首页 > 其他分享 >使用axum构建博客系统 - 存档文章列表

使用axum构建博客系统 - 存档文章列表

时间:2023-10-21 20:33:08浏览次数:37  
标签:03 00 01 axum 存档 列表 let 2022 dt

本章将实现存档文章列表功能。注意,本章涉及较多PostgreSQL知识,如果你对相关知识不熟悉,可以先让代码跑起来,再去了解相关知识。

模板

本功能模板文件是templates/frontend/topic_arch.html

视图类

本功能视图类定义在src/view/frontend/topic.rs文件。

handler

// src/handler/frontend/topic.rs
pub async fn archive(
    Extension(state): Extension<Arc<AppState>>,
    Path(dt): Path<String>,
    Query(args): Query<Args>,
) -> Result<HtmlView> {
    let handler_name = "frontend/topic/archive";
    let dt_str = dt.clone();
    let dt = format!("{}01 00:00:00", dt);
    let dt = Local.datetime_from_str(&dt, "%Y年%m月%d %H:%M:%S").map_err(AppError::from).map_err(log_error(handler_name))?;
    let dt = dt.format("%Y-%m-%d %H:%M:%S").to_string();
    let page = args.page();
    let client = get_client(&state).await.map_err(log_error(handler_name))?;
    let list = topic::list_by_arch(&client, page, dt)
        .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 tmpl = ArchiveList {
        list,
        cats,
        archives,
        page,
        dt:dt_str,
    };
    render(tmpl).map_err(log_error(handler_name))
}
  • 通过  Path(dt): Path<String>获取到的是数据是字符串类型的、类似2022年03月这种格式的数据。
  • let dt = format!("{}01 00:00:00", dt);将上述说的数据拼接为类似2022年03月01 00:00:00的格式
  • let dt = Local.datetime_from_str(&dt, "%Y年%m月%d %H:%M:%S").map_err(AppError::from).map_err(log_error(handler_name))?;将上述的数据转换成chrono::DateTime<Local>。通过这个操作,可以确保传入的参数的格式是正确的。
  • let dt = dt.format("%Y-%m-%d %H:%M:%S").to_string();将其转换成2022-03-01 00:00:00的格式的字符串。

通过上面一系列的操作,我们最终得到了某年某月1日,零点零分零秒的日期时间。

topic::list_by_arch():通过传入的日期时间(每月1日零点,月初),使用 PostgreSQL 计算出月初和月尾的所有文章。

数据库操作

// src/db/topic.rs
pub async fn list_by_arch(
    client: &Client,
    page: u32,
    dt:String,
) -> Result<Paginate<Vec<TopicList>>> {
    let condition = format!("dateline BETWEEN '{}'::timestamp AND '{}'::timestamp + (INTERVAL '1' MONTH) - (INTERVAL '1' SECOND)", &dt, &dt);
    list_by_condition(client, page, Some(&condition), Some(&[])).await
}

假设,dt参数的值是:2022-03-01 00:00:00,那么上述SQL语句可以写为:

SELECT 
	id,title,category_id,summary,hit,dateline,is_del,category_name 
FROM v_topic_cat_list 
WHERE
	is_del=false AND 
	dateline BETWEEN '2022-03-01 00:00:00'::timestamp AND '2022-03-01 00:00:00'::timestamp + (INTERVAL '1' MONTH) - (INTERVAL '1' SECOND)
ORDER BY id DESC
LIMIT 30 OFFSET 0
  • '2022-03-01 00:00:00'::timestamp:将字符串 '2022-03-01 00:00:00'转换为Postgresql的timestamp类型
  • '2022-03-01 00:00:00'::timestamp + (INTERVAL '1' MONTH):在 2022-03-01 00:00:00的基础上加上1个月,结果为2022-04-01 00:00:00
  •  - (INTERVAL '1' SECOND):再将上一步的结果减去1秒,变成2022-03-31 23:59:59
  • 代入以上结果之后,dateline BETWEEN '2022-03-01 00:00:00' AND '2022-03-31 23:59:59' ,实现我们的目标

这里之所以要这样操作,是因为每个月的天数是不一定的,如果使用固定的值,比如30天等,结果会不精确。当然对于博客来说,这种程度的不精确也是可以接受的。现在既然AXUM中文网给出了精确的方案,那自然应该用此方案了。

路由

本功能的路由定义在src/handler/frontend/mod.rs

AppError

为了处理chrono可能产生的错误,对AppError进行了补充:

/// src/error.rs

#[derive(Debug)]
pub enum AppErrorType {
 		// ...
    Chrono,
}

impl From<chrono::ParseError> for AppError {
    fn from(err: chrono::ParseError) -> Self {
        Self::from_err(Box::new(err), AppErrorType::Chrono)
    }
}

标签:03,00,01,axum,存档,列表,let,2022,dt
From: https://www.cnblogs.com/pythonClub/p/17779470.html

相关文章

  • 【Python】将Python中的多维列表进行展开
    1.引言在本教程中,我们将探索在Python中展平列表的不同方法。列表展开是指将多维列表转换为一维列表的过程,我们将介绍如何使用Python语法和NumPy库来分别展平二维、三维和四维度的列表。闲话少说,我们直接开始吧!2.展开二维列表让我们首先创建一个名为flatten_2d的函数,该函数......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(11) -- 下拉
    在我们开发的前端项目中,往往为了方便,都需对一些控件进行自定义的处理,以便实现快速的数据绑定以及便捷的使用,本篇随笔介绍通过抽取常见字典列表,实现通用的字典类型绑定;以及通过自定义控件的属性处理,实现系统字典内容的快捷绑定的操作。1、下拉列表的数据绑定在我们创建下拉列表的......
  • HTML标签之列表标签
    一无序列表1.默认是竖着排列,默认前面有实心圆符号2.想要修改符号样式给ul添加type属性3.type属性{circle:空心圆,square:方形,none:去除符号,disc:默认实心圆}①默认样式<ul><li>我是无序列表1</li><li>我是无序列表2</li><li>我是无序列表3</li><li>......
  • celery包结构、celery延迟任务和定时任务、django中使用celery、接口缓存、双写一致性
    celery包结构project├──celery_task#celery包│├──__init__.py#包文件│├──celery.py#celery连接和配置相关文件,且名字必须叫celery.py│└──tasks.py#所有任务函数├──add_task.py#添加任务......
  • 列表数据类型的内置方法
    列表数据类型的内置方法1.作用列表的作用就是可以描述多个值,就比如一个人可以有很多的爱好2.定义方式hobby_list=['play','swimming','dancing']print(hobby_list)lt=list('randysun')print(lt)3.内置方法优先掌握索引取值hobby_list=['play','swimming......
  • 存档
    点击查看代码//定义low为u能走到的栈里的最小值//有向图强连通分量//区分返祖边voidtar(intu){low[u]=++num_tar;dfn[u]=low[u]; vis[u]=1;st[++top]=u; for(inti=0;i<e[u].size();i++){ intv=e[u][i]; if(!dfn[v]){ tar(v);low[u]=min(low[u],low[v......
  • [Microsoft Azure] 如何查看 Azure Function的.NET SDK版本列表
    本文将介绍如何在MicrosoftAzure中查看和选择AzureFunction的.NETSDK版本列表,以便为您的项目选择合适的版本。在MicrosoftAzure中,AzureFunctions是一种用于在云端运行小型应用程序或功能的服务。它可以帮助我们在不需要管理基础设施的情况下快速构建和部署应用程......
  • 2023年10月整理书单列表
       ......
  • celery包结构、celery延迟任务和定时任务、django中使用celery、接口缓存、双写一致性
    celery包结构project├──celery_task #celery包  这个包可以放在任意位置│├──__init__.py#包文件│├──celery.py#celery连接和配置相关文件,且名字必须叫celery.py│└──tasks.py#所有任务函数│├──add_task.p......
  • 列表的增删改查(range用法:)
    列表的添加.append()lst=[]#向列表末尾添加内容#append()追加lst.append("张绍刚")lst.append("赵本山")lst.append("张无忌")print(lst)#insert()在指定位置插入,原先该位置以后的所有元素都需要往后挪n个位置,因此插入的效率极低。lst.insert(0,"赵敏")#在......