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 }}
+
+
+
+
+
+
+ {{ .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)
+ }
+ }
+}