基于Rust语言的Rocket框架和Sqlx库开发WebAPI项目记录(五)

06-01 1379阅读
登录处理代码

在src目录新建login_handle.rs文件

目录结构如下:

project

|—src

        |—params   //封装参数结构体模块

                 |—req.rs    //封装请求参数结构体

                 |—resp.rs  //封装返回数据结构体

                 |—result_parse.rs  //解析返回参数结构体

                 |—mod.rs    //导出模块       

        |—common    //公共模块

                |—db.rs    //构造数据库连接池

                |—jwt.rs   //处理token

                |—mistake.rs  //处理错误

                |—util.rs  //工具函数

                |—mod.rs  //导出模块

基于Rust语言的Rocket框架和Sqlx库开发WebAPI项目记录(五)
(图片来源网络,侵删)

        |—logic    //业务逻辑模块

                |—wechat.rs    //处理业务

基于Rust语言的Rocket框架和Sqlx库开发WebAPI项目记录(五)
(图片来源网络,侵删)

                |—mod.rs   //导出模块

        |—login_handle.rs   //登录处理函数

基于Rust语言的Rocket框架和Sqlx库开发WebAPI项目记录(五)
(图片来源网络,侵删)

login_handle.rs代码如下:

use crate::common::db;
use crate::params::req;
use crate::params::req::Userparam;
use crate::params::resp;
use crate::common::utils::get_uuid;
use crate::common::jwt::get_token;
use rocket::get;
use rocket_db_pools::Connection;
use rocket_db_pools::sqlx::{self,Row};
use rocket::serde::json::{Value,Json,json};
//注册
pub async fn register(mut db:  Connection,regpram:Json)->Json {
    let userid=get_uuid();
    let sql = sqlx::query("insert into users (uname,id) values ($1,$2)")
        .bind(&regpram.uname)
        .bind(&userid)
        .execute(& mut **db).await;
    match sql {
        Ok(_result) => {
            Json(
              resp::Regresp { code:1,
              message:"Success".to_string(),
              uid:userid
            })
        },
        Err(err) => {
            Json(
                resp::Regresp { code:0,
                message:err.to_string(),
                uid:"null".to_owned()
              })
        }
    }
}
//获取用户id
pub async fn get_id(mut db: Connection,uname:String)->String {
    let uid = sqlx::query("select id from users where uname=$1")
        .bind(&uname)
        .fetch_one(&mut **db)
        .await.unwrap().get(0);
       return uid;
        
   
}
//验证
#[get("/verify/")]
pub async fn verify(mut db: Connection,uname:String)->Value {
    let count = sqlx::query("select count(*) from users where uname=$1")
        .bind(&uname)
        .fetch_one(&mut **db)
        .await;
    match count{
        Ok(a)=>{  //非空行,有数据
            let num:i64 =a.get(0);
            if num>0{
                let id=get_id(db, uname.clone()).await;
                let user=Userparam{
                    uname:uname.clone(),
                    id:id
                };
              get_token(Json(user)).await
            }else{
                let userid=get_uuid();
                let regparam=Userparam{
                    uname:uname.clone(),
                    id:userid
                };
               let reg:Json= register(db, Json(regparam)).await;
               let uid=&reg.uid;
                if reg.code==1{
                    
                    let user=Userparam{
                        uname:uname,
                        id:uid.to_owned()
                    };
                    get_token(Json(user)).await
                }else{
                    json!(
                        resp::Resp { code:0,
                        message:"认证失败!".to_string(),
                      })
                }
            }
        },
        Err(_b)=>{  //空行,无数据
            let userid=get_uuid();
            let regparam=Userparam{
                uname:uname.clone(),
                id:userid
            };
            let reg:Json= register(db, Json(regparam)).await;
            let uid=&reg.uid;
            if reg.code==1{
            
                let user=Userparam{
                    uname:uname,
                    id:uid.to_owned()
                };
                get_token(Json(user)).await
            }else{
                json!(
                    resp::Resp { code:0,
                    message:"认证失败!".to_string(),
                })
            }
        }
    }
  
}

CRUD与上传文件处理代码

在src目录新建xxx_handle.rs文件

目录结构如下:

project

|—src

        |—params   //封装参数结构体模块

                 |—req.rs    //封装请求参数结构体

                 |—resp.rs  //封装返回数据结构体

                 |—result_parse.rs  //解析返回参数结构体

                 |—mod.rs    //导出模块       

        |—common    //公共模块

                |—db.rs    //构造数据库连接池

                |—jwt.rs   //处理token

                |—mistake.rs  //处理错误

                |—util.rs  //工具函数

                |—mod.rs  //导出模块

        |—logic    //业务逻辑模块

                |—wechat.rs    //处理业务

                |—mod.rs   //导出模块

        |—login_handle.rs   //登录处理函数

        |—xxx_handle.rs   //CRUD与上传文件处理函数示例

xxx_handle.rs处理函数代码示例:

use rocket::{post,get};
use rocket_db_pools::Connection;
use rocket_db_pools::sqlx::{self,Row};
use rocket::serde::json::Json;
use sqlx::postgres::PgRow;
use rocket::form::Form;
use std::collections::HashMap;
use std::env;
use crate::logic::wechat::{ocr,parse_ocr,del_img};
use crate::common::db;
use crate::params::req::{self, UploadImg};
use crate::params::resp;
use crate::common::utils::get_uuid;
use crate::common::jwt::Token;
//上传文件处理
#[post("/upload",data="")]
pub async fn upload_file(mut img:Form>,auth:Token)->Json {
    //获取uuid
    let liverid=get_uuid();
    //获取从token中解析出来的用户信息
    let uname=auth.uname;
    let sql = sqlx::query("insert into livers (livervalue,checktime,uid,id) values ($1,$2,$3,$4)")
        .bind(liverpram.livervalue)
        .bind(liverpram.checktime)
        .bind(uname)
        .bind(liverid)
        .execute(&mut **db).await;
    match sql {
        Ok(_result) => {
            Json(
              resp::Resp { code:1,
              message:"Success".to_string(),
            })
        },
        Err(err) => {
            Json(
                resp::Resp { code:0,
                message:err.to_string(),
              })
        }
    }
}
//删除数据
#[get("/delete/")]
pub async fn delete_liver(mut db: Connection,id:String,_auth:Token)->Json {
    let sql = sqlx::query("delete from livers where id=$1")
        .bind(id)
        .execute(&mut **db).await;
    match sql {
        Ok(_result) => {
            Json(
              resp::Resp { code:1,
              message:"Success".to_string(),
            })
        },
        Err(err) => {
            Json(
                resp::Resp { code:0,
                message:err.to_string(),
              })
        }
    }
}
//返回数据
//返回liver数组--倒序
#[get("/list")]
pub async fn list_liver(mut db: Connection,auth:Token) -> Json {
    let uname=auth.uname;
    let rows =sqlx::query("SELECT id,uid,livervalue,checktime FROM livers where uid=$1 order by checktime desc limit 7").bind(uname);
    let list:Result=rows.map(|r:PgRow|
        resp::Listliver{
            livervalue:r.get("livervalue"),
            checktime:r.get("checktime"),
            uid:r.get("uid"),
            id:r.get("id")
         }
    )
    .fetch_all(&mut **db).await;
    match list {
        Ok(data)=>{
            Json(data)
        },
        Err(_err)=>{
            Json(Vec::new())
        }
        
    }
   
    
}
//返回AFP数组--正序
#[get("/listasc")]
pub async fn list_liver_asc(mut db: Connection,auth:Token) -> Json {
    let uname=auth.uname;
    let rows =sqlx::query("select id,uid,livervalue,checktime from (SELECT id,uid,livervalue,checktime FROM livers where uid=$1 order by checktime desc limit 7) order by checktime asc").bind(uname);
    let list:Result=rows.map(|r:PgRow|
        resp::Listliver{
            livervalue:r.get("livervalue"),
            checktime:r.get("checktime"),
            uid:r.get("uid"),
            id:r.get("id")
         }
    )
    .fetch_all(&mut **db).await;
    match list {
        Ok(data)=>{
            Json(data)
        },
        Err(_err)=>{
            Json(Vec::new())
        }
        
    }
    
    
}
//返回AFP数组--倒序
#[get("/listall")]
pub async fn list_liver_all(mut db: Connection,auth:Token) -> Json {
    let uname=auth.uname;
    let rows =sqlx::query("SELECT id,uid,livervalue,checktime FROM livers where uid=$1 order by checktime desc").bind(uname);
    let list:Result=rows.map(|r:PgRow|
        resp::Listliver{
            livervalue:r.get("livervalue"),
            checktime:r.get("checktime"),
            uid:r.get("uid"),
            id:r.get("id")
         }
    )
    .fetch_all(&mut **db).await;
    match list{
        Ok(data)=>{
            Json(data)
        },
        Err(_err)=>{
            Json(Vec::new())
        }
    }
    
    
}
//返回AFP数组--正序
#[get("/listallasc")]
pub async fn list_liver_all_asc(mut db: Connection,auth:Token) -> Json {
    let uname=auth.uname;
    let rows =sqlx::query("SELECT id,uid,livervalue,checktime FROM livers where uid=$1 order by checktime asc").bind(uname);
    let list:Result=rows.map(|r:PgRow|
        resp::Listliver{
            livervalue:r.get("livervalue"),
            checktime:r.get("checktime"),
            uid:r.get("uid"),
            id:r.get("id")
         }
    )
    .fetch_all(&mut **db).await;
    match list{
        Ok(data)=>{
            Json(data)
        },
        Err(_err)=>{
            Json(Vec::new())
        }
    }  
    
}
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码