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