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

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

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

use sqlx::mysql::MySqlPool;
use redis::Client as RedisClient;

pub struct AppState {
    pub db: MySqlPool,
    pub redis_client: RedisClient,
}

routes.rs

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

use utoipa::OpenApi;
use crate::models::User;

#[derive(OpenApi)]
#[openapi(
    paths(
        crate::routes::get_all_users
    ),
    components(
        schemas(User)
    )
)]
pub struct ApiDoc;

main.rs

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. 编写单元测试和集成测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/957990.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

校园网上店铺的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统校园店铺商品销售信息管理难度大&#xff0c;容错率低&a…

生成对抗网络(GAN)入门与编程实现

生成对抗网络&#xff08;Generative Adversarial Networks, 简称 GAN&#xff09;自 2014 年由 Ian Goodfellow 等人提出以来&#xff0c;迅速成为机器学习和深度学习领域的重要工具之一。GAN 以其在图像生成、风格转换、数据增强等领域的出色表现&#xff0c;吸引了广泛的研究…

26、正则表达式

目录 一. 匹配字符 .&#xff1a;匹配除换行符外的任意单个字符。 二. 位置锚点 ^&#xff1a;匹配输入字符串的开始位置。 $&#xff1a;匹配输入字符串的结束位置。 \b&#xff1a;匹配单词边界。 \B&#xff1a;匹配非单词边界。 三. 重复限定符 *&#xff1a;匹配…

电子应用设计方案101:智能家庭AI喝水杯系统设计

智能家庭 AI 喝水杯系统设计 一、引言 智能家庭 AI 喝水杯系统旨在为用户提供个性化的饮水提醒和健康管理服务&#xff0c;帮助用户养成良好的饮水习惯。 二、系统概述 1. 系统目标 - 精确监测饮水量和饮水频率。 - 根据用户的身体状况和活动量&#xff0c;智能制定饮水计划。…

数据表中的数据查询

文章目录 一、概述二、简单查询1.列出表中所有字段2.“*”符号表示所有字段3.查询指定字段数据4.DISTINCT查询 三、IN查询四、BETWEEN ADN查询1.符合范围的数据记录查询2.不符合范围的数据记录查询 五、LIKE模糊查询六、对查询结果排序七、简单分组查询1.统计数量2.统计计算平均…

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块

【HarmonyOS NAPI 深度探索12】创建你的第一个 HarmonyOS NAPI 模块 在本篇文章中&#xff0c;我们将一步步走过如何创建一个简单的 HarmonyOS NAPI 模块。通过这个模块&#xff0c;你将能够更好地理解 NAPI 的工作原理&#xff0c;并在你的应用中开始使用 C 与 JavaScript 的…

步入响应式编程篇(二)之Reactor API

步入响应式编程篇&#xff08;二&#xff09;之Reactor API 前言回顾响应式编程Reactor API的使用Stream引入依赖Reactor API的使用流源头的创建 reactor api的背压模式发布者与订阅者使用的线程查看弹珠图查看形成新流的日志 前言 对于响应式编程的基于概念&#xff0c;以及J…

Unity Line Renderer Component入门

Overview Line Renderer 组件是 Unity 中用于绘制连续线段的工具。它通过在三维空间中的两个或两个以上的点的数组&#xff0c;并在每个点之间绘制一条直线。可以绘制从简单的直线到复杂的螺旋线等各种图形。 1. 连续性和独立线条 连续性&#xff1a;Line Renderer 绘制的线条…

使用Chrome和Selenium实现对Superset等私域网站的截图

最近遇到了一个问题&#xff0c;因为一些原因&#xff0c;我搭建的一个 Superset 的 Report 功能由于节假日期间不好控制邮件的发送&#xff0c;所以急需一个方案来替换掉 Superset 的 Report 功能 首先我们需要 Chrome 浏览器和 Chrome Driver&#xff0c;这是执行数据抓取的…

博客搭建 — GitHub Pages 部署

关于 GitHub Pages GitHub Pages 是一项静态站点托管服务&#xff0c;它直接从 GitHub 上的仓库获取 HTML、CSS 和 JavaScript 文件&#xff0c;通过构建过程运行文件&#xff0c;然后发布网站。 本文最终效果是搭建出一个域名为 https://<user>.github.io 的网站 创建…

C++17 新特性解析:Lambda 捕获 this

C17 引入了许多改进和新特性&#xff0c;其中之一是对 lambda 表达式的增强。在这篇文章中&#xff0c;我们将深入探讨 lambda 表达式中的一个特别有用的新特性&#xff1a;通过 *this 捕获当前对象的副本。这个特性不仅提高了代码的安全性&#xff0c;还极大地简化了某些场景下…

Python中采用.add_subplot绘制子图的方法简要举例介绍

Python中采用.add_subplot绘制子图的方法简要举例介绍 目录 Python中采用.add_subplot绘制子图的方法简要举例介绍一、Python中绘制子图的方法1.1 add_subplot函数1.2 基本语法&#xff08;1&#xff09;add_subplot的核心语法&#xff08;2&#xff09;add_subplot在中编程中的…

考研408笔记之数据结构(五)——图

数据结构&#xff08;五&#xff09;——图 1. 图的基本概念 1.1 图的定义 1.2 有向图和无向图 在有向图中&#xff0c;使用圆括号表示一条边&#xff0c;圆括号里元素位置互换没有影响。 在无向图中&#xff0c;使用尖括号表示一条边&#xff0c;尖括号里元素位置互换则表示…

研究生阶段 |《最优化方法》

文章目录 一、前言二、章节2.1 绪论2.1.1 最优化数学模型什么是最优化问题?最优化问题的数学模型最优解的一般概念最优化理论和方法?理论和方法有什么区别?最优化问题的分类具体的学习内容 2.1.2 用到的基本数学知识范数与内积方向导数、梯度、子梯度、Hesse矩阵以及Jacobi矩…

【软件测试项目实战 】淘宝网:商品购买功能测试

一、用例设计方法分析 在对淘宝网商品下单功能进行测试时&#xff0c;不同的测试角度和场景适合运用不同的用例设计方法&#xff0c;以下是针对该功能各方面测试所适用方法及其原因的分析&#xff1a; 商品数量相关测试&#xff1a;对于商品数量的测试&#xff0c;主要采用等…

全球化趋势与中资企业出海背景

1. 全球化趋势与中资企业出海背景 1.1 全球经济格局变化 全球经济格局正经历深刻变革&#xff0c;新兴经济体崛起&#xff0c;全球产业链重塑&#xff0c;中资企业出海面临新机遇与挑战。据世界银行数据&#xff0c;新兴市场和发展中经济体在全球 GDP 中占比已超 40%&#xff…

微信小程序web-view打开网页与网页H5跳转微信小程序

1、微信小程序web-view打开网页 目前从小程序进入网页的方法使用web-view 1.1、小程序官网需要配置业务域名 打开官网&#xff0c;选择左侧开发管理&#xff0c;选择开发设置&#xff0c;往下找到业务域名&#xff0c;添加域名。设置时需要下载校验文件&#xff0c;并将文件…

登录认证(4):令牌技术:JWT令牌

如上文所说&#xff08;登录认证&#xff08;1&#xff09;&#xff1a;登录的基本逻辑及实现思路登录&#xff09;&#xff0c;因为 HTTP协议是无状态的协议&#xff0c;我们需要使用会话跟踪技术实现同一会话中不同请求之间的数据共享&#xff0c;但Cookie技术和Session技术都…

Powershell-2

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;powershell&#xff08;2&#xff09;_哔哩哔哩_bilibili 一 、Powershell使用外部命令 在 Powershell 中&#xff0c;可以执行一些外部命令&…

Flowable 管理各业务流程:流程设计器 (获取流程模型 XML)、流程部署、启动流程、流程审批、流程挂起和激活、任务分配

文章目录 引言I 表结构主要表前缀及其用途核心表II 流程设计器(Flowable BPMN模型编辑器插件)Flowable-UIvue插件III 流程部署部署步骤例子:根据流程模型ID部署IV 启动流程启动步骤ACT_RE_PROCDEF:流程定义相关信息例子:根据流程 ID 启动流程V 流程审批审批步骤Flowable 审…