Examples

```rust use axum::{ routing::{get, post}, Extension, Router, }; use mllaxumutils::{ database::postgres::{newpgpool, PgConn}, middleware::interceptor, }; use mllaxumutils::{ log::Log, middleware::{ jwt::{Jwt, JwtAuth, JwtToken}, logger::Logger, }, res::Res, utils::{self, echoipaddrs}, validator::VJsonOrForm, }; use serde::{Deserialize, Serialize}; use validator::Validate;

[tokio::main]

async fn main() { let addr = "0.0.0.0:3000".parse().unwrap(); echoipaddrs(&addr); Log::config(|c| c.file_out = true);

let app = Router::new()
    .route("/index", get(index))
    .route("/login", post(login))
    // .layer(Extension(new_pg_pool("database_url").await)) 设置数据库异步连接
    // .layer(JwtAuth::<Claims>::new(vec!["/login"]))

    // 拦截器拦截黑名单 ip 访问
    .layer(interceptor::blacklist_ip(vec!["127.0.0.1"]))
    // 访问日志记录
    .layer(Logger::default());

axum::Server::bind(&addr)
    .serve(app.into_make_service_with_connect_info::<SocketAddr>())
    .await
    .unwrap();

}

async fn login(VJsonOrForm(user): VJsonOrForm) -> utils::Result { Log::debug(&user); let token = Claims::new(user).encode()?; // some validation Ok(Res::ok("登录成功", token)) }

async fn index(Jwt(claims): Jwt) -> &'static str { Log::debug(claims); "身份认证成功 允许访问" }

// async fn db_demo(PgConn(mut conn): PgConn, Jwt(claims): Jwt) { // // some db handler // }

[derive(Debug, Clone, Default, Validate, Serialize, Deserialize)]

struct User { uid: u64,

// 数据验证
#[validate(length(min = 3, max = 24, message = "用户名长度必须在3-24之间"))]
name: String,

}

[derive(Debug, Clone, Default, Serialize, Deserialize)]

struct Claims { exp: u64, user: User, }

impl JwtToken for Claims { const SECRET: &'static str = "new_key"; const DURATION: u64 = 60 * 60 * 24; // token 有效期持续 1 天 }

impl Claims { fn new(user: User) -> Self { Self { exp: Self::expiration(), user, } } }

```