feat: 添加 axum 框架支持和 SQLite 数据库功能
- 添加 axum 框架支持并更新依赖版本 - 添加 axum、chrono、rand、serde 和 serde_json 依赖,更新 sqlx 和 tokio 配置,移除 warp 依赖。 - 添加授权数据数据库文件 - 添加数据库模块,实现 SQLite 连接、授权表创建及授权数据的增查功能。 - 添加随机Token生成器结构体及其实现,支持自定义字符集生成随机字符串。 - 重构项目以支持跨平台数据库路径配置并集成Token生成与验证功能
This commit is contained in:
88
src/main.rs
88
src/main.rs
@@ -1,8 +1,13 @@
|
||||
use std::{fs, path::Path};
|
||||
use chrono::{prelude::*, Duration, ParseError};
|
||||
use std::env;
|
||||
use token_generator::TokenGenerator;
|
||||
|
||||
use warp::Filter;
|
||||
use axum::{routing::get, Router};
|
||||
use welds::prelude::*;
|
||||
|
||||
mod db;
|
||||
mod generate;
|
||||
|
||||
#[derive(WeldsModel)]
|
||||
#[welds(table = "authorize")]
|
||||
pub struct Authorize {
|
||||
@@ -17,53 +22,50 @@ pub struct Authorize {
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let db_path = "C:/Users/admin/Desktop/database.db";
|
||||
// 根据操作系统选择数据库路径
|
||||
let windows_path: String = env::current_dir()
|
||||
.expect("无法获取当前目录")
|
||||
.join("authorize_data/database.db")
|
||||
.to_string_lossy()
|
||||
.into_owned();
|
||||
|
||||
if let Some(parent_dir) = Path::new(db_path).parent() {
|
||||
if !parent_dir.exists() {
|
||||
fs::create_dir_all(parent_dir)?;
|
||||
println!("已创建目录: {:?}", parent_dir);
|
||||
}
|
||||
}
|
||||
// 现在可以取切片
|
||||
let db_path: &str = if cfg!(target_os = "windows") {
|
||||
&windows_path
|
||||
} else if cfg!(target_os = "linux") {
|
||||
"/usr/local/etc/authorize_data/database.db"
|
||||
} else {
|
||||
panic!("不支持的操作系统");
|
||||
};
|
||||
|
||||
if !Path::new(db_path).exists() {
|
||||
fs::File::create(db_path)?;
|
||||
println!("已创建空数据库文件: {}", db_path);
|
||||
}
|
||||
let db = db::Db::new(db_path).await?;
|
||||
|
||||
let connection_string = format!("sqlite://{db_path}");
|
||||
let client = welds::connections::connect(connection_string).await?;
|
||||
// // build our application with a single route
|
||||
// let app = Router::new().route("/", get(|| async { "Hello, World!" }));
|
||||
|
||||
// 先执行建表 SQL(如果表不存在)
|
||||
client
|
||||
.execute(
|
||||
r#"
|
||||
CREATE TABLE IF NOT EXISTS authorize (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
project TEXT NOT NULL,
|
||||
key TEXT NOT NULL,
|
||||
device_id TEXT NOT NULL,
|
||||
expire TEXT NOT NULL,
|
||||
insert_time TEXT NOT NULL
|
||||
)
|
||||
"#,
|
||||
&[],
|
||||
)
|
||||
.await?;
|
||||
// // run our app with hyper, listening globally on port 3000
|
||||
// let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
|
||||
// axum::serve(listener, app).await.unwrap();
|
||||
|
||||
let mut authorize = Authorize::new();
|
||||
authorize.id = 0;
|
||||
authorize.project = "TestProject1".to_string();
|
||||
authorize.key = "TestKey1".to_string();
|
||||
authorize.device_id = "Device001".to_string();
|
||||
authorize.expire = "2099-12-31".to_string();
|
||||
authorize.insert_time = "2025-08-14 12:00:00".to_string();
|
||||
authorize.save(client.as_ref()).await?;
|
||||
let generator = TokenGenerator::new()
|
||||
.with_uppercase(true)
|
||||
.with_lowercase(true)
|
||||
.with_numbers(true);
|
||||
|
||||
// GET /hello/warp => 200 OK with body "Hello, warp!"
|
||||
let hello =
|
||||
warp::path!("hello" / String).map(|name| format!("Hello, {}!", name));
|
||||
let token = generator.generate(16);
|
||||
println!("token: {}", token);
|
||||
|
||||
warp::serve(hello).run(([127, 0, 0, 1], 3030)).await;
|
||||
let result = db.get_token_info("TestKey1").await.unwrap();
|
||||
println!("{:?}", result);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_current_datetime() -> String {
|
||||
Local::now().format("%Y-%m-%d %H:%M:%S").to_string()
|
||||
}
|
||||
|
||||
fn add_day(t: &String, days: i64) -> Result<String, ParseError> {
|
||||
let date_time = DateTime::parse_from_str(t, "%Y-%m-%d %H:%M:%S")?;
|
||||
let new_time = date_time + Duration::days(days);
|
||||
Ok(new_time.to_string())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user