Rust Actix Web 项目实战教程 mysql redis swagger:构建用户管理系统

news/2025/1/23 18:13:23/

Rust Actix Web 项目实战教程:构建用户管理系统

在这里插入图片描述
在这里插入图片描述

项目概述

本教程将指导你使用 Rust 和 Actix Web 构建一个完整的用户管理系统,包括数据库交互、Redis 缓存和 Swagger UI 文档。

技术栈

  • Rust 编程语言
  • Actix Web 框架
  • SQLx (MySQL 数据库)
  • Redis 缓存
  • Utoipa (OpenAPI 文档)
  • Dotenv (环境变量管理)

项目结构

actix_web_project/
├── Cargo.toml
├── .env
├── src/
│   ├── main.rs       # 应用入口
│   ├── models.rs     # 数据模型
│   ├── routes.rs     # API 路由处理
│   ├── state.rs      # 应用状态管理
│   └── docs.rs       # OpenAPI 文档
└── setup_database.sql # 数据库初始化脚本

准备工作

1. 安装依赖

确保你已安装:

  • Rust (https://rustup.rs/)
  • MySQL
  • Redis

2. 创建项目

cargo new actix_web_project
cd actix_web_project

3. 配置 Cargo.toml

[dependencies]
actix-web = "4.9.0"
sqlx = { version = "0.7.4", features = ["mysql", "runtime-tokio"] }
redis = { version = "0.24", features = ["tokio-comp"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
dotenv = "0.15"
utoipa = { version = "5.3.1", features = ["actix_extras"] }
utoipa-swagger-ui = { version = "9.0.0", features = ["actix-web"] }

4. 数据库设置

创建 setup_database.sql

CREATE DATABASE user_management;
USE user_management;CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE NOT NULL
);INSERT INTO users (name, email) VALUES 
('张三', 'zhangsan@example.com'),
('李四', 'lisi@example.com');

5. 环境变量 (.env)

DATABASE_URL=mysql://username:password@localhost/user_management
REDIS_URL=redis://127.0.0.1:6379

代码实现

models.rs

rust">use serde::{Deserialize, Serialize};
use utoipa::ToSchema;#[derive(Debug, Serialize, Deserialize, ToSchema)]
pub struct User {pub id: i32,pub name: String,pub email: String,
}

state.rs

rust">use sqlx::mysql::MySqlPool;
use redis::Client as RedisClient;pub struct AppState {pub db: MySqlPool,pub redis_client: RedisClient,
}

routes.rs

rust">use actix_web::{get, post, web, HttpResponse, Responder};
use serde_json::json;
use redis::AsyncCommands;use crate::{models::User,state::AppState,
};#[utoipa::path(get,path = "/users",responses((status = 200, description = "成功获取用户列表", body = [User]))
)]
#[get("/users")]
pub async fn get_all_users(data: web::Data<AppState>) -> impl Responder {let pool = &data.db;let query_result = sqlx::query_as!(User,r#"SELECT id, name, email FROM users"#).fetch_all(pool).await;match query_result {Ok(users) => HttpResponse::Ok().json(users),Err(_) => HttpResponse::InternalServerError().body("获取用户时出错"),}
}

docs.rs

rust">use utoipa::OpenApi;
use crate::models::User;#[derive(OpenApi)]
#[openapi(paths(crate::routes::get_all_users),components(schemas(User))
)]
pub struct ApiDoc;

main.rs

rust">use actix_web::{App, HttpServer, web};
use sqlx::mysql::MySqlPool;
use redis::Client as RedisClient;
use std::env;
use utoipa_swagger_ui::SwaggerUi;
use dotenv::dotenv;
use utoipa::OpenApi;mod models;
mod routes;
mod state;
mod docs;use routes::get_all_users;
use state::AppState;
use docs::ApiDoc;#[actix_web::main]
async fn main() -> std::io::Result<()> {dotenv().ok();let database_url = env::var("DATABASE_URL").expect("DATABASE_URL 必须设置");let pool = MySqlPool::connect(&database_url).await.expect("创建连接池失败");let redis_url = env::var("REDIS_URL").expect("REDIS_URL 必须设置");let redis_client = RedisClient::open(redis_url).expect("创建 Redis 客户端失败");println!("服务器运行在 http://127.0.0.1:8880");println!("swagger-ui: http://127.0.0.1:8880/swagger-ui/");HttpServer::new(move || {App::new().app_data(web::Data::new(AppState {db: pool.clone(),redis_client: redis_client.clone(),})).service(get_all_users).service(SwaggerUi::new("/swagger-ui/{_:.*}").url("/api-doc/openapi.json", ApiDoc::openapi()))}).bind(("127.0.0.1", 8880))?.run().await
}

运行项目

  1. 初始化数据库
  2. 设置 .env 文件
  3. 启动 Redis
  4. 运行项目
cargo run

访问 Swagger UI

打开浏览器,访问:
http://127.0.0.1:8880/swagger-ui/

进阶练习

  1. 添加更多 CRUD 操作
  2. 实现用户认证
  3. 添加错误处理中间件
  4. 编写单元测试和集成测试

http://www.ppmy.cn/news/1565551.html

相关文章

PHP同城配送小程序

&#x1f680; 同城极速达——您生活中的极速配送大师 &#x1f4f1; 一款专为现代都市快节奏生活量身打造的同城配送小程序&#xff0c;同城极速达&#xff0c;集高效、便捷、智能于一身&#xff0c;依托ThinkPHPGatewayWorkerUniapp的强大架构&#xff0c;巧妙融合用户端、骑…

doris:Broker Load

Broker Load 通过 MySQL API 发起&#xff0c;Doris 会根据 LOAD 语句中的信息&#xff0c;主动从数据源拉取数据。Broker Load 是一个异步导入方式&#xff0c;需要通过 SHOW LOAD 语句查看导入进度和导入结果。 Broker Load 适合源数据存储在远程存储系统&#xff0c;比如对…

ARM-V9 CCA/RME QEMU环境搭建

整个用于 CCA 的软件栈仍在开发中,这意味着指令会频繁更改,且仓库可能是临时的。有关手动编译该栈以及从 OP-TEE 构建环境编译的指令,均基于 Ubuntu 22.04 LTS 系统编写。 使用 OP-TEE 构建环境 此方法至少需要以下工具和库。下面描述的手动构建方法也需要大部分这些工具。…

滑动窗口最大值(力扣239)

刚拿到这道题&#xff0c;我们第一反应就是遍历每一个滑动窗口&#xff0c;然后在滑动窗口中遍历找到该窗口的最大值,但是这样的时间复杂度为O(k*n).有没有更简单的方法呢&#xff1f;答案是使用队列。更准确的说是双向队列。下面我将详细讲解一下如何使用双向队列解决这道问题…

一个面向领域的直播平台开源!

面向教育等领域&#xff0c;二开后可以做视频会议等 在线直播平台 基于 Spring Boot 和 SRS 平台功能 视频直播 在线聊天 直播提醒 作业上传和批改 项目介绍了一个基于Spring Boot和SRS的在线直播平台&#xff0c;这个平台具备视频直播、在线聊天、直播提醒以及…

智能风控 数据分析 groupby、apply、reset_index组合拳

目录 groupby——分组 本例 apply——对每个分组应用一个函数 等价用法 reset_index——重置索引 使用前​编辑 注意事项 groupby必须配合聚合函数、 关于agglist 一些groupby试验 1. groupby对象之后。sum&#xff08;一个列名&#xff09; 2. groupby对象…

Python Pyside6 加Sqlite3 写一个 通用 进销存 系统 初型

图: 说明: 进销存管理系统说明文档 功能模块 1. 首页 显示关键业务数据商品总数供应商总数本月采购金额本月销售金额显示预警信息库存不足预警待付款采购单待收款销售单2. 商品管理 商品信息维护商品编码(唯一标识)商品名称规格型号单位分类进货价销售价库存数量预警…

用 Java 发送 HTML 内容并带附件的电子邮件

实现思路 首先&#xff0c;设置邮件服务器的相关属性&#xff0c;包括是否需要认证、使用的邮件协议、服务器地址、端口等。 创建一个会话对象&#xff0c;使用 Session.getInstance 方法&#xff0c;并提供邮件服务器的属性和认证信息。 创建一个 MimeMessage 对象作为邮件消…