今天就要打疫苗了 然後我现在还没睡 掰了
明天没看到我的文就代表真的掰了 QQ
好 今天准备的内容比较多一点
主要是前天看到学长在帮学校弄一个图书馆的登入系统
我想说能不能用 Rust Rocket Rebuild 出一个
当然 可能有部份内容不一样 因为我根本没看过他的 Code 想必各位读者也不会看过
今天的 Code 颇多的
明天不太知道要讲啥 我去问学长他还有什麽功能了 如果有问到应该就是继续这个东东吧
那这篇的内容是使用 Rocket + Serde + SQLx + Chrono
阅读前请先回去看之前的 SQLX教学配置环境 就是创造 .db档之类的
以下是 Cargo.toml 档
[dependencies]
chrono = "0.4.19"
rocket = { version = "0.5.0-rc.1", features = ["json"] }
serde = "1.0.130"
sqlx = { version = "0.5.7", features = [ "runtime-tokio-rustls", "sqlite" ] }
tokio = { version = "1.12.0", features = ["full"] }
anyhow = "1.0"
futures = "0.3"
然後我现在才发现 toml 会有颜色显示
那这边的部份会需要两个 Struct
#[derive(Serialize, Deserialize)]
pub struct User {
username: String,
student_id: String,
pos: i32,
}
#[derive(Serialize, Deserialize)]
pub struct Input {
username: String,
student_id: String,
pos: i32,
time: String,
}
上面是 POST 资料进去我们的後端所用的 Struct
而下面是回传以及使用资料库的 Struct
那直接看我们 POST 的 Code
#[post("/get_in", format = "json", data = "<user>")]
async fn inside(user: Json<User>) -> Status {
let username = user.username.clone();
let student_id = user.student_id.clone();
let pos = user.pos.clone();
let time= Local::now().to_string();
sql::add_data(Input {
username,
student_id,
pos,
time,
}).await;
Status::Accepted
}
那可以看到说就跟昨天的内容很像
也就是引入内容然後 clone
其实也可以在传入那边去 clone 这样会比较简洁
而 time 那边我使用 chrono 里面的函数,具体用法我没有到很清楚,我只会一些用法
要注意的地方是 因为有使用 await 所以函数要加 async
那麽切到 SQL 的部份
pub async fn add_data(data: Input) -> anyhow::Result<()> {
let pool = SqlitePool::connect(&env::var("DATABASE_URL")?).await?;
let mut conn = pool.acquire().await?;
let add = sqlx::query!(
r#"INSERT INTO student (name, student_id, pos, time) VALUES ($1, $2, $3, $4)"#, data.username, data.student_id, data.pos, data.time)
.execute(&mut conn).await?;
Ok(())
}
可以看到说跟之前讲 SQLX 的时候有些差别
就是不会传入 pool 也就是 SqlitePool
最後回传 OK
#[get("/all_data")]
async fn search() -> Json<Vec<Input>>{
let result = sql::list_data().await;
Json(result.unwrap())
}
这边可以看到十分的简短
所以我们直接切到 SQL 的部份
pub async fn list_data() -> anyhow::Result<(Vec<crate::Input>)> {
let pool = SqlitePool::connect(&env::var("DATABASE_URL")?).await?;
let result = sqlx::query!(r#"
SELECT name, student_id, pos, time
FROM student
ORDER BY name
"#).fetch_all(&pool).await?;
let mut ret: Vec<crate::Input> = Vec::new();
for i in result {
ret.push(
crate::Input {
username: i.name.unwrap().clone(),
student_id: i.student_id.clone(),
pos: i.pos.parse::<i32>().unwrap().clone(),
time: i.time.clone(),
}
);
}
Ok(ret)
}
那这边这个 SQL 用法是照官方文档写的 实际上也可行
下面的部份就是去将资料塞到我们最後要回传的 Code
而上面是 Result 的部份
所以也可以看到上面 search 的函数中最後回传是有 unwrap 的
至於下面 pos 这边我记得好像有讲过 总之就是一个能够弄成 atoi 的方法
那既然解释完 Code 就来看最後成品吧!
传入资料是这两笔
传入後会看到後端
左边是後端 右边是 POST 内容
最後可以看到资料
今天先这样 明天打 BNT 怕
>>: Day 18 UItableView的练习 (2/3)
当我们拿到一份数据资料的时候并不是直接上手开始分析,我们首先需要对进它行「观察」,并从中了解资料是否...
主要功能为设定/取得连线到WMX3Engine的设备或者是软件所设定的名称 使用方法 设定 //需接...
DAY11 部署 Automated ML 昨天体验到 Automated ML 的威力了,它可以自...
人们常说学语言在特定环境学会比较快,所以像是学英文把自己丢到美国去学是最快的,学台语就回家跟阿嬷吃饭...
打起精神来,今天有比昨天更好一点! 这题,我对他的解释是,现在有未知的图,我有些node跟node之...