错误日志路径及优化

This commit is contained in:
xing 2023-04-07 22:59:07 +08:00
parent 1f3ca99441
commit 9e293e7f39
21 changed files with 156 additions and 107 deletions

View File

@ -69,8 +69,8 @@ maxRequestSleepNum: 100
maxRequestNum: 500
# 单ip同时最大搜索请求数
singleIpSearchNum: 10
# 错误日志输出路径
logOutput: err.log
# Gzip
gzip: false
# 提交评论url

View File

@ -94,17 +94,17 @@ func PostComment(c *gin.Context) {
go func() {
id := str.ToInteger[uint64](i, 0)
if id <= 0 {
logs.ErrPrintln(err, "获取文档id", i)
logs.Error(errors.New("获取文档id错误"), "", i)
return
}
post, err := cache.GetPostById(cc, id)
if err != nil {
logs.ErrPrintln(err, "获取文档", id)
logs.Error(err, "获取文档错误", id)
return
}
su := fmt.Sprintf("%s: %s[%s]发表了评论对文档[%v]的评论", wpconfig.GetOption("siteurl"), author, m, post.PostTitle)
err = mail.SendMail([]string{conf.Mail.User}, su, comment)
logs.ErrPrintln(err, "发送邮件", conf.Mail.User, su, comment)
logs.IfError(err, "发送邮件", conf.Mail.User, su, comment)
}()
s, er := io.ReadAll(ress.Body)

View File

@ -53,7 +53,10 @@ func initConf(c string) (err error) {
if err != nil {
return
}
err = logs.InitLogger()
if err != nil {
return err
}
database, err := db.InitDb()
if err != nil {
return
@ -84,7 +87,7 @@ func flushCache() {
defer func() {
if r := recover(); r != nil {
err := mail.SendMail([]string{config.GetConfig().Mail.User}, "清空缓存失败", fmt.Sprintf("err:[%s]", r))
logs.ErrPrintln(err, "发邮件失败")
logs.IfError(err, "发邮件失败")
}
}()
cachemanager.Flush()
@ -98,13 +101,15 @@ func reloads() {
}
}()
err := config.InitConfig(confPath)
logs.ErrPrintln(err, "获取配置文件失败", confPath)
logs.IfError(err, "获取配置文件失败", confPath)
err = logs.InitLogger()
logs.IfError(err, "日志配置错误")
_, err = db.InitDb()
logs.ErrPrintln(err, "重新读取db失败", config.GetConfig().Mysql)
logs.IfError(err, "重新读取db失败", config.GetConfig().Mysql)
err = wpconfig.InitOptions()
logs.ErrPrintln(err, "获取网站设置WpOption失败")
logs.IfError(err, "获取网站设置WpOption失败")
err = wpconfig.InitTerms()
logs.ErrPrintln(err, "获取WpTerms表失败")
logs.IfError(err, "获取WpTerms表失败")
reload.Reload()
flushCache()
log.Println("reload complete")

View File

@ -48,7 +48,7 @@ func RecoverAndSendMail(w io.Writer) func(ctx *gin.Context) {
fmt.Sprintf("%s%s %s 发生错误", fmt.Sprintf(wpconfig.GetOption("siteurl")), c.FullPath(), time.Now().Format(time.RFC1123Z)), content)
if er != nil {
logs.ErrPrintln(er, "recover send mail fail", fmt.Sprintf("%v", err))
logs.IfError(er, "recover send mail fail", fmt.Sprintf("%v", err))
}
}()
}

View File

@ -103,7 +103,7 @@ func Archives(ctx context.Context) []models.PostArchive {
if l > 0 && a.month != m || l < 1 {
r, err := a.fn(ctx)
if err != nil {
logs.ErrPrintln(err, "set cache err[%s]")
logs.Error(err, "set cache fail")
return nil
}
a.month = m
@ -123,7 +123,7 @@ func CategoriesTags(ctx context.Context, t ...int) []models.TermsMy {
tt = t[0]
}
r, err := categoryAndTagsCaches.GetCache(ctx, tt, time.Second, ctx, tt)
logs.ErrPrintln(err, "get category err")
logs.IfError(err, "get category fail")
return r
}
func AllCategoryTagsNames(ctx context.Context, t ...int) map[string]struct{} {
@ -132,7 +132,10 @@ func AllCategoryTagsNames(ctx context.Context, t ...int) map[string]struct{} {
tt = t[0]
}
r, err := categoryAndTagsCaches.GetCache(ctx, tt, time.Second, ctx, tt)
logs.ErrPrintln(err, "get category err")
if err != nil {
logs.Error(err, "get category fail")
return nil
}
return slice.ToMap(r, func(t models.TermsMy) (string, struct{}) {
return t.Name, struct{}{}
}, true)

View File

@ -15,7 +15,7 @@ func RecentComments(ctx context.Context, n int) (r []models.Comments) {
if len(r) > n {
r = r[0:n]
}
logs.ErrPrintln(err, "get recent comment")
logs.IfError(err, "get recent comment fail")
return
}

View File

@ -96,7 +96,7 @@ func postFeed(arg ...any) (x string, err error) {
id := arg[1].(string)
ID := str.ToInteger[uint64](id, 0)
maxId, err := GetMaxPostId(c)
logs.ErrPrintln(err, "get max post id")
logs.IfError(err, "get max post id")
if ID < 1 || ID > maxId || err != nil {
return
}

View File

@ -53,7 +53,7 @@ func RecentPosts(ctx context.Context, n int) (r []models.Posts) {
if n < len(r) {
r = r[:n]
}
logs.ErrPrintln(err, "get recent post")
logs.IfError(err, "get recent post")
return
}

View File

@ -25,6 +25,6 @@ func GetAllUsername(ctx context.Context) (map[string]struct{}, error) {
func GetUserById(ctx context.Context, uid uint64) models.Users {
r, err := usersCache.GetCache(ctx, uid, time.Second, ctx, uid)
logs.ErrPrintln(err, "get user", uid)
logs.IfError(err, "get user", uid)
return r
}

View File

@ -15,65 +15,66 @@ func GetConfig() Config {
}
type Config struct {
Ssl Ssl `yaml:"ssl"`
Mysql Mysql `yaml:"mysql"`
Mail Mail `yaml:"mail"`
CacheTime CacheTime `yaml:"cacheTime"`
DigestWordCount int `yaml:"digestWordCount"`
MaxRequestSleepNum int64 `yaml:"maxRequestSleepNum"`
MaxRequestNum int64 `yaml:"maxRequestNum"`
SingleIpSearchNum int64 `yaml:"singleIpSearchNum"`
Gzip bool `yaml:"gzip"`
PostCommentUrl string `yaml:"postCommentUrl"`
TrustIps []string `yaml:"trustIps"`
TrustServerNames []string `yaml:"trustServerNames"`
Theme string `yaml:"theme"`
PostOrder string `yaml:"postOrder"`
UploadDir string `yaml:"uploadDir"`
Pprof string `yaml:"pprof"`
ListPagePlugins []string `yaml:"listPagePlugins"`
PaginationStep int `yaml:"paginationStep"`
ShowQuerySql bool `yaml:"showQuerySql"`
Plugins []string `yaml:"plugins"`
Ssl Ssl `yaml:"ssl" json:"ssl"`
Mysql Mysql `yaml:"mysql" json:"mysql"`
Mail Mail `yaml:"mail" json:"mail"`
CacheTime CacheTime `yaml:"cacheTime" json:"cacheTime"`
DigestWordCount int `yaml:"digestWordCount" json:"digestWordCount,omitempty"`
MaxRequestSleepNum int64 `yaml:"maxRequestSleepNum" json:"maxRequestSleepNum,omitempty"`
MaxRequestNum int64 `yaml:"maxRequestNum" json:"maxRequestNum,omitempty"`
SingleIpSearchNum int64 `yaml:"singleIpSearchNum" json:"singleIpSearchNum,omitempty"`
Gzip bool `yaml:"gzip" json:"gzip,omitempty"`
PostCommentUrl string `yaml:"postCommentUrl" json:"postCommentUrl,omitempty"`
TrustIps []string `yaml:"trustIps" json:"trustIps,omitempty"`
TrustServerNames []string `yaml:"trustServerNames" json:"trustServerNames,omitempty"`
Theme string `yaml:"theme" json:"theme,omitempty"`
PostOrder string `yaml:"postOrder" json:"postOrder,omitempty"`
UploadDir string `yaml:"uploadDir" json:"uploadDir,omitempty"`
Pprof string `yaml:"pprof" json:"pprof,omitempty"`
ListPagePlugins []string `yaml:"listPagePlugins" json:"listPagePlugins,omitempty"`
PaginationStep int `yaml:"paginationStep" json:"paginationStep,omitempty"`
ShowQuerySql bool `yaml:"showQuerySql" json:"showQuerySql,omitempty"`
Plugins []string `yaml:"plugins" json:"plugins,omitempty"`
LogOutput string `yaml:"logOutput" json:"logOutput,omitempty"`
}
type CacheTime struct {
CacheControl time.Duration `yaml:"cacheControl"`
RecentPostCacheTime time.Duration `yaml:"recentPostCacheTime"`
CategoryCacheTime time.Duration `yaml:"categoryCacheTime"`
ArchiveCacheTime time.Duration `yaml:"archiveCacheTime"`
ContextPostCacheTime time.Duration `yaml:"contextPostCacheTime"`
RecentCommentsCacheTime time.Duration `yaml:"recentCommentsCacheTime"`
DigestCacheTime time.Duration `yaml:"digestCacheTime"`
PostListCacheTime time.Duration `yaml:"postListCacheTime"`
SearchPostCacheTime time.Duration `yaml:"searchPostCacheTime"`
MonthPostCacheTime time.Duration `yaml:"monthPostCacheTime"`
PostDataCacheTime time.Duration `yaml:"postDataCacheTime"`
PostCommentsCacheTime time.Duration `yaml:"postCommentsCacheTime"`
CrontabClearCacheTime time.Duration `yaml:"crontabClearCacheTime"`
MaxPostIdCacheTime time.Duration `yaml:"maxPostIdCacheTime"`
UserInfoCacheTime time.Duration `yaml:"userInfoCacheTime"`
CommentsCacheTime time.Duration `yaml:"commentsCacheTime"`
SleepTime []time.Duration `yaml:"sleepTime"`
CacheControl time.Duration `yaml:"cacheControl" json:"cacheControl,omitempty"`
RecentPostCacheTime time.Duration `yaml:"recentPostCacheTime" json:"recentPostCacheTime,omitempty"`
CategoryCacheTime time.Duration `yaml:"categoryCacheTime" json:"categoryCacheTime,omitempty"`
ArchiveCacheTime time.Duration `yaml:"archiveCacheTime" json:"archiveCacheTime,omitempty"`
ContextPostCacheTime time.Duration `yaml:"contextPostCacheTime" json:"contextPostCacheTime,omitempty"`
RecentCommentsCacheTime time.Duration `yaml:"recentCommentsCacheTime" json:"recentCommentsCacheTime,omitempty"`
DigestCacheTime time.Duration `yaml:"digestCacheTime" json:"digestCacheTime,omitempty"`
PostListCacheTime time.Duration `yaml:"postListCacheTime" json:"postListCacheTime,omitempty"`
SearchPostCacheTime time.Duration `yaml:"searchPostCacheTime" json:"searchPostCacheTime,omitempty"`
MonthPostCacheTime time.Duration `yaml:"monthPostCacheTime" json:"monthPostCacheTime,omitempty"`
PostDataCacheTime time.Duration `yaml:"postDataCacheTime" json:"postDataCacheTime,omitempty"`
PostCommentsCacheTime time.Duration `yaml:"postCommentsCacheTime" json:"postCommentsCacheTime,omitempty"`
CrontabClearCacheTime time.Duration `yaml:"crontabClearCacheTime" json:"crontabClearCacheTime,omitempty"`
MaxPostIdCacheTime time.Duration `yaml:"maxPostIdCacheTime" json:"maxPostIdCacheTime,omitempty"`
UserInfoCacheTime time.Duration `yaml:"userInfoCacheTime" json:"userInfoCacheTime,omitempty"`
CommentsCacheTime time.Duration `yaml:"commentsCacheTime" json:"commentsCacheTime,omitempty"`
SleepTime []time.Duration `yaml:"sleepTime" json:"sleepTime,omitempty"`
}
type Ssl struct {
Cert string `yaml:"cert"`
Key string `yaml:"key"`
Cert string `yaml:"cert" json:"cert,omitempty"`
Key string `yaml:"key" json:"key,omitempty"`
}
type Mail struct {
User string `yaml:"user"`
Alias string `yaml:"alias"`
Pass string `yaml:"pass"`
Host string `yaml:"host"`
Port int `yaml:"port"`
Ssl bool `yaml:"ssl"`
User string `yaml:"user" json:"user,omitempty"`
Alias string `yaml:"alias" json:"alias,omitempty"`
Pass string `yaml:"pass" json:"pass,omitempty"`
Host string `yaml:"host" json:"host,omitempty"`
Port int `yaml:"port" json:"port,omitempty"`
Ssl bool `yaml:"ssl" json:"ssl,omitempty"`
}
type Mysql struct {
Dsn Dsn `yaml:"dsn"`
Pool Pool `yaml:"pool"`
Dsn Dsn `yaml:"dsn" json:"dsn"`
Pool Pool `yaml:"pool" json:"pool"`
}
func InitConfig(conf string) error {
@ -94,12 +95,12 @@ func InitConfig(conf string) error {
}
type Dsn struct {
Host string `yaml:"host"`
Port string `yaml:"port"`
Db string `yaml:"db"`
User string `yaml:"user"`
Password string `yaml:"password"`
Charset string `yaml:"charset"`
Host string `yaml:"host" json:"host,omitempty"`
Port string `yaml:"port" json:"port,omitempty"`
Db string `yaml:"db" json:"db,omitempty"`
User string `yaml:"user" json:"user,omitempty"`
Password string `yaml:"password" json:"password,omitempty"`
Charset string `yaml:"charset" json:"charset,omitempty"`
}
func (m Dsn) GetDsn() string {
@ -111,8 +112,8 @@ func (m Dsn) GetDsn() string {
}
type Pool struct {
ConnMaxIdleTime time.Duration `yaml:"connMaxIdleTime"`
MaxOpenConn int `yaml:"maxOpenConn"`
MaxIdleConn int `yaml:"maxIdleConn"`
ConnMaxLifetime time.Duration `yaml:"connMaxLifetime"`
ConnMaxIdleTime time.Duration `yaml:"connMaxIdleTime" json:"connMaxIdleTime,omitempty"`
MaxOpenConn int `yaml:"maxOpenConn" json:"maxOpenConn,omitempty"`
MaxIdleConn int `yaml:"maxIdleConn" json:"maxIdleConn,omitempty"`
ConnMaxLifetime time.Duration `yaml:"connMaxLifetime" json:"connMaxLifetime,omitempty"`
}

View File

@ -30,7 +30,7 @@ func GetPostMetaByPostIds(args ...any) (r map[uint64]map[string]any, err error)
if postmeta.MetaKey == "_wp_attachment_metadata" {
metadata, err := phphelper.UnPHPSerializeToStruct[models.WpAttachmentMetadata](postmeta.MetaValue)
if err != nil {
logs.ErrPrintln(err, "解析postmeta失败", postmeta.MetaId, postmeta.MetaValue)
logs.Error(err, "解析postmeta失败", postmeta.MetaId, postmeta.MetaValue)
continue
}
r[postmeta.PostId][postmeta.MetaKey] = metadata

View File

@ -2,17 +2,45 @@ package logs
import (
"fmt"
"github.com/fthvgb1/wp-go/internal/pkg/config"
"github.com/fthvgb1/wp-go/safety"
"io"
"log"
"os"
"runtime"
"strings"
)
func ErrPrintln(err error, desc string, args ...any) {
if err == nil {
return
var logs = safety.NewVar[*log.Logger](nil)
func InitLogger() error {
l := &log.Logger{}
c := config.GetConfig()
if c.LogOutput == "" {
c.LogOutput = "stderr"
}
var out io.Writer
switch c.LogOutput {
case "stdout":
out = os.Stdout
case "stderr":
out = os.Stderr
default:
file, err := os.OpenFile(c.LogOutput, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0777)
if err != nil {
return err
}
out = file
}
logs.Store(l)
l.SetFlags(log.Ldate | log.Ltime)
l.SetOutput(out)
return nil
}
func Errs(err error, depth int, desc string, args ...any) {
var pcs [1]uintptr
runtime.Callers(2, pcs[:])
runtime.Callers(depth, pcs[:])
f := runtime.CallersFrames([]uintptr{pcs[0]})
ff, _ := f.Next()
s := strings.Builder{}
@ -23,7 +51,16 @@ func ErrPrintln(err error, desc string, args ...any) {
_, _ = fmt.Fprintf(&s, "%v", arg)
}
}
if err != nil {
log.Println(s.String())
logs.Load().Println(s.String())
}
func Error(err error, desc string, args ...any) {
Errs(err, 3, desc, args)
}
func IfError(err error, desc string, args ...any) {
if err == nil {
return
}
Errs(err, 3, desc, args...)
}

View File

@ -19,19 +19,24 @@ const ThemeName = "twentyfifteen"
func Init(fs embed.FS) {
b, err := fs.ReadFile("twentyfifteen/themesupport.json")
if err != nil {
logs.Error(err, "读取themesupport.json失败")
return
}
err = json.Unmarshal(b, &themesupport)
logs.ErrPrintln(err, "解析themesupport失败")
if err != nil {
logs.Error(err, "解析themesupport失败")
return
}
bytes, err := fs.ReadFile("twentyfifteen/colorscheme.json")
if err != nil {
logs.Error(err, "读取colorscheme.json失败")
return
}
err = json.Unmarshal(bytes, &colorscheme)
if err != nil {
logs.Error(err, "解析colorscheme失败")
return
}
logs.ErrPrintln(err, "解析colorscheme失败")
}
var pipe = wp.HandlePipe(wp.ExecuteHandleFn, widget.MiddleWare(ready, data)...)
@ -56,7 +61,7 @@ func data(next wp.HandleFn[*wp.Handle], h *wp.Handle) {
next(h)
}
func configs(h *wp.Handle) *wp.Handle {
func configs(h *wp.Handle) {
h.PushComponentFilterFn(widgets.Search, func(h *wp.Handle, s string, args ...any) string {
return strings.ReplaceAll(s, `class="search-submit"`, `class="search-submit screen-reader-text"`)
})
@ -67,5 +72,4 @@ func configs(h *wp.Handle) *wp.Handle {
h.PushHandleFn(constraints.AllStats, wp.NewHandleFn(customHeader, 10))
h.PushHandleFn(constraints.AllStats, wp.NewHandleFn(wp.IndexRender, 50))
h.PushHandleFn(constraints.Detail, wp.NewHandleFn(wp.DetailRender, 50))
return h
}

View File

@ -49,7 +49,7 @@ func Hook(h *wp.Handle) {
pipe(h)
}
func configs(h *wp.Handle) *wp.Handle {
func configs(h *wp.Handle) {
wphandle.RegisterPlugins(h, config.GetConfig().Plugins...)
h.PushHandleFn(constraints.AllStats, wp.NewHandleFn(calClass, 20))
h.PushCacheGroupHeadScript("colorScheme-customHeader", 10, colorScheme, customHeader)
@ -67,7 +67,6 @@ func configs(h *wp.Handle) *wp.Handle {
wp.SetComponentsArgsForMap(h, widgets.Search, "{$form}", searchForm)
h.PushHandleFn(constraints.AllStats, wp.NewHandleFn(wp.IndexRender, 10))
h.PushHandleFn(constraints.Detail, wp.NewHandleFn(wp.DetailRender, 10))
return h
}
func ready(next wp.HandleFn[*wp.Handle], h *wp.Handle) {
wp.InitThemeArgAndConfig(configs, h)
@ -95,7 +94,7 @@ var listPostsPlugins = func() map[string]wp.Plugin[models.Posts, *wp.Handle] {
func errorsHandle(h *wp.Handle) {
switch h.Stats {
case constraints.Error404, constraints.InternalErr, constraints.ParamError:
logs.ErrPrintln(h.Err(), "报错:")
logs.IfError(h.Err(), "报错:")
h.SetTempl("twentyseventeen/posts/error.gohtml")
}
}

View File

@ -78,7 +78,7 @@ func Category(h *wp.Handle, id string, blockParser ParserBlock) (func() string,
var con any
err = json.Unmarshal([]byte(blockParser.Attrs), &con)
if err != nil {
logs.ErrPrintln(err, "解析category attr错误", blockParser.Attrs)
logs.Error(err, "解析category attr错误", blockParser.Attrs)
return nil
}
var conf map[any]any

View File

@ -27,7 +27,7 @@ func (h *Handle) GetCustomHeader() (r models.PostThumbnail, isRand bool) {
return hs
})
if err != nil {
logs.ErrPrintln(err, "获取页眉背景图失败")
logs.Error(err, "获取页眉背景图失败")
return
}
hs := slice.Copy(img)

View File

@ -38,7 +38,7 @@ func (d *DetailHandle) BuildDetailData() (err error) {
func (d *DetailHandle) CheckAndGetPost() (err error) {
id := str.ToInteger[uint64](d.C.Param("id"), 0)
maxId, err := cache.GetMaxPostId(d.C)
logs.ErrPrintln(err, "get max post id")
logs.IfError(err, "get max post id")
if id > maxId || id <= 0 {
d.Stats = constraints.ParamError
err = errors.New("无效的文档id")
@ -49,7 +49,7 @@ func (d *DetailHandle) CheckAndGetPost() (err error) {
post, err := cache.GetPostById(d.C, id)
if post.Id == 0 || err != nil || post.PostStatus != "publish" {
d.Stats = constraints.Error404
logs.ErrPrintln(err, "获取id失败")
logs.IfError(err, "获取id失败")
err = errors.New(str.Join("无效的文档id "))
return
}
@ -71,7 +71,7 @@ func (d *DetailHandle) PasswordProject() {
}
func (d *DetailHandle) Comment() {
comments, err := cache.PostComments(d.C, d.Post.Id)
logs.ErrPrintln(err, "get d.Post comment", d.Post.Id)
logs.IfError(err, "get d.Post comment", d.Post.Id)
d.ginH["comments"] = comments
d.Comments = comments
@ -95,7 +95,7 @@ func (d *DetailHandle) RenderComment() {
func (d *DetailHandle) ContextPost() {
prev, next, err := cache.GetContextPost(d.C, d.Post.Id, d.Post.PostDate)
logs.ErrPrintln(err, "get pre and next post", d.Post.Id, d.Post.PostDate)
logs.IfError(err, "get pre and next post", d.Post.Id, d.Post.PostDate)
d.ginH["next"] = next
d.ginH["prev"] = prev
}

View File

@ -70,7 +70,7 @@ func GetListPostPlugins(name []string, m map[string]Plugin[models.Posts, *Handle
if ok {
return v, true
}
logs.ErrPrintln(errors.New(str.Join("插件", t, "不存在")), "")
logs.IfError(errors.New(str.Join("插件", t, "不存在")), "")
return nil, false
})
}

View File

@ -21,7 +21,7 @@ func (h *Handle) StickPosts() []models.Posts {
}
array, err := phpserialize.UnmarshalIndexedArray([]byte(v))
if err != nil {
logs.ErrPrintln(err, "解析option sticky_posts错误")
logs.Error(err, "解析option sticky_posts错误", v)
return
}
r = slice.FilterAndMap(array, func(t any) (models.Posts, bool) {

View File

@ -65,22 +65,23 @@ type HandleCall struct {
Order int
}
func InitThemeArgAndConfig(fn func(*Handle) *Handle, h *Handle) {
func InitThemeArgAndConfig(fn func(*Handle), h *Handle) {
hh := reload.GetAnyValBys("themeArgAndConfig", h, func(h *Handle) Handle {
h.components = make(map[string][]Components[string])
h.handleFns = make(map[int][]HandleCall)
h.componentsArgs = make(map[string]any)
h.componentFilterFn = make(map[string][]func(*Handle, string, ...any) string)
hh := fn(h)
return *hh
h.ginH = gin.H{}
fn(h)
return *h
})
m := make(map[string][]Components[string])
for k, v := range hh.components {
vv := make([]Components[string], len(v))
copy(vv, v)
m[k] = vv // slice.Copy(v)
m[k] = vv
}
h.components = m // maps.Copy(hh.components)
h.components = m
h.handleFns = hh.handleFns
h.componentsArgs = hh.componentsArgs
h.componentFilterFn = hh.componentFilterFn
@ -201,12 +202,11 @@ func (h *Handle) SetComponentsArgs(key string, value any) {
func NewHandle(c *gin.Context, scene int, theme string) *Handle {
mods, err := wpconfig.GetThemeMods(theme)
logs.ErrPrintln(err, "获取mods失败")
logs.IfError(err, "获取mods失败")
return &Handle{
C: c,
theme: theme,
Session: sessions.Default(c),
ginH: gin.H{},
scene: scene,
Stats: constraints.Ok,
themeMods: mods,

View File

@ -149,7 +149,7 @@ func GetThemeMods(theme string) (r ThemeMods, err error) {
//这里在的err可以不用处理因为php的默认值和有设置过的类型可能不一样直接按有设置的类型处理就行
r, err = maps.StrAnyMapToStruct[ThemeMods](m)
if err != nil {
logs.ErrPrintln(err, "解析thememods错误")
logs.Error(err, "解析thememods错误(可忽略)")
err = nil
}
r.setThemeSupport(theme)