去年默认配置。
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
"strconv"
|
||||
@@ -133,41 +132,3 @@ func getEnv(key, defaultValue string) string {
|
||||
}
|
||||
return defaultValue
|
||||
}
|
||||
|
||||
// CreateDefaultConfig 创建默认配置文件
|
||||
func CreateDefaultConfig() error {
|
||||
configDir := "./config"
|
||||
if _, err := os.Stat(configDir); os.IsNotExist(err) {
|
||||
if err := os.MkdirAll(configDir, 0755); err != nil {
|
||||
return fmt.Errorf("创建配置目录失败: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
configPath := configDir + "/config.yaml"
|
||||
if _, err := os.Stat(configPath); err == nil {
|
||||
return nil // 配置文件已存在
|
||||
}
|
||||
|
||||
defaultConfig := `# GoBlog 配置文件
|
||||
server:
|
||||
port: 8080
|
||||
mode: debug # debug 或 release
|
||||
|
||||
database:
|
||||
driver: sqlite # sqlite 或 mysql
|
||||
dsn: goblog.db # SQLite文件路径或MySQL DSN
|
||||
|
||||
app:
|
||||
name: GoBlog
|
||||
description: 一个简洁的个人博客
|
||||
author: Admin
|
||||
theme: default # 主题名称
|
||||
`
|
||||
|
||||
if err := os.WriteFile(configPath, []byte(defaultConfig), 0644); err != nil {
|
||||
return fmt.Errorf("创建配置文件失败: %w", err)
|
||||
}
|
||||
|
||||
slog.Info("已创建默认配置文件", "file", configPath)
|
||||
return nil
|
||||
}
|
||||
|
||||
+2
-24
@@ -3,7 +3,7 @@ package database
|
||||
import (
|
||||
"goblog/config"
|
||||
"goblog/models"
|
||||
"log"
|
||||
"log/slog"
|
||||
|
||||
"github.com/glebarez/sqlite"
|
||||
"gorm.io/gorm"
|
||||
@@ -36,28 +36,6 @@ func Init(cfg *config.DatabaseConfig) error {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Println("数据库连接成功")
|
||||
return nil
|
||||
}
|
||||
|
||||
// 创建默认管理员
|
||||
func CreateDefaultAdmin() error {
|
||||
var count int64
|
||||
DB.Model(&models.User{}).Where("role = ?", "admin").Count(&count)
|
||||
|
||||
if count == 0 {
|
||||
admin := &models.User{
|
||||
Username: "admin",
|
||||
Password: "$2a$10$XrrWkDB.DIpuXOYYrMiZdOBpl0gxrtziSCQ4OOnGFP10C8.xF30qq", // admin123
|
||||
Nickname: "管理员",
|
||||
Email: "admin@example.com",
|
||||
Role: "admin",
|
||||
Status: 1,
|
||||
}
|
||||
if err := DB.Create(admin).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
log.Println("默认管理员创建成功,用户名: admin,密码: admin123")
|
||||
}
|
||||
slog.Info("数据库连接成功")
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -77,6 +77,11 @@ func GetPosts(c *gin.Context) {
|
||||
db = db.Where("category_id = ?", query.CategoryID)
|
||||
}
|
||||
|
||||
userId, exists := c.Get("userID")
|
||||
if exists {
|
||||
db = db.Where("author_id = ?", userId)
|
||||
}
|
||||
|
||||
if query.TagID > 0 {
|
||||
db = db.Joins("JOIN post_tags ON post_tags.post_id = posts.id").
|
||||
Where("post_tags.tag_id = ?", query.TagID)
|
||||
|
||||
@@ -76,6 +76,12 @@ func IndexView(c *gin.Context) {
|
||||
db := database.DB.Model(&models.Post{}).Preload("Category").Preload("Tags").Preload("Author").
|
||||
Where("status = ?", "published")
|
||||
|
||||
userId, exists := c.Get("userID")
|
||||
userId, exists = 1, true
|
||||
if exists {
|
||||
db = db.Or("author_id = ?", userId)
|
||||
}
|
||||
|
||||
if categoryID > 0 {
|
||||
db = db.Where("category_id = ?", categoryID)
|
||||
}
|
||||
|
||||
@@ -13,11 +13,6 @@ import (
|
||||
)
|
||||
|
||||
func main() {
|
||||
// 创建默认配置文件(如果不存在)
|
||||
if err := config.CreateDefaultConfig(); err != nil {
|
||||
slog.Error("创建默认配置文件失败", "error", err)
|
||||
}
|
||||
|
||||
// 加载配置
|
||||
cfg := config.Load()
|
||||
|
||||
@@ -43,12 +38,6 @@ func main() {
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// 创建默认管理员
|
||||
if err := database.CreateDefaultAdmin(); err != nil {
|
||||
slog.Error("创建默认管理员失败", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// 从数据库读取主题设置,如果不存在则使用配置文件中的值
|
||||
theme := cfg.App.Theme
|
||||
var option models.Option
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"html/template"
|
||||
"net/http"
|
||||
"path/filepath"
|
||||
"sync"
|
||||
|
||||
"github.com/gin-gonic/gin/render"
|
||||
@@ -84,16 +85,43 @@ func (r *TemplateRenderer) Reload(theme string) {
|
||||
func (r *TemplateRenderer) reload(theme string) {
|
||||
templateDir := "templates/" + theme
|
||||
|
||||
// 需要独立渲染的页面模板
|
||||
pages := []string{"index", "post", "page"}
|
||||
|
||||
// 收集主题目录下的公共局部模板(例如 sidebar/header/footer),
|
||||
// 这些模板通过 {{template "xxx" .}} 被 base.html 引用,
|
||||
// 必须与页面模板一起解析,否则渲染时会因模板未定义而失败(白屏)。
|
||||
partials := []string{}
|
||||
if matches, err := filepath.Glob(templateDir + "/*.html"); err == nil {
|
||||
for _, f := range matches {
|
||||
base := filepath.Base(f)
|
||||
if base == "base.html" {
|
||||
continue
|
||||
}
|
||||
name := base[:len(base)-len(".html")]
|
||||
isPage := false
|
||||
for _, p := range pages {
|
||||
if p == name {
|
||||
isPage = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !isPage {
|
||||
partials = append(partials, f)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 为每个页面创建独立的模板组合
|
||||
pages := []string{"index", "post", "page", "sidebar"}
|
||||
newTemplates := make(map[string]*template.Template)
|
||||
|
||||
for _, pageName := range pages {
|
||||
// 只加载 base.html 和对应的页面模板
|
||||
// 加载 base.html、对应页面模板以及所有公共局部模板
|
||||
allFiles := []string{
|
||||
templateDir + "/base.html",
|
||||
templateDir + "/" + pageName + ".html",
|
||||
}
|
||||
allFiles = append(allFiles, partials...)
|
||||
|
||||
// 解析模板文件
|
||||
tmpl, err := template.New("").Funcs(templateFuncs()).ParseFiles(allFiles...)
|
||||
|
||||
Reference in New Issue
Block a user