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

rust 全栈应用框架dioxus server

接上一篇文章dioxus全栈应用框架的基本使用,支持web、desktop、mobile等平台。

可以先查看上一篇文章rust 全栈应用框架dioxus👈

既然是全栈框架,那肯定是得有后端服务的,之前创建的服务没有包含后端服务包,我们修改Cargo.toml,增加后端服务包,

指定依赖dioxus包含特性fullstack

dioxus = { version = "0.6.0", features = ['fullstack'] }

并且需要去掉当前默认的default平台设置,增加server服务端功能。之后需要重启项目,并且需要指定平台dx serve --platform web

[features]
default = ["web"] // 移除
web = ["dioxus/web"]
desktop = ["dioxus/desktop"]
mobile = ["dioxus/mobile"]
server = ["dioxus/server"] // 增加

重新启动服务后,类似本地mock服务,可以像调用接口一样在前端组件逻辑中调用。
在这里插入图片描述

启动之后可以看到和仅前端服务不同的是多了一个fullstack.这样我们可以开始编写服务端代码了。

以一个简单的记录信息的服务为例,保存用户输入的信息,并展示用户已经保存的信息数据。

内连服务RPC

内连服务功能函数定义和界面定义代码没有分离。通过#[server]定义服务端功能函数,函数是异步async的。

我们定义保存用户输入信息的函数,返回值为Result<(), ServerFnError>,请求参数会自动被序列化,响应参数也必须可被序列化。

#[server]
async fn save_note(content:String) -> Result<(), ServerFnError> {Ok(())
}

在页面上通过点击事件,调用后端服务,dioxus使用axum来处理后端服务,前端则可以通过reqwest库请求服务。内连服务则可以让我们直接在事件处理方法中调用服务端函数。

axusm 是一个web服务框架,集成了tokio异步运行时;tower构建客户端和服务端;hyperhttp服务库。

定义好了服务端功能函数,在客户端通过点击事件进行调用。dioxus会自动处理调用到的服务函数,注册服务,建立调用关系。

#[component]
fn App() -> Element {let mut content = use_signal(|| "".to_string());let handle_input = move |event: FormEvent| {content.set(event.value());};let handle_submit = move |_| async move {save_note(content()).await.unwrap();};rsx! {input { value:"{content}", oninput:handle_input }button { onclick:handle_submit,"submit" }}
}

用户输入点击提交,然后调用服务端函数save_note保存信息。完善一下服务端功能,将输入的信息存储到当前目录文件中note.txt

#[server]
async fn save_note(content:String) -> Result<(), ServerFnError> {println!("received note {}", content);// 存储到当前目录文件中 note.txtstd::fs::write("note.txt", content).unwrap();Ok(())
}

运行测试dx serve --platform web启动服务时,发现报错了
在这里插入图片描述

根据问题查询是因为在web平台要构建server服务时,中间依赖的mio库是一个服务端网络库,不能编译为WASM。web端不能运行服务端程序,所以改换平台测试dx serve --platform desktop

改用desktop平台,运行成功,按照功能测试了输入内容并点击保存,项目根目录下出现了文件note.txt文件,内容正是我们输入的内容。
在这里插入图片描述

手动注册服务

通过#[server] 定义的服务端功能函数,在运行时会启动注册服务,这就限制了无法在不能运行服务端程序的平台上运行。比如不能在web平台上执行,我们可以手动注册服务,并通过运行环境判断执行前端服务还是后端服务。

在自定义服务时,需要添加依赖axum \ tokio,使用了optional来标记依赖,这是因为某些依赖只在特定的平台中运行,然后在特定的平台特性中指定需要的依赖。

[dependencies]
axum = { version = "0.7.9", optional = true }
tokio = { version = "1.44.2", features = ["full"], optional = true }[features]
server = ['dioxus/server', "dep:axum", "dep:tokio"]

定义服务注册函数launch_server,通过#[cfg(feature = "server")]条件判断只有在featuresserver时才编译代码,这样在启动web平台时不会自动将服务端代码进行编译,达到web和server分离的目的。

#[cfg(feature = "server")]
async fn launch_server() {// 获取到服务ip 端口// 这里依赖了`dioxus`的features cli_configlet addr = cli_config::fullstack_address_or_localhost();// 自定义axum 路由let router = axum::Router::new().serve_dioxus_application(ServeConfigBuilder::new(), App).into_make_service();// 监听端口let listener = tokio::net::TcpListener::bind(addr).await.unwrap();// 启动服务axum::serve(listener, router).await.unwrap();
}

dioxus::fullstack 提供了与axum集成的服务能力。提供了serve_dioxus_application方法,它提供完整的服务端渲染应用的能力。

注意:目前我使用的dioxus版本是0.6.3,对应的axum版本是0.7。最新的axum版本是0.8,不支持serve_dioxus_application,这可能会在dioxus新版本0.7中解决。

定义好了服务端运行函数,我们修改主函数main.rs,通过条件编译#[cfg(feature = "server")]只有在特性sever时执行我们定义的launch_server,其它时执行前端运行函数dioxus::launch(App)

fn main() {#[cfg(feature = "server")]tokio::runtime::Runtime::new().unwrap().block_on(launch_server());#[cfg(not(feature = "server"))]dioxus::launch(App);
}

现在可以直接运行dx serve --platform web,现在是服务端渲染,我们可以正常的访问前端页面,并且通过接口调用到了后端服务。

可以看到默认转换的服务API地址,前缀默认是api,请求地址、类型等设置可以通过#[server]参数进行设置,这里暂不涉及,需要的可以去查看文档。
在这里插入图片描述

在前后端混合开发时,注意一些服务端需要的静态变量,比如密码,数据库连接等,不能直接定义变量,通过条件编译#[cfg(feature = "server")]进行处理。

分离服务

我们可以采用rust工作区来管理项目,区分服务端server和前端,然后前端又可以区分为webmobiledesktop,将公共的页面逻辑放在app中,这样我们的目录就变成了
在这里插入图片描述

那么之前的区分server的入口执行代码存放在server目录中

use dioxus::prelude::*;// 不同平台的页面入口组件
use web::App;#[cfg(feature = "server")]
#[tokio::main]
async fn main() {let addr = dioxus::cli_config::fullstack_address_or_localhost();let router = axum::Router::new().serve_dioxus_application(ServeConfigBuilder::new(), App).into_make_service();let listener = tokio::net::TcpListener::bind(addr).await.unwrap();axum::serve(listener, router).await.unwrap();
}#[cfg(not(feature = "server"))]
fn main() {dioxus::launch(App);
}

这里还是依赖了dioxus提供的服务端能力,也可以自己使用axum自定义服务端功能,在调用#[server]定义的服务端函数的地方改为传统接口请求方式。

将通用的组件,包括服务端函数等放在子包app中,然后在不同的平台的引入并使用。

use dioxus::prelude::*;use app::App as BaseApp;#[component]
pub fn App() -> Element {rsx! {h2 { "Hello, web!" }BaseApp {}}
}

明确不同平台、不同能力划分的子包,可以更方便的管理,也能更好的针对不同平台进行定制化处理。

官方并没有给出一个标准示例,这方面还需要继续探索。#[server]可以将前后端写在一起,再区分模块是否不妥,还需实践。

路由

路由在业务开发中必不可少,dioxus 提供了特性router支持路由配置,我们修改依赖增加特性支持

[workspace.dependencies]
dioxus = { version = "0.6.3", features = ["fullstack", "router"] }

diosux提供了派生宏Routable使得我们通过枚举定义路由:

#[derive(Routable, Clone, PartialEq)]
enum Route {#[route("/")]Home,
}

定义了默认导航路由地址/渲染组件Home,在需要渲染路由的地方使用Router::<Route> {}来占位路由渲染。修改组件App增加路由渲染占位:

#[component]
pub fn App() -> Element {rsx! {Router::<Route> {}}
}

我们定义Home组件,默认可以展示来自不同平台的平台名称,在各个平台中通过use_context_providerhook提供了平台名称。比如在web平台中:

use dioxus::prelude::*;use app::App as BaseApp;#[component]
pub fn App() -> Element {use_context_provider(|| "dioxus-web".to_string());rsx! {BaseApp {}}
}

Home组件中获取并展示,上下文变量共享可以作为不同平台的环境变量来处理一些特定的逻辑。

#[component]
pub fn Home() -> Element {let platform_name: String = use_context();rsx! {h2{"{platform_name}"}}
}

我们将原来的输入信息保存的功能提取成一个组件Note,并默认初始渲染这个组件,我们还希望Home组件也能展示,也就是Home组件是父组件,Note组件是子组件。

通过Outlet::<Route> {}将路由匹配的组件渲染到指定的位置,修改组件Home

use dioxus::prelude::*;use crate::Route;#[component]
pub fn Home() -> Element {let platform_name: String = use_context();rsx! {h2{"{platform_name}"}// 渲染子组件Outlet::<Route> {}}
}

路由/默认渲染Note,调整路由定义,通过#[layout]定义组件嵌套关系,在父组件内部可通过Outlet渲染匹配到的子组件。

#[derive(Routable, Clone, PartialEq)]
enum Route {#[layout(Home)]#[route("/")]AddNote,
}

上面默认路由/渲染了Note,在日常开发中/路由渲染可能会发生改变,为了方便灵活配置,指定跳转到其他路由。新增一个路由/note,用来访问Note组件,然后路由/重定向到/note

#[derive(Routable, Clone, PartialEq)]
#[rustfmt::skip]
enum Route {#[redirect("/",|| Route::AddNote)]#[layout(Home)]#[route("/note")]AddNote,#[end_layout]
}

为了标识嵌套关系,使用#[rustfmt::skip]保持手动缩进格式,使用#[redirect]重定向路由,第一个参数指定路径;第二个闭包函数返回渲染的路由(已经定义了的路由)。

当前重定向目标路由时,浏览器的访问路径并不会由/更改为/note

动态路由

动态路由包括动态路径和查询参数。

动态路径就是通过:name表示参数name可以是任意值。

#[derive(Routable, Clone, PartialEq)]
#[rustfmt::skip]
enum Route {#[route("/note/:id")]ViewNote {id:String},
}

查询参数则是在路径后面加上?,后面跟:name,多个参数用&连接。

#[derive(Routable, Clone, PartialEq)]
#[rustfmt::skip]
enum Route {#[route("/note?:name&:id")]ViewNote { name:String, id:String },
}

在传递参数时,需要按照参数顺序定义,比如name字段必须在id前面。{ id:String, name:String }这样写是错的。

路由嵌套

通过#[layout]实现组件嵌套。实现路由嵌套可以减少路径重复书写,通过#[nest]标识上级路径

#[derive(Routable, Clone, PartialEq)]
#[rustfmt::skip]
enum Route {#[redirect("/",|| Route::AddNote)]#[layout(Home)]#[nest("/note")]#[route("/")]AddNote,#[route("/view?:name&:id")]ViewNote { name:String,id:String  },#[end_nest]#[end_layout]
}

路由嵌套中也可以使用动态路径,它可以将参数传递给所有子路由。

404页面

路由404页面,当匹配不到所有的路由定义时,渲染指定的页面,在路由配置最后新增路由兜底,通过:..segments匹配所有路径段:

#[derive(Routable, Clone, PartialEq)]
enum Route {// ... routes#[route("/:..segments")]NotFound { segments: Vec<String> },
}

也可通过redirect重定向到首页去,我们在初始默认/渲染的Home组件,可以在路由重定向,当匹配不到其他路由路径时,渲染Home组件。

#[derive(Routable, Clone, PartialEq)]
enum Route {#[route("/")]#[redirect("/:..segments",|segments:Vec<String>| Route::Home {})]Home,
}

对于处理路由匹配不到的处理只能选择其中一个配置,不能同时设置。

对于:..routes捕获剩余路由路径也可用于路由的嵌套路由中,比如#[route("/note/:..routes")]

路由导航

dioxus 提供了组件Link 用来跳转到指定路由。

#[component]
pub fn Home() -> Element {rsx! {Link { to:Route::AddNote {} , "Add Note" },Link { to:"https://www.baidu.com", "Baidu" },}
}

也支持直接跳转第三方链接。还可以通过navigator全局函数获取到导航实例,通过方法手动跳转指定路由

  • push 跳转到指定路由
  • replace 替换当前路由,路由历史丢失,不能回退。
  • go 跳转到指定路由,路由历史保留,可以回退。
  • go_back 返回上一级路由。
  • go_forward 返回下一级路由。
#[component]
pub fn Home() -> Element {let router = navigator();rsx! {button {onclick: move |_| {router.push(Route::AddNote {});},"Add Note"}}
}

虽然功能上navigatorLink类似,但是对于外部链接navigator并不保证跳转成功。

为了方便路由的前进、后退,dioxus提供了全局组件GoBackButtonGoForwardButton直接使用,避免了通过点击事件处理函数手动跳转。

#[component]
pub fn Add() -> Element {rsx! {GoBackButton {"back"}}
}

连接数据库

现在能用的数据库很多了,这里找一个简单的数据库测试存储。不需要额外安装的嵌入式数据库,比如SQLite

安装依赖rusqlite

cargo add rusqlite --optional

新增一个db.rs用于管理操作数据库,数据库操作只能在服务端运行, 我们需要使用#[cfg(feature = "server")]

#[cfg(feature = "server")]
thread_local! {pub static DB: rusqlite::Connection = {println!("DB init");let conn = rusqlite::Connection::open("note.db").unwrap();conn.execute_batch("CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY,content TEXT NOT NULL)",).unwrap();conn};
}

修改我们之前保存信息的服务端方法,把保存到文件改为存储到数据库表中。

#[server]
pub async fn save_note(content: String) -> Result<(), ServerFnError> {println!("received note {}", content);// 存储到当前目录文件中 note.txt// std::fs::write("note.txt", content).unwrap();#[cfg(feature = "server")]{use crate::db::DB;let inserted = DB.with(|f| f.execute("INSERT INTO notes (content) VALUES (?1)", [&content])).expect("failed to insert into notes");println!("inserted {} rows", inserted);}Ok(())
}

同样的,在操作数据库也应该保证是在服务端运行#[cfg(feature = "server")],启动我们的程序dx serve --platform web,在交互接口调用时,同时完成了数据初始化,并保存了数据到note.db中。

可以看到当前服务目录下自动生成了note.db文件,并且可以查看到数据已经保存到数据库中。
在这里插入图片描述

引用

  • dioxus

  • dioxus-doc

相关文章:

rust 全栈应用框架dioxus server

接上一篇文章dioxus全栈应用框架的基本使用&#xff0c;支持web、desktop、mobile等平台。 可以先查看上一篇文章rust 全栈应用框架dioxus&#x1f448; 既然是全栈框架&#xff0c;那肯定是得有后端服务的&#xff0c;之前创建的服务没有包含后端服务包&#xff0c;我们修改…...

Clinica集成化的开源平台-神经影像研究

Clinica集成化的开源平台-神经影像研究 &#x1f31f; Clinica集成化的开源平台-神经影像研究引言 &#x1f6e0;️ 一、环境搭建与数据准备1. 安装Clinica&#xff08;附避坑指南&#xff09;2. 数据标准化&#xff08;BIDS格式处理&#xff09; &#x1f9e0; 二、sMRI预处理…...

LabVIEW中算法开发的系统化解决方案与优化

在 LabVIEW 开发环境中&#xff0c;算法实现是连接硬件数据采集与上层应用的核心环节。由于图形化编程范式与传统文本语言存在差异&#xff0c;LabVIEW 中的算法开发需要特别关注执行效率、代码可维护性以及与硬件资源的适配性。本文从算法架构设计、性能优化到工程实现&#x…...

【Pandas】pandas DataFrame cov

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

【递归、搜索与回溯】专题一:递归(一)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人递归&#xff0c;搜索与回溯算法的学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码…...

pythonocc 拉伸特征

micromamba install -c conda-forge pythonocc-core opencascade.js安装不起来&#xff0c;ai用pythonocc练个手 拉伸线框 线成面 from OCC.Core.gp import gp_Pnt, gp_Dir, gp_Vec from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire f…...

防爆手机与普通手机有什么区别

在石油化工、矿山能源、危化品运输等特殊行业中&#xff0c;一部手机的选择可能直接关系到生产安全与人员生命。防爆手机作为工业安全通信的核心工具&#xff0c;与日常使用的普通手机存在本质差异。本文将从技术原理、安全标准、功能设计及适用场景等维度&#xff0c;解析二者…...

动手学深度学习12.3.自动并行-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;无 本节教材地址&#xff1a;12.3. 自动并行 — 动手学深度学习 2.0.0 documentation 本节开源代…...

第二十二天打卡

数据预处理 import pandas as pd from sklearn.model_selection import train_test_splitdef data_preprocessing(file_path):"""泰坦尼克号生存预测数据预处理函数参数:file_path: 原始数据文件路径返回:preprocessed_data: 预处理后的数据集""&quo…...

SET NX互斥功能的实现原理

Redis 的 SET key value NX 命令通过其原子性和底层数据结构的特性实现互斥功能&#xff0c;具体实现如下&#xff1a; 1. 互斥功能的实现原理 SET NX 的核心是 原子性操作&#xff1a;当且仅当键&#xff08;key&#xff09;不存在时&#xff0c;才会设置键的值。Redis 的单线…...

前端 CSS 样式书写与选择器 基础知识

1.CSS介绍 CSS是Cascading Style Sheet的缩写&#xff0c;中文意思为"层叠样式表"&#xff0c;它是网页的装饰者&#xff0c;用来修饰各标签 排版(大小、边距、背景、位置等)、改变字体的样式(字体大小、字体颜色、对齐方式等)。 2.CSS书写位置 2.1 样式表特征 层…...

一小时学会Docker使用!

文章目录 前言一、安装ssh连接工具二、安装docker三、Docker常见命令四、docker-compose使用 前言 Docker&#xff1a; Docker简单来说就是简化环境配置的&#xff0c;我们配置环境只需要简单的docker pull&#xff0c;docker run即可&#xff0c;而删除环境也很容易&#xff…...

android studio开发aar插件,并用uniapp开发APP使用这个aar

android studio开发aar插件&#xff0c;并用uniapp开发APP使用这个aar 使用android studio打包aar和Unity导入aar详解...

操作系统实战——QEMU模拟器搭建【rCore 操作系统】

操作系统大作业——QEMU模拟器搭建rCore操作系统 按照本篇步骤走&#xff0c;帮你少走很多弯路&#xff01;博主在自己做的过程中踩了很多坑&#xff0c;过程还是很痛苦的&#xff0c;走了很多弯路&#xff0c;现在都已经在文章中把坑填平了&#xff0c;把弯路修直了。 创作不易…...

web:InfiniteScroll 无限滚动

InfiniteScroll 无限滚动 分页加载 <div class"data-box" v-infinite-scroll"loadMore"> <li v-fori in dataList></li> </div>form: {current: 1,size: 10,}loadMore(){console.log(this.dataList.length, this.total ,8888)if…...

【Redis 进阶】哨兵模式

思维导图&#xff1a; 一、哨兵模式概述 &#xff08;一&#xff09;传统主从复制模式的局限性 在传统的Redis主从复制架构中&#xff0c;若主节点发生故障&#xff0c;运维人员需手动执行故障转移操作&#xff0c;将一个从节点提升为新主节点&#xff0c;并逐一通知所有客户…...

告别卡顿,图片查看界的“速度与激情”

嘿&#xff0c;小伙伴们&#xff01;今天电脑天空给大家介绍一款超好用的图片查看神器——ImageGlass&#xff01;这可不是普通的图片查看软件哦&#xff0c;它简直就是图片界的“全能王”。首先&#xff0c;它能打开的图片格式多到让你眼花缭乱&#xff0c;什么PNG、JPEG、GIF…...

02_线性模型(回归分类模型)

用于分类的线性模型 线性模型也广泛应用于分类问题&#xff0c;可以利用下面的公式进行预测&#xff1a; $ \widehat y w[0]*x[0]w[1]*x[1]…w[p]*x[p]b > 0$ 公式看起来与线性回归的公式非常相似&#xff0c;但没有返回特征的加权求和&#xff0c;而是为预测设置了阈值…...

力扣2094题解

记录&#xff1a; 2025.5.12 题目&#xff1a; 思路&#xff1a; 暴力遍历。 解题步骤&#xff1a; 1.统计数字出现次数&#xff1a;使用数组cnt来记录输入数组中每个数字的出现次数。 2.生成三位偶数&#xff1a;通过循环从100开始&#xff0c;每次递增2&#xff0c;生成…...

人物角色设定机制

模块一&#xff1a;角色塑造进阶技巧 将角色设定(Character Headcanon)提升至更高层次 当您通过Character Headcanon Generator生成基础设定后&#xff0c;可运用以下专业技巧深化角色塑造&#xff1a; 情感核心图谱分析法 解构角色情感驱动机制及其情境表现&#xff1a; 主…...

Python动态渲染页面抓取之Selenium使用指南

目录 一、Selenium技术架构解析 二、环境搭建与基础配置 1. 组件安装 2. 驱动配置 3. 基础操作模板 三、动态内容抓取核心策略 1. 智能等待机制 2. 交互行为模拟 3. 反爬应对方案 四、实战案例&#xff1a;电商评论抓取 五、性能优化与异常处理 2. 异常捕获 六、进…...

智能手表 MCU 任务调度图

智能手表 MCU 任务调度图 处理器平台&#xff1a;ARM Cortex-M33 系统架构&#xff1a;事件驱动 多任务 RTOS RTOS&#xff1a;FreeRTOS&#xff08;或同类实时内核&#xff09; 一、任务调度概览 任务名称优先级周期性功能描述App_MainTask中否主循环调度器&#xff0c;系统…...

【C++】cout的格式输出

目录 一、cout的格式输出1、控制宽度和填充2、控制数值格式3、控制整数格式4、控制对齐方式 个人主页<—请点击 C专栏<—请点击 一、cout的格式输出 printf函数在输出数据的时候&#xff0c;可以指定格式来输出&#xff0c;比如&#xff1a;指定宽度、指定小数点后的位…...

私域流量新阵地:掌握Telegram私域运营全方法

在流量获取成本不断上升的今天&#xff0c;越来越多企业和品牌开始将目光转向“私域流量”——一条可以长期沉淀用户、反复转化的可持续增长之路。而在全球化趋势下&#xff0c;Telegram作为一款以高自由度、强隐私性著称的即时通讯平台&#xff0c;正在成为私域运营的新阵地。…...

Python Day23 学习

继续SHAP图绘制的学习 1. SHAP特征重要性条形图 特征重要性条形图&#xff08;Feature Importance Bar Plot&#xff09;是 SHAP 提供的一种全局解释工具&#xff0c;用于展示模型中各个特征对预测结果的重要性。以下是详细解释&#xff1a; 图的含义 - 横轴&#xff1a;表示…...

《ATPL地面培训教材13:飞行原理》——第12章:飞行力学基础

翻译&#xff1a;Leweslyh&#xff1b;工具&#xff1a;Cursor & Cluade 3.7&#xff1b;过程稿 第12章&#xff1a;飞行力学基础 目录 引言直线水平稳定飞行尾翼和升降舵直线稳定爬升爬升角重量、高度和温度的影响带动力下降紧急下降滑翔滑翔下降率转弯非对称推力飞行最…...

数据中台整体建设方案规划设计方案,数据中台建设汇报方案(PPT)

中台建设背景 在数字化转型浪潮下&#xff0c;企业需通过客户需求精准化、营销策略智能化、管理体系数字化三大核心方向构建竞争优势。本项目以渠道数据整合为基础&#xff0c;围绕客户精准化运营、营销智能化决策、管理数字化赋能三大目标&#xff0c;打造支撑一线业务场景的数…...

嵌入式软件--stm32 DAY 6 USART串口通讯(下)

1.寄存器轮询_收发字符串 通过寄存器轮询方式实现了收发单个字节之后&#xff0c;我们趁热打铁&#xff0c;争上游&#xff0c;进阶到字符串。字符串就是多个字符。很明显可以循环收发单个字节实现。 然后就是接收字符串。如果接受单个字符的函数放在while里&#xff0c;它也可…...

Flask如何读取配置信息

目录 一、使用 app.config 读取配置 二、设置配置的几种方式 1. 直接设置 2. 从 Python 文件加载 3. 从环境变量加载 4. 从字典加载 5. 从 .env 文件加载&#xff08;推荐开发环境用&#xff09; 三、读取配置值 四、最佳实践建议 在 Flask 中读取配置信息有几种常见方…...

AWS EC2源代码安装valkey命令行客户端

sudo yum -y install openssl-devel gcc wget https://github.com/valkey-io/valkey/archive/refs/tags/8.1.1.tar.gz tar xvzf 8.1.1.tar.gz cd valkey-8.1.1/ make distclean make valkey-cli BUILD_TLSyes参考 Connecting to nodes...

项目全栈实战-基于智能体、工作流、API模块化Docker集成的创业分析平台

目录 思维导图 前置知识 Docker是什么&#xff1f; Docker的核心概念&#xff1a; Docker在本项目中的作用 1. 环境隔离与一致性 2. 简化部署流程 3. 资源管理与扩展性 4. 服务整合与通信 5. 版本控制和回滚 6. 开发与生产环境一致性 总结 前端 1.小程序 2.web …...

如何快速入门大模型?

学习大模型的流程是什么 &#xff1f; 提示词工程&#xff1a;只需掌握提问技巧即可使用大模型&#xff0c;通过优化提问方式获得更精准的模型输出套壳应用开发&#xff1a;在大模型生态上开发业务层产品&#xff08;如AI主播、AI小助手等&#xff09;&#xff0c;只需调用API…...

《Flutter社交应用暗黑奥秘:模式适配与色彩的艺术》

暗黑模式已从一种新奇的功能演变为用户体验中不可或缺的一环。对于Flutter开发者而言&#xff0c;如何在社交应用中完美实现暗黑模式适配与色彩对比度优化&#xff0c;是一场充满挑战与惊喜的技术探索之旅。 暗黑模式&#xff0c;绝非仅仅是将界面颜色反转这么简单。从用户体验…...

【秣厉科技】LabVIEW工具包——OpenCV 教程(21):CUDA 加速方案

文章目录 前言一、方案总述二、改造步骤三、编程范例四、应用移植总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Windows系统&#xff0c;LabVIEW>2018&#xff0c;兼容32位和64位。 一、方案总述 为了保持轻量化与普…...

flutter使用命令生成BinarySize分析图

flutter build ios --analyze-size 生成的文件&#xff0c;使用dev tools 可以分析具体的包大小...

高并发场景下的BI架构设计:衡石分布式查询引擎与缓存分级策略

在电商大促、金融交易时段或IoT实时监控场景中&#xff0c;企业BI系统常面临瞬时万级并发查询的冲击——运营团队需要实时追踪GMV波动&#xff0c;风控部门需秒级响应欺诈检测&#xff0c;产线监控需毫秒级反馈设备状态。传统单体架构的BI系统在此类场景下极易崩溃&#xff0c;…...

web 自动化之 selenium 下拉鼠标键盘文件上传

文章目录 一、下拉框操作二、键盘操作三、鼠标操作四、日期控件五、滚动条操作六、文件上传七、定位windows窗口及窗口的元素总结&#xff1a;页面及元素常用操作 一、下拉框操作 from selenium.webdriver.support.select import Select import time from selenium.webdriver.…...

Qt Creator 配置 Android 编译环境

Qt Creator 配置 Android 编译环境 环境配置流程下载JDK修改Qt Creator默认android配置文件修改sdk_definitions.json配置修改的内容 Qt Creator配置异常处理删除提示占用编译报错 环境 Qt Creator 版本 qtcreator-16.0.1Win10 嗯, Qt这个开发环境有点难折腾,搞了我三天… 配…...

主流编程语言中ORM工具全解析

在不同编程语言中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;工具的设计目标都是简化数据库操作。 以下是主流语言中最常用的 ORM 工具&#xff0c;按语言分类介绍其特点、适用场景和典型案例。 一、Python 生态 Python 社区…...

详解RabbitMQ工作模式之发布确认模式

​​​​​​​ 目录 发布确认模式 概述 消息丢失问题 发布确认的三种模式 实现步骤 应用场景 代码案例 引入依赖 常量类 单条确认 运行代码 批量确认 运行代码 异步确认 运行代码 对比批量确认和异步确认模式 发布确认模式 概述 发布确认模式用于确保消息已…...

Power BI 实操案例,将度量值转化为切片器(动态切换分析指标)

Power BI 实操案例&#xff0c;将度量值转化为切片器&#xff08;动态切换分析指标&#xff09; 想要在Power BI中让度量值也能像维度一样灵活筛选&#xff1f;没问题&#xff0c;这里就为你揭秘如何将度量值转化为切片器&#xff08;动态切换分析指标&#xff09;的实用方法&…...

利用散点图探索宇航员特征与太空任务之间的关系

利用散点图探索宇航员特征与太空任务之间的关系 import matplotlib.pyplot as plt import numpy as np import pandas as pdfrom flexitext import flexitext from matplotlib.patches import FancyArrowPatchplt.rcParams.update({"font.family": "Corbel&quo…...

人工智能的哲学与社会影响

人工智能&#xff08;AI&#xff09;的快速发展对人类社会的方方面面产生了深远的影响。在这部分中&#xff0c;我们将探讨AI对人与机器关系的影响、AI对就业和经济的潜在影响&#xff0c;以及人类与AI共存的可能性和道德议题。同时&#xff0c;我们还将针对大众对AI的一些常见…...

MySQL 中 UPDATE 结合 SELECT 和 UPDATE CASE WHEN 的示例

概述 以下是 MySQL 中 UPDATE 结合 SELECT 和 UPDATE CASE WHEN 的示例&#xff1a; 一、UPDATE 结合 SELECT&#xff08;跨表更新&#xff09; 场景&#xff1a;根据 orders 表中的订单总金额&#xff0c;更新 users 表中用户的 total_spent 字段。 -- 创建测试表 CREATE T…...

FPGA前瞻篇-计数器设计与实现实例

这是本篇文章的设计目标如下所示&#xff1a; 这个 Counter 模块是一个LED 闪烁计数器&#xff0c;设计目标是&#xff1a; 当输入时钟 clk 为 50 MHz 时&#xff0c;每 0.5 秒翻转一次 LED 灯状态。 随后我们开始补充理论知识。 计数是一种最简单基本的运算&#xff0c;计数器…...

运行Spark程序-在Idea中(二)

&#xff08;四&#xff09;使用Maven创建新项目 核心的操作步骤如下&#xff1a; 1.启动idea,选择新建项目。 2.将Scala添加到全局库中。 3.设置maven依赖项。修改pom.xml文件&#xff0c;添加如下&#xff1a; 4.下载依赖。添加完成之后&#xff0c;刷新Maven&#xff0c;它…...

Mosaic数据增强技术

Mosaic 数据增强技术是一种在计算机视觉领域广泛应用的数据增强方法。下面是Mosaic 数据增强技术原理的详细介绍 一、原理 Mosaic 数据增强是将多张图像&#xff08;通常是 4 张&#xff09;按照一定的规则拼接在一起&#xff0c;形成一张新的图像。在拼接过程中&#xff0c;会…...

Kafka、RabbitMQ 和 RocketMQ区别及上手难度

Kafka、RabbitMQ 和 RocketMQ 是三种流行的消息中间件&#xff0c;它们在设计理念、使用场景和上手难度上有显著差异。以下是它们的核心区别和上手难度分析&#xff1a; 1. 核心区别 特性KafkaRabbitMQRocketMQ设计目标高吞吐、分布式日志流处理通用的消息队列&#xff0c;强调…...

.NET 8 + Angular WebSocket 高并发性能优化

.NET 8 Angular WebSocket 高并发性能优化。 .NET 8 WebSocket 高并发性能优化 WebSocket 是一种全双工通信协议&#xff0c;允许客户端和服务端之间保持持久连接。在高并发场景下&#xff0c;优化 WebSocket 的性能至关重要。以下是针对 .NET 8 中 WebSocket 高并发性能优化…...

SimScape物理建模实例1--单质量-弹簧-阻尼系统

实例1模型下载&#xff1a; 【免费】simscape单质量弹簧阻尼模型资源-CSDN文库 如下图所示单质量弹簧阻尼系统&#xff0c;弹簧具有初始压缩量&#xff0c;假设为1m, 质量块除了受到自身重力作用以外&#xff0c;受到弹簧拉力&#xff0c;以及阻尼器阻尼力&#xff0c;根据牛顿…...