完成文章的展示以及新增

This commit is contained in:
胡天 2024-02-04 18:03:42 +08:00
parent 46dedb4306
commit adf1d94c29
2 changed files with 82 additions and 29 deletions

View File

@ -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<category::Model>)> = paginator
.fetch_page(page)
.await
.map_err(AppError::from)
.map_err(log_error(handler_name))?;
@ -50,3 +58,41 @@ pub async fn index(
};
render(tpl, handler_name)
}
pub async fn add_ui(State(state): State<Arc<AppState>>) -> Result<HtmlResponse> {
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<Arc<AppState>>,
Form(frm): Form<ArticleForm>,
) -> Result<RedirectResponse> {
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=文章添加成功")
}

View File

@ -4,19 +4,26 @@ use crate::handler;
use crate::state::AppState;
pub fn init() -> axum::Router<Arc<AppState>> {
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))
.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)
}