代码结构优化,添加readme

This commit is contained in:
xing 2022-11-04 10:38:59 +08:00
parent 5880c02eb2
commit faaafa2349
15 changed files with 64 additions and 60 deletions

4
README.md Normal file
View File

@ -0,0 +1,4 @@
## wp-go
a simple front of wordpress build with golang.
一个go写的wordress的前端功能比较简单只有列表页和详情页,rss2主题只有一个twentyfifeen主题插件的话只有一个简单的列表页的摘要生成和enlighter代码高亮。本身只用于展示文章添加评论走的转发请求到php的wordpress。

View File

@ -6,10 +6,10 @@ import (
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github/fthvgb1/wp-go/actions/common" "github/fthvgb1/wp-go/actions/common"
"github/fthvgb1/wp-go/config"
"github/fthvgb1/wp-go/logs" "github/fthvgb1/wp-go/logs"
"github/fthvgb1/wp-go/mail" "github/fthvgb1/wp-go/mail"
"github/fthvgb1/wp-go/models" "github/fthvgb1/wp-go/models"
"github/fthvgb1/wp-go/vars"
"io" "io"
"net/http" "net/http"
"net/http/cookiejar" "net/http/cookiejar"
@ -39,7 +39,7 @@ func PostComment(c *gin.Context) {
m := c.PostForm("email") m := c.PostForm("email")
comment := c.PostForm("comment") comment := c.PostForm("comment")
c.Request.Body = io.NopCloser(bytes.NewBuffer(data)) c.Request.Body = io.NopCloser(bytes.NewBuffer(data))
req, err := http.NewRequest("POST", vars.Conf.PostCommentUrl, strings.NewReader(c.Request.PostForm.Encode())) req, err := http.NewRequest("POST", config.Conf.PostCommentUrl, strings.NewReader(c.Request.PostForm.Encode()))
if err != nil { if err != nil {
return return
} }
@ -69,7 +69,7 @@ func PostComment(c *gin.Context) {
return return
} }
su := fmt.Sprintf("%s: %s[%s]发表了评论对文档[%v]的评论", models.Options["siteurl"], author, m, post.PostTitle) su := fmt.Sprintf("%s: %s[%s]发表了评论对文档[%v]的评论", models.Options["siteurl"], author, m, post.PostTitle)
err = mail.SendMail([]string{vars.Conf.Mail.User}, su, comment) err = mail.SendMail([]string{config.Conf.Mail.User}, su, comment)
logs.ErrPrintln(err, "发送邮件") logs.ErrPrintln(err, "发送邮件")
}() }()
return return

View File

@ -4,9 +4,9 @@ import (
"context" "context"
"fmt" "fmt"
"github/fthvgb1/wp-go/cache" "github/fthvgb1/wp-go/cache"
"github/fthvgb1/wp-go/config"
"github/fthvgb1/wp-go/logs" "github/fthvgb1/wp-go/logs"
"github/fthvgb1/wp-go/models" "github/fthvgb1/wp-go/models"
"github/fthvgb1/wp-go/vars"
"sync" "sync"
"time" "time"
) )
@ -32,29 +32,29 @@ func InitActionsCommonCache() {
setCacheFunc: archives, setCacheFunc: archives,
} }
searchPostIdsCache = cache.NewMapCacheByFn[string, PostIds](searchPostIds, vars.Conf.SearchPostCacheTime) searchPostIdsCache = cache.NewMapCacheByFn[string, PostIds](searchPostIds, config.Conf.SearchPostCacheTime)
postListIdsCache = cache.NewMapCacheByFn[string, PostIds](searchPostIds, vars.Conf.PostListCacheTime) postListIdsCache = cache.NewMapCacheByFn[string, PostIds](searchPostIds, config.Conf.PostListCacheTime)
monthPostsCache = cache.NewMapCacheByFn[string, []uint64](monthPost, vars.Conf.MonthPostCacheTime) monthPostsCache = cache.NewMapCacheByFn[string, []uint64](monthPost, config.Conf.MonthPostCacheTime)
postContextCache = cache.NewMapCacheByFn[uint64, PostContext](getPostContext, vars.Conf.ContextPostCacheTime) postContextCache = cache.NewMapCacheByFn[uint64, PostContext](getPostContext, config.Conf.ContextPostCacheTime)
postsCache = cache.NewMapCacheByBatchFn[uint64, models.WpPosts](getPostsByIds, vars.Conf.PostDataCacheTime) postsCache = cache.NewMapCacheByBatchFn[uint64, models.WpPosts](getPostsByIds, config.Conf.PostDataCacheTime)
categoryCaches = cache.NewSliceCache[models.WpTermsMy](categories, vars.Conf.CategoryCacheTime) categoryCaches = cache.NewSliceCache[models.WpTermsMy](categories, config.Conf.CategoryCacheTime)
recentPostsCaches = cache.NewSliceCache[models.WpPosts](recentPosts, vars.Conf.RecentPostCacheTime) recentPostsCaches = cache.NewSliceCache[models.WpPosts](recentPosts, config.Conf.RecentPostCacheTime)
recentCommentsCaches = cache.NewSliceCache[models.WpComments](recentComments, vars.Conf.RecentCommentsCacheTime) recentCommentsCaches = cache.NewSliceCache[models.WpComments](recentComments, config.Conf.RecentCommentsCacheTime)
postCommentCaches = cache.NewMapCacheByFn[uint64, []uint64](postComments, vars.Conf.PostCommentsCacheTime) postCommentCaches = cache.NewMapCacheByFn[uint64, []uint64](postComments, config.Conf.PostCommentsCacheTime)
maxPostIdCache = cache.NewSliceCache[uint64](getMaxPostId, vars.Conf.MaxPostIdCacheTime) maxPostIdCache = cache.NewSliceCache[uint64](getMaxPostId, config.Conf.MaxPostIdCacheTime)
usersCache = cache.NewMapCacheByBatchFn[uint64, models.WpUsers](getUsers, vars.Conf.UserInfoCacheTime) usersCache = cache.NewMapCacheByBatchFn[uint64, models.WpUsers](getUsers, config.Conf.UserInfoCacheTime)
commentsCache = cache.NewMapCacheByBatchFn[uint64, models.WpComments](getCommentByIds, vars.Conf.CommentsCacheTime) commentsCache = cache.NewMapCacheByBatchFn[uint64, models.WpComments](getCommentByIds, config.Conf.CommentsCacheTime)
} }
func ClearCache() { func ClearCache() {

View File

@ -1,4 +1,4 @@
package vars package config
import ( import (
"fmt" "fmt"

View File

@ -3,29 +3,29 @@ package db
import ( import (
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
"github/fthvgb1/wp-go/vars" "github/fthvgb1/wp-go/config"
) )
var Db *sqlx.DB var Db *sqlx.DB
func InitDb() error { func InitDb() error {
dsn := vars.Conf.Mysql.Dsn.GetDsn() dsn := config.Conf.Mysql.Dsn.GetDsn()
var err error var err error
Db, err = sqlx.Open("mysql", dsn) Db, err = sqlx.Open("mysql", dsn)
if err != nil { if err != nil {
return err return err
} }
if vars.Conf.Mysql.Pool.ConnMaxIdleTime != 0 { if config.Conf.Mysql.Pool.ConnMaxIdleTime != 0 {
Db.SetConnMaxIdleTime(vars.Conf.Mysql.Pool.ConnMaxLifetime) Db.SetConnMaxIdleTime(config.Conf.Mysql.Pool.ConnMaxLifetime)
} }
if vars.Conf.Mysql.Pool.MaxIdleConn != 0 { if config.Conf.Mysql.Pool.MaxIdleConn != 0 {
Db.SetMaxIdleConns(vars.Conf.Mysql.Pool.MaxIdleConn) Db.SetMaxIdleConns(config.Conf.Mysql.Pool.MaxIdleConn)
} }
if vars.Conf.Mysql.Pool.MaxOpenConn != 0 { if config.Conf.Mysql.Pool.MaxOpenConn != 0 {
Db.SetMaxOpenConns(vars.Conf.Mysql.Pool.MaxOpenConn) Db.SetMaxOpenConns(config.Conf.Mysql.Pool.MaxOpenConn)
} }
if vars.Conf.Mysql.Pool.ConnMaxLifetime != 0 { if config.Conf.Mysql.Pool.ConnMaxLifetime != 0 {
Db.SetConnMaxLifetime(vars.Conf.Mysql.Pool.ConnMaxLifetime) Db.SetConnMaxLifetime(config.Conf.Mysql.Pool.ConnMaxLifetime)
} }
return err return err
} }

4
go.mod
View File

@ -10,6 +10,8 @@ require (
github.com/gin-gonic/gin v1.8.1 github.com/gin-gonic/gin v1.8.1
github.com/go-sql-driver/mysql v1.6.0 github.com/go-sql-driver/mysql v1.6.0
github.com/jmoiron/sqlx v1.3.5 github.com/jmoiron/sqlx v1.3.5
golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v2 v2.4.0
) )
@ -29,11 +31,9 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.0.5 // indirect github.com/pelletier/go-toml/v2 v2.0.5 // indirect
github.com/ugorji/go/codec v1.2.7 // indirect github.com/ugorji/go/codec v1.2.7 // indirect
golang.org/x/crypto v0.0.0-20220924013350-4ba4fb4dd9e7 // indirect
golang.org/x/net v0.0.0-20220923203811-8be639271d50 // indirect golang.org/x/net v0.0.0-20220923203811-8be639271d50 // indirect
golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect
golang.org/x/text v0.3.7 // indirect golang.org/x/text v0.3.7 // indirect
google.golang.org/protobuf v1.28.1 // indirect google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df // indirect
) )

View File

@ -280,7 +280,7 @@ func (r anyArr[T]) Less(i, j int) bool {
return r.fn(r.data[i], r.data[j]) return r.fn(r.data[i], r.data[j])
} }
func SampleSort[T any](arr []T, fn func(i, j T) bool) { func SimpleSort[T any](arr []T, fn func(i, j T) bool) {
slice := anyArr[T]{ slice := anyArr[T]{
data: arr, data: arr,
fn: fn, fn: fn,

View File

@ -608,7 +608,7 @@ func TestRandNum(t *testing.T) {
} }
} }
func TestSampleSort(t *testing.T) { func TestSimpleSort(t *testing.T) {
type xy struct { type xy struct {
x int x int
y int y int
@ -654,8 +654,8 @@ func TestSampleSort(t *testing.T) {
} }
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
if SampleSort(tt.args.arr, tt.args.fn); !reflect.DeepEqual(tt.args.arr, tt.wantR) { if SimpleSort(tt.args.arr, tt.args.fn); !reflect.DeepEqual(tt.args.arr, tt.wantR) {
t.Errorf("SampleSort() = %v, want %v", tt.args.arr, tt.wantR) t.Errorf("SimpleSort() = %v, want %v", tt.args.arr, tt.wantR)
} }
}) })
} }

View File

@ -3,7 +3,7 @@ package mail
import ( import (
"crypto/tls" "crypto/tls"
"fmt" "fmt"
"github/fthvgb1/wp-go/vars" "github/fthvgb1/wp-go/config"
"gopkg.in/gomail.v2" "gopkg.in/gomail.v2"
"mime" "mime"
"strings" "strings"
@ -24,8 +24,8 @@ func SendMail(mailTo []string, subject string, body string, a ...AttacheFile) er
gomail.SetEncoding(gomail.Base64), gomail.SetEncoding(gomail.Base64),
) )
m.SetHeader("From", m.SetHeader("From",
m.FormatAddress(vars.Conf.Mail.User, m.FormatAddress(config.Conf.Mail.User,
vars.Conf.Mail.Alias, config.Conf.Mail.Alias,
)) ))
m.SetHeader("To", mailTo...) m.SetHeader("To", mailTo...)
m.SetHeader("Subject", subject) m.SetHeader("Subject", subject)
@ -43,12 +43,12 @@ func SendMail(mailTo []string, subject string, body string, a ...AttacheFile) er
} }
d := gomail.NewDialer( d := gomail.NewDialer(
vars.Conf.Mail.Host, config.Conf.Mail.Host,
vars.Conf.Mail.Port, config.Conf.Mail.Port,
vars.Conf.Mail.User, config.Conf.Mail.User,
vars.Conf.Mail.Pass, config.Conf.Mail.Pass,
) )
if vars.Conf.Mail.Ssl { if config.Conf.Mail.Ssl {
d.TLSConfig = &tls.Config{InsecureSkipVerify: true} d.TLSConfig = &tls.Config{InsecureSkipVerify: true}
} }
err := d.DialAndSend(m) err := d.DialAndSend(m)

View File

@ -1,12 +1,12 @@
package mail package mail
import ( import (
"github/fthvgb1/wp-go/vars" "github/fthvgb1/wp-go/config"
"testing" "testing"
) )
func TestSendMail(t *testing.T) { func TestSendMail(t *testing.T) {
vars.InitConfig() config.InitConfig()
type args struct { type args struct {
mailTo []string mailTo []string
subject string subject string

View File

@ -3,18 +3,18 @@ package main
import ( import (
"github/fthvgb1/wp-go/actions" "github/fthvgb1/wp-go/actions"
"github/fthvgb1/wp-go/actions/common" "github/fthvgb1/wp-go/actions/common"
"github/fthvgb1/wp-go/config"
"github/fthvgb1/wp-go/db" "github/fthvgb1/wp-go/db"
"github/fthvgb1/wp-go/models" "github/fthvgb1/wp-go/models"
"github/fthvgb1/wp-go/plugins" "github/fthvgb1/wp-go/plugins"
"github/fthvgb1/wp-go/route" "github/fthvgb1/wp-go/route"
"github/fthvgb1/wp-go/vars"
"math/rand" "math/rand"
"time" "time"
) )
func init() { func init() {
rand.Seed(time.Now().UnixNano()) rand.Seed(time.Now().UnixNano())
err := vars.InitConfig() err := config.InitConfig()
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -40,7 +40,7 @@ func init() {
} }
func cronClearCache() { func cronClearCache() {
t := time.NewTicker(vars.Conf.CrontabClearCacheTime) t := time.NewTicker(config.Conf.CrontabClearCacheTime)
for { for {
select { select {
case <-t.C: case <-t.C:

View File

@ -4,10 +4,10 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github/fthvgb1/wp-go/config"
"github/fthvgb1/wp-go/logs" "github/fthvgb1/wp-go/logs"
"github/fthvgb1/wp-go/mail" "github/fthvgb1/wp-go/mail"
"github/fthvgb1/wp-go/models" "github/fthvgb1/wp-go/models"
"github/fthvgb1/wp-go/vars"
"io" "io"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
@ -42,7 +42,7 @@ func RecoverAndSendMail(w io.Writer) func(ctx *gin.Context) {
) )
er := mail.SendMail( er := mail.SendMail(
[]string{vars.Conf.Mail.User}, []string{config.Conf.Mail.User},
fmt.Sprintf("%s%s %s 发生错误", fmt.Sprintf(models.Options["siteurl"]), c.FullPath(), time.Now().Format(time.RFC1123Z)), content) fmt.Sprintf("%s%s %s 发生错误", fmt.Sprintf(models.Options["siteurl"]), c.FullPath(), time.Now().Format(time.RFC1123Z)), content)
if er != nil { if er != nil {

View File

@ -2,14 +2,14 @@ package middleware
import ( import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github/fthvgb1/wp-go/config"
"github/fthvgb1/wp-go/helper" "github/fthvgb1/wp-go/helper"
"github/fthvgb1/wp-go/vars"
"net/http" "net/http"
"strings" "strings"
) )
func ValidateServerNames() func(ctx *gin.Context) { func ValidateServerNames() func(ctx *gin.Context) {
serverName := helper.SimpleSliceToMap(vars.Conf.TrustServerNames, func(v string) string { serverName := helper.SimpleSliceToMap(config.Conf.TrustServerNames, func(v string) string {
return v return v
}) })
return func(c *gin.Context) { return func(c *gin.Context) {

View File

@ -4,9 +4,9 @@ import (
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github/fthvgb1/wp-go/cache" "github/fthvgb1/wp-go/cache"
"github/fthvgb1/wp-go/config"
"github/fthvgb1/wp-go/helper" "github/fthvgb1/wp-go/helper"
"github/fthvgb1/wp-go/models" "github/fthvgb1/wp-go/models"
"github/fthvgb1/wp-go/vars"
"regexp" "regexp"
"strings" "strings"
"time" "time"
@ -19,7 +19,7 @@ var digestCache *cache.MapCache[uint64, string]
var quto = regexp.MustCompile(`&quot; *|&amp; *|&lt; *|&gt; ?|&nbsp; *`) var quto = regexp.MustCompile(`&quot; *|&amp; *|&lt; *|&gt; ?|&nbsp; *`)
func InitDigestCache() { func InitDigestCache() {
digestCache = cache.NewMapCacheByFn[uint64](digestRaw, vars.Conf.DigestCacheTime) digestCache = cache.NewMapCacheByFn[uint64](digestRaw, config.Conf.DigestCacheTime)
} }
func ClearDigestCache() { func ClearDigestCache() {
@ -29,7 +29,7 @@ func ClearDigestCache() {
func digestRaw(arg ...any) (string, error) { func digestRaw(arg ...any) (string, error) {
str := arg[0].(string) str := arg[0].(string)
id := arg[1].(uint64) id := arg[1].(uint64)
limit := vars.Conf.DigestWordCount limit := config.Conf.DigestWordCount
if limit < 0 { if limit < 0 {
return str, nil return str, nil
} else if limit == 0 { } else if limit == 0 {

View File

@ -7,11 +7,11 @@ import (
"github.com/gin-contrib/sessions/cookie" "github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github/fthvgb1/wp-go/actions" "github/fthvgb1/wp-go/actions"
"github/fthvgb1/wp-go/config"
"github/fthvgb1/wp-go/helper" "github/fthvgb1/wp-go/helper"
"github/fthvgb1/wp-go/middleware" "github/fthvgb1/wp-go/middleware"
"github/fthvgb1/wp-go/static" "github/fthvgb1/wp-go/static"
"github/fthvgb1/wp-go/templates" "github/fthvgb1/wp-go/templates"
"github/fthvgb1/wp-go/vars"
"html/template" "html/template"
"net/http" "net/http"
"time" "time"
@ -21,8 +21,8 @@ func SetupRouter() *gin.Engine {
// Disable Console Color // Disable Console Color
// gin.DisableConsoleColor() // gin.DisableConsoleColor()
r := gin.New() r := gin.New()
if len(vars.Conf.TrustIps) > 0 { if len(config.Conf.TrustIps) > 0 {
err := r.SetTrustedProxies(vars.Conf.TrustIps) err := r.SetTrustedProxies(config.Conf.TrustIps)
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -40,11 +40,11 @@ func SetupRouter() *gin.Engine {
middleware.ValidateServerNames(), middleware.ValidateServerNames(),
gin.Logger(), gin.Logger(),
middleware.RecoverAndSendMail(gin.DefaultErrorWriter), middleware.RecoverAndSendMail(gin.DefaultErrorWriter),
middleware.FlowLimit(vars.Conf.MaxRequestSleepNum, vars.Conf.MaxRequestNum, vars.Conf.SleepTime), middleware.FlowLimit(config.Conf.MaxRequestSleepNum, config.Conf.MaxRequestNum, config.Conf.SleepTime),
middleware.SetStaticFileCache, middleware.SetStaticFileCache,
) )
//gzip 因为一般会用nginx做反代时自动使用gzip,所以go这边本身可以不用 //gzip 因为一般会用nginx做反代时自动使用gzip,所以go这边本身可以不用
if vars.Conf.Gzip { if config.Conf.Gzip {
r.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithExcludedPaths([]string{ r.Use(gzip.Gzip(gzip.DefaultCompression, gzip.WithExcludedPaths([]string{
"/wp-includes/", "/wp-content/", "/wp-includes/", "/wp-content/",
}))) })))
@ -58,7 +58,7 @@ func SetupRouter() *gin.Engine {
})) }))
store := cookie.NewStore([]byte("secret")) store := cookie.NewStore([]byte("secret"))
r.Use(sessions.Sessions("go-wp", store)) r.Use(sessions.Sessions("go-wp", store))
r.GET("/", middleware.SearchLimit(vars.Conf.SingleIpSearchNum), actions.Index) r.GET("/", middleware.SearchLimit(config.Conf.SingleIpSearchNum), actions.Index)
r.GET("/page/:page", actions.Index) r.GET("/page/:page", actions.Index)
r.GET("/p/category/:category", actions.Index) r.GET("/p/category/:category", actions.Index)
r.GET("/p/category/:category/page/:page", actions.Index) r.GET("/p/category/:category/page/:page", actions.Index)
@ -71,7 +71,7 @@ func SetupRouter() *gin.Engine {
r.GET("/p/:id/feed", actions.PostFeed) r.GET("/p/:id/feed", actions.PostFeed)
r.GET("/feed", actions.Feed) r.GET("/feed", actions.Feed)
r.GET("/comments/feed", actions.CommentsFeed) r.GET("/comments/feed", actions.CommentsFeed)
r.POST("/comment", middleware.FlowLimit(vars.Conf.MaxRequestSleepNum, 5, vars.Conf.SleepTime), actions.PostComment) r.POST("/comment", middleware.FlowLimit(config.Conf.MaxRequestSleepNum, 5, config.Conf.SleepTime), actions.PostComment)
if helper.IsContainInArr(gin.Mode(), []string{gin.DebugMode, gin.TestMode}) { if helper.IsContainInArr(gin.Mode(), []string{gin.DebugMode, gin.TestMode}) {
pprof.Register(r, "dev/pprof") pprof.Register(r, "dev/pprof")
} }