[Day26] 用 Rocket 做一个图书馆门禁後端 (Part 3)

今天就要打疫苗了 然後我现在还没睡 掰了
明天没看到我的文就代表真的掰了 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 怕


<<:  Day19 - ImageView(一)

>>:  Day 18 UItableView的练习 (2/3)

基础统计-让我们来聊聊叙述统计

当我们拿到一份数据资料的时候并不是直接上手开始分析,我们首先需要对进它行「观察」,并从中了解资料是否...

[WMX3] 4.SetDeviceName and GetAllDevices

主要功能为设定/取得连线到WMX3Engine的设备或者是软件所设定的名称 使用方法 设定 //需接...

[DAY11] 部署 Automated ML

DAY11 部署 Automated ML 昨天体验到 Automated ML 的威力了,它可以自...

DAY3 安装Android Studio

人们常说学语言在特定环境学会比较快,所以像是学英文把自己丢到美国去学是最快的,学台语就回家跟阿嬷吃饭...

Leetcode: 1627. Graph Connectivity With Threshold

打起精神来,今天有比昨天更好一点! 这题,我对他的解释是,现在有未知的图,我有些node跟node之...