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

【Rust光年纪】探索Rust终端编程:从跨平台操作到用户界面设计

构建跨平台终端应用的完美选择:Rust 库综述

前言

随着终端应用程序的发展,越来越多的开发者开始寻找跨平台的、易于使用的库来构建终端用户界面和执行终端操作。本文将介绍几个流行的 Rust 库,它们提供了丰富的功能和灵活的 API 来满足不同需求。

欢迎订阅专栏:Rust光年纪

文章目录

  • 构建跨平台终端应用的完美选择:Rust 库综述
    • 前言
    • 1. crossterm:跨平台的跨终端库
      • 1.1 简介
        • 1.1.1 核心功能
        • 1.1.2 使用场景
      • 1.2 安装与配置
        • 1.2.1 安装指南
        • 1.2.2 基本配置
      • 1.3 API 概览
        • 1.3.1 跨平台兼容性
        • 1.3.2 终端操作
    • 2. termion:一个用于构建终端应用的库
      • 2.1 简介
        • 2.1.1 核心功能
        • 2.1.2 使用场景
      • 2.2 安装与配置
        • 2.2.1 安装指南
        • 2.2.2 基本配置
      • 2.3 API 概览
        • 2.3.1 终端交互
        • 2.3.2 屏幕控制
    • 3. rustyline:一个用于实现基于GNU Readline的线程安全的命令行编辑库
      • 3.1 简介
        • 3.1.1 核心功能
        • 3.1.2 使用场景
      • 3.2 安装与配置
        • 3.2.1 安装指南
        • 3.2.2 基本配置
      • 3.3 API 概览
        • 3.3.1 命令行编辑
        • 3.3.2 自动补全
    • 4. pancurses:一个用于跨平台的ncurses库
      • 4.1 简介
        • 4.1.1 核心功能
        • 4.1.2 使用场景
      • 4.2 安装与配置
        • 4.2.1 安装指南
        • 4.2.2 基本配置
      • 4.3 API 概览
        • 4.3.1 窗口管理
        • 4.3.2 用户输入处理
    • 5. tui-rs:一个用于构建终端用户界面的Rust库
      • 5.1 简介
      • 5.2 安装与配置
        • 5.2.1 安装指南
        • 5.2.2 基本配置
      • 5.3 API 概览
        • 5.3.1 终端UI组件
        • 5.3.2 事件处理
    • 6. Crossterm Winapi: 一个用于在Windows上直接调用Windows API的Crossterm扩展库
      • 6.1 简介
        • 6.1.1 核心功能
        • 6.1.2 使用场景
      • 6.2 安装与配置
        • 6.2.1 安装指南
        • 6.2.2 基本配置
      • 6.3 API 概览
        • 6.3.1 Windows API调用
        • 6.3.2 平台特定功能支持
    • 总结

1. crossterm:跨平台的跨终端库

1.1 简介

crossterm是一个用于处理终端操作的Rust库,可以在不同的平台和终端上运行。它提供了一系列功能丰富的API,方便开发者进行终端操作。

1.1.1 核心功能

crossterm库的核心功能包括但不限于:

  • 控制光标移动
  • 修改文本样式
  • 获取终端尺寸
  • 清屏等终端操作
1.1.2 使用场景

crossterm可应用于构建命令行工具、图形用户界面以及需要与终端交互的应用程序中。

1.2 安装与配置

1.2.1 安装指南

你可以在Cargo.toml文件中添加以下代码来安装crossterm:

[dependencies]
crossterm = "0.20"

更多安装详情,请参考 crossterm官方文档

1.2.2 基本配置

使用crossterm前,需要在项目文件中引入以下模块:

use crossterm::{execute,style::{Color, Print, ResetColor, SetBackgroundColor, SetForegroundColor},ExecutableCommand,
};

1.3 API 概览

1.3.1 跨平台兼容性

crossterm确保了在不同的操作系统上都能正常运行,包括Windows、Mac和Linux等。

1.3.2 终端操作

接下来我们使用crossterm进行一些基本的终端操作示例:

use crossterm::{execute,style::{Color, Print, ResetColor, SetBackgroundColor, SetForegroundColor},ExecutableCommand,
};fn main() {// 清空终端execute!(std::io::stdout(),Clear(ClearType::All), // Clear all cells in the terminal.).unwrap();// 移动光标到指定位置execute!(std::io::stdout(),MoveTo(10, 5), // Move the cursor to column 10, row 5.).unwrap();// 设置前景色和背景色并打印文本execute!(std::io::stdout(),SetForegroundColor(Color::Yellow),SetBackgroundColor(Color::Blue),Print("Hello, crossterm!"),ResetColor,).unwrap();
}

以上是crossterm库在Rust中的简单应用示例,更多API的使用方法请查阅 crossterm官方文档。

2. termion:一个用于构建终端应用的库

termion是一个用于构建终端应用的Rust库,它提供了许多功能,使得在终端中创建用户界面和进行交互变得更加简单。本文将介绍termion库的简介、安装与配置以及API概览。

2.1 简介

2.1.1 核心功能

termion库的核心功能包括:

  • 处理终端输入
  • 控制光标和颜色
  • 清屏和移动光标等

这些功能可以帮助开发者构建各种复杂的终端应用程序,例如命令行工具、游戏以及终端编辑器等。

2.1.2 使用场景

termion可用于构建各种类型的终端应用,从简单的命令行工具到复杂的终端用户界面(TUI)都可以使用该库进行开发。

2.2 安装与配置

2.2.1 安装指南

要使用termion库,需要确保已经安装了Rust编程语言和Cargo包管理器。接下来,在项目的Cargo.toml文件中添加以下依赖:

[dependencies]
termion = "1.5.6"

然后执行以下命令安装termion库:

$ cargo build
2.2.2 基本配置

在使用termion之前,需要首先引入该库。以下是一个简单的示例代码:

extern crate termion;use termion::event::Key;
use termion::input::TermRead;fn main() {for c in std::io::stdin().keys() {match c.unwrap() {Key::Char('q') => break,_ => println!("pressed {:?}", c),}}
}

上述示例演示了如何导入termion库,并监听终端的按键事件。

2.3 API 概览

2.3.1 终端交互

termion库提供了一系列用于处理终端输入输出的API。例如,可以通过write()函数将字符写入终端,通过flush()函数刷新输出缓冲区。

use std::io::{Write, stdout};
use termion::raw::IntoRawMode;fn main() {let mut stdout = stdout().into_raw_mode().unwrap();write!(stdout, "{}", termion::clear::All);stdout.flush().unwrap();
}

以上代码演示了如何使用termion清空终端屏幕。

2.3.2 屏幕控制

通过termion,还可以控制终端屏幕的光标位置、颜色以及其他外观属性。例如,通过cursor::Goto(x, y)可以将光标移动到指定位置。

use std::io::{Write, stdout};
use termion::cursor;fn main() {let mut stdout = stdout();write!(stdout, "{}", cursor::Goto(5, 3));stdout.flush().unwrap();
}

以上代码演示了如何使用termion将光标移动到终端的第5行第3列。

通过以上示例,我们可以看到termion库提供了丰富的API,帮助开发者轻松地构建各种终端应用程序。

更多关于termion库的信息,请查阅 termion官方文档。

3. rustyline:一个用于实现基于GNU Readline的线程安全的命令行编辑库

3.1 简介

rustyline 是一个用于实现基于GNU Readline的线程安全的命令行编辑库。它提供了一种简单的方法来处理用户输入,包括命令行编辑和自动补全功能。

3.1.1 核心功能

rustyline 的核心功能包括:

  • 支持基于 GNU Readline 的命令行编辑
  • 提供线程安全的命令行编辑功能
  • 自动补全功能的支持
3.1.2 使用场景

rustyline 可以被广泛应用于需要命令行编辑和自动补全功能的 Rust 应用程序中,例如交互式命令行工具、Shell 程序等。

3.2 安装与配置

3.2.1 安装指南

你可以通过在 Cargo.toml 文件中添加以下依赖来安装 rustyline:

[dependencies]
rustyline = "8.2"

更多关于 rustyline 的安装指南可以参考 rustyline 的官方文档

3.2.2 基本配置

一般情况下,rustyline 不需要额外的配置即可进行基本的命令行编辑和自动补全操作。但是你可以根据自己的需求对其进行个性化配置。

3.3 API 概览

3.3.1 命令行编辑

下面是一个简单的使用 rustyline 进行命令行编辑的例子:

use rustyline::error::ReadlineError;
use rustyline::Editor;fn main() {let mut rl = Editor::<()>::new();if let Err(_) = rl.load_history("history.txt") {println!("No previous history.");}loop {let readline = rl.readline(">> ");match readline {Ok(line) => {rl.add_history_entry(line.as_str());println!("Line: {}", line);},Err(ReadlineError::Interrupted) => {println!("CTRL-C");break},Err(ReadlineError::Eof) => {println!("CTRL-D");break},Err(err) => {println!("Error: {:?}", err);break}}}rl.save_history("history.txt").unwrap();
}
3.3.2 自动补全

rustyline 也提供了自动补全的功能,下面是一个简单的自动补全示例:

use rustyline::completion::{Completer, FilenameCompleter};
use rustyline::error::ReadlineError;
use rustyline::Editor;struct SimpleCompleter {words: Vec<String>,
}impl Completer for SimpleCompleter {fn complete(&self, line: &str, pos: usize) -> Result<(usize, Vec<String>), ReadlineError> {let s: String = line.chars().take(pos).collect();let mut vec = Vec::new();for w in &self.words {if w.starts_with(&s) {vec.push(w.clone());}}Ok((0, vec))}
}fn main() {let completer = FilenameCompleter::new();let mut rl = Editor::<()>::new();rl.set_completer(Some(Box::new(completer)));let _ = rl.bind_sequence("\t", rustyline::Cmd::Complete);loop {let readline = rl.readline(">> ");match readline {Ok(line) => {rl.add_history_entry(line.as_str());println!("Line: {}", line);},Err(ReadlineError::Interrupted) => {println!("CTRL-C");break},Err(ReadlineError::Eof) => {println!("CTRL-D");break},Err(err) => {println!("Error: {:?}", err);break}}}
}

更多关于 rustyline 的 API 概览可以参考 [rustyline

4. pancurses:一个用于跨平台的ncurses库

Pancurses 是一个基于 Rust 语言的用于跨平台的 ncurses 库,可以在终端中实现文本界面的显示和交互。它提供了丰富的 API,适用于需要在命令行环境下构建用户界面的应用程序。

4.1 简介

4.1.1 核心功能

Pancurses 提供了一系列函数和结构体,用于创建、管理和渲染文本界面。它支持创建窗口、添加文字、处理鼠标和键盘输入等功能,使得开发者可以通过代码控制命令行界面的展示和交互。

4.1.2 使用场景

Pancurses 可以被广泛用于需要在终端环境下构建用户界面的应用,比如命令行工具、游戏或者系统管理程序等。

4.2 安装与配置

4.2.1 安装指南

你可以在 Cargo.toml 文件中添加 pancurses 作为依赖:

[dependencies]
pancurses = "0.17"

然后运行 cargo build 来安装 pancurses。

关于更多详细的安装方式,你可以访问 Pancurses GitHub 仓库 获取最新的安装指南。

4.2.2 基本配置

在开始使用 Pancurses 之前,你需要确保已经初始化了 curses 库。你可以使用 initscr() 函数来进行初始化,并在程序结束时调用 endwin() 来关闭 curses。

4.3 API 概览

4.3.1 窗口管理

Pancurses 提供了一系列函数来创建和管理窗口,比如 newwin() 来创建新窗口,mvwin() 来移动窗口位置,以及 box() 来为窗口添加边框等。

以下是一个简单的例子:

use pancurses::{initscr, endwin, Window};fn main() {let window = initscr();// 创建一个新窗口let new_window = window.newwin(10, 30, 5, 5);new_window.box('|', '-');// 刷新窗口new_window.refresh();// 关闭窗口endwin();
}
4.3.2 用户输入处理

Pancurses 也提供了丰富的函数来处理用户输入,比如 getch() 用于获取单个字符的输入,getstr() 用于获取字符串输入等。

以下是一个简单的例子:

use pancurses::{initscr, endwin, Window};fn main() {let window = initscr();window.printw("请输入你的名字:");window.refresh();let mut input = String::new();window.getstr(&mut input);window.printw(&format!("你输入的名字是:{}", input));window.refresh();window.getch();endwin();
}

更多关于 Pancurses 的 API 信息,你可以访问 Pancurses 文档 获取完整的 API 参考和用法说明。

5. tui-rs:一个用于构建终端用户界面的Rust库

tui-rs 是一个 Rust 语言编写的库,用于构建终端用户界面(TUI)。它提供了丰富的功能,使得开发者能够轻松地在终端环境中创建各种复杂的用户界面。本文将介绍 tui-rs 的核心功能、使用场景、安装与配置方法以及 API 概览。

5.1 简介

tui-rs 的核心功能包括但不限于:

  • 提供基础的 TUI 组件,例如窗口、面板、文本框等
  • 支持自定义样式和主题
  • 能够处理鼠标和键盘事件
  • 支持基于渲染器的布局管理

tui-rs 适用于需要在终端界面中展示信息、接收用户输入或与命令行交互的场景,例如系统监控工具、终端版游戏、日志查看器等。

5.2 安装与配置

5.2.1 安装指南

要使用 tui-rs,首先需要在项目的 Cargo.toml 文件中添加以下依赖:

[dependencies]
tui = "0.16"

然后在代码中引入 tui-rs 库:

use tui::widgets::{Widget, Block, Borders};
use tui::layout::{Layout, Constraint, Direction};
use tui::backend::TermionBackend;
use tui::Terminal;
use termion::raw::IntoRawMode;
use std::io;fn main() -> Result<(), io::Error> {let stdout = io::stdout().into_raw_mode()?;let backend = TermionBackend::new(stdout);let mut terminal = Terminal::new(backend)?;terminal.draw(|f| {let size = f.size();let chunks = Layout::default().direction(Direction::Vertical).constraints([Constraint::Ratio(1, 3),Constraint::Ratio(2, 3),]).split(size);let block = Block::default().title("Block").borders(Borders::ALL);f.render_widget(block, chunks[0]);})?;Ok(())
}
5.2.2 基本配置

tui-rs 可以通过设置颜色、字体等参数来进行基本配置。更多配置选项可以在官方文档中找到。

5.3 API 概览

5.3.1 终端UI组件

tui-rs 提供了丰富的 UI 组件,如窗口(Window)、面板(Panel)、文本框(Text Box)、列表(List)等。这些组件能够帮助开发者快速构建复杂的终端用户界面。

5.3.2 事件处理

tui-rs 能够处理鼠标、键盘等事件,并根据用户的操作更新界面。例如,可以监听键盘输入并实时更新终端中的内容。

更多关于 tui-rs 的详细信息可以访问官方网站:tui-rs GitHub

以上是对 tui-rs 的简要介绍,希望能够帮助你快速上手使用这个强大的 Rust TUI 库。

6. Crossterm Winapi: 一个用于在Windows上直接调用Windows API的Crossterm扩展库

6.1 简介

Crossterm Winapi 是一个为在 Windows 上直接调用 Windows API 提供支持的 Crossterm 扩展库。它允许 Rust 开发者利用 Windows API 的丰富功能,从而增强终端应用程序的能力。

6.1.1 核心功能
  • 直接调用 Windows API
  • 增强终端应用程序的功能和性能
6.1.2 使用场景
  • 创建更复杂、更强大的终端应用程序
  • 实现与 Windows API 相关的特定功能

6.2 安装与配置

6.2.1 安装指南

你可以通过在你的 Cargo.toml 文件中添加以下代码来安装 Crossterm Winapi:

[dependencies]
crossterm_winapi = "0.7"

更多安装信息,请参考 Crossterm Winapi Github 页面。

6.2.2 基本配置

要使用 Crossterm Winapi,你需要先确保你的项目已经配置好了相关的依赖,并且你的开发环境是在 Windows 上。

use crossterm_winapi::{Console, Coord, Handle, HandleType, ScreenBuffer, Size};fn main() {let console = Console::from(Handle::current_out_handle().unwrap());let screen_buffer = ScreenBuffer::from(Handle::current_out_handle().unwrap());// 更多配置内容,请查阅官方文档
}

6.3 API 概览

6.3.1 Windows API调用
use crossterm_winapi::{Console, Handle, HandleType};fn main() {let console = Console::from(Handle::current_out_handle().unwrap());// 调用 Windows API 获取控制台相关信息
}
6.3.2 平台特定功能支持

Crossterm Winapi 提供了对 Windows API 的全面支持,包括各种平台特定功能。具体示例请参考 Crossterm Winapi 官方文档。

以上是 Crossterm Winapi 的基本介绍和使用方式,希望对你有所帮助!

总结

通过本文的阅读,您将对几个流行的 Rust 库有一个清晰的认识,分别是 crossterm、termion、rustyline、pancurses、tui-rs 以及 Crossterm Winapi 扩展库。每个库都具有独特的特点和适用场景,使得您能够根据自身项目需求做出明智的选择,并且能够快速上手使用这些库来构建出色的终端应用程序。

相关文章:

【Rust光年纪】探索Rust终端编程:从跨平台操作到用户界面设计

构建跨平台终端应用的完美选择&#xff1a;Rust 库综述 前言 随着终端应用程序的发展&#xff0c;越来越多的开发者开始寻找跨平台的、易于使用的库来构建终端用户界面和执行终端操作。本文将介绍几个流行的 Rust 库&#xff0c;它们提供了丰富的功能和灵活的 API 来满足不同…...

67、ceph

一、ceph 1.1、ceph概念 ceph是一个开源的&#xff0c;用c语言写的分布式的存储系统。存储文件数据。 /dev/sdb fdisk /dev/sdb gdisk /dev/sdb lvm 逻辑卷 可以扩容 raid 磁盘阵列 高可用 基于物理意义上的单机的存储系统。 分布式有多台物理磁盘组成一个集群&…...

最大正方形[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 在一个由0和1组成的二维矩阵内&#xff0c;找到只包含1的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [["1","0","1","0","0"],[&quo…...

JavaScript 浅谈观察者模式 前端设计模式

2、观察者模式 2.1、观察者模式 2.1.1、前言 定义一种一对多的依赖关系&#xff0c;当一个对象发生变化时&#xff0c;所有依赖于它的对象都会自动收到通知并更新。 两个角色&#xff1a; Subject&#xff08;主题/被观察者&#xff09; Observer&#xff08;观察者&…...

【自动驾驶】自定义消息格式的话题通信(C++版本)

目录 新建消息文件更改包xml文件中的依赖关系更改cmakelist文件中的配置执行时依赖改变cmakelist编译顺序发布者程序调用者程序新建launch文件程序测试 新建消息文件 在功能包目录下&#xff0c;新建msg文件夹&#xff0c;下面新建mymsg.msg文件&#xff0c;其内容为 string …...

提升前端性能的JavaScript技巧

1. 前端JavaScript性能问题 前端JavaScript的性能问题可以显著影响Web应用的用户体验和整体性能。以下是一些常见的前端JavaScript性能问题: 1.1. 频繁的DOM操作 问题描述:JavaScript经常需要与DOM(文档对象模型)交互来更新页面内容。然而,每次DOM操作都可能触发浏览器的…...

“服务之巅:Spring Cloud中SLA监控与管理的艺术“

标题&#xff1a;“服务之巅&#xff1a;Spring Cloud中SLA监控与管理的艺术” 在微服务架构中&#xff0c;服务调用的可靠性和性能是至关重要的。服务级别协议&#xff08;Service Level Agreement&#xff0c;简称SLA&#xff09;是衡量服务性能的关键指标&#xff0c;它定义…...

ChatGPT角色定位提问提示词和指令完整版

角色定位提问 在与ChatGPT的对话中&#xff0c;角色定位提问是一种有效的策略&#xff0c;通过为ChatGPT和自己设定特定的角色或身份&#xff0c;可以引导对话朝着更加具体、有针对性的方向发展。这种提问方式不仅有助于ChatGPT更好地理解问题的背景和需求&#xff0c;还能使回…...

docker之我不会的命令

docker命令之我不会的 保存镜像&#xff08;打包&#xff09; docker save 镜像名或镜像id -o 保存路径和镜像名字例子&#xff1a; docker save tomcat -o /home/my_tomcat.tar加载保存的镜像 docker load -i 镜像保存的位置例子 在/home/路径下 docker load -i my_tomca…...

Together规则引擎 金融解决方案

目录 1.金融法规和期望正在发生变化,快速跟踪您的金融数字化变革&#xff01;2.抵押贷款功能集&#xff08;MFS&#xff09;3.MFS 示例模型4.MFS 知识特点5.MFS特定功能 1.金融法规和期望正在发生变化,快速跟踪您的金融数字化变革&#xff01; ogether规则引擎使金融机构能够简…...

【PyQt5】PyQt5 主要类

1.经常使用的模块 Sr.No.模块描述1QtCore其他模块使用的核心非GUI类2QtGui图形用户界面组件3QtMultimedia低级多媒体编程的类4QtNetwork网络编程的类5QtOpenGLOpenGL支持类6QtScript用于评估Qt脚本的类7QtSql使用SQL进行数据库集成的类8QtSvg用于显示SVG文件内容的类9QtWebKit…...

渗透测试实战-HFS远程RCE漏洞利用

免责声明&#xff1a;文章来源于真实渗透测试&#xff0c;已获得授权&#xff0c;且关键信息已经打码处理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本…...

企业级管理系统模板 -- 若依

文章目录 前言一、若依模板运行效果二、若依模板下载地址 1、版本说明2、前端下载地址3、后端下载地址三、修改模板代码名称四、修改前端标题及logo总结 前言 在我们学习别人的项目时&#xff0c;总会遇到许多不同的管理系统&#xff0c;例如&#xff1a;学生管理系统&#xf…...

无人车搭载无人机技术详解

无人车搭载无人机技术&#xff0c;是近年来智能交通与无人机技术深度融合的产物&#xff0c;旨在通过集成两者的优势&#xff0c;实现更加灵活、高效的作业能力。该技术将无人机作为无人车的一个可移动、多功能的传感器平台或执行器&#xff0c;通过协同工作&#xff0c;扩展无…...

从“抠图”到“抠视频”,Meta上新AI工具SAM 2。

继2023年4月首次推出SAM&#xff0c;实现对图像的精准分割后&#xff0c;Meta于北京时间2024年7月30日推出了能够分割视频的新模型SAM 2&#xff08;Segment Anything Model 2&#xff09;。SAM 2将图像分割和视频分割功能整合到一个模型中。所谓“分割”&#xff0c;是指区别视…...

一篇讲清楚什么是密码加密和加盐算法 | 附Java代码实现

目录 前言&#xff1a; 一、密码加密 1. MD5介绍 2.彩虹表攻击 3.测试复杂密码是否能被攻破 二、加盐算法 1.对密码123456演示加盐算法 2.盐值的储存 3.密码加盐思想总结 三、Java代码实现 前言&#xff1a; 早些年&#xff0c;数据泄露屡见不鲜&#xff0c;每个班上总…...

C++入门2

函数重载 函数重载&#xff1a;是函数的一种特殊情况&#xff0c;C允许在同一作用域中声明几个功能类似的同名函数&#xff0c;这 些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同&#xff0c;常用来处理实现功能类似数据类型 不同的问题 比如下面的 int add(int x…...

在Nestjs使用mysql和typeorm

1. 创建项目 nest new nest-mysql-test 2. 添加config 安装 nestjs/config 包 pnpm i --save nestjs/config 添加 .env 文件 DATABASE_HOSTlocalhost DATABASE_PORT3306 DATABASE_USERNAMEroot DATABASE_PASSWORD123456 DATABASE_DBdbtest 创建 config/database.config.…...

【数据库】MySql深度分页SQL查询优化

问题描述 mysql中&#xff0c;使用limitoffset实现分页难免会遇到深度分页问题&#xff0c;即页码数越大&#xff0c;性能越差。 select * from student order by id limit 200000,10;如上语句&#xff0c;其实我们希望查询第20000页的10条数据&#xff0c;实际执行会发现耗时…...

黑马Java零基础视频教程精华部分_14_正则表达式

系列文章目录 文章目录 系列文章目录一、先爽一下正则表达式不使用正则的情况下使用正则的情况下 二、正则表达式的作用三、正则表达式具体表达1、规则2、字符类示例3、预定义字符示例首先学习转义字符 示例练习 四、基本练习1、快捷方法&#xff1a;2、验证手机号3、验证座机电…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...