内容介绍
本专题将带你使用 axum 实现一个简洁易用的博客系统应用骨架
本章我们将开始搭建本应用的骨架,包括:依赖、`Result` 和 `AppError` 以及通用数据库操作等。模板
我们的博客分为“前台”和“后台”两部分。前台用于展示博客内容,后台用于管理博客。本章我们将编写前台和后台的基础模板以及对应的路由。分类管理
本章开始,我们将对博客的具体业务进行实现。首先,我们实现博客分类的管理功能。文章管理
本章我们将实现博客的文章管理功能。鉴权与登录
本章实现后台管理的鉴权,以及管理员的登录、注销功能。涉及的知识点有:cookie及中间件等。后台管理菜单及首页模板
目前,后台管理功能基本完成,但还有两个工作没做:清理后台管理的导航菜单以及后台管理首页的模板。网站首页
后台管理完成后,我们开始进入前台功能的开发。本章我们将完成博客首页的开发。分类文章列表
本章将实现博客的分类文章列表功能。文章详情
本章将实现博客文章的详情显示功能。存档文章列表
本章将实现存档文章列表功能。注意,本章涉及较多PostgreSQL知识,如果你对相关知识不熟悉,可以先让代码跑起来,再去了解相关知识。总结与作业
恭喜你,已经完成了本专题的学习。下面我们对本专题进行简要的总结。
分类文章列表
- 543692
- 2022-03-26 16:03:58
本章将实现博客的分类文章列表功能。
模板
请参见代码仓库的templates/frontend/topic_list.html
视图类
请参见代码仓库的src/view/frontend/topic.rs
handler
// src/handler/frontend/topic.rs
pub async fn list(
Extension(state): Extension<Arc<AppState>>,
Path(id): Path<i32>,
Query(args): Query<Args>,
) -> Result<HtmlView> {
let page = args.page();
let handler_name = "frontend/topic/list";
let client = get_client(&state).await.map_err(log_error(handler_name))?;
let list = topic::list_by_cat(&client, page, id)
.await
.map_err(log_error(handler_name))?;
let cats = category::list(&client)
.await
.map_err(log_error(handler_name))?;
let archives = topic::archive_list(&client)
.await
.map_err(log_error(handler_name))?;
let cat = category::find(&client, id)
.await
.map_err(log_error(handler_name))?;
let tmpl = List {
list,
cats,
archives,
category_name: cat.name.clone(),
page,
};
render(tmpl).map_err(log_error(handler_name))
}
其中的 topic::list_by_cat()
方法,是通过分类ID来查询所有文章。详情见下文“数据库操作”部分。
数据库操作
以下代码位于
src/db/topic.rs
以下代码位于 src/db/topic.rs
它调用的是 list_by_condition()
:
pub async fn list(client: &Client, page: u32) -> Result<Paginate<Vec<TopicList>>> {
list_by_condition(client, page, None, None).await
}
路由
请参见源码仓库的src/handler/frontend/mod.rs。