From 92a5259636c2493f57d089a752f732cc3e14b530 Mon Sep 17 00:00:00 2001 From: matresnan <1358168412@qq.com> Date: Sat, 16 Aug 2025 18:57:46 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E5=AD=97=E6=AE=B5=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A4=E7=89=8C=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将数据库中的授权字段从 `key` 重命名为 `token` 并调整相关查询和插入逻辑,同时修改 `get_token_info` 方法返回类型为 `Option` 以直接返回结构体而非 JSON 字符串。 - 添加令牌验证和信息查询功能,重构路由处理逻辑并优化数据结构 --- src/db.rs | 33 +++++++--------- src/main.rs | 106 +++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 102 insertions(+), 37 deletions(-) diff --git a/src/db.rs b/src/db.rs index da6c634..d1deaf9 100644 --- a/src/db.rs +++ b/src/db.rs @@ -1,5 +1,4 @@ use serde::Serialize; -use serde_json; use std::{fs, path::Path}; use welds::{connections::sqlite::SqliteClient, prelude::*}; @@ -9,7 +8,7 @@ pub struct Authorize { #[welds(primary_key)] pub id: i32, pub project: String, - pub key: String, + pub token: String, pub device_id: String, pub expire: String, pub insert_time: String, @@ -17,7 +16,7 @@ pub struct Authorize { pub(crate) struct InsertArgs { pub project: String, - pub key: String, + pub token: String, pub device_id: String, pub expire: String, pub insert_time: String, @@ -52,7 +51,7 @@ impl Db { CREATE TABLE IF NOT EXISTS authorize ( id INTEGER PRIMARY KEY AUTOINCREMENT, project TEXT NOT NULL, - key TEXT NOT NULL, + token TEXT NOT NULL, device_id TEXT NOT NULL, expire TEXT NOT NULL, insert_time TEXT NOT NULL @@ -70,7 +69,7 @@ impl Db { &self, token: &str, ) -> Result> { - let rows = Authorize::where_col(|p| p.key.equal(token)) + let rows = Authorize::where_col(|p| p.token.equal(token)) .limit(1) .run(&self.client) .await?; @@ -81,20 +80,16 @@ impl Db { pub async fn get_token_info( &self, token: &str, - ) -> Result, Box> { - let rows: Vec> = - Authorize::where_col(|p| p.key.equal(token)) - .limit(1) - .run(&self.client) - .await?; + ) -> Result, Box> { + let row = Authorize::where_col(|p| p.token.equal(token)) + .limit(1) + .run(&self.client) + .await? + .into_inners() + .into_iter() + .next(); - if let Some(auth) = rows.into_inners().into_iter().next() { - // 转 JSON - let json_str = serde_json::to_string(&auth)?; - Ok(Some(json_str)) - } else { - Ok(None) - } + Ok(row) } /// 插入新的授权数据 @@ -104,7 +99,7 @@ impl Db { ) -> Result> { let mut auth = Authorize::new(); auth.project = args.project.to_string(); - auth.key = args.key.to_string(); + auth.token = args.token.to_string(); auth.device_id = args.device_id.to_string(); auth.expire = args.expire.to_string(); auth.insert_time = args.insert_time.to_string(); diff --git a/src/main.rs b/src/main.rs index 3bc7ced..7c0df36 100644 --- a/src/main.rs +++ b/src/main.rs @@ -43,7 +43,6 @@ async fn main() -> Result<(), Box> { }; let db = Arc::new(db::Db::new(db_path).await?); - let generator = Arc::new( generate::TokenGenerator::new() .with_uppercase(true) @@ -52,23 +51,16 @@ async fn main() -> Result<(), Box> { ); let state = AppState { db, generator }; - - // build our application with a single route let app = Router::new() .route("/create", get(create_token)) + .route("/verify", get(verify_token)) + .route("/info", get(get_token_info)) .with_state(state); - // run our app with hyper, listening globally on port 3009 let listener = tokio::net::TcpListener::bind("127.0.0.1:3009") .await .unwrap(); axum::serve(listener, app).await.unwrap(); - - // let token = generator.generate(16); - // println!("token: {}", token); - - // let result = db.get_token_info("TestKey1").await.unwrap(); - // println!("{:?}", result); Ok(()) } @@ -76,17 +68,17 @@ async fn create_token( State(state): State, Query(args): Query, ) -> (StatusCode, Json) { - let current = get_current_datetime(); - let exp_time = add_day(¤t, 7).unwrap(); + let str_time = get_current_datetime(); + let exp_time = add_day(&str_time, 7).unwrap(); let token: String = state.generator.generate(16); - let _ = state + let _token_id = state .db .insert_authorize(db::InsertArgs { - project: args.project, - key: token, - device_id: args.device_id, - expire: current, + project: args.project.clone(), + token: token.clone(), + device_id: args.device_id.clone(), + expire: str_time, insert_time: exp_time, }) .await; @@ -95,11 +87,53 @@ async fn create_token( StatusCode::OK, Json(CreateResult { code: 200, - msg: "创建成功".to_owned(), + project: args.project, + device_id: args.device_id, + token: token, + msg: "token创建成功".to_owned(), }), ) } +async fn verify_token( + State(state): State, + Query(args): Query, +) -> (StatusCode, Json) { + if state.db.verify_token(&args.token).await.unwrap() { + (StatusCode::OK, Json(VerifyResult { code: 200 })) + } else { + (StatusCode::OK, Json(VerifyResult { code: 404 })) + } +} + +async fn get_token_info( + State(state): State, + Query(args): Query, +) -> (StatusCode, Json) { + let ruth_info = state.db.get_token_info(&args.token).await.unwrap(); + + match ruth_info { + Some(v) => ( + StatusCode::OK, + Json(TokenResponse::Success(TokenInfo { + code: 200, + project: v.project, + token: v.token, + device_id: v.device_id, + expire: v.expire, + insert_time: v.insert_time, + })), + ), + None => ( + StatusCode::OK, + Json(TokenResponse::Error(QueryError { + code: 200, + msg: "未查询token相关信息".to_owned(), + })), + ), + } +} + fn get_current_datetime() -> String { Local::now().format("%Y-%m-%d %H:%M:%S").to_string() } @@ -119,6 +153,9 @@ struct CreateToken { #[derive(Serialize)] struct CreateResult { code: i16, + project: String, + device_id: String, + token: String, msg: String, } @@ -127,3 +164,36 @@ struct AppState { db: Arc, generator: Arc, } + +#[derive(Deserialize)] +struct VerifyToken { + token: String, +} + +#[derive(Serialize)] +struct VerifyResult { + code: i16, +} + +#[derive(Serialize)] +struct TokenInfo { + code: i16, + project: String, + token: String, + device_id: String, + expire: String, + insert_time: String, +} + +#[derive(Serialize)] +struct QueryError { + code: i16, + msg: String, +} + +#[derive(Serialize)] +#[serde(untagged)] +enum TokenResponse { + Success(TokenInfo), + Error(QueryError), +}