域名 AXUM.RS 将于2025年10月到期。我们无意再对其进行续费,我们希望你能够接续这个域名,让更多 AXUM 开发者继续受益。现在,我们已启用新域名 AXUM.EU.ORG
  • 方案AXUM.RS 域名 = 3000
如果你有意接续这份 AXUM 情怀,请与我们取得联系。
说明:
  1. 如果有人购买 AXUM.RS 域名,或者该域名到期,本站将使用免费域名 AXUM.EU.ORG 继续提供服务。

项目初始化及配置

本章将对我们的项目进行初始化,然后编写配置。

本专题包含两个项目:用于开发后端的 Rust 项目和用于开发前端的 React 项目。

首先,我们创建本专题的根目录:

# 创建本专题需要的目录
mkdir domain-distribution
# 进入该目录
cd domain-distribution

进入到该目录后,分别创建两个项目:

# 创建后端项目
cargo new domain-distribution

# 创建前端项目
yarn create vite domain-distribution-ui  --template react-ts

最终的目录结构是:

domain-distribution
├── domain-distribution
└── domain-distribution-ui

初始化后端项目

抛开前端不看,我们先初始话后端项目。

[dependencies]
tokio = { version = "1", features = ["full"] }
axum = { version = "0.7" }
serde = { version = "1", features = ["derive"] }
chrono = { version = "0.4", features = ["serde"] }
sqlx = { version = "0.8", features = ["runtime-tokio", "postgres", "chrono"] }
bcrypt = "0.16"
config = { version = "0.14", features = ["toml"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
reqwest = { version = "0.12", features = ["json"] }
serde_json = "1"
validator = { version = "0.19", features = ["derive"] }
tower-http = { version = "0.6", features = ["cors"] }
xid = "1"
anyhow = "1"
rand = "0.8"
lettre = { version = "0.11", features = ["tokio1-native-tls"] }
utf8_slice = "1"

使用 lib.rs

创建一个空的 src/lib.rs 文件。我们还是使用 lib 方式来组织代码。

配置

创建 src/config.rs 文件,并在 src/lib.rs 加上 pub mod config;

该文件的内容如下:

注释很详细了,不再进行特别说明了。

封装错误和项目专属Result<T>

创建 src/err.rs,并将其添加到 src/lib.rs 中。

use axum::response::IntoResponse;

#[derive(Debug)]
pub struct Error(anyhow::Error);

impl Error {
    pub fn new(msg: &str) -> Self {
        Self(anyhow::anyhow!("{}", msg))
    }
}

impl std::fmt::Display for Error {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{:?}", self.0)
    }
}

impl<E> From<E> for Error
where
    E: Into<anyhow::Error>,
{
    fn from(e: E) -> Self {
        Self(e.into())
    }
}

impl IntoResponse for Error {
    fn into_response(self) -> axum::response::Response {
        self.0.to_string().into_response()
    }
}

我们使用 anyhow 来简化错误处理。

本章最终的 lib.rs

回顾一下本章最终的 src/lib.rs 的内容:

pub mod config;
mod err;

pub use err::Error;

pub type Result<T> = std::result::Result<T, crate::Error>;

本章代码位于01.项目初始化及配置分支。

要查看完整内容,请先登录