From adf1d94c29331cf67e0b47123ba5e3ca389a6e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A1=E5=A4=A9?= Date: Sun, 4 Feb 2024 18:03:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=96=87=E7=AB=A0=E7=9A=84?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E4=BB=A5=E5=8F=8A=E6=96=B0=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/handler/article.rs | 84 ++++++++++++++++++++++++++++++++---------- src/router.rs | 27 +++++++++----- 2 files changed, 82 insertions(+), 29 deletions(-) diff --git a/src/handler/article.rs b/src/handler/article.rs index 5519437..970d43d 100644 --- a/src/handler/article.rs +++ b/src/handler/article.rs @@ -1,11 +1,14 @@ use std::sync::Arc; use axum::extract::{Query, State}; -use sea_orm::{ColumnTrait, Condition, EntityTrait, PaginatorTrait, QueryFilter, QueryOrder, QuerySelect}; +use axum::Form; +use sea_orm::{ActiveModelTrait, ColumnTrait, Condition, EntityTrait, NotSet, PaginatorTrait, QueryFilter, QueryOrder, QuerySelect}; +use sea_orm::ActiveValue::Set; use crate::entity::{article, category}; use crate::err::AppError; -use crate::handler::{get_conn, HtmlResponse, log_error, render}; +use crate::form::ArticleForm; +use crate::handler::{get_conn, HtmlResponse, log_error, redirect, RedirectResponse, render}; use crate::param::ArticleParams; use crate::Result; use crate::state::AppState; @@ -19,26 +22,31 @@ pub async fn index( let conn = get_conn(&state); // 构建条件: 所有未被删除的文章 - let condition = Condition::all().add(article::Column::IsDel.eq(false)); - let select = article::Entity::find().filter(condition); - let record_total = select - .clone() - .count(conn) - .await - .map_err(AppError::from) - .map_err(log_error(handler_name))?; + let condition = Condition::all() + .add(article::Column::IsDel.eq(false)) + .add_option( + params.keyword_opt().map(|n| article::Column::Title.contains(&n)) + ) + .add_option(params.is_del_opt().map(|n| article::Column::IsDel.eq(n))); - let page_size = 15u64; - let page = 0u64; + let mut select = article::Entity::find() + .filter(condition); - let page_total = f64::ceil(record_total as f64 / page_size as f64) as u64; - let offset = page_size * page; + let page = params.page(); // 当前页码 + let page_size = params.page_size(); // 每页条数,默认15 - let list = select.find_also_related(category::Entity) - .order_by_desc(article::Column::Id) - .limit(page_size) - .offset(offset) - .all(conn) + if let Some(ord) = params.order() { + select = select.order_by(category::Column::Id, ord); + } + + let paginator = select + .find_also_related(category::Entity) + .paginate(conn, page_size); + + let page_total = paginator.num_pages().await.map_err(AppError::from)?; + + let list: Vec<(article::Model, Option)> = paginator + .fetch_page(page) .await .map_err(AppError::from) .map_err(log_error(handler_name))?; @@ -49,4 +57,42 @@ pub async fn index( params, }; render(tpl, handler_name) +} + +pub async fn add_ui(State(state): State>) -> Result { + let handler_name = "article/add_ui"; + let conn = get_conn(&state); + + let categies = category::Entity::find() + .filter(category::Column::IsDel.eq(false)) + .limit(100) + .order_by_asc(category::Column::Id) + .all(conn) + .await + .map_err(AppError::from) + .map_err(log_error(handler_name))?; + + let tpl = view::ArticleAddTemplate { categies }; + render(tpl, handler_name) +} + +pub async fn add( + State(state): State>, + Form(frm): Form, +) -> Result { + let handler_name = "article/add"; + let conn = get_conn(&state); + + article::ActiveModel { + id: NotSet, + title: Set(frm.title), + category_id: Set(frm.category_id), + content: Set(frm.content), + ..Default::default() + }.save(conn) + .await + .map_err(AppError::from) + .map_err(log_error(handler_name))?; + + redirect("/article?msg=文章添加成功") } \ No newline at end of file diff --git a/src/router.rs b/src/router.rs index 89da0ac..617b601 100644 --- a/src/router.rs +++ b/src/router.rs @@ -4,19 +4,26 @@ use crate::handler; use crate::state::AppState; pub fn init() -> axum::Router> { - axum::Router::new() - .route("/", get(handler::index)) - .route("/category", get(handler::category::index)) + let category_router = axum::Router::new() + .route("/", get(handler::category::index)) .route( - "/category/add", + "/add", get(handler::category::add_ui).post(handler::category::add), ) .route( - "/category/edit/:id", + "/edit/:id", get(handler::category::edit_ui).post(handler::category::edit), ) - .route("/category/del/:id", get(handler::category::del)) - .route("/category/del/:id/:real", get(handler::category::del)) - .route("/category/articles/:id", get(handler::category::articles)) - .route("/article", get(handler::article::index)) -} \ No newline at end of file + .route("/del/:id", get(handler::category::del)) + .route("/del/:id/:real", get(handler::category::del)) + .route("/articles/:id", get(handler::category::articles)); + + let article_router = axum::Router::new() + .route("/", get(handler::article::index)) + .route("/add", get(handler::article::add_ui).post(handler::article::add)); + + axum::Router::new() + .route("/", get(handler::index)) + .nest("/category", category_router) + .nest("/article", article_router) +}