Tauri窗口与界面管理:打造专业桌面应用体验 (入门系列五)
窗口管理是桌面应用的核心特性之一,良好的窗口管理可以显著提升用户体验。在Web开发中,我们通常被限制在浏览器窗口内,但Tauri允许前端开发者控制应用窗口的方方面面,从而创造出更加原生的体验。
窗口配置基础
初始窗口配置
在tauri.conf.json
文件中,我们可以配置应用启动时的主窗口。Tauri v2提供了更丰富的窗口配置选项:
{"app": {"windows": [{"label": "main", // 窗口唯一标识符"title": "My Tauri App", // 窗口标题"width": 800, // 窗口宽度"height": 600, // 窗口高度"x": null, // 窗口X坐标,null表示自动"y": null, // 窗口Y坐标,null表示自动"center": true, // 是否居中显示"resizable": true, // 是否可调整大小"minWidth": 400, // 最小宽度"minHeight": 200, // 最小高度"maxWidth": null, // 最大宽度,null表示不限制"maxHeight": null, // 最大高度,null表示不限制"fullscreen": false, // 是否全屏"focus": true, // 创建时是否获得焦点"maximized": false, // 是否最大化"visible": true, // 是否可见"decorations": true, // 是否显示窗口装饰"alwaysOnTop": false, // 是否置顶"skipTaskbar": false, // 是否在任务栏隐藏"transparent": false, // 是否透明"shadow": true, // 是否显示阴影"theme": null, // 窗口主题,"light"或"dark""closable": true, // 是否可关闭"fileDropEnabled": true, // 是否允许拖放文件"acceptFirstMouse": false, // macOS上是否接受首次鼠标点击"tabbingIdentifier": null, // macOS上的标签标识符"titleBarStyle": "Visible", // 标题栏样式,"Visible"、"Transparent"或"Overlay""hiddenTitle": false, // macOS上是否隐藏标题"url": "index.html", // 加载的URL或本地文件路径"userAgent": null, // 自定义用户代理"incognito": false, // 是否使用隐身模式"contentProtected": false, // 是否保护窗口内容不被截图"cursor": null, // 默认鼠标指针样式"windowEffects": null, // 窗口视觉效果设置"maximizable": true, // 是否可最大化"minimizable": true, // 是否可最小化"webviewAttributes": {} // WebView的额外属性}]}
}
这些配置选项让你能够精确控制窗口的外观和行为。每个选项都有其特定用途:
- 基本属性:
width
、height
、title
等控制窗口的基本外观 - 位置控制:
x
、y
、center
决定窗口的初始位置 - 大小限制:
minWidth
、minHeight
、maxWidth
、maxHeight
控制窗口大小范围 - 状态控制:
maximized
、fullscreen
、visible
等控制窗口的初始状态 - 外观设置:
decorations
、transparent
、shadow
等控制窗口的视觉效果 - 行为控制:
resizable
、closable
、fileDropEnabled
等控制窗口的交互行为
窗口标识符
每个窗口都需要一个唯一的标识符(label
),这是通过API操作窗口的关键。默认主窗口的标识符是main
。如果你需要创建多窗口应用,需要为每个窗口指定唯一的标识符:
{"app": {"windows": [{"label": "main", // 主窗口标识符"title": "主窗口"},{"label": "settings", // 设置窗口标识符"title": "设置","width": 500,"height": 400,"visible": false // 初始不可见}]}
}
窗口父子关系
Tauri v2支持设置窗口的父子关系,这对于创建模态窗口或工具窗口特别有用:
{"app": {"windows": [{"label": "main","title": "主窗口"},{"label": "modal","title": "模态窗口","parent": "main", // 指定父窗口"width": 400,"height": 300,"decorations": false, // 无边框窗口"transparent": true, // 透明背景"alwaysOnTop": true // 保持在最上层}]}
}
窗口操作API
Tauri提供了丰富的窗口操作API,让你可以从前端控制窗口行为。在Tauri v2中,这些API更加类型安全和易用。
基本窗口操作
import { Window } from '@tauri-apps/api/window';// 获取当前窗口实例
const window = Window.getCurrent();// 基本窗口操作
async function windowControls() {// 最小化await window.minimize();// 最大化await window.maximize();// 恢复原始大小await window.unmaximize();// 切换全屏await window.setFullscreen(true);// 关闭窗口await window.close();// 获取窗口状态const isMaximized = await window.isMaximized();const isFullscreen = await window.isFullscreen();const isVisible = await window.isVisible();// 设置窗口大小await window.setSize(new LogicalSize(800, 600));// 设置窗口位置await window.setPosition(new LogicalPosition(100, 100));// 设置窗口标题await window.setTitle('新标题');// 设置窗口焦点await window.setFocus();// 设置窗口置顶await window.setAlwaysOnTop(true);// 设置窗口透明度await window.setOpacity(0.8);
}
窗口状态监听
Tauri v2提供了更强大的事件监听系统,让你能够响应窗口的各种状态变化:
import { Window } from '@tauri-apps/api/window';function setupWindowListeners() {const window = Window.getCurrent();// 窗口移动const unlisten1 = window.onMoved(({ x, y }) => {console.log(`窗口移动到 (${x}, ${y})`);});// 窗口缩放const unlisten2 = window.onResized(({ width, height }) => {console.log(`窗口大小调整为 ${width}x${height}`);});// 窗口焦点变化const unlisten3 = window.onFocusChanged(({ focused }) => {console.log(`窗口${focused ? '获得' : '失去'}焦点`);});// 窗口即将关闭const unlisten4 = window.onCloseRequested((event) => {// 阻止默认关闭行为event.preventDefault();// 显示确认对话框if (confirm('确定要关闭吗?')) {window.close();}});// 窗口主题变化const unlisten5 = window.onThemeChanged(({ theme }) => {console.log(`窗口主题变为: ${theme}`);});// 窗口缩放比例变化const unlisten6 = window.onScaleFactorChanged(({ scaleFactor }) => {console.log(`窗口缩放比例变为: ${scaleFactor}`);});// 清理监听器return () => {unlisten1();unlisten2();unlisten3();unlisten4();unlisten5();unlisten6();};
}
多窗口管理
Tauri v2提供了更强大的多窗口管理能力,支持创建、查找和控制多个窗口:
import { Window } from '@tauri-apps/api/window';async function openSettingsWindow() {// 检查窗口是否已存在const existingWindow = Window.getByLabel('settings');if (existingWindow) {// 如果已存在,激活它await existingWindow.setFocus();return existingWindow;}// 创建新窗口const settingsWindow = new Window('settings', {url: 'settings.html', // 加载的HTML文件title: '应用设置',width: 500,height: 400,center: true,resizable: true,parent: Window.getCurrent(), // 设置父窗口decorations: false, // 无边框窗口transparent: true, // 透明背景alwaysOnTop: true // 保持在最上层});// 监听窗口事件settingsWindow.once('tauri://created', () => {console.log('设置窗口已创建');});settingsWindow.once('tauri://error', (e) => {console.error('设置窗口创建失败:', e);});return settingsWindow;
}// 获取所有窗口
async function getAllWindows() {const windows = await Window.getAll();console.log('所有窗口:', windows.map(w => w.label));
}// 获取主窗口
async function getMainWindow() {const mainWindow = await Window.getByLabel('main');return mainWindow;
}
窗口间通信
Tauri v2提供了多种窗口间通信的方式:
通过事件通信
import { Window } from '@tauri-apps/api/window';
import { emit, listen } from '@tauri-apps/api/event';// 在主窗口中发送事件
function sendDataToSettings(data) {emit('data-to-settings', data);
}// 在设置窗口中监听事件
function listenForData() {return listen('data-to-settings', (event) => {console.log('收到数据:', event.payload);// 处理数据...});
}
通过窗口API直接发送
import { Window } from '@tauri-apps/api/window';// 在一个窗口中向另一个窗口发送消息
async function sendMessageToMain(message) {const mainWindow = await Window.getByLabel('main');if (mainWindow) {await mainWindow.emit('message-from-settings', message);}
}
自定义窗口
无边框窗口
Tauri v2提供了更灵活的无边框窗口配置,让你能够创建完全自定义的窗口界面:
{"app": {"windows": [{"decorations": false, // 禁用标准窗口装饰"transparent": true, // 启用透明背景"titleBarStyle": "Overlay", // 使用覆盖式标题栏"shadow": true, // 保留窗口阴影"contentProtected": true // 保护窗口内容}]}
}
然后在前端实现自定义标题栏:
<template><div class="custom-titlebar"><div class="titlebar-drag-region"></div><div class="window-title">{{ title }}</div><div class="window-controls"><button @click="minimize" class="control-button"><span>🗕</span></button><button @click="toggleMaximize" class="control-button"><span>{{ isMaximized ? '🗗' : '🗖' }}</span></button><button @click="close" class="control-button close"><span>✕</span></button></div></div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import { Window } from '@tauri-apps/api/window';const title = ref('My Custom App');
const isMaximized = ref(false);
const window = Window.getCurrent();async function minimize() {await window.minimize();
}async function toggleMaximize() {if (isMaximized.value) {await window.unmaximize();isMaximized.value = false;} else {await window.maximize();isMaximized.value = true;}
}async function close() {await window.close();
}let unlisten;onMounted(async () => {// 监听窗口状态变化unlisten = await window.onResized(() => {// 检查是否最大化isMaximized.value = await window.isMaximized();});
});onUnmounted(() => {if (unlisten) unlisten();
});
</script><style scoped>
.custom-titlebar {height: 32px;background: #2b2b2b;display: flex;justify-content: space-between;align-items: center;color: white;user-select: none;position: fixed;top: 0;left: 0;right: 0;z-index: 1000;
}.titlebar-drag-region {position: absolute;top: 0;left: 0;right: 0;height: 100%;-webkit-app-region: drag; /* 允许拖拽 */
}.window-title {margin-left: 12px;font-size: 12px;
}.window-controls {display: flex;-webkit-app-region: no-drag; /* 按钮区域不可拖拽 */
}.control-button {width: 46px;height: 32px;border: none;background: transparent;color: white;font-size: 12px;display: flex;justify-content: center;align-items: center;cursor: pointer;
}.control-button:hover {background: rgba(255, 255, 255, 0.1);
}.control-button.close:hover {background: #e81123;
}
</style>
系统托盘
Tauri v2提供了更强大的系统托盘功能,支持自定义图标、菜单和事件处理:
// src-tauri/src/main.rs
use tauri::{CustomMenuItem, SystemTray, SystemTrayMenu, SystemTrayMenuItem, SystemTrayEvent,Manager
};fn main() {// 定义托盘菜单项let quit = CustomMenuItem::new("quit".to_string(), "退出");let show = CustomMenuItem::new("show".to_string(), "显示窗口");let hide = CustomMenuItem::new("hide".to_string(), "隐藏窗口");let settings = CustomMenuItem::new("settings".to_string(), "设置");// 创建托盘菜单let tray_menu = SystemTrayMenu::new().add_item(show).add_item(hide).add_native_item(SystemTrayMenuItem::Separator).add_item(settings).add_native_item(SystemTrayMenuItem::Separator).add_item(quit);// 创建系统托盘let system_tray = SystemTray::new().with_menu(tray_menu).with_icon(tauri::Icon::Raw(include_bytes!("../icons/icon.png").to_vec()));tauri::Builder::default().system_tray(system_tray).on_system_tray_event(|app, event| match event {// 处理托盘菜单点击SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() {"quit" => {app.exit(0);}"show" => {let window = app.get_window("main").unwrap();window.show().unwrap();window.set_focus().unwrap();}"hide" => {let window = app.get_window("main").unwrap();window.hide().unwrap();}"settings" => {let window = app.get_window("main").unwrap();window.emit("open-settings", ()).unwrap();}_ => {}},// 托盘图标左键点击SystemTrayEvent::LeftClick { .. } => {let window = app.get_window("main").unwrap();if window.is_visible().unwrap() {window.hide().unwrap();} else {window.show().unwrap();window.set_focus().unwrap();}}// 托盘图标右键点击SystemTrayEvent::RightClick { .. } => {// 可以在这里显示自定义菜单}_ => {}}).run(tauri::generate_context!()).expect("error while running tauri application");
}
在前端监听托盘事件:
import { Window } from '@tauri-apps/api/window';
import { listen } from '@tauri-apps/api/event';// 监听设置菜单点击事件
listen('open-settings', () => {// 打开设置窗口openSettingsWindow();
});
窗口内容管理
单页面应用与路由
对于单页面应用(SPA),你可以利用前端路由管理不同页面,而不是创建多个窗口:
// Vue Router示例
import { createRouter, createWebHashHistory } from 'vue-router';const router = createRouter({history: createWebHashHistory(), // 使用Hash模式路由routes: [{ path: '/', component: Home },{ path: '/settings', component: Settings },{ path: '/profile', component: Profile }]
});
窗口内加载URL
Tauri v2提供了更灵活的URL加载方式:
import { Window } from '@tauri-apps/api/window';// 创建窗口并加载外部URL
const docsWindow = new Window('docs', {url: 'https://tauri.app/docs/',title: 'Tauri文档',
});// 在现有窗口中加载新URL
async function navigateToHelp() {const window = Window.getCurrent();await window.loadUrl('/help.html');
}
嵌入网页内容
Tauri v2支持在应用中嵌入外部网页内容,并提供了更好的安全控制:
<template><div class="webview-container"><iframe :src="url" class="webview"@load="onFrameLoad"sandbox="allow-same-origin allow-scripts"></iframe></div>
</template><script setup>
import { ref } from 'vue';const url = ref('https://tauri.app');function onFrameLoad(event) {console.log('Frame loaded:', event);
}
</script><style scoped>
.webview-container {width: 100%;height: 100%;overflow: hidden;
}.webview {width: 100%;height: 100%;border: none;
}
</style>
响应式设计与窗口缩放
动态调整布局
Tauri v2提供了更好的窗口缩放事件支持,让你能够实现更流畅的响应式设计:
<template><div class="app-container" :class="{ 'compact': isCompact }"><div class="sidebar" v-if="!isCompact"><!-- 侧边栏内容 --></div><div class="main-content"><!-- 主要内容 --></div></div>
</template><script setup>
import { ref, onMounted, onUnmounted } from 'vue';
import { Window } from '@tauri-apps/api/window';const isCompact = ref(false);
const window = Window.getCurrent();
let unlisten;async function checkWindowSize() {const { width } = await window.innerSize();isCompact.value = width < 768;
}onMounted(async () => {await checkWindowSize();unlisten = await window.onResized(() => {checkWindowSize();});
});onUnmounted(() => {if (unlisten) unlisten();
});
</script><style scoped>
.app-container {display: flex;height: 100vh;
}.sidebar {width: 250px;background: #f5f5f5;
}.main-content {flex: 1;
}.compact .main-content {width: 100%;
}
</style>
保存和恢复窗口状态
Tauri v2提供了更可靠的窗口状态管理:
import { Window } from '@tauri-apps/api/window';
import { Store } from 'tauri-plugin-store-api';// 创建存储
const store = new Store('window-state.dat');// 保存窗口状态
async function saveWindowState() {try {const window = Window.getCurrent();const position = await window.outerPosition();const size = await window.outerSize();const isMaximized = await window.isMaximized();await store.set('windowState', {x: position.x,y: position.y,width: size.width,height: size.height,isMaximized});await store.save();} catch (error) {console.error('保存窗口状态失败:', error);}
}// 恢复窗口状态
async function restoreWindowState() {try {const window = Window.getCurrent();const state = await store.get('windowState');if (state) {// 先设置位置和大小if (state.width && state.height) {await window.setSize(new LogicalSize(state.width, state.height));}if (state.x !== undefined && state.y !== undefined) {await window.setPosition(new LogicalPosition(state.x, state.y));}// 然后处理最大化状态if (state.isMaximized) {await window.maximize();}}} catch (error) {console.error('恢复窗口状态失败:', error);}
}// 在窗口即将关闭时保存状态
Window.getCurrent().onCloseRequested(async (event) => {// 保存窗口状态await saveWindowState();
});// 应用启动时恢复状态
document.addEventListener('DOMContentLoaded', async () => {await restoreWindowState();
});
小结
作为前端开发者,Tauri的窗口管理功能让你能够打造专业级的桌面应用体验。通过本文介绍的技术,你可以:
- 配置和控制窗口的基本属性
- 创建多窗口应用并实现窗口间通信
- 设计自定义无边框窗口和标题栏
- 添加系统托盘功能
- 管理窗口内容和导航
- 实现响应式设计以适应窗口缩放
- 保存和恢复窗口状态
这些能力使你能够超越传统Web应用的限制,创建具有原生应用外观和体验的桌面软件。
在下一篇文章中,我们将探讨Tauri的系统集成功能,包括通知、快捷键和自动启动等特性。
相关文章:
Tauri窗口与界面管理:打造专业桌面应用体验 (入门系列五)
窗口管理是桌面应用的核心特性之一,良好的窗口管理可以显著提升用户体验。在Web开发中,我们通常被限制在浏览器窗口内,但Tauri允许前端开发者控制应用窗口的方方面面,从而创造出更加原生的体验。 窗口配置基础 初始窗口配置 在…...
golang goroutine(协程)和 channel(管道) 案例解析
文章目录 goroutine和channel概念开启线程与channel简单通信流程多个工作协程并发执行流程 goroutine和channel概念 goroutine(协程),一般我们常见的是进程,线程,进程可以理解为一个软件在运行执行的过程,线程跟协程比较类似&…...
底层源码和具体测试解析HotSpot JVM的notify唤醒有序性(5000字详解)
在大家的认知里,或者大家也可能搜过,notify唤醒机制到底是随机的呢?还是顺序的呢?在网上其实也有很多人说notify的唤醒机制就是随机的,但实际上并不是这样的,notify的唤醒机制是先进先出的! 目…...
Jenkins(CI/CD工具)
1. 什么是 Jenkins? Jenkins 是一个开源的持续集成(CI)和持续交付/部署(CD)工具,用于自动化软件构建、测试和部署过程。 2. Jenkins 优势 (1)开源免费:社区活跃&#…...
Apache Sqoop数据采集问题
Sqoop数据采集格式问题 一、Sqoop工作原理二、Sqoop命令格式三、Oracle数据采集格式问题四、Sqoop增量采集方案 Apache Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库&…...
再学GPIO(二)
GPIO寄存器 每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。 GPIO…...
err: Error: Request failed with status code 400
好的,今天学习ai的时候从前端发送请求,实在是想不通为啥会啥是一个坏请求,后来从前端方法一个一个找参数,传递的值都有,然后想到我这边需要传递的是一个对象,那么后端使用的RequestParam就接收不到json对象…...
解决qnn htp 后端不支持boolean 数据类型的方法。
一、背景 1.1 问题原因 Qnn 模型在使用fp16的模型转换不支持类型是boolean的cast 算子,因为 htp 后端支持量化数据类型或者fp16,不支持boolean 类型。 ${QNN_SDK_ROOT_27}/bin/x86_64-linux-clang/qnn-model-lib-generator -c ./bge_small_fp16.cpp -b …...
k8s学习记录(五):Pod亲和性详解
一、前言 上一篇文章初步探讨了 Kubernetes 的节点亲和性,了解到它在 Pod 调度上比传统方式更灵活高效。今天我们继续讨论亲和性同时Kubernetes 的调度机制。 二、Pod亲和性 上一篇文章中我们介绍了节点亲和性,今天我们讲解一下Pod亲和性。首先我们先看…...
MongoDB与PHP7的集成与优化
MongoDB与PHP7的集成与优化 引言 随着互联网技术的飞速发展,数据库技术在现代软件开发中扮演着越来越重要的角色。MongoDB作为一种流行的NoSQL数据库,以其灵活的数据模型和强大的扩展性受到众多开发者的青睐。PHP7作为当前最流行的服务器端脚本语言之一,其性能和稳定性也得…...
maven相关概念深入介绍
1. pom.xml文件 就像Make的MakeFile、Ant的build.xml一样,Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。…...
以科技之力,启智慧出行 —— 阅读《NVIDIA 自动驾驶安全报告》及观看实验室视频有感
作为中南民族大学通信工程专业的学生,近期研读《NVIDIA 自动驾驶安全报告》并观看其实验室系列视频后,我深刻感受到自动驾驶技术不仅是一场交通革命,更是一次社会生产力的解放与民族精神的升华。这场变革的浪潮中,我看到了科技如何…...
2P4M-ASEMI机器人功率器件专用2P4M
编辑:LL 2P4M-ASEMI机器人功率器件专用2P4M 型号:2P4M 品牌:ASEMI 封装:TO-126 批号:最新 引脚数量:3 封装尺寸:如图 特性:双向可控硅 工作结温:-40℃~150℃ 在…...
基础的贝叶斯神经网络(BNN)回归
下面是一个最基础的贝叶斯神经网络(BNN)回归示例,采用PyTorch实现,适合入门理解。 这个例子用BNN拟合 y x 噪声 的一维回归问题,输出均值和不确定性(方差)。 import torch import torch.nn a…...
小黑享受思考心流: 73. 矩阵置零
小黑代码 class Solution:def setZeroes(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""items []m len(matrix)n len(matrix[0])for i in range(m):for j in range(n):if not m…...
整合 | 大模型时代:微调技术在医疗智能问答矩阵的实战应用20250427
🔎 整合 | 大模型时代:微调技术在医疗智能问答矩阵的实战应用 一、引言 在大模型技术高速变革的背景下,数据与微调技术不再是附属品,而是成为了AI能力深度重构的核心资产。 尤其在医疗行业中,微调技术改写了智能分诊和…...
Web安全:威胁解析与综合防护体系构建
Web安全:威胁解析与综合防护体系构建 Web安全是保护网站、应用程序及用户数据免受恶意攻击的核心领域。随着数字化转型加速,攻击手段日益复杂,防护需兼顾技术深度与系统性。以下从威胁分类、防护技术、最佳实践及未来趋势四个维度࿰…...
spring项目rabbitmq es项目启动命令
应该很多开发者遇到过需要启动中间件的情况,什么测试服务器挂了,服务连不上nacos了巴拉巴拉的,虽然是测试环境,但也会手忙脚乱,疯狂百度。 这里介绍一些实用方法 有各种不同的场景,一是重启,服…...
人工智能期末复习1
该笔记为2024.7出版的人工智能技术应用导论(第二版)课本部分的理论总结。 一、人工智能的产生与发展 概念:人工智能是通过计算机系统和模型模拟、延申和拓展人类智能的理论、方法、技术及应用系统的一门新的技术科学。 发展:19…...
深入理解指针(5)
字符指针变量 对下述代码进行调试 继续go,并且观察p2 弹出错误: 为什么报错呢? 因为常量字符串是不能被修改的,否则,编译器报错。 最后,打印一下: 《剑指offer》中收录了⼀道和字符串相关的笔试题&#…...
新魔百和CM311-5_CH/YST/ZG代工_GK6323V100C_2+8G蓝牙版_强刷卡刷固件包(可救砖)
新魔百和CM311-5_CH/YST/ZG代工_GK6323V100C_28G蓝牙版_强刷卡刷固件包(可救砖) 1、准备一个优盘卡刷强刷刷机,用一个usb2.0的8G以下U盘,fat32,2048块单分区格式化(强刷对ÿ…...
磁盘清理git gc
#!/bin/bash find / -type d -name “.git” 2>/dev/null | while read -r git_dir; do repo_dir ( d i r n a m e " (dirname " (dirname"git_dir") echo “Optimizing r e p o d i r " c d " repo_dir" cd " repodir"cd&…...
django admin AttributeError: ‘UserResorce‘ object has no attribute ‘ID‘
在 Django 中遇到 AttributeError: ‘UserResource’ object has no attribute ‘ID’ 这类错误通常是因为你在代码中尝试访问一个不存在的属性。在你的例子中,错误提示表明 UserResource 类中没有名为 ID 的属性。这可能是由以下几个原因造成的: 拼写错…...
现代Python打包工具链
现代Python打包工具如Poetry、Flit和Hatch提供了更简单、更强大的方式来管理项目依赖和打包流程。下面我将通过具体示例详细介绍这三种工具。 1. Poetry - 全功能依赖管理工具 Poetry是最流行的现代Python项目管理工具之一,它集依赖管理、虚拟环境管理和打包发布于一…...
(done) 吴恩达版提示词工程 8. 聊天机器人 (聊天格式设计,上下文内容,点餐机器人)
视频:https://www.bilibili.com/video/BV1Z14y1Z7LJ/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 别人的笔记:https://zhuanlan.zhihu.com/p/626966526 8. 聊天机器人(Chatbot) …...
Maven概述
1.maven是什么? Maven 是一个基于项目对象模型(Project Object Model,POM)概念的项目构建工具,主要用于 Java 项目的构建、依赖管理和项目信息管理。(跨平台的项目管理工具,用于构建和管理任何…...
SKLearn - Biclustering
文章目录 Biclustering (双聚类)谱二分聚类算法演示生成样本数据拟合 SpectralBiclustering绘制结果 Spectral Co-Clustering 算法演示使用光谱协同聚类算法进行文档的二分聚类 Biclustering (双聚类) 关于双聚类技术的示例。 谱…...
使用c++实现一个简易的量子计算,并向外提供服务
实现一个简易的量子计算模拟器并提供服务是一个相对复杂的过程,涉及到量子计算的基本概念、C编程以及网络服务的搭建。以下是一个简化的步骤指南,帮助你开始这个项目: 步骤 1: 理解量子计算基础 在开始编码之前,你需要对量子计算…...
京东攻防岗位春招面试题
围绕电商场景,以下是5道具有代表性的技术面试题及其解析,覆盖供应链、电商大促、红蓝对抗等场景。 《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?…...
Kafka批量消费部分处理成功时的手动提交方案
Kafka批量消费部分处理成功时的手动提交方案 当使用Kafka批量消费时,如果500条消息中只有部分处理成功,需要谨慎处理偏移量提交以避免消息丢失或重复消费。以下是几种处理方案示例: 方案1:记录成功消息并提交最后成功偏移量 Co…...
消息中间件
零、文章目录 消息中间件 1、中间件 (1)概述 中间件(Middleware)是位于操作系统、网络与数据库之上,应用软件之下的一层独立软件或服务程序,其核心作用是连接不同系统、屏蔽底层差异,并为应…...
vue3直接操作微信小程序云开发数据库,web网页对云数据库进行增删改查
我们开发好小程序以后,有时候需要编写一个管理后台网页对数据库进行管理,之前我们只能借助云开发自带的cms网页,但是cms网页设计的比较丑,工作量和代码量也不够,所以我们今天就来带大家实现用vue3编写管理后台直接管理…...
重塑编程体验边界:明基RD280U显示器深度体验
重塑编程体验边界:明基RD280U显示器深度体验 写在前面 本文将以明基RD280U为核心,通过技术解析、实战体验与创新案例,揭示专业显示器如何重构开发者的数字工作台。 前言:当像素成为生产力的催化剂 在GitHub的年度开发者调查中&…...
Linux命令-iostat
iostat 命令介绍 iostat 是一个用于监控 Linux 系统输入/输出设备加载情况的工具。它可以显示 CPU 的使用情况以及设备和分区的输入/输出统计信息,对于诊断系统性能瓶颈(如磁盘或网络活动缓慢)特别有用。 语法: iostat [options…...
Hyper-V安装Win10系统,报错“No operating system was loaded“
环境: Win10专业版 Hyper-V 问题描述: Hyper-V安装Win10系统,报错"No operating system was loaded" 已挂载ISO但仍无法启动的深度解决方案 🔧如果已确认ISO正确挂载且启动顺序已调整,但虚拟机仍提…...
Zabbix
zabbix官网: https://www.zabbix.com zabbix中文操作手册:https://www.zabbix.com/documentation/5.0/zh/manual/introduction/features 1、SERVER Zabbix server 是 Zabbix 软件的核心组件。Zabbix Agent 向Zabbix server报告可用性、系统完整性信息和统计信息。…...
NEPCON China 2025 | 具身智能时代来临,灵途科技助力人形机器人“感知升级”
4月22日至24日,生产设备暨微电子工业展(NEPCON China 2025)在上海如期开展。本届展会重磅推出“人形机器人拆解展区”,汇聚35家具身智能产业链领军企业,围绕机械结构、传感器布局、驱动系统与AI算法的落地应用…...
css响应式布局设置子元素高度和宽度一样
css响应式布局设置子元素高度和宽度一样 常常遇到响应式布局 其中父元素(类名为.list)包含多个子元素(类名为.item),每个子元素中显示一张图片,并且这些图片能够根据子元素的宽度和高度进行自适应调整。 …...
【AI论文】RefVNLI:迈向可扩展的主题驱动文本到图像生成评估
摘要:主题驱动的文本到图像(T2I)生成旨在生成与给定文本描述一致的图像,同时保留参考主题图像的视觉特征。 尽管该领域具有广泛的下游适用性——从增强图像生成的个性化到视频渲染中一致的角色表示——但该领域的进展受到缺乏可靠…...
信创系统 sudoers 权限配置实战!从小白到高手
好文链接:实战!银河麒麟 KYSEC 安全中心执行控制高级配置指南 Hello,大家好啊!今天给大家带来一篇关于信创终端操作系统中 sudoers 文件详解的实用文章!在 Linux 系统中,sudo 是一项非常重要的权限控制机制…...
用户行为检测技术解析:从请求头到流量模式的对抗与防御
用户行为检测是反爬机制的核心环节,网站通过分析请求特征、交互轨迹和时间模式,识别异常流量并阻断爬虫。本文从基础特征检测与高级策略分析两个维度,深入解析用户行为检测的技术原理与对抗方案。 一、基础特征检测:请求头与交互…...
关于Android Studio的AndroidManifest.xml的详解
AndroidManifest.xml 是 Android 项目的核心配置文件,它定义了应用的基本信息、所需权限、组件、功能等。它为 Android 系统提供了关于应用如何运行的重要信息。每个 Android 应用程序必须包含这个文件,而且这个文件的配置直接影响到应用的行为和安装要求…...
全栈自动化:从零构建智能CI/CD流水线
1. 基础架构:GitLab Kubernetes 1.1 GitLab CI/CD核心配置 GitLab通过.gitlab-ci.yml定义流水线阶段。以下是一个基础模板: stages:- build- test- deploybuild_job:stage: buildscript:- echo "Compiling the code..."- make…...
xe-upload上传文件插件
1.xe-upload地址:文件选择、文件上传组件(图片,视频,文件等) - DCloud 插件市场 2.由于开发app要用到上传文件组件,uni.chooseFile在app上不兼容,所以找到了xe-upload,兼容性很强&a…...
PySpark中DataFrame应用升阶及UDF使用
目录 1. 加载数据2. 列常见操作2.1 添加新列2.2 重命名列2.3 删除指定列2.4 修改数据 3 空值处理3.1 丢弃空值3.2 空值填充 4 聚合操作4.1 分组聚合 5 用户自定义函数(UDF)5.1 传统UDF函数5.2 Pandas UDF(向量化UDF) 参考资料 imp…...
C++ ——引用
引用定义 引用是一个已存在的变量的别名。 用法 类型 & 别名 引用指向的变量名 关于别名的理解: 别名可以理解为绰号或者小名,比如美猴王、齐天大圣、斗战胜佛等,指的都是孙悟空。 这意味着: ①别名和别名指向的变量其实是同…...
OpenCV 图形API(65)图像结构分析和形状描述符------拟合二维点集的直线函数 fitLine2D()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 拟合一条直线到2D点集。 该函数通过最小化 ∑ i ρ ( r i ) \sum_i \rho(r_i) ∑iρ(ri)来将一条直线拟合到2D点集,其中 ri 是第…...
k8s生成StarRocks集群模版
集群由1个fe3个be组成,满足以下要求: 1、由3个pod组成,每pod分配2c4g 2、第一个pod里有一个be与一个fe,同在一个容器里,fe配置jvm内存设置为1024mb,be的jvm内存设置为1024MB 3、第二第三个pod里分别有一…...
web基础+HTTP+HTML+apache
目录 一.web基础 1.1web是什么 1.2HTTP 1.2.1HTTP的定义 1.2.2 HTTP请求过程 1.2.3 HTTP报文 1 请求报文 2 响应报文 1.2.4 HTTP协议状态码 1.2.5 HTTP方法 1.2.6 HTTP协议版本 二.HTML CSS和JavaScript 2.1HTML 2.1.1HTML的概述 2.1.2 HTML中的部分基本标签&…...
C++修炼:list模拟实现
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞,关注&am…...