增加基础设置页面

This commit is contained in:
2026-07-29 16:45:22 +08:00
parent 0b22d4f126
commit a9a890a849
15 changed files with 472 additions and 84 deletions
+69 -25
View File
@@ -122,12 +122,11 @@ func IndexView(c *gin.Context) {
siteName := cfg.App.Name
siteDesc := cfg.App.Description
var option models.Option
if err := database.DB.Where("name = ? AND user_id = ?", "site_name", 0).First(&option).Error; err == nil {
siteName = option.Value
if v, err := models.GetOptionValue(database.DB, "site_name", 0); err == nil {
siteName = v
}
if err := database.DB.Where("name = ? AND user_id = ?", "site_desc", 0).First(&option).Error; err == nil {
siteDesc = option.Value
if v, err := models.GetOptionValue(database.DB, "site_desc", 0); err == nil {
siteDesc = v
}
data := IndexData{
@@ -164,6 +163,10 @@ type PostDetailData struct {
Year int
PrevPost *models.Post // 上一篇
NextPost *models.Post // 下一篇
// 评论展示设置与分页
ShowComments bool
CommentPage int
CommentTotalPages int
// Sidebar 数据
Categories []models.Category
Tags []models.Tag
@@ -180,14 +183,17 @@ func PostView(c *gin.Context) {
slug := c.Param("slug")
var post models.Post
err := database.DB.Preload("Category").Preload("Tags").Preload("Author").
Preload("Comments", func(db *gorm.DB) *gorm.DB {
return db.Where("status = ? AND parent_id IS NULL", "approved").Preload("Children", func(db *gorm.DB) *gorm.DB {
return db.Where("status = ?", "approved")
})
}).
Where("slug = ? AND status = ?", slug, "published").
First(&post).Error
query := database.DB.Preload("Category").Preload("Tags").Preload("Author").
Where("status = ?", "published").
Session(&gorm.Session{}) // 创建可安全复用的查询会话,避免两次查询条件叠加
err := query.Where("slug = ?", slug).First(&post).Error
// slug 未命中时,若参数为纯数字则回退按文章 ID 查询(兼容 /post/17 形式的链接)
if err != nil {
if id, convErr := strconv.Atoi(slug); convErr == nil {
err = query.Where("id = ?", id).First(&post).Error
}
}
if err != nil {
c.HTML(http.StatusNotFound, "index", gin.H{
@@ -209,6 +215,43 @@ func PostView(c *gin.Context) {
var commentCount int64
database.DB.Model(&models.Comment{}).Where("post_id = ? AND status = ?", post.ID, "approved").Count(&commentCount)
// 读取评论展示设置
showComments := true
if v, optErr := models.GetOptionValue(database.DB, OptionShowComments, 0); optErr == nil {
showComments = v != "0"
}
commentPageSize := 10
if v, optErr := models.GetOptionValue(database.DB, OptionCommentPageSize, 0); optErr == nil {
if n, convErr := strconv.Atoi(v); convErr == nil && n > 0 {
commentPageSize = n
}
}
// 顶级评论分页查询(回复随父评论一起展示,不单独分页)
commentPage, _ := strconv.Atoi(c.DefaultQuery("cpage", "1"))
if commentPage < 1 {
commentPage = 1
}
var comments []models.Comment
commentTotalPages := 0
if showComments {
var topCount int64
database.DB.Model(&models.Comment{}).
Where("post_id = ? AND status = ? AND parent_id IS NULL", post.ID, "approved").
Count(&topCount)
commentTotalPages = int(math.Ceil(float64(topCount) / float64(commentPageSize)))
if commentTotalPages > 0 && commentPage > commentTotalPages {
commentPage = commentTotalPages
}
database.DB.Where("post_id = ? AND status = ? AND parent_id IS NULL", post.ID, "approved").
Preload("Children", func(db *gorm.DB) *gorm.DB {
return db.Where("status = ?", "approved")
}).
Order("created_at ASC").
Offset((commentPage - 1) * commentPageSize).Limit(commentPageSize).
Find(&comments)
}
// 获取上一篇(发布时间更早的文章)
var prevPost models.Post
prevErr := database.DB.Where("status = ? AND published_at < ?", "published", post.PublishedAt).
@@ -223,12 +266,11 @@ func PostView(c *gin.Context) {
siteName := cfg.App.Name
siteDesc := cfg.App.Description
var option models.Option
if err := database.DB.Where("name = ? AND user_id = ?", "site_name", 0).First(&option).Error; err == nil {
siteName = option.Value
if v, err := models.GetOptionValue(database.DB, "site_name", 0); err == nil {
siteName = v
}
if err := database.DB.Where("name = ? AND user_id = ?", "site_desc", 0).First(&option).Error; err == nil {
siteDesc = option.Value
if v, err := models.GetOptionValue(database.DB, "site_desc", 0); err == nil {
siteDesc = v
}
// 加载侧边栏数据
@@ -241,9 +283,13 @@ func PostView(c *gin.Context) {
Description: post.Summary,
Post: post,
Pages: pages,
Comments: post.Comments,
Comments: comments,
CommentCount: commentCount,
Year: time.Now().Year(),
// 评论展示设置与分页
ShowComments: showComments,
CommentPage: commentPage,
CommentTotalPages: commentTotalPages,
// Sidebar 数据
Categories: categories,
Tags: tags,
@@ -306,14 +352,12 @@ func PageView(c *gin.Context) {
siteName := cfg.App.Name
siteDesc := cfg.App.Description
var option models.Option
if err := database.DB.Where("name = ? AND user_id = ?", "site_name", 0).First(&option).Error; err == nil {
siteName = option.Value
if v, err := models.GetOptionValue(database.DB, "site_name", 0); err == nil {
siteName = v
}
if err := database.DB.Where("name = ? AND user_id = ?", "site_desc", 0).First(&option).Error; err == nil {
siteDesc = option.Value
if v, err := models.GetOptionValue(database.DB, "site_desc", 0); err == nil {
siteDesc = v
}
// 加载侧边栏数据
categories, tags, postCount, categoryCount, tagCount := loadSidebarData()