优化代码,添加两个配置

This commit is contained in:
xing 2023-02-10 21:23:30 +08:00
parent ef71192add
commit cd636e2dc9
15 changed files with 124 additions and 72 deletions

View File

@ -60,13 +60,13 @@ cacheTime:
commentsCacheTime: 24h commentsCacheTime: 24h
# 主题的页眉图片缓存时间 # 主题的页眉图片缓存时间
themeHeaderImagCacheTime: 5m themeHeaderImagCacheTime: 5m
# 随机sleep时间
sleepTime: [ 1s,3s ]
# 摘要字数 # 摘要字数
digestWordCount: 300 digestWordCount: 300
# 到达指定并发请求数时随机sleep # 到达指定并发请求数时随机sleep
maxRequestSleepNum: 100 maxRequestSleepNum: 100
# 随机sleep时间
sleepTime: [1s,3s]
# 全局最大请求数超过直接403 # 全局最大请求数超过直接403
maxRequestNum: 500 maxRequestNum: 500
# 单ip同时最大搜索请求数 # 单ip同时最大搜索请求数
@ -79,6 +79,10 @@ gzip: false
postCommentUrl: http://wp.test/wp-comments-post.php postCommentUrl: http://wp.test/wp-comments-post.php
# TrustIps # TrustIps
trustIps: [] trustIps: []
# 分页器间隔数
paginationStep: 1
# 显示查询的sql语句
showQuerySql: false
# trust servername 信任的域名 # trust servername 信任的域名
trustServerNames: ["xy.test","blog.xy.test"] trustServerNames: ["xy.test","blog.xy.test"]
# 主题 为空值为option template没有就默认为twentyfifteen # 主题 为空值为option template没有就默认为twentyfifteen

View File

@ -2,18 +2,18 @@ package maps
import "strings" import "strings"
func GetStrMapAnyVal[T any](key string, v map[string]any) (r T, o bool) { func GetStrMapAnyVal[T any](m map[string]any, key string) (r T, o bool) {
k := strings.Split(key, ".") k := strings.Split(key, ".")
if len(k) > 1 { if len(k) > 1 {
val, ok := v[k[0]] val, ok := m[k[0]]
if ok { if ok {
vx, ok := val.(map[string]any) vx, ok := val.(map[string]any)
if ok { if ok {
r, o = GetStrMapAnyVal[T](strings.Join(k[1:], "."), vx) r, o = GetStrMapAnyVal[T](vx, strings.Join(k[1:], "."))
} }
} }
} else { } else {
x, ok := v[k[0]] x, ok := m[k[0]]
if ok { if ok {
vv, ok := x.(T) vv, ok := x.(T)
if ok { if ok {

View File

@ -54,7 +54,7 @@ func TestGetStrMapAnyVal(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) {
gotR, gotO := GetStrMapAnyVal[int](tt.args.key, tt.args.v) gotR, gotO := GetStrMapAnyVal[int](tt.args.v, tt.args.key)
if !reflect.DeepEqual(gotR, tt.wantR) { if !reflect.DeepEqual(gotR, tt.wantR) {
t.Errorf("GetStrMapAnyVal() gotR = %v, want %v", gotR, tt.wantR) t.Errorf("GetStrMapAnyVal() gotR = %v, want %v", gotR, tt.wantR)
} }

View File

@ -59,7 +59,7 @@ func initConf(c string) (err error) {
if err != nil { if err != nil {
return return
} }
model.InitDB(model.NewSqlxQuery(database)) model.InitDB(db.QueryDb(database))
err = wpconfig.InitOptions() err = wpconfig.InitOptions()
if err != nil { if err != nil {
return return

View File

@ -6,10 +6,10 @@ import (
"github.com/fthvgb1/wp-go/helper" "github.com/fthvgb1/wp-go/helper"
"github.com/fthvgb1/wp-go/helper/slice" "github.com/fthvgb1/wp-go/helper/slice"
"github.com/fthvgb1/wp-go/internal/pkg/config" "github.com/fthvgb1/wp-go/internal/pkg/config"
"github.com/fthvgb1/wp-go/internal/pkg/constraints"
"github.com/fthvgb1/wp-go/internal/pkg/dao" "github.com/fthvgb1/wp-go/internal/pkg/dao"
"github.com/fthvgb1/wp-go/internal/pkg/logs" "github.com/fthvgb1/wp-go/internal/pkg/logs"
"github.com/fthvgb1/wp-go/internal/pkg/models" "github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/internal/plugins"
"sync" "sync"
"time" "time"
) )
@ -162,7 +162,7 @@ func CategoriesTags(ctx context.Context, t ...int) []models.TermsMy {
logs.ErrPrintln(err, "get category err") logs.ErrPrintln(err, "get category err")
if len(t) > 0 { if len(t) > 0 {
return slice.Filter(r, func(my models.TermsMy) bool { return slice.Filter(r, func(my models.TermsMy) bool {
return helper.Or(t[0] == plugins.Tag, "post_tag", "category") == my.Taxonomy return helper.Or(t[0] == constraints.Tag, "post_tag", "category") == my.Taxonomy
}) })
} }
return r return r
@ -171,7 +171,7 @@ func AllCategoryTagsNames(ctx context.Context, c int) map[string]struct{} {
r, err := categoryAndTagsCaches.GetCache(ctx, time.Second, ctx) r, err := categoryAndTagsCaches.GetCache(ctx, time.Second, ctx)
logs.ErrPrintln(err, "get category err") logs.ErrPrintln(err, "get category err")
return slice.FilterAndToMap(r, func(t models.TermsMy) (string, struct{}, bool) { return slice.FilterAndToMap(r, func(t models.TermsMy) (string, struct{}, bool) {
if helper.Or(c == plugins.Tag, "post_tag", "category") == t.Taxonomy { if helper.Or(c == constraints.Tag, "post_tag", "category") == t.Taxonomy {
return t.Name, struct{}{}, true return t.Name, struct{}{}, true
} }
return "", struct{}{}, false return "", struct{}{}, false

View File

@ -32,6 +32,8 @@ type Config struct {
UploadDir string `yaml:"uploadDir"` UploadDir string `yaml:"uploadDir"`
Pprof string `yaml:"pprof"` Pprof string `yaml:"pprof"`
ListPagePlugins []string `yaml:"listPagePlugins"` ListPagePlugins []string `yaml:"listPagePlugins"`
PaginationStep int `yaml:"paginationStep"`
ShowQuerySql bool `yaml:"showQuerySql"`
} }
type CacheTime struct { type CacheTime struct {

View File

@ -0,0 +1,16 @@
package constraints
const (
Home = iota + 1
Archive
Category
Tag
Search
Author
Detail
Ok
Empty404
ParamError
InternalErr
)

View File

@ -1,9 +1,12 @@
package db package db
import ( import (
"context"
"github.com/fthvgb1/wp-go/internal/pkg/config" "github.com/fthvgb1/wp-go/internal/pkg/config"
"github.com/fthvgb1/wp-go/model"
_ "github.com/go-sql-driver/mysql" _ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx"
"log"
) )
var db *sqlx.DB var db *sqlx.DB
@ -30,3 +33,23 @@ func InitDb() (*sqlx.DB, error) {
} }
return db, err return db, err
} }
func QueryDb(db *sqlx.DB) model.UniversalDb {
query := model.NewUniversalDb(
func(ctx context.Context, a any, s string, args ...any) error {
if config.GetConfig().ShowQuerySql {
go log.Println(model.FormatSql(s, args...))
}
return db.Select(a, s, args...)
},
func(ctx context.Context, a any, s string, args ...any) error {
if config.GetConfig().ShowQuerySql {
go log.Println(model.FormatSql(s, args...))
}
return db.Get(a, s, args...)
})
return query
}

View File

@ -1,23 +0,0 @@
package plugins
const (
Home = iota + 1
Archive
Category
Tag
Search
Detail
Ok
Empty404
Error
InternalErr
)
var IndexSceneMap = map[int]struct{}{
Home: {},
Archive: {},
Category: {},
Tag: {},
Search: {},
}

View File

@ -10,11 +10,13 @@ import (
"github.com/fthvgb1/wp-go/internal/pkg/logs" "github.com/fthvgb1/wp-go/internal/pkg/logs"
"github.com/fthvgb1/wp-go/internal/pkg/models" "github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/internal/plugins" "github.com/fthvgb1/wp-go/internal/plugins"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
type Handle struct { type Handle struct {
C *gin.Context C *gin.Context
Session sessions.Session
GinH gin.H GinH gin.H
Password string Password string
Scene int Scene int
@ -31,13 +33,22 @@ func (h Handle) Index() {
} }
func (h Handle) ExecListPagePlugin(m map[string]Plugin[models.Posts], calls ...func(*models.Posts)) { func (h Handle) ExecListPagePlugin(m map[string]Plugin[models.Posts], calls ...func(*models.Posts)) {
pluginConf := config.GetConfig().ListPagePlugins pluginConf := config.GetConfig().ListPagePlugins
plugin := GetPlugins(pluginConf, m)
h.GinH["posts"] = slice.Map( plugin := GetListPostPlugins(pluginConf, m)
h.GinH["posts"].([]models.Posts),
PluginFn[models.Posts](plugin, h, Defaults(calls...))) posts, ok := maps.GetStrMapAnyVal[[]models.Posts](h.GinH, "posts")
if ok {
h.GinH["posts"] = slice.Map(posts, PluginFn[models.Posts](plugin, h, Defaults(calls...)))
}
} }
/*func (h Handle) Pagination(paginate pagination) {
}*/
type Fn[T any] func(T) T type Fn[T any] func(T) T
type Plugin[T any] func(next Fn[T], h Handle, t T) T type Plugin[T any] func(next Fn[T], h Handle, t T) T
@ -54,7 +65,7 @@ var pluginFns = map[string]Plugin[models.Posts]{
"digest": Digest, "digest": Digest,
} }
func Plugins() map[string]Plugin[models.Posts] { func ListPostPlugins() map[string]Plugin[models.Posts] {
return maps.Copy(pluginFns) return maps.Copy(pluginFns)
} }
@ -71,7 +82,7 @@ func Default[T any](t T) T {
return t return t
} }
func GetPlugins(name []string, m map[string]Plugin[models.Posts]) []Plugin[models.Posts] { func GetListPostPlugins(name []string, m map[string]Plugin[models.Posts]) []Plugin[models.Posts] {
return slice.FilterAndMap(name, func(t string) (Plugin[models.Posts], bool) { return slice.FilterAndMap(name, func(t string) (Plugin[models.Posts], bool) {
v, ok := m[t] v, ok := m[t]
if ok { if ok {

View File

@ -1,6 +1,8 @@
package twentyfifteen package twentyfifteen
import ( import (
"github.com/fthvgb1/wp-go/helper/maps"
"github.com/fthvgb1/wp-go/internal/pkg/constraints"
"github.com/fthvgb1/wp-go/internal/pkg/models" "github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/internal/plugins" "github.com/fthvgb1/wp-go/internal/plugins"
"github.com/fthvgb1/wp-go/internal/theme/common" "github.com/fthvgb1/wp-go/internal/theme/common"
@ -20,30 +22,27 @@ func Hook(h2 common.Handle) {
templ: "twentyfifteen/posts/index.gohtml", templ: "twentyfifteen/posts/index.gohtml",
} }
//h.GinH["HeaderImage"] = h.getHeaderImage(h.C) //h.GinH["HeaderImage"] = h.getHeaderImage(h.C)
if h.Stats == plugins.Empty404 { if h.Stats == constraints.Empty404 {
h.C.HTML(h.Code, h.templ, h.GinH) h.C.HTML(h.Code, h.templ, h.GinH)
return return
} }
if h.Scene == plugins.Detail { if h.Scene == constraints.Detail {
h.Detail() h.Detail()
return return
} }
h.Index() h.Index()
} }
var plugin = common.Plugins() var plugin = common.ListPostPlugins()
func (h handle) Index() { func (h handle) Index() {
if h.Stats != plugins.Empty404 { if h.Stats != constraints.Empty404 {
h.ExecListPagePlugin(plugin) h.ExecListPagePlugin(plugin)
p, ok := h.GinH["pagination"] page, ok := maps.GetStrMapAnyVal[pagination.ParsePagination](h.GinH, "pagination")
if ok { if ok {
pp, ok := p.(pagination.ParsePagination) h.GinH["pagination"] = pagination.Paginate(plugins.TwentyFifteenPagination(), page)
if ok {
h.GinH["pagination"] = pagination.Paginate(plugins.TwentyFifteenPagination(), pp)
}
} }
} }

View File

@ -6,6 +6,7 @@ import (
"github.com/fthvgb1/wp-go/helper/slice" "github.com/fthvgb1/wp-go/helper/slice"
str "github.com/fthvgb1/wp-go/helper/strings" str "github.com/fthvgb1/wp-go/helper/strings"
"github.com/fthvgb1/wp-go/internal/pkg/cache" "github.com/fthvgb1/wp-go/internal/pkg/cache"
"github.com/fthvgb1/wp-go/internal/pkg/constraints"
"github.com/fthvgb1/wp-go/internal/pkg/logs" "github.com/fthvgb1/wp-go/internal/pkg/logs"
"github.com/fthvgb1/wp-go/internal/pkg/models" "github.com/fthvgb1/wp-go/internal/pkg/models"
"github.com/fthvgb1/wp-go/internal/plugins" "github.com/fthvgb1/wp-go/internal/plugins"
@ -38,7 +39,7 @@ func Hook(cHandle common.Handle) {
templ: "twentyseventeen/posts/index.gohtml", templ: "twentyseventeen/posts/index.gohtml",
} }
h.GinH["HeaderImage"] = h.getHeaderImage(h.C) h.GinH["HeaderImage"] = h.getHeaderImage(h.C)
if h.Scene == plugins.Detail { if h.Scene == constraints.Detail {
h.Detail() h.Detail()
return return
} }
@ -46,20 +47,17 @@ func Hook(cHandle common.Handle) {
} }
var pluginFns = func() map[string]common.Plugin[models.Posts] { var pluginFns = func() map[string]common.Plugin[models.Posts] {
return maps.Merge(common.Plugins(), map[string]common.Plugin[models.Posts]{ return maps.Merge(common.ListPostPlugins(), map[string]common.Plugin[models.Posts]{
"twentyseventeen_postThumbnail": postThumbnail, "twentyseventeen_postThumbnail": postThumbnail,
}) })
}() }()
func (h handle) Index() { func (h handle) Index() {
if h.Stats != plugins.Empty404 { if h.Stats != constraints.Empty404 {
h.ExecListPagePlugin(pluginFns) h.ExecListPagePlugin(pluginFns)
p, ok := h.GinH["pagination"] page, ok := maps.GetStrMapAnyVal[pagination.ParsePagination](h.GinH, "pagination")
if ok { if ok {
pp, ok := p.(pagination.ParsePagination) h.GinH["pagination"] = pagination.Paginate(paginate, page)
if ok {
h.GinH["pagination"] = pagination.Paginate(paginate, pp)
}
} }
} }
@ -70,7 +68,7 @@ func (h handle) Index() {
func (h handle) Detail() { func (h handle) Detail() {
post := h.GinH["post"].(models.Posts) post := h.GinH["post"].(models.Posts)
h.GinH["bodyClass"] = h.bodyClass() h.GinH["bodyClass"] = h.bodyClass()
if h.Stats == plugins.Empty404 { if h.Stats == constraints.Empty404 {
h.C.HTML(h.Code, h.templ, h.GinH) h.C.HTML(h.Code, h.templ, h.GinH)
return return
} }
@ -115,7 +113,7 @@ func (c comment) FormatLi(ctx *gin.Context, m models.Comments, depth int, isTls
func postThumbnail(next common.Fn[models.Posts], h common.Handle, t models.Posts) models.Posts { func postThumbnail(next common.Fn[models.Posts], h common.Handle, t models.Posts) models.Posts {
if t.Thumbnail.Path != "" { if t.Thumbnail.Path != "" {
t.Thumbnail.Sizes = "(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" t.Thumbnail.Sizes = "(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px"
if h.Scene == plugins.Detail { if h.Scene == constraints.Detail {
t.Thumbnail.Sizes = "100vw" t.Thumbnail.Sizes = "100vw"
} }
} }
@ -139,16 +137,16 @@ func (h handle) getHeaderImage(c *gin.Context) (r models.PostThumbnail) {
func (h handle) bodyClass() string { func (h handle) bodyClass() string {
s := "" s := ""
if h.Stats == plugins.Empty404 { if h.Stats == constraints.Empty404 {
return "error404" return "error404"
} }
switch h.Scene { switch h.Scene {
case plugins.Search: case constraints.Search:
s = "search-no-results" s = "search-no-results"
if len(h.GinH["posts"].([]models.Posts)) > 0 { if len(h.GinH["posts"].([]models.Posts)) > 0 {
s = "search-results" s = "search-results"
} }
case plugins.Category, plugins.Tag: case constraints.Category, constraints.Tag:
cat := h.C.Param("category") cat := h.C.Param("category")
if cat == "" { if cat == "" {
cat = h.C.Param("tag") cat = h.C.Param("tag")
@ -160,17 +158,17 @@ func (h handle) bodyClass() string {
s = cate.Slug s = cate.Slug
} }
s = fmt.Sprintf("category-%d %v", cate.Terms.TermId, s) s = fmt.Sprintf("category-%d %v", cate.Terms.TermId, s)
case plugins.Detail: case constraints.Detail:
s = fmt.Sprintf("postid-%d", h.GinH["post"].(models.Posts).Id) s = fmt.Sprintf("postid-%d", h.GinH["post"].(models.Posts).Id)
} }
return str.Join(class[h.Scene], s) return str.Join(class[h.Scene], s)
} }
var class = map[int]string{ var class = map[int]string{
plugins.Home: "home blog ", constraints.Home: "home blog ",
plugins.Archive: "archive date page-two-column", constraints.Archive: "archive date page-two-column",
plugins.Category: "archive category page-two-column", constraints.Category: "archive category page-two-column",
plugins.Tag: "archive category page-two-column ", constraints.Tag: "archive category page-two-column ",
plugins.Search: "search ", constraints.Search: "search ",
plugins.Detail: "post-template-default single single-post single-format-standard ", constraints.Detail: "post-template-default single single-post single-format-standard ",
} }

View File

@ -11,6 +11,8 @@ func InitDB(db dbQuery) {
globalBb = db globalBb = db
} }
type QueryFn func(context.Context, any, string, ...any) error
type Model interface { type Model interface {
PrimaryKey() string PrimaryKey() string
Table() string Table() string

View File

@ -20,19 +20,19 @@ func NewSqlxQuery(sqlx *sqlx.DB) SqlxQuery {
func (r SqlxQuery) Select(ctx context.Context, dest any, sql string, params ...any) error { func (r SqlxQuery) Select(ctx context.Context, dest any, sql string, params ...any) error {
if os.Getenv("SHOW_SQL") == "true" { if os.Getenv("SHOW_SQL") == "true" {
go log.Println(formatSql(sql, params)) go log.Println(FormatSql(sql, params...))
} }
return r.sqlx.Select(dest, sql, params...) return r.sqlx.Select(dest, sql, params...)
} }
func (r SqlxQuery) Get(ctx context.Context, dest any, sql string, params ...any) error { func (r SqlxQuery) Get(ctx context.Context, dest any, sql string, params ...any) error {
if os.Getenv("SHOW_SQL") == "true" { if os.Getenv("SHOW_SQL") == "true" {
go log.Println(formatSql(sql, params)) go log.Println(FormatSql(sql, params...))
} }
return r.sqlx.Get(dest, sql, params...) return r.sqlx.Get(dest, sql, params...)
} }
func formatSql(sql string, params []any) string { func FormatSql(sql string, params ...any) string {
for _, param := range params { for _, param := range params {
switch param.(type) { switch param.(type) {
case string: case string:

20
model/universal.go Normal file
View File

@ -0,0 +1,20 @@
package model
import "context"
type UniversalDb struct {
selects QueryFn
gets QueryFn
}
func NewUniversalDb(selects QueryFn, gets QueryFn) UniversalDb {
return UniversalDb{selects: selects, gets: gets}
}
func (u UniversalDb) Select(ctx context.Context, a any, s string, args ...any) error {
return u.selects(ctx, a, s, args...)
}
func (u UniversalDb) Get(ctx context.Context, a any, s string, args ...any) error {
return u.gets(ctx, a, s, args...)
}