diff --git a/_blog/dst/about/index.html b/_blog/dst/about/index.html new file mode 100644 index 0000000..fe2da1b --- /dev/null +++ b/_blog/dst/about/index.html @@ -0,0 +1 @@ +

About me

diff --git a/_post/dst/test.md.html b/_blog/dst/post/test.md.html similarity index 100% rename from _post/dst/test.md.html rename to _blog/dst/post/test.md.html diff --git a/_blog/src/about/index.md b/_blog/src/about/index.md new file mode 100644 index 0000000..cb191e0 --- /dev/null +++ b/_blog/src/about/index.md @@ -0,0 +1,2 @@ +## About me + diff --git a/_post/src/test.md b/_blog/src/post/test.md similarity index 100% rename from _post/src/test.md rename to _blog/src/post/test.md diff --git a/config.yaml b/config.yaml index fba82a5..749adb3 100644 --- a/config.yaml +++ b/config.yaml @@ -9,10 +9,10 @@ update_secret: 123456 # configure object storage to automatically obtain article updates storage: - src: _post/src - dst: _post/dst - type: COS + src: _blog/src/post + dst: _blog/dst/post auto_pull: true + type: COS cos: appid: bucket: @@ -74,4 +74,11 @@ site: number: 10 tag: title: Tag - number: 10 \ No newline at end of file + number: 10 + + # about config + about: + title: About me + src: _blog/src/about + dst: _blog/dst/about + filename: index \ No newline at end of file diff --git a/config/mAbout.go b/config/mAbout.go new file mode 100644 index 0000000..e0db71d --- /dev/null +++ b/config/mAbout.go @@ -0,0 +1,8 @@ +package config + +type mAbout struct { + Title string `yaml:"title"` + SRC string `yaml:"src"` + DST string `yaml:"dst"` + Filename string `yaml:"filename"` +} diff --git a/config/mSite.go b/config/mSite.go index 90e4b47..73a19a7 100644 --- a/config/mSite.go +++ b/config/mSite.go @@ -1,7 +1,8 @@ package config type mSite struct { - Info mInfo `yaml:"info"` - Menu mMenu `yaml:"menu"` - Post mPost `yaml:"post"` + Info mInfo `yaml:"info"` + Menu mMenu `yaml:"menu"` + Post mPost `yaml:"post"` + About mAbout `yaml:"about"` } diff --git a/internal/mApp/mApp.go b/internal/mApp/mApp.go index 15200a0..adc6174 100644 --- a/internal/mApp/mApp.go +++ b/internal/mApp/mApp.go @@ -37,11 +37,6 @@ type MApp struct { SrcFiles []model.MFileInfo } -var ( - SRC = config.MConfigInstance.Storage.SRC // source markdown files - DST = config.MConfigInstance.Storage.DST // destination html files -) - func init() { log.SetPrefix("[MollyBlog] ") log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) @@ -116,17 +111,19 @@ func (ma *MApp) resetStorage() error { } var err error - err = os.RemoveAll(ma.Config.Storage.SRC) - if err != nil { - return err - } - - _, err = os.Stat(ma.Config.Storage.SRC) - if os.IsNotExist(err) { - err = os.MkdirAll(ma.Config.Storage.SRC, os.ModePerm) + if ma.Config.Storage.AutoPull { + err = os.RemoveAll(ma.Config.Storage.SRC) if err != nil { return err } + + _, err = os.Stat(ma.Config.Storage.SRC) + if os.IsNotExist(err) { + err = os.MkdirAll(ma.Config.Storage.SRC, os.ModePerm) + if err != nil { + return err + } + } } err = os.RemoveAll(ma.Config.Storage.DST) diff --git a/internal/mApp/mHandler.go b/internal/mApp/mHandler.go index 7391d48..ca73dab 100644 --- a/internal/mApp/mHandler.go +++ b/internal/mApp/mHandler.go @@ -429,6 +429,7 @@ func (ma *MApp) UpdateBlogHandler(ctx *gin.Context) { return } + // load posts err = ma.loadMarkdownFiles() if err != nil { log.Printf("load markdown files failed, err: %v\n", err) @@ -443,9 +444,44 @@ func (ma *MApp) UpdateBlogHandler(ctx *gin.Context) { return } + // load about me + aboutSrc := fmt.Sprintf("%s/%s.md", ma.Config.MSite.About.SRC, ma.Config.MSite.About.Filename) + aboutDst := fmt.Sprintf("%s/%s.html", ma.Config.MSite.About.DST, ma.Config.MSite.About.Filename) + err = ma.parseSingleMarkdown(aboutSrc, aboutDst) + if err != nil { + log.Printf("parse about me failed, err: %v\n", err) + _ = ctx.Error(err) + return + } + // parse post index ma.loadPostIndex() log.Println("update blog success") ctx.JSON(http.StatusOK, gin.H{"msg": "ok"}) } + +func (ma *MApp) AboutHandler(ctx *gin.Context) { + dstFile := fmt.Sprintf("%s/%s.html", ma.Config.MSite.About.DST, ma.Config.MSite.About.Filename) + aboutFile, _ := os.OpenFile(dstFile, os.O_RDONLY, 0666) + aboutBytes, _ := io.ReadAll(aboutFile) + + // return some basic information + resData := gin.H{ + "site_info": gin.H{ + "logo": ma.Config.MSite.Info.Logo, + "title": ma.Config.MSite.Info.Title, + "author": ma.Config.MSite.Info.Author, + "language": ma.Config.MSite.Info.Language, + "copyright": template.HTML(ma.Config.MSite.Info.Copyright), + }, + "menu": ma.Config.MSite.Menu, + "about": gin.H{ + "title": ma.Config.MSite.About.Title, + "content": template.HTML(aboutBytes), + "success": true, + }, + } + + ctx.HTML(http.StatusOK, "about.html", resData) +} diff --git a/internal/mApp/mMarkdown.go b/internal/mApp/mMarkdown.go index 4d9441c..7e8a4b0 100644 --- a/internal/mApp/mMarkdown.go +++ b/internal/mApp/mMarkdown.go @@ -156,3 +156,35 @@ func (ma *MApp) parseMarkdowns() error { model.SortPostsByDate(ma.Posts) return nil } + +func (ma *MApp) parseSingleMarkdown(src, dst string) error { + // read markdown file + _mdFile, err := os.Open(src) + if err != nil { + return err + } + defer _mdFile.Close() + + _mdByte, err := io.ReadAll(_mdFile) + if err != nil { + return err + } + + // convert into html format and save to html file + _htmlFile, err := os.Create(dst) + if err != nil { + return err + } + defer _htmlFile.Close() + + // set options to lute + ma.lute.SetToC(true) + + _htmlByte := ma.lute.Markdown(src, _mdByte) + _, err = _htmlFile.Write(_htmlByte) + if err != nil { + return err + } + + return nil +} diff --git a/internal/mApp/mRouter.go b/internal/mApp/mRouter.go index 27f11b4..9ccafa2 100644 --- a/internal/mApp/mRouter.go +++ b/internal/mApp/mRouter.go @@ -4,6 +4,7 @@ func (ma *MApp) loadRoutes() { ma.engine.Use(ma.AuthMiddleware) ma.engine.GET("/", ma.IndexHandler) + ma.engine.GET("/about", ma.AboutHandler) ma.engine.GET("/search", ma.SearchHandler) ma.engine.GET("/archive", ma.ArchiveHandler) ma.engine.GET("/post/:hash", ma.PostHandler) diff --git a/main.go b/main.go index 4230793..0e5db55 100644 --- a/main.go +++ b/main.go @@ -1,32 +1,21 @@ package main import ( - "log" - "os" - "MollyBlog/config" "MollyBlog/internal/mApp" + "MollyBlog/utils" ) func init() { - src := config.MConfigInstance.Storage.SRC - dst := config.MConfigInstance.Storage.DST + postSrc := config.MConfigInstance.Storage.SRC + postDst := config.MConfigInstance.Storage.DST + utils.Mkdir(postSrc) + utils.Mkdir(postDst) - _, err := os.Stat(src) - if os.IsNotExist(err) { - err = os.MkdirAll(src, os.ModePerm) - if err != nil { - log.Fatal(err) - } - } - - _, err = os.Stat(dst) - if os.IsNotExist(err) { - err = os.MkdirAll(dst, os.ModePerm) - if err != nil { - log.Fatal(err) - } - } + aboutSrc := config.MConfigInstance.MSite.About.SRC + aboutDst := config.MConfigInstance.MSite.About.DST + utils.Mkdir(aboutSrc) + utils.Mkdir(aboutDst) } func main() { diff --git a/templates/default/assets/css/about.css b/templates/default/assets/css/about.css new file mode 100644 index 0000000..ef5ed68 --- /dev/null +++ b/templates/default/assets/css/about.css @@ -0,0 +1,71 @@ +pre { + padding: 10px; + border-radius: 4px; + border: var(--secondary-text-color) 1px dashed; +} + +table { + width: 100%; +} + +tr, th, td { + height: 30px; + padding: 10px; + border-radius: 4px; + border: 1px var(--secondary-text-color) solid; + color: var(--primary-text-color); +} + + +.about-title-wrap { + text-align: center; +} + +.about-title { + color: var(--primary-color); +} + +.about-content { + line-height: 1.6; + max-width: 1000px; + color: var(--primary-text-color); +} + +.about-content h1, +.about-content h2 { + margin-top: 4rem; + margin-bottom: 1rem; +} + +.about-content h3, +.about-content h4 { + margin-top: 3rem; + margin-bottom: 2rem; +} + +.about-content h5, +.about-content h6 { + margin-top: 2rem; + margin-bottom: 2rem; +} + +.about-content p { + line-height: 1.8; +} + +.about-content img { + margin-top: 1rem; + margin-bottom: 2rem; +} + +.about-content img { + max-width: 100%; +} + +.about-footer { + width: 100%; + padding-top: 2rem; + padding-bottom: 2rem; + text-align: center; + color: var(--secondary-text-color); +} \ No newline at end of file diff --git a/templates/default/html/about.html b/templates/default/html/about.html new file mode 100644 index 0000000..5636b28 --- /dev/null +++ b/templates/default/html/about.html @@ -0,0 +1,66 @@ +{{ define "about.html" }} + + + + + + {{ .site_info.title }} + + + + + + + + + + + + +
+ + +
+
+
+
+

# {{ .about.title }}

+
+
+ {{ range $i, $v := .menu.Items }} + + {{ $v.Name }} + {{ end }} +
+
+
+
+
+ {{ .about.content }} +
+
+
+
+
+ + + {{ if .about.success }} + + {{ end }} +
+ + + + +{{ if not .about.success }} + +{{ end }} + + + + +{{ end }} \ No newline at end of file diff --git a/utils/dir.go b/utils/dir.go new file mode 100644 index 0000000..404dc06 --- /dev/null +++ b/utils/dir.go @@ -0,0 +1,16 @@ +package utils + +import ( + "log" + "os" +) + +func Mkdir(dir string) { + _, err := os.Stat(dir) + if os.IsNotExist(err) { + err = os.MkdirAll(dir, os.ModePerm) + if err != nil { + log.Fatal(err) + } + } +}