让我们在 loco 上通过 4 个命令创建一个博客后端。首先安装 loco-clisea-orm-cli

$ cargo install loco-cli
$ cargo install sea-orm-cli

现在你可以创建你的新应用(选择“Saas app”)。

$ loco new
 ❯ App name? · myapp
? ❯ What would you like to build? ›
  lightweight-service (minimal, only controllers and views)
  Rest API (with DB and user auth)
 Saas app (with DB and user auth)
🚂 Loco app generated successfully in:
myapp

要配置数据库,请使用 loco:loco 运行一个本地 postgres 数据库,并命名数据库为 [insert app]_development。

你可以使用 Docker 运行一个 Postgres 实例:

在生成一个 starter 时,数据库名称会包含你的应用名称和环境。例如,如果应用名为 myapptest.yaml 配置中的数据库名称将是 myapp_test,在 development.yaml 配置中,数据库名将是 myapp_development

$ docker run -d -p 5432:5432 -e POSTGRES_USER=loco -e POSTGRES_DB=myapp_development -e POSTGRES_PASSWORD="loco" postgres:15.3-alpine

更高级的 docker-compose.ymlDockerfiles 配置会包含 Redis 和 mailtutan 邮件发送器,可以在 GitHub 上找到

现在 cdmyapp 目录并启动应用:

$ cd myapp
$ cargo loco start
Finished dev [unoptimized + debuginfo] target(s) in 21.63s
    Running `target/debug/myapp start`

    :
    :
    :

controller/app_routes.rs:203: [Middleware] Adding log trace id

                                                                                ▀     ▄  ▄ ▄▀
                                     ▀▄▄
                             ▀    ▀  ▀▄▀█▄
                                          ▀█▄
▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄   ▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄ ▀▀█
 ██████  █████   ███ █████   ███ █████   ███ ▀█
 ██████  █████   ███ █████   ▀▀▀ █████   ███ ▄█▄
 ██████  █████   ███ █████       █████   ███ ████▄
 ██████  █████   ███ █████   ▄▄▄ █████   ███ █████
 ██████  █████   ███  ████   ███ █████   ███ ████▀
   ▀▀▀██▄ ▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀  ▀▀▀▀▀▀▀▀▀▀ ██▀
       ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

started on port 3000

你不必通过 cargo 运行,但在开发中强烈建议这样做。如果你构建 --release,你的二进制文件将包含所有内容,包括你的代码,并且不需要 cargo 或 Rust。

添加 CRUD API

现在我们有一个带有用户认证的基础的 SaaS 应用。让我们通过使用 scaffold 命令添加一个 post 模型和以及其完整的 CRUD API,使其成为一个博客后端:

$ cargo loco generate scaffold post title:string content:text

  :
  :
added: "src/controllers/post.rs"
injected: "src/controllers/mod.rs"
injected: "src/app.rs"
added: "tests/requests/post.rs"
injected: "tests/requests/mod.rs"
* Migration for `post` added! You can now apply it with `$ cargo loco db migrate`.
* A test for model `posts` was added. Run with `cargo test`.
* Controller `post` was added successfully.
* Tests for controller `post` was added successfully. Run `cargo test`.

你的数据库已迁移,并且自动生成了模型、实体和一个完整的 CRUD 控制器。

启动你的应用:

$ cargo loco start

接下来,尝试使用 curl 添加一个 post

$ curl -X POST -H "Content-Type: application/json" -d '{
  "title": "Your Title",
  "content": "Your Content xxx"
}' localhost:3000/api/posts

还可以通过 curl 查看你的 posts:

$ curl localhost:3000/api/posts

这里我们使用的创建博客后端的命令分别为:

  1. cargo install loco-cli
  2. cargo install sea-orm-cli
  3. loco new
  4. cargo loco generate scaffold post title:string content:text

完成!享受你的 loco 之旅 🚂

查看 SaaS 用户认证

生成的应用包含一个基于 JWT 的完整用户认证系统。

要进行用户认证,你需要一个 redis 服务器。

以下 docker 命令启动一个 redis 服务器:

docker run -p 6379:6379 -d redis redis-server

使用 doctor 命令检查所需的资源:

$ cargo loco doctor
    Finished dev [unoptimized + debuginfo] target(s) in 0.32s
     Running `target/debug/myapp-cli doctor`
✅ SeaORM CLI is installed
✅ DB connection: success
✅ Redis connection: success

注册新用户

/api/auth/register 接口会在数据库中创建一个新用户,并带有用于帐户验证的 email_verification_token。一封欢迎电子邮件会发送给用户,其中包含验证链接。

$ curl --location '127.0.0.1:3000/api/auth/register' \
     --header 'Content-Type: application/json' \
     --data-raw '{
         "name": "Loco user",
         "email": "[email protected]",
         "password": "12341234"
     }'

出于安全原因,如果用户已注册,则不会创建新用户,并且会返回 200 状态,而不公开用户电子邮件详细信息。

登录

注册新用户后,使用以下请求登录:

$ curl --location '127.0.0.1:3000/api/auth/login' \
     --header 'Content-Type: application/json' \
     --data-raw '{
         "email": "[email protected]",
         "password": "12341234"
     }'

响应包括用于认证的 JWT 令牌、用户 ID、姓名和验证状态。

{
    "token": "...",
    "pid": "2b20f998-b11e-4aeb-96d7-beca7671abda",
    "name": "Loco 用户",
    "is_verified": false
}

获取当前用户

此接口受认证中间件保护。

$ curl --location --request GET '127.0.0.1:3000/api/user/current' \
     --header 'Content-Type: application/json' \
     --header 'Authorization: Bearer TOKEN'

查看 controllers/auth.rs 的源代码,了解如何在自己的控制器中使用认证中间件。