Android后端签到flask迁移到rust的axum的过程-签到性能和便携
本次变更了以下内容:
- 为了使用之前ip2sta的ip到端点名的python,dic变量,将其存入redis hashset.使用地址/api/ip2dic 手动执行之.并且定义在/station/init,这个每天初始化redis的路径下.
- 在rust axum使用redis 连接池在test中 ip2dic,IP转端点名,转本日此端网址.
- 在前端的人名下使用了乒乓操作.点击状态切换,并把签到的人汇总到请假列. 可以请假和取消请假. 三个集合存数据.
*. 1端点对应的人名集合,key day/端点名
*. 2.签到的集合,key check:端点名
*. 3,请假的集合 key check:端点名:thin (hashset,可以存放具体内容,但没使用) - 最后是调整caddy的反代,需要使用 个别路径的跳转,其中rust使用全新的根路径下的子路径,但是android入口也就是获得IP并且ip2sta转到端点名的路径,定义到新的rust接口.剩下的由rust实现,移动端的功能.需要使用以下语法快.在rust规划中应该加入somepath目录,这样,调试和发布,就能通用了.
handle_path /somepath/*
rewrite * /somerust{path}
上个文章给出了示例redis连接池.本次在它基础扩展了几乎全部adroid,app,webkit所使用网页的实现方式,切换为axum.主要逻辑从python直接迁移.说下缺点:
- js,html,rust, 互相掺和在一起.至今也不愿隔离.由于include ,js,bootstrap,css,.这些都在运行环境,所以的cargo run的运行时虽然可以绑定redis,但是静态文件并不能直达.需要一个解决的办法.
- 路径的话,归结为一个统一子路径,这样容易迁移,尤其在反向代理的时候,暴露一个统一子路径就比较好了.
- route不能如flask, /test /test/ test/:arg 定向到一个函数fn, 使用变量赋值缺省值的方式.
- 路径下函数的调用,不太知道怎么做,所以功能的分离做起来挺费劲的.
- 关于参数的传递有点太过神奇,不知道怎么就过去了,但是要想formt!()宏的第一个参数使用,一段文件里的内容最后怎么也无法实现,最后用了mut string的 replace.
速度和易用性肯定有提升,但是意义不算大.还有就是,可执行文件5.7M,不要建立python.环境.小功率设备也可以.这是全部的好处了.以下是总代码.
Cargo.toml
[package]
name = "hello-axum"
version = "0.1.0"
edition = "2021"[dependencies]
axum = "0.8.0-alpha.1"
bb8 = "0.8.5"
bb8-redis = "0.17.0"
redis = "0.27.2"
tokio = { version = "1.0", features = ["full", "macros", "rt-multi-thread"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
chrono = "0.4.39"
main.rc
use axum::{extract::{FromRef, FromRequestParts, Path, State },http::{header::HeaderValue,request::{self, Parts}, StatusCode},response::Html,routing::get,http::HeaderMap,response::Redirect,Router,
};
use std::{any::{type_name,type_name_of_val, TypeId}, result};
use bb8::{Pool, PooledConnection};
use bb8_redis::RedisConnectionManager;
use redis::AsyncCommands;
use tracing_subscriber::{fmt::format, layer::SubscriberExt, util::SubscriberInitExt};use chrono::Local;
use bb8_redis::bb8;#[tokio::main]
async fn main() {tracing_subscriber::registry().with(tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| format!("{}=debug", env!("CARGO_CRATE_NAME")).into()),).with(tracing_subscriber::fmt::layer()).init();tracing::debug!("connecting to redis");let redurl="redis://ip:6379/9";let manager = RedisConnectionManager::new(redurl).unwrap();let pool = bb8::Pool::builder().build(manager).await.unwrap();{// ping the database before startinglet mut conn = pool.get().await.unwrap();conn.set::<&str, &str, ()>("foo", "barr").await.unwrap();let result: String = conn.get("foo").await.unwrap();assert_eq!(result, "barr");}tracing::debug!("successfully connected to redis and pinged it");// build our application with some routeslet app = Router::new().route("/",get(using_connection_pool_extractor),// post.(using_connection_extractor),)//.route("/rsta/{day}/{sta}", get( bsta)).route("/sta/{day}/{sta}/{person}", get( bsta)).route("/check/{sta}/{person}",get(check)).route("/test/{person}",get(test)).route("/test/",get(test)).route("/thincheck/{sta}/{person}",get(thincheck)).route("/sta/ip2sta",get(using_connection_extractor)).with_state(pool);// run itlet listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();tracing::debug!("listening on {}", listener.local_addr().unwrap());axum::serve(listener, app).await.unwrap();
}type ConnectionPool = Pool<RedisConnectionManager>;async fn using_connection_pool_extractor(State(pool): State<ConnectionPool>,
) -> Result<String, (StatusCode, String)> {let mut conn = pool.get().await.map_err(internal_error)?;let result: String = conn.get("foo").await.map_err(internal_error)?;Ok(format!("端点:{}",result))
}
// my first python route async fn test(State(pool): State<ConnectionPool>,headers: HeaderMap,Path((person)):Path<(String)>
) -> Result<Redirect, (StatusCode, String)> {let mut conn = pool.get().await.map_err(internal_error)?;// let result:Vec<String>= conn.keys("*").await.map_err(internal_error)?;//let key=format!("2024-10-21/{}","衡水北");// let key=&format!("check:{}","衡水北") ;// let result:Vec<String>= conn.lrange(key,0,-1).await.map_err(internal_error)?;// let result :Vec<String>= conn.smembers(key).await.map_err(internal_error)?;// // Ok(format!("{:?}",headers))let mut strip="10.180.145.40:544545";if let Some(ip) = headers.get("X-Forwarded-For") {strip = std::str::from_utf8(ip.as_bytes()).map_err(internal_error)?;}
if let Some(ip) = headers.get("X-Real-IP") {strip = std::str::from_utf8(ip.as_bytes()).map_err(internal_error)?;} let mut cip =String::from(strip);cip.truncate(cip.find(":").unwrap_or(cip.len()));let ipin=conn.hexists("ip2sta", &cip).await.map_err(internal_error)?;let mut sta=String::from("调度");if ipin{sta= conn.hget("ip2sta",&cip).await.map_err(internal_error)?;}// datetime.date.today().strftime("%Y-%m-%d") let now = Local::now();let formatted = now.format("%Y-%m-%d").to_string();Ok(Redirect::to(&format!("/rk/sta/{}/{}/{}",formatted,&sta,&person)))
}
async fn bsta(State(pool): State<ConnectionPool>,Path((day, sta,person )): Path<(String, String,String)>
) -> Result<Html<String>, (StatusCode, String)> {let mut conn = pool.get().await.map_err(internal_error)?;// let result:Vec<String>= conn.keys("*").await.map_err(internal_error)?;// let result:Vec<String>= conn.lrange(key,0,-1).await.map_err(internal_error)?;// let result :Vec<String>= conn.smembers(key).await.map_err(internal_error)?;let homebytes = include_bytes!("home.html");let mut homestr = String::from(std::str::from_utf8(homebytes).map_err(internal_error)?);let mut result=String::from("");if sta.contains("&"){for ista in sta.split("&"){result.push_str( stacheck(State(pool.clone()), &day, &ista).await?.as_str());}
}
else
{result.push_str( stacheck(State(pool.clone()), &day, &sta).await?.as_str());
} let cks=format!(r#"<script type="text/javascript"> function emitinfo(person,urlme){{console.log(person)window.golsocket.emit('mess', person)location.href=urlme// fechange(person,urlme)}}
window.onload = function() {{ document.getElementById("{person}").focus();
}}; </script> <body style="background: url('/images/backgroud.jpg') no-repeat center center fixed;-moz-background-size: cover;-webkit-background-size: cover;-o-background-size: cover;background-size: cover;
" > <div class="page-header" style="width: 100%;"><h3 class="opacity-75" align=center>{sta} 会 议 签 到</h3><p align=right id=day >{day}</p> </div> <p>{result}</p><div style=" display: flex;justify-content: right;align-items: right;width:80%;height:70%;"><h2><span class="label label-success h5">[未签到]回到会议,将弹框⏏︎到此签到⬆️,请试按此键☛</span> </h2><img style="width: auto" src='/images/docu2.jpg' alg="some"/></div> "#);let mark=if result.contains('V') {"nill"} else { "null"} ; let sec = &homestr.find("{mark}").unwrap();homestr.replace_range(sec..&(sec+6),&mark);// let homestr2= &homestr1.replace("{mark}", mark);let sec = &homestr.find("{mainstr}").unwrap();homestr.replace_range(sec..&(sec+9),&cks);Ok(Html(String::from(homestr)))
}async fn stacheck( State(pool): State<ConnectionPool> ,day:&str,sta:&str
)-> Result<String, (StatusCode, String)> {let mut conn = pool.get().await.map_err(internal_error)?;// let mut conn = pool.get().await.map_err(internal_error)?;let result:Vec<String>= conn.keys("*").await.map_err(internal_error)?;let key=format!("{day}/{sta}" );let ckey=format!("check:{}",sta);let tkey=&format!("check:{}:thin",sta);let persons:Vec<String>= conn.lrange(key,0,-1).await.map_err(internal_error)?;let checks :Vec<String>= conn.smembers(ckey).await.map_err(internal_error)?;let thins :Vec<String>=conn.hkeys(tkey).await.map_err(internal_error)?;// let re= conn.del(tkey ).await.map_err(internal_error)?;// Ok(format!("{:?}",thins))let info= if checks.len()==0 {"btn-warning"}else {"btn-light "};let mut re=format!(r#"<li class="list-group-item lh-sm " style="height: 45px" ><span class= "btn {info}"> {sta}: </span>"#);for i in persons{
//<a href="/thinks/{sta}/{i}">有事</a> let mark= if (&checks).contains(&i) {r#""green">V</font>]</a>"# }else {r#""red">X</font>]</a>"#}; re.push_str(& format!(r#"<a class="btn btn-light" href='#' οnclick='emitinfo("{i}","/rk/check/{sta}/{i}")' id={i}> {i} [<font color={mark}<space/> "#));}re.push_str(r#"{<span class= "btn {info}">有事请单击:</span>"#);for i in &checks{let mark= if (&thins).contains(i) {r#""blue">O</font>]</a>"# } else {r#""green">V</font>]</a>"# }; re.push_str(& format!(r#"<a class="btn btn-light" href='#' οnclick='emitinfo("{i}","/rk/thincheck/{sta}/{i}" )' id="{i}s"> {i} [<font color={mark}<space/> "#));}re.push_str(&format!(r#"}}<a class="lable lable-light opacity-75 " href='#'b sta="{sta}" id="{sta}">[more]</a><space/></li>"#));//<a class="lable lable-light opacity-75 " href="#" sta="{sta}" id="{sta}Ok(format!("{}",re.as_str()))
}async fn thincheck(State(pool): State<ConnectionPool>,headers: HeaderMap,Path((sta, person)): Path<(String, String)>
) -> Result<Redirect, (StatusCode, String)> {let mut conn = pool.get().await.map_err(internal_error)?;let tkey=&format!("check:{}:thin",sta);let onthins = conn.hexists(tkey,&person).await.map_err(internal_error)?;if onthins { let result: String =conn.hdel(tkey,&person).await.map_err(internal_error)?;} else {let result: String = conn.hset(tkey,&person,"thin").await.map_err(internal_error)?;
}
//let def=HeaderValue::from_str(&format!("/rk/test/{}s",&person)).unwrap();
//let rurl=headers.get("referer").unwrap_or(&def).to_str().unwrap_or_default();
let rurl=&format!("/rk/test/{}s",&person);
Ok( Redirect::to( rurl))
}
async fn check(State(pool): State<ConnectionPool>,headers: HeaderMap,Path((sta, person)): Path<(String, String)>
) -> Result<Redirect, (StatusCode, String)> {let mut conn = pool.get().await.map_err(internal_error)?;let ckey=&format!("check:{}",sta);let tkey=&format!("check:{}:thin",sta);// conn.del(ckey ).await.map_err(internal_error)?;let ischeck = conn.sismember(ckey,&person).await.map_err(internal_error)?;if ischeck {let result: String =conn.srem(ckey,&[&person]).await.map_err(internal_error)?;let result: String =conn.hdel(tkey,&person).await.map_err(internal_error)?;} else {let result: String = conn.sadd(ckey,&[&person]).await.map_err(internal_error)?;
}// let def=HeaderValue::from_str(&format!("/rk/test/{}",&person)).unwrap();//let rurl=headers.get("referer").unwrap_or( &def).to_str().unwrap_or_default();let rurl=&format!("/rk/test/{}",&person);Ok( Redirect::to( rurl))
}
// we can also write a custom extractor that grabs a connection from the pool
// which setup is appropriate depends on your application
struct DatabaseConnection(PooledConnection<'static, RedisConnectionManager>);impl<S> FromRequestParts<S> for DatabaseConnection
whereConnectionPool: FromRef<S>,S: Send + Sync,
{type Rejection = (StatusCode, String);async fn from_request_parts( _parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> {let pool = ConnectionPool::from_ref(state);let conn = pool.get_owned().await.map_err(internal_error)?;Ok(Self(conn))}
}async fn using_connection_extractor(DatabaseConnection(mut conn): DatabaseConnection,
) -> Result<String, (StatusCode, String)> {conn.set::<&str, &str, ()>("station", "wjc,zhw,sd").await.unwrap();let result: String = conn.hgetall("ip2sta").await.map_err(internal_error)?;// let result: String = conn.hset("ip2sta","10.180.133.72","宫东").await.map_err(internal_error)?;Ok(format!("{:?}",result))
} /// Utility function for mapping any error into a `500 Internal Server Error`
/// response.
fn internal_error<E>(err: E) -> (StatusCode, String)
whereE: std::error::Error,
{(StatusCode::INTERNAL_SERVER_ERROR, err.to_string())
}
这里的home.html是一个总页面模板.
相关文章:
Android后端签到flask迁移到rust的axum的过程-签到性能和便携
本次变更了以下内容: 为了使用之前ip2sta的ip到端点名的python,dic变量,将其存入redis hashset.使用地址/api/ip2dic 手动执行之.并且定义在/station/init,这个每天初始化redis的路径下.在rust axum使用redis 连接池在test中 ip2dic,IP转端点名,转本日此端网址.在前端的人名下…...
Android13开机向导
文章目录 前言需求-场景第三方资料说明需求思路按照平台 思路 从配置上去 feature换个思路,去feature。SimMissingActivity 判断跳过逻辑SetupWizardUtils 判断SIM 、 hasSystemFeature FEATURE_TELEPHONYPackageManager.FEATURE_TELEPHONYApplicationPackageManage…...
泷羽sec学习打卡-brupsuite6暴力破解与验证码识别绕过
声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-验证码绕过以及字典爆破 如何利用brpsuite进行验证码绕过呢?1、下…...
vue季度选择器(antd2.0 版本无此控件,单独写一个)
vue季度选择器 效果显示 效果显示 <template><div><a-popoverplacement"bottom"overlayClassName"season-picker"trigger"click"v-model"showSeason"><template #content><div class"season-picker-b…...
Microsemi Libero使用技巧11——CoreUARTAPB RX管脚分配时不显示
调用串口IP核CoreUARTAPB,并例化到顶层设计,发现UART_RX管脚在进行管脚分配时没有显示出来,最后发现是CoreAPB3总线IP核配置不对导致,改为如下配置后正常。...
回归预测 | MATLAB实现SVM-Adaboost集成学习结合支持向量机多输入单输出回归预测
回归预测 | MATLAB实现SVM-Adaboost集成学习结合支持向量机多输入单输出回归预测 目录 回归预测 | MATLAB实现SVM-Adaboost集成学习结合支持向量机多输入单输出回归预测基本介绍程序设计基本介绍 SVM-Adaboost集成学习是一种将支持向量机(SVM)与AdaBoost算法相结合的集成学习…...
Keil-MDK开发环境编译后axf自动转换bin格式文件
编译选项添加如下,调用fromelf工具自动完成转换: fromelf --bin -o "$LL.bin" "#L"...
计算机组成原理(五):程序装载
在计算机组成原理中,程序装载(Program Loading)是指将程序从外存(如磁盘)加载到内存中,并为其运行做好准备的过程。程序装载是实现程序从静态存储状态到动态运行状态的关键环节,涉及地址映射、内…...
开发EDA工具常用的三方开源
EDA软件是制造芯片重要工具,是现在举国的大难题。这个工具难在哪里,几句话说不清,但它确实也有一些非常通用的功能,这些功能依赖一些成熟的轮子,这些轮子,就是三方的开源项目,下面列举一些常用的…...
微信小程序中 crypto-js 加解密全攻略
一、引言 在微信小程序开发中,数据的安全至关重要。加解密技术在保护用户数据和应用程序的安全性方面起着关键作用。小程序在与服务器进行数据交互时,面临着数据泄露、篡改等安全风险。为了确保用户信息的安全,选择合适的加解密算法变得尤为…...
Vue2 - 最新实现将多个文件批量导出为ZIP压缩包格式并下载功能,纯前端下载多个文件打包输出成zip格式,vue2将文件批量下载打包成ZIP下载保存本地(后端二进制文件流/base64图片/url
前言 Vue3 版本,请访问 这篇文章。 在 vue2 | nuxt2 项目开发中,详解实现把多个文件组合成一个ZIP压缩包格式下载到用户本地,将文件批量下载打包成zip格式并自定义压缩包命名名称,vue批量下载文件并导出为压缩包的功能,如何将后端返回的二进制文件流打包成zip格式,支持任…...
The Rise and Potential of Large Language ModelBased Agents:A Survey---摘要、背景、引言
题目 基于大语言模型的Agent的兴起与发展前景 论文地址:https://arxiv.org/pdf/2309.07864.pdf 项目地址:https:/github.com/WooooDyy./LLM-Agent–Paper-List 摘要 长期以来,人类一直在追求等同于或超越人类水平的人工智能(A),…...
【unity】从零开始制作平台跳跃游戏--界面的认识,添加第一个角色!
在上一篇文章中,我们已经完成了unity的环境配置与安装⬇️ 【Unity】环境配置与安装-CSDN博客 接下来,让我们开始新建一个项目吧! 新建项目 首先进入unityHub的项目页面,点击“新项目”: 我们这个系列将会以2D平台…...
Java中的Stream
1. 什么是 Stream? Stream 是 Java 8 引入的一种新方式,目的是帮助我们更简洁、更高效地处理集合(如 List、Set、Map 等)。你可以把 Stream 想象成一条“流水线”,数据就像是流水线上的原材料,经过流水线的…...
ARM学习(36)静态扫描规则学习以及工具使用
笔者来学习了解一下静态扫描以及其规则,并且亲身是实践一下对arm 架构的代码进行扫描。 1、静态扫描认识 静态扫描:对代码源文件按照一定的规则进行扫描,来发现一些潜在的问题或者风险,因为不涉及代码运行,所以其一般只是发现一些规范或则一些质量问题,当然这些可能存在潜…...
前端将base64转pdf页面预览
前端将base64转pdf页面预览 <embed :src"pdfList" width"100%" height"100%" type"application/pdf" />pdfList.value data:application/pdf;base64,${res}//后端传jpg或pdf格式可直接 :src“返回内容”显示...
Java-26 深入浅出 Spring - 实现简易Ioc-02 无IoC与AOP场景下实现业务
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...
能不能用一句话或者简洁地凝练深度学习的本质和精髓?
深度学习就是学习输入与输出之间的映射关系。 深度学习模型本质上只是个参数量很大的函数,其中函数的参数可以通过训练样本进行调整。 根据训练样本的不同,进一步可以分为以下几类: 一、给定输入以及对应的输出,其中输出是唯一的…...
我的宝贵经验
在技术的浩瀚海洋中,一份优秀的技术文档宛如精准的航海图。它是知识传承的载体,是团队协作的桥梁,更是产品成功的幕后英雄。然而,打造这样一份出色的技术文档并非易事。你是否在为如何清晰阐释复杂技术而苦恼?是否纠结…...
发现一个对话框中的按钮,全部失效,点击都没有任何反应,已经解决
前端问题,技术vue2,ts。 发现一个对话框中的按钮,全部失效,点击都没有任何反应。 因为我只在template标签中加入下面这个代码,并没有注册。 只要有一个子组件没有注册,就会影响所有的按钮,使当前…...
深度学习中损失函数(loss function)介绍
深度学习中损失函数(loss function)介绍 在深度学习的宏伟城堡中,损失函数扮演着国王的角色,它决定了模型训练的方向和目标。损失函数,也被称为代价函数,是衡量模型预测与实际结果之间差异的函数。在深度学习的训练过程中&…...
【渗透测试】信息收集二
其他信息收集 在渗透测试中,历史漏洞信息收集是一项重要的工作,以下是相关介绍: 历史漏洞信息收集的重要性 提高效率:通过收集目标系统或应用程序的历史漏洞信息,可以快速定位可能存在的安全问题,避免重复…...
前端三大框架 Vue、React 和 Angular 的市场占比分析
一、引言 ?? 随着前端技术的迅速发展,Vue.js、React 和 Angular 已成为全球最受欢迎的三大前端框架。在国内外,不同的框架在市场中的占比和流行程度存在显著差异。本文将从全球和中国市场的角度,对这三大框架的市场占比进行分析࿰…...
Gitlab服务管理和仓库项目权限管理
Gitlab服务管理 gitlab-ctl start # 启动所有 gitlab 组件; gitlab-ctl stop # 停止所有 gitlab 组件; gitlab-ctl restart # 重启所有 gitlab 组件; gitlab-ctl status …...
MySQL ON DUPLICATE KEY UPDATE影响行数
目录 分析为什么Updates返回7 总结 数据库更新日志如下 insertOrUpdateList|> Preparing: INSERT INTO clue_user_tag (vuid, tag_id, tag_type, content) VALUES (?, ?, ?, ?) , (?, ?, ?, ?) , (?, ?, ?, ?) , (?, ?, ?, ?) ON DUPLICATE KEY UPDATE …...
美团2024年秋招第一场笔试【前端移动端】
美团2024年秋招第一场笔试【前端&移动端】 2024/12/12 1.在一个长度为28的数组中删除第5个元素时(元素序号:1~28),需要向前移动(23)个元素。 2.如下图一个树型结构,其结点E在树的中序遍历…...
【EXCEL】 获取多列中 不为空的那一个数据
从多个表格筛选出来的上班时间是下表这样的 我要把他们放在同一列,这样方便后续处理,合并列输入下面这个公式即可 日期不加 TEXT() 函数 转日期格式;将得到是一串数字 TEXT(TEXTJOIN(", ",TRUE,B2:F2),&qu…...
Qt 开发笔记2
1> 样式表加载 一定要在Ui 初始化之前调用, 之后调用会不生效。 2> 设置QlineEdit输入框 具体四周的间距: setTextMargins(m_nLeftTextMargin, m_nTopTextMargin, m_nRightTextMargin, m_nBottomTextMargin);3> 设置背景图(平滑不…...
R学习——数据框
目录 1数据框的合并 2数据框的访问 2.1 通过索引[] 2.2符号$访问 2.3 attach访问 2.4 with访问 1数据框的合并 当每个内容存储为单独的向量,data.frame可以进行这些内容单独数据框合并。 2数据框的访问 2.1 通过索引[] [i]输出对应的列 [i,]输出对应的行 …...
深入详解人工智能机器学习常见算法中的K-means聚类
目录 引言 1. K-means聚类的基本概念 1.1 K-means聚类的定义 1.2 K-means聚类的核心思想 1.3 K-means聚类的目标函数 2. K-means聚类的核心原理 2.1 初始化 2.2 分配 2.3 更新 2.4 迭代 3. K-means聚类的具体实现 3.1 K-means聚类的算法流程 3.2 K-means聚类的Pyt…...
TDengine SpringBoot操作
TDengine与Spring Boot的结合可以为开发者提供一个高性能、分布式的物联网、工业大数据处理平台,同时利用Spring Boot的简化配置和快速开发特性。以下是对TDengine与Spring Boot集成的详细解析: 一、TDengine简介 TDengine是由涛思数据开发的一款高性能…...
【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件
sgFileLink源代码 <template><div :class"$options.name"><el-link click.stop"clickFile(data)"><img :src"getSrc(data)" /><span>{{ getFileNameAndSize(data) }}</span></el-link><el-linkcl…...
C语言实验 函数一
时间:2024.12.14 6-1 弹球距离 double dist (double h,double p) {double sum = h,height;height = h*p;while(height>=TOL){sum += height * 2; //上行下行都算,所以是两倍的距离。height *=p;}return sum; } 6-2 使用函数输出一个整数的逆序数 错误代码:运行超…...
惠普Laser Jet MFP M437nda复印机成像装置严重不足及更换传输卷故障解决方法
惠普Laser Jet MFP M437nda复印机成像装置严重不足及更换传输卷故障解决方法,记录维修那点事儿,普通维修工的日常维修点滴; 惠普Laser Jet MFP M437nda复印机成像装置严重不足维修方法 如果复印及打印的效果没有问题的情况下我们也可以不更换套鼓及显影剂,那么不更换套鼓及…...
委托(Delegate)和事件(Event)-(下篇)
委托(Delegate)与事件(Event)-(上篇)-CSDN博客 上一篇内容! 一、创建非静态委托 在C#中,使用非静态委托意味着将委托绑定到类的实例方法上,而不是静态方法。这允许你通过委托调用特定对象上的方法&am…...
ios 开发配置蓝牙
如果使用了蓝牙功能, 又没有配置, 会出现以下错误: This app has crashed because it attempted to access privacy-sensitive data without a usage description. The apps Info.plist must contain an NSBluetoothAlwaysUsageDescription key with a string value explaini…...
JVM 栈帧结构详解
在 Java 虚拟机(JVM)中,栈帧(Stack Frame)是用于支持方法调用和方法执行的关键数据结构。每个方法从调用开始到执行完成,都对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。本文将详细介绍 JVM 栈帧的结构及…...
HTML和JavaScript实现商品购物系统
下面是一个更全面的商品购物系统示例,包含新增商品、商品的增加删除以及结算找零的功能。这个系统使用HTML和JavaScript实现。 1.功能说明: 这个应用程序使用纯HTML和JavaScript实现。 包含一个商品列表和一个购物车区域。商品列表中有几个示例商品&a…...
(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验三----学校选址与路径规划(超超超详细!!!)
目录 实验三 学校选址与道路规划 3.1 实验内容及目的 3.1.1 实验内容 3.1.2 实验目的 3.2 实验方案 3.3 操作流程 3.3.1 环境设置 3.3.2 地势分析 (1)提取坡度: (2)重分类: 3.3.3 学校点分析 (1)欧氏距离: (2)重分类: 3.3.4 娱乐场所点分析 (1)欧氏距离…...
ip_done
文章目录 路由结论 IP分片 数据链路层重谈Mac地址MAC帧报头局域网的通信原理MSS,以及MAC帧对上层的影响ARP协议 1.公司是不是这样呢? 类似的要给运营商交钱,构建公司的子网,具有公司级别的入口路由器 2.为什么要这样呢?? IP地…...
Mysql体系架构剖析——岁月云实战笔记
1 体系架构 理论内容阅读了mysql体系架构剖析,其他的根据岁月云的实战进行记录。 1.1 连接层 mysql最上层为连接服务,引入线程池,允许多台客户端连接,主要工作:连接处理、授权认证、安全防护、管理连接等。 连接处理&a…...
【卷积神经网络】AlexNet实践
构建模型 模版搭建 # 定义一个AlexNet模型类def __init__(self):# 调用父类的构造函数(如果继承自nn.Module的话)super(AlexNet, self).__init__()# ReLU激活函数self.ReLU nn.ReLU()# 卷积层1:输入1个通道(灰度图)&a…...
LF CRLF
这个提示的含义是:Git 检测到你当前的 file3.txt 文件中使用了 LF(换行符,Line Feed,\n) 作为换行符,但在你系统的 Git 配置中,指定要将其转换为 CRLF(回车换行,Carriage…...
Python学习(二)—— 基础语法(上)
目录 一,表达式和常量和变量 1.1 表达式 1.2 变量 1.3 动态类型特性 1.4 输入 二,运算符 2.1 算术运算符 2.2 关系运算符 2.3 逻辑运算符 2.4 赋值运算符 2.5 练习 三,语句 3.1 条件语句 3.2 while循环 3.3 for循环 四&#…...
科研绘图系列:R语言绘制网络图和密度分布图(network density plot)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3图4图5图6图7图8系统信息参考介绍 R语言绘制网络图和密度分布图(network & density plot) 加载R包 library(magrittr) library(dplyr) library(…...
python解题之寻找最大的葫芦
问题描述 问题描述 在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 �a 和另外两张相同牌面值的牌 �b。如果两个人同时拥有“葫芦”,我们会优先比较牌 &#…...
openwrt安装tailscale
1. 下载 进入tailscale的github仓库复制最新版本的链接:点击跳转 wget https://github.com/adyanth/openwrt-tailscale-enabler/releases/download/v1.36.1-fb2f6cf-autoupdate/openwrt-tailscale-enabler-v1.36.1-fb2f6cf-autoupdate.tgz2.解压缩 tar x -zvC / …...
基于物联网的智能插座云平台 WIFI云平台MQTT协议
功能介绍 功能描述: STM32单片机为控制核心 LCD1602液晶显示当前时间温度 开启时间 关闭时间 按键设置开启时间/关闭时间,温度报警上限 到开启时间,继电器自动打开,到关闭时间,自动关闭 通过DS18B20温度传感器获…...
MySQL 事务
概念介绍 事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组 DML 语句要么全部成功,要么全部失败,是一个整体。MySQL 提供一种机制,保证我们达到这样的效果。 事务就是要做的或所做的事情,主要用…...
消息中间件面试题-参考回答
消息中间件面试题-参考回答 面试官:RabbitMQ-如何保证消息不丢失 候选人: 嗯!我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的,这里面就要求了消息的高可用性,我们要保证消息的不丢失。主要从三个层面…...