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

[复制链接]
发表于 2025-7-27 06:10:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
登录处置惩罚代码

在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  //导出模块
        |—logic    //业务逻辑模块
                |—wechat.rs    //处置惩罚业务
                |—mod.rs   //导出模块
        |—login_handle.rs   //登录处置惩罚函数
login_handle.rs代码如下:
  1. use crate::common::db;
  2. use crate::params::req;
  3. use crate::params::req::Userparam;
  4. use crate::params::resp;
  5. use crate::common::utils::get_uuid;
  6. use crate::common::jwt::get_token;
  7. use rocket::get;
  8. use rocket_db_pools::Connection;
  9. use rocket_db_pools::sqlx::{self,Row};
  10. use rocket::serde::json::{Value,Json,json};
  11. //注册
  12. pub async fn register(mut db:  Connection<db::Prodb>,regpram:Json<req::Userparam>)->Json<resp::Regresp> {
  13.     let userid=get_uuid();
  14.     let sql = sqlx::query("insert into users (uname,id) values ($1,$2)")
  15.         .bind(&regpram.uname)
  16.         .bind(&userid)
  17.         .execute(& mut **db).await;
  18.     match sql {
  19.         Ok(_result) => {
  20.             Json(
  21.               resp::Regresp { code:1,
  22.               message:"Success".to_string(),
  23.               uid:userid
  24.             })
  25.         },
  26.         Err(err) => {
  27.             Json(
  28.                 resp::Regresp { code:0,
  29.                 message:err.to_string(),
  30.                 uid:"null".to_owned()
  31.               })
  32.         }
  33.     }
  34. }
  35. //获取用户id
  36. pub async fn get_id(mut db: Connection<db::Prodb>,uname:String)->String {
  37.     let uid = sqlx::query("select id from users where uname=$1")
  38.         .bind(&uname)
  39.         .fetch_one(&mut **db)
  40.         .await.unwrap().get(0);
  41.        return uid;
  42.         
  43.    
  44. }
  45. //验证
  46. #[get("/verify/<uname>")]
  47. pub async fn verify(mut db: Connection<db::Prodb>,uname:String)->Value {
  48.     let count = sqlx::query("select count(*) from users where uname=$1")
  49.         .bind(&uname)
  50.         .fetch_one(&mut **db)
  51.         .await;
  52.     match count{
  53.         Ok(a)=>{  //非空行,有数据
  54.             let num:i64 =a.get(0);
  55.             if num>0{
  56.                 let id=get_id(db, uname.clone()).await;
  57.                 let user=Userparam{
  58.                     uname:uname.clone(),
  59.                     id:id
  60.                 };
  61.               get_token(Json(user)).await
  62.             }else{
  63.                 let userid=get_uuid();
  64.                 let regparam=Userparam{
  65.                     uname:uname.clone(),
  66.                     id:userid
  67.                 };
  68.                let reg:Json<resp::Regresp>= register(db, Json(regparam)).await;
  69.                let uid=&reg.uid;
  70.                 if reg.code==1{
  71.                     
  72.                     let user=Userparam{
  73.                         uname:uname,
  74.                         id:uid.to_owned()
  75.                     };
  76.                     get_token(Json(user)).await
  77.                 }else{
  78.                     json!(
  79.                         resp::Resp { code:0,
  80.                         message:"认证失败!".to_string(),
  81.                       })
  82.                 }
  83.             }
  84.         },
  85.         Err(_b)=>{  //空行,无数据
  86.             let userid=get_uuid();
  87.             let regparam=Userparam{
  88.                 uname:uname.clone(),
  89.                 id:userid
  90.             };
  91.             let reg:Json<resp::Regresp>= register(db, Json(regparam)).await;
  92.             let uid=&reg.uid;
  93.             if reg.code==1{
  94.             
  95.                 let user=Userparam{
  96.                     uname:uname,
  97.                     id:uid.to_owned()
  98.                 };
  99.                 get_token(Json(user)).await
  100.             }else{
  101.                 json!(
  102.                     resp::Resp { code:0,
  103.                     message:"认证失败!".to_string(),
  104.                 })
  105.             }
  106.         }
  107.     }
  108.   
  109. }
复制代码
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处置惩罚函数代码示例:
  1. use rocket::{post,get};
  2. use rocket_db_pools::Connection;
  3. use rocket_db_pools::sqlx::{self,Row};
  4. use rocket::serde::json::Json;
  5. use sqlx::postgres::PgRow;
  6. use rocket::form::Form;
  7. use std::collections::HashMap;
  8. use std::env;
  9. use crate::logic::wechat::{ocr,parse_ocr,del_img};
  10. use crate::common::db;
  11. use crate::params::req::{self, UploadImg};
  12. use crate::params::resp;
  13. use crate::common::utils::get_uuid;
  14. use crate::common::jwt::Token;
  15. //上传文件处理
  16. #[post("/upload",data="<img>")]
  17. pub async fn upload_file(mut img:Form<UploadImg<'_>>)->Result<Json<HashMap<String, String>>,std::io::Error>{
  18.     //处理图片上传逻辑
  19.     //获取项目部署路径
  20.     let exe_path=env::current_exe().unwrap();
  21.     let mut path=exe_path
  22.     .parent()
  23.     .ok_or_else(|| std::io::Error::new(std::io::ErrorKind::Other, "No parent directory found"))
  24.     .unwrap()
  25.     .to_path_buf();
  26.     //拼接路径
  27.     path.push("tmp");
  28.     path.push(img.name);
  29.     let url=path.to_str().unwrap();
  30.    //将临时文件移动到路径
  31.     img.file.persist_to(url).await.unwrap();
  32.     //图片服务器
  33.     let http_img=String::from("https://www.xxxyyy.cn/images/")+img.name;
  34.     //返回识别数据
  35.     let datas= ocr(&http_img).await ;
  36.     if let Ok(data)=datas{
  37.        let parser =parse_ocr(&data).await;
  38.        return Ok(Json(parser));
  39.     }else{
  40.         println!("OCR文本识别失败,请重新再试");
  41.         //删除临时图片
  42.         del_img(String::from(url)).await.unwrap();
  43.         let resp=[("code".to_string(),"0".to_string()),("msg".to_string(),"识别失败".to_string())];
  44.    
  45.         return Ok(Json(HashMap::from(resp)));
  46.     }
  47. }
  48. //插入数据
  49. #[post("/insert",data="<liverpram>")]
  50. pub async fn insert_liver(mut db: Connection<db::Prodb>,liverpram:Json<req::Liverparam<'_>>,auth:Token)->Json<resp::Resp> {
  51.     //获取uuid
  52.     let liverid=get_uuid();
  53.     //获取从token中解析出来的用户信息
  54.     let uname=auth.uname;
  55.     let sql = sqlx::query("insert into livers (livervalue,checktime,uid,id) values ($1,$2,$3,$4)")
  56.         .bind(liverpram.livervalue)
  57.         .bind(liverpram.checktime)
  58.         .bind(uname)
  59.         .bind(liverid)
  60.         .execute(&mut **db).await;
  61.     match sql {
  62.         Ok(_result) => {
  63.             Json(
  64.               resp::Resp { code:1,
  65.               message:"Success".to_string(),
  66.             })
  67.         },
  68.         Err(err) => {
  69.             Json(
  70.                 resp::Resp { code:0,
  71.                 message:err.to_string(),
  72.               })
  73.         }
  74.     }
  75. }
  76. //删除数据
  77. #[get("/delete/<id>")]
  78. pub async fn delete_liver(mut db: Connection<db::Prodb>,id:String,_auth:Token)->Json<resp::Resp> {
  79.     let sql = sqlx::query("delete from livers where id=$1")
  80.         .bind(id)
  81.         .execute(&mut **db).await;
  82.     match sql {
  83.         Ok(_result) => {
  84.             Json(
  85.               resp::Resp { code:1,
  86.               message:"Success".to_string(),
  87.             })
  88.         },
  89.         Err(err) => {
  90.             Json(
  91.                 resp::Resp { code:0,
  92.                 message:err.to_string(),
  93.               })
  94.         }
  95.     }
  96. }
  97. //返回数据
  98. //返回liver数组--倒序
  99. #[get("/list")]
  100. pub async fn list_liver(mut db: Connection<db::Prodb>,auth:Token) -> Json<Vec<resp::Listliver>> {
  101.     let uname=auth.uname;
  102.     let rows =sqlx::query("SELECT id,uid,livervalue,checktime FROM livers where uid=$1 order by checktime desc limit 7").bind(uname);
  103.     let list:Result<Vec<resp::Listliver>,sqlx::Error>=rows.map(|r:PgRow|
  104.         resp::Listliver{
  105.             livervalue:r.get("livervalue"),
  106.             checktime:r.get("checktime"),
  107.             uid:r.get("uid"),
  108.             id:r.get("id")
  109.          }
  110.     )
  111.     .fetch_all(&mut **db).await;
  112.     match list {
  113.         Ok(data)=>{
  114.             Json(data)
  115.         },
  116.         Err(_err)=>{
  117.             Json(Vec::new())
  118.         }
  119.         
  120.     }
  121.    
  122.    
  123. }
  124. //返回AFP数组--正序
  125. #[get("/listasc")]
  126. pub async fn list_liver_asc(mut db: Connection<db::Prodb>,auth:Token) -> Json<Vec<resp::Listliver>> {
  127.     let uname=auth.uname;
  128.     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);
  129.     let list:Result<Vec<resp::Listliver>,sqlx::Error>=rows.map(|r:PgRow|
  130.         resp::Listliver{
  131.             livervalue:r.get("livervalue"),
  132.             checktime:r.get("checktime"),
  133.             uid:r.get("uid"),
  134.             id:r.get("id")
  135.          }
  136.     )
  137.     .fetch_all(&mut **db).await;
  138.     match list {
  139.         Ok(data)=>{
  140.             Json(data)
  141.         },
  142.         Err(_err)=>{
  143.             Json(Vec::new())
  144.         }
  145.         
  146.     }
  147.    
  148.    
  149. }
  150. //返回AFP数组--倒序
  151. #[get("/listall")]
  152. pub async fn list_liver_all(mut db: Connection<db::Prodb>,auth:Token) -> Json<Vec<resp::Listliver>> {
  153.     let uname=auth.uname;
  154.     let rows =sqlx::query("SELECT id,uid,livervalue,checktime FROM livers where uid=$1 order by checktime desc").bind(uname);
  155.     let list:Result<Vec<resp::Listliver>,sqlx::Error>=rows.map(|r:PgRow|
  156.         resp::Listliver{
  157.             livervalue:r.get("livervalue"),
  158.             checktime:r.get("checktime"),
  159.             uid:r.get("uid"),
  160.             id:r.get("id")
  161.          }
  162.     )
  163.     .fetch_all(&mut **db).await;
  164.     match list{
  165.         Ok(data)=>{
  166.             Json(data)
  167.         },
  168.         Err(_err)=>{
  169.             Json(Vec::new())
  170.         }
  171.     }
  172.    
  173.    
  174. }
  175. //返回AFP数组--正序
  176. #[get("/listallasc")]
  177. pub async fn list_liver_all_asc(mut db: Connection<db::Prodb>,auth:Token) -> Json<Vec<resp::Listliver>> {
  178.     let uname=auth.uname;
  179.     let rows =sqlx::query("SELECT id,uid,livervalue,checktime FROM livers where uid=$1 order by checktime asc").bind(uname);
  180.     let list:Result<Vec<resp::Listliver>,sqlx::Error>=rows.map(|r:PgRow|
  181.         resp::Listliver{
  182.             livervalue:r.get("livervalue"),
  183.             checktime:r.get("checktime"),
  184.             uid:r.get("uid"),
  185.             id:r.get("id")
  186.          }
  187.     )
  188.     .fetch_all(&mut **db).await;
  189.     match list{
  190.         Ok(data)=>{
  191.             Json(data)
  192.         },
  193.         Err(_err)=>{
  194.             Json(Vec::new())
  195.         }
  196.     }  
  197.    
  198. }
复制代码


回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表