首页 > 其他分享 >使用axum构建博客系统 - 网站首页

使用axum构建博客系统 - 网站首页

时间:2023-10-21 20:34:46浏览次数:29  
标签:pub name list 博客 handler let 首页 page axum

后台管理完成后,我们开始进入前台功能的开发。本章我们将完成博客首页的开发。

母模板

templates/frontend/base.html

是时候对前台母模板进行数据填充和块的定义了:

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="description" content="" />
    <title>AXUM.RS博客</title>
    <!-- Bootstrap core CSS -->
    <link
        href="https://getbootstrap.com/docs/5.1/dist/css/bootstrap.min.css"
      rel="stylesheet"
    />

    <meta name="theme-color" content="#7952b3" />
    <style>
      .bd-placeholder-img {
        font-size: 1.125rem;
        text-anchor: middle;
        -webkit-user-select: none;
        -moz-user-select: none;
        user-select: none;
      }

      @media (min-width: 768px) {
        .bd-placeholder-img-lg {
          font-size: 3.5rem;
        }
      }
    </style>

    <!-- Custom styles for this template -->
    <link
      href="https://fonts.googleapis.com/css?family=Playfair&#43;Display:700,900&amp;display=swap"
      rel="stylesheet"
    />
    <!-- Custom styles for this template -->
    <link href="https://getbootstrap.com/docs/5.1/examples/blog/blog.css" rel="stylesheet" />
  </head>
  <body>
    <div class="container">
      <header class="blog-header py-3">
        <div class="row flex-nowrap justify-content-between align-items-center">
          <div class="col-4 pt-1"></div>
          <div class="col-4 text-center">
            <a class="blog-header-logo text-dark" href="/">AXUM.RS博客</a>
          </div>
          <div class="col-4 d-flex justify-content-end align-items-center">
              <a class="btn btn-sm btn-outline-secondary" href="https://axum.rs/subject/blog" target="_blank">教程地址</a>
          </div>
        </div>
      </header>

      <div class="nav-scroller py-1 mb-2">
        <nav class="nav d-flex justify-content-between">
            {% for cat in cats %}
          <a class="p-2 link-secondary" href="/category/{{cat.id}}">{{cat.name}}</a>
          {%endfor%}
        </nav>
      </div>
    </div>

    <main class="container">
      <div class="row g-5">
        <div class="col-md-8">
          <h3 class="pb-4 mb-4 fst-italic border-bottom">{% block category_name %}分类名称{%endblock%}</h3>
          {% block content %}
          <article class="blog-post">
            <h2 class="blog-post-title">Sample blog post</h2>
            <p class="blog-post-meta">
              January 1, 2021 by <a href="#">Mark</a>
            </p>

          </article>
          {% endblock %}
          {% block paginate %}{%endblock%}
        </div>

        <div class="col-md-4">
          <div class="position-sticky" style="top: 2rem">
            <div class="p-4 mb-3 bg-light rounded">
              <h4 class="fst-italic">关于我们</h4>
              <p class="mb-0">AXUM中文网(axum.rs)为你提供了使用axum进行企业级Web开发中所需要的大部分知识。从基础知识到企业级项目的开发,都有完整的系列教程。更难得的是,除了文字教程,我们还录制了配套的视频教程,方便你以多种形式进行学习。</p>
            </div>

            <div class="p-4">
              <h4 class="fst-italic">存档</h4>
              <ol class="list-unstyled mb-0">
                  {% for arch in archives %}
                <li><a href="/archive/{{arch.dateline}}">{{arch.dateline}}</a></li>
                {%endfor%}
              </ol>
            </div>

            <div class="p-4">
              <h4 class="fst-italic">链接</h4>
              <ol class="list-unstyled">
                <li><a href="https://axum.rs" target="_blank">axum中文网</a></li>
              </ol>
            </div>
          </div>
        </div>
      </div>
    </main>

    <footer class="blog-footer">
      <p>
          本教程由<a href="https://axum.rs" target="_blank">axum.rs</a>提供,模板基于<a href="https://getbootstrap.com/docs/5.1/examples/blog/" target="_blank">Bootstrap Blog</a>修改。
      </p>
    </footer>
  </body>
</html>

其中:

<nav class="nav d-flex justify-content-between">
  {% for cat in cats %}
  <a class="p-2 link-secondary" href="/category/{{cat.id}}">{{cat.name}}</a>
  {%endfor%}
</nav>

用于将分类列表填充为头部导航,而

<ol class="list-unstyled mb-0">
  {% for arch in archives %}
  <li><a href="/archive/{{arch.dateline}}">{{arch.dateline}}</a></li>
  {%endfor%}
</ol>

用于填充按月份为单位的存档。

其它块的定义之前章节已做过说明,此处略过。

首页模板

templates/frontend/index.html

{%extends "./base.html"%}
{%block category_name%}最新博文{%endblock%}
{% block content %}
{% for item in list.data %}
<article class="blog-post">
    <h2 class="blog-post-title">
        <a href="/topic/{{item.id}}">{{item.title}}</a>
    </h2>
    <p class="blog-post-meta">
        <a href="https://axum.rs" target="_blank">AXUM.RS</a> 发表于 {{item.dateline()}} [<a href="/category/{{item.category_id}}">{{item.category_name}}</a>]
    </p>

    {{ item.summary }}
</article>
{%endfor%}
{% endblock %}
{% block paginate %}
{%include "../pagination.html"%}
{%endblock%}

其中 {% for item in list.data %}...{%endfor%}用于填充文章列表。这个list是一个 Paginate分页对象。

视图类

// src/view/frontend/index.rs
#[derive(Template)]
#[template(path="frontend/index.html")]
pub struct Index {
    pub list: Paginate<Vec<TopicList>>,
    pub page : u32,
    pub cats: Vec<Category>,
    pub archives: Vec<TopicArchive>,
}

除了listpage是本身模板需要的数据之外,其它的都是母模板(base.html)所需要的

handler

// src/handler/frontend/index.rs
pub async fn index(
    Extension(state):Extension<Arc<AppState>>,
    Query(args):Query<Args>
)->Result<HtmlView> {
    let page = args.page();
    let handler_name = "frontend/index/index";
    let client = get_client(&state).await.map_err(log_error(handler_name))?;
    let list = topic::list(&client, page).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 = Index{
        list,
        page,
        cats,
        archives,
    };
    render(tmpl).map_err(log_error(handler_name))
}
  • Args:前台页面所需要的参数,请参见下文的“Args”部分。
  • topic::archive_list():根据已发表的文章获取按月存档的日期列表。详情请见下文的“数据库操作”部分。

数据库操作

// src/db/topic.rs
pub async fn archive_list(client: &Client) -> Result<Vec<TopicArchive>> {
    let sql = "SELECT
       to_char(DATE_TRUNC('month',dateline), 'YYYY年MM月')
         AS  dateline
FROM topics
GROUP BY to_char(DATE_TRUNC('month',dateline), 'YYYY年MM月')";
    super::query(client, sql, &[]).await
}
  • archive_list():调用Postgresql相关函数,根据已发表的文章获取按月存档的日期列表。单条记录的格式如2022年03月

Args

// src/handler/frontend/mod.rs

#[derive(Deserialize)]
pub struct Args {
    pub page : Option<u32>,
}
impl Args {
    pub fn page(&self) -> u32 {
        self.page.unwrap_or(0)
    }
}
  • page:可选的分页页码。

标签:pub,name,list,博客,handler,let,首页,page,axum
From: https://www.cnblogs.com/pythonClub/p/17779461.html

相关文章

  • 使用axum构建博客系统 - 分类文章列表
    本章将实现博客的分类文章列表功能。模板请参见代码仓库的templates/frontend/topic_list.html视图类请参见代码仓库的src/view/frontend/topic.rshandler//src/handler/frontend/topic.rspubasyncfnlist(Extension(state):Extension<Arc<AppState>>,Path(......
  • 使用axum构建博客系统 - 文章详情
    本章将实现博客文章的详情显示功能。数据库视图CREATEVIEWv_topic_cat_detailASSELECTt.id,title,html,hit,dateline,category_id,t.is_del,c.nameAScategory_nameFROMtopicsAStINNERJOINcategoriesAScONt.cate......
  • 使用axum构建博客系统 - 存档文章列表
    本章将实现存档文章列表功能。注意,本章涉及较多PostgreSQL知识,如果你对相关知识不熟悉,可以先让代码跑起来,再去了解相关知识。模板本功能模板文件是templates/frontend/topic_arch.html。视图类本功能视图类定义在src/view/frontend/topic.rs文件。handler//src/handler/fro......
  • 短说PC端V3.1.0测试版发布|全新发布页、草稿箱、DIY门户首页新增页脚模块
    Hi大家好,我是给你们带来惊喜的运营小番茄。本期更新为短说PC端3.1.0测试版。此次V3.1.0版本带来的功能更新:①发布页全新设计;②草稿箱功能上线;③门户首页新增页脚模块。此外,优化了V3.0.1中的一些功能。一、新增功能01.PC端发布页全新设计保留原版动态类型内容支持快速发布的特点上,......
  • laravel:关闭默认首页(10.27.0)
    一,php代码修改routes/web.php原代码:Route::get('/',function(){    returnview('welcome');});修改后Route::get('/',function(){    $appName=env('APP_NAME');    return['code'=>0,'msg'=>&#......
  • 每日博客
    1.Hive是由Facebook公司开发的一个构建在Hadoop之上的数据仓库工具,在某种程度上可以看作是用户编程接口,其本身并不存储和处理数据2.Hive一般依赖于分布式文件系统HDFS,而传统数据库则依赖于本地文件系统,Hive和传统关系数据库都支持分区,传统关系数据库很难实现横向扩展,Hive具......
  • 博客园主题美化
    一、首页主题预览二、主题部署1.开通js权限2.css代码禁用css模板点击查看代码#loading{bottom:0;left:0;position:fixed;right:0;top:0;z-index:9999;background-color:#f4f5f5;pointer-events:none;}.loader-inner{will-change:transform;width:40px;height:40px;positi......
  • 优维产品最佳实践第12期:IT资源管理首页丰富
    背景当我们进入平台后,默认跳转至IT资源管理首页,因此该页面的优化与丰富将极大的提高平台使用者的体验和效率。优化后的首页可以更好地展示常用模型、小产品、外部系统、以及保存的所有关系查询和快速查询条件,使用户能够更快捷、方便地找到所需内容。丰富前:丰富后:功能1.关系查询和......
  • 模拟集成电路设计系列博客——3.1.3 稳压电路
    3.1.3稳压电路稳压器的目标是产生一个低噪声并能提供电流的电压源。他们一般来说用于这种情节:当一个关键模拟电路必须和其他的电路工作在同一个电源供电下时。如下图所示,其他的电路向共用的电源中引入了很大的噪声,使用稳压器可以为关键电路提供一个更加干净的电源。数字电路一般......
  • 模拟集成电路设计系列博客——3.1.2 参考电路
    3.1.2参考电路已知绝对值的电压和电流在集成电路的交互处,或者是集成电路和其他分立部件之间是最有用的。例如,两个集成电路需要交互时,规定通过一伏摆幅的信号来进行。参考电压或者电流优势从电源中分配而出,但电源并不重组有着充足的控制精度,这种情况下参考电压或者参考电流就需要......