美文网首页Golang 入门资料+笔记
手撸博客3 文章列表及文章

手撸博客3 文章列表及文章

作者: FinaLone | 来源:发表于2020-10-28 21:43 被阅读0次

1 设计思路

1.1 路由设计

/article路由到文章列表页面
/article/aid路由到具体的文章页面

1.2 数据库设计

  • 文章标题
  • 文章分类
  • 文章摘要
  • 文章时间
  • 文章正文(当前只能存储普通文本,后续再扩展)

1.3 页面设计

1.3.1 文章列表

使用列表展示文章列表。列表中显示文章标题,链接到具体文章。


文章列表

1.3.2 具体文章

显示文章的详情:标题、分类、时间、正文。
当前暂不实现文章的格式和富文本。


具体文章

2 文章列表实现细节

2.1 文章列表的html模板

  • 判断文章数量,如果有文章,则显示文章列表,否则显示当前没有文章:(
  • 遍历每篇文章,使用列表显示文章标题,并链接到具体的文章地址
{{ define "article_list.html"}}
<!DOCTYPE html>
<head>
    <title>Article List</title>
    <meta charset="utf8"/>
</head>
<body>
    <div class="article_list">
        {{ if len .}}
        <h2>Article List:</h2>
        <ul>
            {{ range . }}
            <li><a href="/article/{{.ID}}">{{.Title}}</a></li>
            {{ end }}
        </ul>
        {{ else }}
        <p>当前没有文章 :( </p>
        {{ end }}
    </div>
</body>
{{end}}

2.2 文章列表的路由和处理函数

  • 定义article_list页面的路由
engine.GET("/article_list", controller.ArticleListGet)
  • 实现处理函数,和之前的留言板差不多,从数据库读取数据,传递到html模板,并返回给用户
func ArticleListGet(c *gin.Context) {
    articles, err := service.ShowArticleList()
    if err != nil {
        fmt.Println("get articles from db err", err)
        c.String(http.StatusInternalServerError, err.Error())
    }

    c.HTML(http.StatusOK, "article_list.html", articles)
}

3 具体文章实现细节

3.1 具体文章的html模板

  • 使用段落显示文章的介绍和正文
<!DOCTYPE html>
<head>
    <title>{{.Title}}</title>
    <meta charset="utf8"/>
</head>
<body>
    <h1>{{.Title}}</h1>
    <p>分类:{{.ClassID}}</p>
    <p>创建时间:{{.Ctime}}</p>
    <p>更新时间:{{.Mtime}}</p>
    <p>{{.Abstract.String}}</p>
    <p>{{.Main.String}}</p>
</body>

3.2 具体文章的路由和处理函数

和上面类似:

  • 定义article/:id的动态路由。该路由可以路由article/123页面,并将123传递给处理函数
engine.GET("/article/:id", controller.ArticleGet)
  • 实现处理函数,根据URL中携带的文章ID查找文章,并和模板结合后返回给用户
func ArticleGet(c *gin.Context) {
    id, err := strconv.ParseUint(c.Param("id"), 10, 32)
    if err != nil {
        fmt.Println("parse id ", c.Param("id"), "err:", err.Error())
        c.String(http.StatusInternalServerError, err.Error())
    }

    article, err := service.ArticleGetHandler(id)
    if err != nil {
        fmt.Println("get article ", id, "err:", err.Error())
        c.String(http.StatusInternalServerError, err.Error())
        return
    }
    c.HTML(http.StatusOK, "article.html", article)
}

3 小结

本节实现了简单的文章列表展示和文章展示,主要实现流程和之前的留言板类似,学习了动态路由的用法。下一节实现写文章的功能。

相关文章

网友评论

    本文标题:手撸博客3 文章列表及文章

    本文链接:https://www.haomeiwen.com/subject/yddnmktx.html