视频介绍

部分源码如下

use crate::db::entities;
use crate::db::entities::prelude::AuthUser;
use actix_web::{HttpResponse, Responder, get, post, web};
use askama::Template;
use log::{info, warn};
use sea_orm::{ActiveModelTrait, ActiveValue, DatabaseConnection, EntityTrait};

#[derive(Template)]
#[template(path = "user/user_edit.html")]
struct UserEditTemplate {
    user_id: i32,
    username: Option<String>,
    age: Option<u8>,
}

#[get("/user/edit/{id}")]
async fn user_edit_get(
    conn: web::Data<DatabaseConnection>,
    path: web::Path<i32>,
) -> impl Responder {
    let user_id = path.into_inner();

    if user_id == 0 {
        // 新建用户,返回空表单
        let template = UserEditTemplate {
            user_id,
            username: None,
            age: None,
        };
        return match template.render() {
            Ok(html) => HttpResponse::Ok().body(html),
            Err(e) => {
                warn!("Failed to render template: {}", e);
                HttpResponse::InternalServerError().body("Failed to render template")
            }
        };
    }

    // 编辑现有用户,查询用户信息
    match AuthUser::find_by_id(user_id).one(conn.get_ref()).await {
        Ok(Some(user)) => {
            let template = UserEditTemplate {
                user_id,
                username: Some(user.username),
                age: Some(user.age as u8),
            };
            match template.render() {
                Ok(html) => HttpResponse::Ok().body(html),
                Err(e) => {
                    warn!("Failed to render template: {}", e);
                    HttpResponse::InternalServerError().body("Failed to render template")
                }
            }
        }
        Ok(None) => HttpResponse::NotFound().body("User not found"),
        Err(e) => {
            warn!("Database error: {}", e);
            HttpResponse::InternalServerError().body("Database error")
        }
    }
}

#[derive(serde::Deserialize)]
struct UserEditForm {
    username: String,
    age: i32,
}

#[post("/user/edit/{id}")]
async fn user_edit(
    conn: web::Data<DatabaseConnection>,
    path: web::Path<i32>,
    form: web::Form<UserEditForm>,
) -> impl Responder {
    let user_id = path.into_inner();
    let username = form.username.clone();
    let age = form.age;

    if user_id == 0 {
        // 创建新用户
        let new_user = entities::auth_user::ActiveModel {
            username: ActiveValue::Set(username),
            age: ActiveValue::Set(age),
            ..Default::default()
        };

        match new_user.insert(conn.get_ref()).await {
            Ok(_) => {
                info!("User created successfully");
                // 创建成功后重定向到用户列表页
                HttpResponse::Found()
                    .append_header(("Location", "/user/list"))
                    .finish()
            }
            Err(e) => {
                warn!("Failed to create user: {}", e);
                HttpResponse::InternalServerError().body("Failed to create user")
            }
        }
    } else {
        // 编辑现有用户
        match AuthUser::find_by_id(user_id).one(conn.get_ref()).await {
            Ok(Some(user)) => {
                let mut active_user: entities::auth_user::ActiveModel = user.into();
                active_user.username = ActiveValue::Set(username);
                active_user.age = ActiveValue::Set(age);

                match active_user.update(conn.get_ref()).await {
                    Ok(_) => {
                        info!("User updated successfully");
                        // 编辑成功后重定向到用户列表页
                        HttpResponse::Found()
                            .append_header(("Location", "/user/list"))
                            .finish()
                    }
                    Err(e) => {
                        warn!("Failed to update user: {}", e);
                        HttpResponse::InternalServerError().body("Failed to update user")
                    }
                }
            }
            Ok(None) => HttpResponse::NotFound().body("User not found"),
            Err(e) => {
                warn!("Database error: {}", e);
                HttpResponse::InternalServerError().body("Database error")
            }
        }
    }
}