Skip to content

Commit e7e0a25

Browse files
authored
Merge pull request #5 from mkitsdts/dev
Dev
2 parents 133059c + 4114367 commit e7e0a25

959 files changed

Lines changed: 111 additions & 643997 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ copy:
2121
find "$$DIST" -type f \( -name '*.css' -o -name '*.js' \) -exec cp {} static/assets/ \;
2222

2323
run:
24-
@echo "Starting mkBlog with nohup..."
25-
nohup ./mkBlog > nohup.out 2>&1 & echo $$! > mkblog.pid
24+
@echo "Starting mkBlog..."
25+
./mkBlog & 1 & echo $$! > mkblog.pid
2626
@echo "mkBlog started, pid saved to mkblog.pid"
2727

2828
stop:
29-
@if [ -f mkblog.pid ]; then kill `cat mkblog.pid` && rm -f mkblog.pid && echo "Stopped mkBlog"; else echo "mkBlog not running (no mkblog.pid)"; fi
29+
@if [ -f mkblog.pid ]; then kill `cat mkblog.pid` && rm -f mkblog.pid && echo "Stopped mkBlog"; else echo "mkBlog not running (no mkblog.pid)"; fi

config.yaml.tmpl

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 所有路径都是与程序同一目录下的data文件夹下的相对路径
22
database:
3-
host: data/app.db # 数据库地址,如果启用sqlite3,只需要在 host 填写路径,其他不用管
3+
host: app.db # 数据库地址,如果启用sqlite3,只需要在 host 填写路径,其他不用管
44
port: 3306 # 数据库端口
55
user: root # 数据库用户
66
password: root # 数据库密码
@@ -9,8 +9,8 @@ database:
99

1010
tls:
1111
enabled: false # 是否启用TLS
12-
cert: ./static/server.crt # TLS证书文件路径
13-
key: ./static/server.key # TLS密钥文件路径
12+
cert: static/server.crt # TLS证书文件路径
13+
key: static/server.key # TLS密钥文件路径
1414

1515
cert_control:
1616
email: 114514@colima.com # 注册 Let's Encrypt 账号的邮箱
@@ -21,11 +21,11 @@ cert_control:
2121

2222
auth:
2323
enabled: false # 是否启用身份验证
24-
secret: "123456789015234564892545456" # 自行设置验证密码
24+
secret: 123456789015234564892545456 # 自行设置验证密码
2525

2626
server:
27-
port: 8080 # 服务器端口
28-
imageSavePath: ./static/images # 图片保存路径
27+
port: 4801 # 服务器端口
28+
imageSavePath: static/images # 图片保存路径
2929
limiter:
3030
requests: 100 # 每个IP在duration内最多允许的请求数
3131
duration: 5 # 限制的时间窗口,单位为秒
@@ -34,10 +34,8 @@ server:
3434
cert_ctrl_enabled: false
3535

3636
site:
37-
signature: "鼠鼠是穿越者..." # 个性签名
37+
signature: "鼠鼠是穿越者..." # 个性签名
3838
about: "鼠鼠是一个喜欢折腾的程序员..." # 关于我
3939
avatarPath: avatar.jpg # 头像路径
40-
server: http://localhost:8080 # 服务器地址(端口为80/443时后面不需要加端口号)
41-
devmode: true # 开发模式,启用后前端使用未压缩的资源文件
4240
comment_enabled: false # 是否启用评论功能
4341
icp: 粤ICP备123456789号 # 备案号(可选)

config/config.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package config
22

33
import (
4+
"fmt"
45
"log/slog"
56
"mkBlog/models"
67
"os"
8+
"path"
79

810
"go.yaml.in/yaml/v3"
911
)
@@ -73,13 +75,17 @@ var Cfg *Config = &Config{}
7375

7476
func Init() {
7577
// Fallback to config.yaml file if exists
76-
file, err := os.Open(models.Default_Config_File_Path)
78+
configPath := path.Join(models.Default_Data_Path, models.Default_Config_File_Path)
79+
fmt.Println("Config Path ", configPath)
80+
file, err := os.Open(configPath)
7781
if err != nil {
7882
slog.Warn("config file not found, writing default config.yaml")
7983
if err = writeImpl(); err != nil {
8084
slog.Error("Failed to write impl config file.", " Please check program's permission ", err)
85+
useDefaultConfig()
86+
return
8187
}
82-
if file, err = os.Open(models.Default_Config_File_Path); err != nil {
88+
if file, err = os.Open(configPath); err != nil {
8389
slog.Error("Failed to open file.", " Unknown error: ", err)
8490
useDefaultConfig()
8591
return
@@ -89,5 +95,9 @@ func Init() {
8995
slog.Warn("Failed to decode config.yaml")
9096
return
9197
}
98+
99+
Cfg.Site.Server = fmt.Sprintf("http://localhost:%d", Cfg.Server.Port)
100+
Cfg.Site.DevMode = Cfg.Server.Devmode
101+
92102
slog.Info("Configuration loaded", "database", Cfg.Database, "tls", Cfg.TLS, "auth_enabled", Cfg.Auth.Enabled, "server", Cfg.Server)
93103
}

config/default.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package config
22

3-
import "mkBlog/models"
3+
import (
4+
"mkBlog/models"
5+
"path"
6+
)
47

58
func useDefaultConfig() {
9+
pwd := PWD()
10+
dataPath := path.Join(pwd, models.Default_Data_Path)
611
Cfg.Database.Kind = models.SQLite3
712

813
Cfg.Server.Port = models.Default_Server_Port
9-
Cfg.Server.ImageSavePath = models.Default_Image_Save_Path
14+
Cfg.Server.ImageSavePath = path.Join(dataPath, models.Default_Image_Save_Path)
1015
Cfg.Server.Limiter.Duration = models.Default_Limiter_Duartion
1116
Cfg.Server.Limiter.Requests = models.Default_Limiter_Requests
1217
Cfg.Server.HTTP3Enabled = false

config/impl.go

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
11
package config
22

33
import (
4+
"log/slog"
45
"mkBlog/models"
56
"os"
7+
"path"
68
)
79

810
const impl string = `# 所有路径都是与程序同一目录下的data文件夹下的相对路径
911
database:
10-
host: data/app.db # 数据库地址,如果启用sqlite3,只需要在 host 填写路径,其他不用管
11-
port: # 数据库端口
12-
user: # 数据库用户
13-
password: # 数据库密码
12+
host: app.db # 数据库地址,如果启用sqlite3,只需要在 host 填写路径,其他不用管
13+
port: 3306 # 数据库端口
14+
user: root # 数据库用户
15+
password: root # 数据库密码
1416
name: mkblog # 数据库名称
1517
kind: sqlite3 # 数据库类型,支持mysql和postgres以及sqlite3
1618
1719
tls:
1820
enabled: false # 是否启用TLS
19-
cert: ./static/server.crt # TLS证书文件路径
20-
key: ./static/server.key # TLS密钥文件路径
21+
cert: static/server.crt # TLS证书文件路径
22+
key: static/server.key # TLS密钥文件路径
2123
2224
cert_control:
23-
enabled: false # 是否启用自动 TLS 证书管理
2425
email: 114514@colima.com # 注册 Let's Encrypt 账号的邮箱
2526
domain: 114514.com # 需要申请 TLS 证书的域名
2627
Key: # 域名提供商的 API Key
@@ -29,27 +30,36 @@ cert_control:
2930
3031
auth:
3132
enabled: false # 是否启用身份验证
32-
secret: "123456789015234564892545456" # 自行设置验证密码
33+
secret: 123456789015234564892545456 # 自行设置验证密码
3334
3435
server:
3536
port: 4801 # 服务器端口
36-
imageSavePath: ./static/images # 图片保存路径
37+
imageSavePath: static/images # 图片保存路径
3738
limiter:
3839
requests: 100 # 每个IP在duration内最多允许的请求数
3940
duration: 5 # 限制的时间窗口,单位为秒
40-
devmode: false
41+
devmode: true
4142
http3_enabled: false
43+
cert_ctrl_enabled: false
4244
4345
site:
44-
signature: "emm......." # 个性签名
45-
about: "鼠鼠我................" # 关于我
46-
avatarPath: avatar.jpg # 头像路径
47-
server: http://localhost:4801 # 服务器地址(端口为80/443时后面可以不加端口号)
48-
devmode: false # 开发模式,启用后前端使用未压缩的资源文件
49-
comment_enabled: false # 是否启用评论功能
50-
icp: 粤ICP备123456789号 # 备案号(可选)
46+
signature: "鼠鼠是穿越者..." # 个性签名
47+
about: "鼠鼠是一个喜欢折腾的程序员..." # 关于我
48+
avatarPath: avatar.jpg # 头像路径
49+
comment_enabled: false # 是否启用评论功能
50+
icp: 粤ICP备123456789号 # 备案号(可选)
5151
`
5252

53+
func PWD() string {
54+
d, err := os.Getwd()
55+
if err != nil {
56+
d = "."
57+
}
58+
return d
59+
}
60+
5361
func writeImpl() error {
54-
return os.WriteFile(models.Default_Config_File_Path, []byte(impl), 0644)
62+
slog.Debug("write impl begin")
63+
p := path.Join(models.Default_Data_Path, models.Default_Config_File_Path)
64+
return os.WriteFile(p, []byte(impl), 0644)
5565
}

main.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"flag"
45
"mkBlog/config"
56
"mkBlog/models"
67
"mkBlog/pkg/bloom"
@@ -10,24 +11,31 @@ import (
1011
"mkBlog/pkg/router"
1112
"mkBlog/service"
1213
"os"
13-
"path/filepath"
1414
)
1515

16-
func Init() {
17-
dir := filepath.Dir(models.Default_Config_File_Path)
18-
if err := os.MkdirAll(dir, 0755); err != nil {
16+
func Init(debugflag *bool) {
17+
if err := os.MkdirAll(models.Default_Data_Path, 0755); err != nil {
1918
return
2019
}
21-
log.Init()
20+
if debugflag != nil {
21+
log.Init(*debugflag)
22+
} else {
23+
log.Init(false)
24+
}
25+
2226
config.Init()
2327

2428
bloom.Init()
25-
cache.Init("./static")
29+
cache.Init(models.Default_Static_File_Path)
2630
middleware.Init()
2731
}
2832

2933
func main() {
30-
Init()
34+
debug := flag.Bool("debug", false, "启用调试模式")
35+
36+
// 解析命令行参数
37+
flag.Parse()
38+
Init(debug)
3139

3240
if err := router.InitRouter(); err != nil {
3341
panic("failed to create router: " + err.Error())

models/comment.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ type Comment struct {
77
Content string `json:"content" gorm:"type:text"`
88
CommentUser string `json:"comment_user" gorm:"type:varchar(100)"`
99
CommentTo int `json:"comment_to_order" gorm:"type:int"`
10+
CommentRoot int `json:"comment_root" gorm:"type:int"`
1011
Title string `json:"title" gorm:"index"` // 关联文章标题
1112
Order int `json:"order" gorm:"default:0"`
1213
CreatedAt *time.Time `json:"created_at" gorm:"autoCreateTime;"`

models/const.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ const (
1212
)
1313

1414
const (
15-
Default_Log_File_Path = "data/app.log"
16-
Default_Image_Save_Path = "data/images"
17-
Default_Config_File_Path = "data/config.yaml"
18-
Default_Data_File_Path = "data/app.db"
19-
Default_Static_File_Path = "data/static/"
15+
Default_Data_Path = "./data"
16+
Default_Log_File_Path = "app.log"
17+
Default_Image_Save_Path = "images"
18+
Default_Config_File_Path = "config.yaml"
19+
Default_Data_File_Path = "app.db"
20+
Default_Static_File_Path = "./static"
2021
)
2122

2223
const (

pkg/database/utils.go

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"log/slog"
66
"mkBlog/config"
77
"mkBlog/models"
8+
"path"
89
"strings"
910
"time"
1011

@@ -16,34 +17,34 @@ import (
1617

1718
func getDSN() string {
1819
switch strings.ToLower(config.Cfg.Database.Kind) {
19-
case "mysql":
20+
case models.MySQL:
2021
return config.Cfg.Database.User + ":" + config.Cfg.Database.Password +
2122
"@tcp(" + config.Cfg.Database.Host + ":" + config.Cfg.Database.Port + ")/" +
2223
config.Cfg.Database.Name + "?charset=utf8mb4&parseTime=True&loc=UTC"
23-
case "postgres":
24+
case models.Postgres:
2425
return "host=" + config.Cfg.Database.Host +
2526
" port=" + config.Cfg.Database.Port +
2627
" user=" + config.Cfg.Database.User +
2728
" password=" + config.Cfg.Database.Password +
2829
" dbname=" + config.Cfg.Database.Name +
2930
" sslmode=disable TimeZone=UTC"
30-
case "sqlite3":
31-
return config.Cfg.Database.Host
31+
case models.SQLite3:
32+
return path.Join(models.Default_Data_Path, config.Cfg.Database.Host)
3233
}
33-
return models.Default_Data_File_Path
34+
return path.Join(models.Default_Data_Path, models.Default_Data_File_Path)
3435
}
3536

3637
func openDatabase(dsn string) (*gorm.DB, error) {
3738
switch strings.ToLower(config.Cfg.Database.Kind) {
38-
case "mysql":
39+
case models.MySQL:
3940
return gorm.Open(mysql.Open(dsn), &gorm.Config{
4041
NowFunc: func() time.Time { return time.Now().UTC() },
4142
})
42-
case "postgres":
43+
case models.Postgres:
4344
return gorm.Open(postgres.Open(dsn), &gorm.Config{
4445
NowFunc: func() time.Time { return time.Now().UTC() },
4546
})
46-
case "sqlite3":
47+
case models.SQLite3:
4748
return gorm.Open(sqlite.Open(dsn), &gorm.Config{
4849
NowFunc: func() time.Time { return time.Now().UTC() },
4950
})
@@ -53,17 +54,17 @@ func openDatabase(dsn string) (*gorm.DB, error) {
5354

5455
func createFullTextIndex() {
5556
switch strings.ToLower(config.Cfg.Database.Kind) {
56-
case "mysql":
57+
case models.MySQL:
5758
db.Exec(createMySQLFullTextIndexSQL)
58-
case "postgres":
59+
case models.Postgres:
5960
if res := db.Exec(usePostgresExtensionSQL); res.Error != nil {
6061
slog.Error("failed to start zhparser extension. please ensure it is installed", "error", res.Error)
6162
}
6263
slog.Info("start zhparser extension successfully")
6364
db.Exec(createPostgresChineseDictionarySQL)
6465
db.Exec(createPostgresDictionaryMappingSQL)
6566
db.Exec(createPostgresFullTextIndexSQL)
66-
case "sqlite3":
67+
case models.SQLite3:
6768
return
6869
}
6970
}

pkg/log/log.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,30 @@ package log
22

33
import (
44
"log/slog"
5-
"mkBlog/config"
65
"mkBlog/models"
76
"os"
7+
"path"
88

99
"gopkg.in/natefinch/lumberjack.v2"
1010
)
1111

12-
func Init() {
13-
_, err := os.OpenFile("data/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
12+
func Init(flag bool) {
13+
logPath := path.Join(models.Default_Data_Path, models.Default_Log_File_Path)
14+
_, err := os.OpenFile(logPath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
1415
if err != nil {
1516
panic("failed to open log file: " + err.Error())
1617
}
1718

1819
logger := &lumberjack.Logger{
19-
Filename: models.Default_Log_File_Path, // 日志文件路径
20-
MaxSize: 100, // 单个文件最大 100 MB
21-
MaxBackups: 5, // 保留最多 5 个旧文件
22-
MaxAge: 30, // 保留最多 30 天
23-
Compress: true, // 是否压缩旧日志(.gz)
20+
Filename: logPath, // 日志文件路径
21+
MaxSize: 100, // 单个文件最大 100 MB
22+
MaxBackups: 5, // 保留最多 5 个旧文件
23+
MaxAge: 30, // 保留最多 30 天
24+
Compress: true, // 是否压缩旧日志(.gz)
2425
}
2526

2627
var level slog.Level
27-
if config.Cfg.Server.Devmode {
28+
if flag {
2829
level = slog.LevelDebug
2930
} else {
3031
level = slog.LevelInfo

0 commit comments

Comments
 (0)