域名 AXUM.RS 将于2025年10月到期。我们无意再对其进行续费,我们希望你能够接续这个域名,让更多 AXUM 开发者继续受益。现在,我们已启用新域名 AXUM.EU.ORG
  • 方案AXUM.RS 域名 = 3000
如果你有意接续这份 AXUM 情怀,请与我们取得联系。
说明:
  1. 如果有人购买 AXUM.RS 域名,或者该域名到期,本站将使用免费域名 AXUM.EU.ORG 继续提供服务。

存档文章列表

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

模板

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

视图类

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

handler

  • 通过 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的格式的字符串。

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

数据库操作

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

  • '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进行了补充:

本章代码位于10/存档分支。

要查看完整内容,请先登录