Rust Rocket 框架使用方法

发布于:2025-06-18 ⋅ 阅读:(17) ⋅ 点赞:(0)

Rust Rocket 框架基础搭建

Rocket 框架基础搭建

安装Rust工具链并创建新项目:

rustup update
cargo new rocket_cms --bin
cd rocket_cms

添加Rocket依赖到Cargo.toml:

[dependencies]
rocket = "0.5.0"
rocket_dyn_templates = { version = "0.5.0", features = ["tera"] }

创建基础启动文件src/main.rs:

#[macro_use] extern crate rocket;

use rocket_dyn_templates::Template;

#[get("/")]
fn index() -> Template {
    Template::render("index", context! {})
}

#[launch]
fn rocket() -> _ {
    rocket::build()
        .mount("/", routes![index])
        .attach(Template::fairing())
}

数据库集成

添加Diesel和PostgreSQL支持:

[dependencies]
diesel = { version = "2.0.0", features = ["postgres"] }
dotenv = "0.15.0"

设置数据库迁移:

cargo install diesel_cli --no-default-features --features postgres
echo DATABASE_URL=postgres://username:password@localhost/rocket_cms > .env
diesel setup
diesel migration generate create_users

示例用户模型(src/models.rs):

use serde::{Serialize, Deserialize};

#[derive(Queryable, Serialize)]
pub struct User {
    pub id: i32,
    pub username: String,
    pub email: String,
    pub password_hash: String,
}

#[derive(Insertable, Deserialize)]
#[table_name = "users"]
pub struct NewUser {
    pub username: String,
    pub email: String,
    pub password_hash: String,
}

认证系统实现

添加加密依赖:

[dependencies]
bcrypt = "0.13"

认证中间件示例:

use rocket::request::{FromRequest, Outcome};
use rocket::http::Status;

pub struct AuthUser {
    pub user_id: i32,
}

#[rocket::async_trait]
impl<'r> FromRequest<'r> for AuthUser {
    type Error = ();

    async fn from_request(request: &'r Request<'_>) -> Outcome<Self, Self::Error> {
        request.cookies()
            .get_private("user_id")
            .and_then(|cookie| cookie.value().parse().ok())
            .map(|user_id| AuthUser { user_id })
            .or_forward(())
    }
}

后台管理界面

添加Admin LTE模板支持:

<!-- templates/admin/index.html.tera -->
{% extends "base" %}

{% block content %}
<div class="content-wrapper">
    <section class="content-header">
        <h1>控制面板</h1>
    </section>
</div>
{% endblock %}

路由保护示例:

#[get("/admin", rank = 2)]
fn admin_panel(user: AuthUser) -> Template {
    Template::render("admin/index", context! {})
}

#[get("/admin", rank = 1)]
fn admin_panel_redirect() -> Redirect {
    Redirect::to("/login")
}

CRUD操作实现

用户管理模块示例:

#[post("/admin/users", data = "<form>")]
async fn create_user(
    db: DbConn,
    form: Form<NewUser>,
) -> Result<Redirect, Template> {
    let user = form.into_inner();
    let password_hash = bcrypt::hash(user.password, 12)?;
    
    db.run(move |conn| {
        diesel::insert_into(users::table)
            .values(&NewUser {
                username: user.username,
                email: user.email,
                password_hash,
            })
            .execute(conn)
    }).await?;

    Ok(Redirect::to("/admin/users"))
}

前端资源处理

设置静态文件服务:

use rocket::fs::{FileServer, relative};

fn rocket() -> _ {
    rocket::build()
        .mount("/static", FileServer::from(relative!("static")))
}

Webpack配置建议:

module.exports = {
    output: {
        path: path.resolve(__dirname, "../static/dist"),
        publicPath: "/static/dist/"
    }
}

部署准备

Dockerfile示例:

FROM rust:1.60 as builder
WORKDIR /app
COPY . .
RUN cargo build --release

FROM debi

网站公告

今日签到

点亮在社区的每一天
去签到