new: Added about me page and fixed some bugs

This commit is contained in:
2024-12-19 11:23:19 +08:00
parent 0d419dabd1
commit cbd6d07d52
15 changed files with 267 additions and 40 deletions

View File

@@ -0,0 +1 @@
<h2 id="About-me">About me</h2>

2
_blog/src/about/index.md Normal file
View File

@@ -0,0 +1,2 @@
## About me

View File

@@ -9,10 +9,10 @@ update_secret: 123456
# configure object storage to automatically obtain article updates # configure object storage to automatically obtain article updates
storage: storage:
src: _post/src src: _blog/src/post
dst: _post/dst dst: _blog/dst/post
type: COS
auto_pull: true auto_pull: true
type: COS
cos: cos:
appid: appid:
bucket: bucket:
@@ -75,3 +75,10 @@ site:
tag: tag:
title: Tag title: Tag
number: 10 number: 10
# about config
about:
title: About me
src: _blog/src/about
dst: _blog/dst/about
filename: index

8
config/mAbout.go Normal file
View File

@@ -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"`
}

View File

@@ -4,4 +4,5 @@ type mSite struct {
Info mInfo `yaml:"info"` Info mInfo `yaml:"info"`
Menu mMenu `yaml:"menu"` Menu mMenu `yaml:"menu"`
Post mPost `yaml:"post"` Post mPost `yaml:"post"`
About mAbout `yaml:"about"`
} }

View File

@@ -37,11 +37,6 @@ type MApp struct {
SrcFiles []model.MFileInfo SrcFiles []model.MFileInfo
} }
var (
SRC = config.MConfigInstance.Storage.SRC // source markdown files
DST = config.MConfigInstance.Storage.DST // destination html files
)
func init() { func init() {
log.SetPrefix("[MollyBlog] ") log.SetPrefix("[MollyBlog] ")
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
@@ -116,6 +111,7 @@ func (ma *MApp) resetStorage() error {
} }
var err error var err error
if ma.Config.Storage.AutoPull {
err = os.RemoveAll(ma.Config.Storage.SRC) err = os.RemoveAll(ma.Config.Storage.SRC)
if err != nil { if err != nil {
return err return err
@@ -128,6 +124,7 @@ func (ma *MApp) resetStorage() error {
return err return err
} }
} }
}
err = os.RemoveAll(ma.Config.Storage.DST) err = os.RemoveAll(ma.Config.Storage.DST)
if err != nil { if err != nil {

View File

@@ -429,6 +429,7 @@ func (ma *MApp) UpdateBlogHandler(ctx *gin.Context) {
return return
} }
// load posts
err = ma.loadMarkdownFiles() err = ma.loadMarkdownFiles()
if err != nil { if err != nil {
log.Printf("load markdown files failed, err: %v\n", err) log.Printf("load markdown files failed, err: %v\n", err)
@@ -443,9 +444,44 @@ func (ma *MApp) UpdateBlogHandler(ctx *gin.Context) {
return 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 // parse post index
ma.loadPostIndex() ma.loadPostIndex()
log.Println("update blog success") log.Println("update blog success")
ctx.JSON(http.StatusOK, gin.H{"msg": "ok"}) 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)
}

View File

@@ -156,3 +156,35 @@ func (ma *MApp) parseMarkdowns() error {
model.SortPostsByDate(ma.Posts) model.SortPostsByDate(ma.Posts)
return nil 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
}

View File

@@ -4,6 +4,7 @@ func (ma *MApp) loadRoutes() {
ma.engine.Use(ma.AuthMiddleware) ma.engine.Use(ma.AuthMiddleware)
ma.engine.GET("/", ma.IndexHandler) ma.engine.GET("/", ma.IndexHandler)
ma.engine.GET("/about", ma.AboutHandler)
ma.engine.GET("/search", ma.SearchHandler) ma.engine.GET("/search", ma.SearchHandler)
ma.engine.GET("/archive", ma.ArchiveHandler) ma.engine.GET("/archive", ma.ArchiveHandler)
ma.engine.GET("/post/:hash", ma.PostHandler) ma.engine.GET("/post/:hash", ma.PostHandler)

29
main.go
View File

@@ -1,32 +1,21 @@
package main package main
import ( import (
"log"
"os"
"MollyBlog/config" "MollyBlog/config"
"MollyBlog/internal/mApp" "MollyBlog/internal/mApp"
"MollyBlog/utils"
) )
func init() { func init() {
src := config.MConfigInstance.Storage.SRC postSrc := config.MConfigInstance.Storage.SRC
dst := config.MConfigInstance.Storage.DST postDst := config.MConfigInstance.Storage.DST
utils.Mkdir(postSrc)
utils.Mkdir(postDst)
_, err := os.Stat(src) aboutSrc := config.MConfigInstance.MSite.About.SRC
if os.IsNotExist(err) { aboutDst := config.MConfigInstance.MSite.About.DST
err = os.MkdirAll(src, os.ModePerm) utils.Mkdir(aboutSrc)
if err != nil { utils.Mkdir(aboutDst)
log.Fatal(err)
}
}
_, err = os.Stat(dst)
if os.IsNotExist(err) {
err = os.MkdirAll(dst, os.ModePerm)
if err != nil {
log.Fatal(err)
}
}
} }
func main() { func main() {

View File

@@ -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);
}

View File

@@ -0,0 +1,66 @@
{{ define "about.html" }}
<html lang="{{ .site_info.language }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ .site_info.title }}</title>
<link rel="icon" type="image/x-icon" href="{{ .site_info.logo }}"/>
<link rel="stylesheet" href="../assets/css/lib/fontawesome.all.min.css">
<link rel="stylesheet" href="../assets/css/lib/bootstrap.min.css">
<link rel="stylesheet" href="../assets/css/lib/xcode-dark.css">
<link rel="stylesheet" href="../assets/css/global.css">
<link rel="stylesheet" href="../assets/css/about.css">
<script src="../assets/js/lib/typed.umd.js"></script>
<script src="../assets/js/lib/jquery.min.js"></script>
<script src="../assets/js/lib/bootstrap.min.js"></script>
<script src="../assets/js/lib/fontawesome.all.min.js"></script>
</head>
<body>
<div class="root-container">
<!-- body -->
<div class="container p-3">
<div class="row pt-lg-3">
<div class="col-8 mx-auto">
<div class="about-title-wrap">
<h3 class="about-title"># {{ .about.title }}</h3>
<div class="row pt-3">
<div class="col-12 col-md-9 mx-auto post-menu">
{{ range $i, $v := .menu.Items }}
<i class="{{ $v.Icon }} m-icon"></i>
<a class="main-menu-link" href="{{ $v.Url }}"> {{ $v.Name }} </a>
{{ end }}
</div>
</div>
</div>
<div class="about-content-wrap">
<div class="about-content">
{{ .about.content }}
</div>
</div>
</div>
</div>
</div>
<!-- post footer -->
{{ if .about.success }}
<div class="about-footer">
{{ .site_info.copyright }}
</div>
{{ end }}
</div>
<!-- footer -->
{{ if not .about.success }}
<div class="footer">
{{ .site_info.copyright }}
</div>
{{ end }}
</body>
</html>
{{ end }}

16
utils/dir.go Normal file
View File

@@ -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)
}
}
}