mirror of
https://github.com/yv1ing/MollyBlog.git
synced 2025-09-16 14:53:45 +08:00
new: Added about me page and fixed some bugs
This commit is contained in:
1
_blog/dst/about/index.html
Normal file
1
_blog/dst/about/index.html
Normal file
@@ -0,0 +1 @@
|
||||
<h2 id="About-me">About me</h2>
|
||||
2
_blog/src/about/index.md
Normal file
2
_blog/src/about/index.md
Normal file
@@ -0,0 +1,2 @@
|
||||
## About me
|
||||
|
||||
15
config.yaml
15
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
|
||||
number: 10
|
||||
|
||||
# about config
|
||||
about:
|
||||
title: About me
|
||||
src: _blog/src/about
|
||||
dst: _blog/dst/about
|
||||
filename: index
|
||||
8
config/mAbout.go
Normal file
8
config/mAbout.go
Normal 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"`
|
||||
}
|
||||
@@ -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"`
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
29
main.go
29
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() {
|
||||
|
||||
71
templates/default/assets/css/about.css
Normal file
71
templates/default/assets/css/about.css
Normal 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);
|
||||
}
|
||||
66
templates/default/html/about.html
Normal file
66
templates/default/html/about.html
Normal 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
16
utils/dir.go
Normal 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user