- 替换 Beego 框架为 GoFrame v2 - 重构项目结构: controller/service/dao/middleware 分层 - 替换自定义 crons 包为 gcron - 模板从 views/ 迁移到 resource/template/ - 配置从 conf/app.conf 迁移到 config.yml - 数据库从 MySQL 切换为 SQLite (modernc.org/sqlite) - 移除 agent/ 远程执行器(待后续迁移) - 移除 crons/ 自定义定时器包 - 静态资源整理到 resource/static/
130 lines
2.8 KiB
Go
130 lines
2.8 KiB
Go
package boot
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gogf/gf/v2/os/gview"
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
)
|
|
|
|
func init() {
|
|
view := gview.Instance()
|
|
if err := view.SetConfigWithMap(map[string]interface{}{
|
|
"Paths": []string{"resource/template"},
|
|
}); err != nil {
|
|
// fallback - gview may not support SetConfigWithMap on singleton
|
|
}
|
|
|
|
// urlfor 生成路由URL
|
|
view.BindFunc("urlfor", func(name string, params ...string) string {
|
|
route, ok := RouteMap[name]
|
|
if !ok {
|
|
return "#"
|
|
}
|
|
if len(params) >= 2 {
|
|
route = route + "?" + url.QueryEscape(params[0]) + "=" + url.QueryEscape(params[1])
|
|
}
|
|
return route
|
|
})
|
|
|
|
// date 日期格式化(兼容多种格式)
|
|
view.BindFunc("date", func(t interface{}, format string) string {
|
|
var tm time.Time
|
|
switch v := t.(type) {
|
|
case time.Time:
|
|
tm = v
|
|
case int64:
|
|
tm = time.Unix(v, 0)
|
|
case int:
|
|
tm = time.Unix(int64(v), 0)
|
|
case string:
|
|
// 尝试解析时间戳字符串
|
|
if i := gconv.Int64(v); i > 0 {
|
|
tm = time.Unix(i, 0)
|
|
} else {
|
|
return v
|
|
}
|
|
default:
|
|
return fmt.Sprintf("%v", t)
|
|
}
|
|
switch format {
|
|
case "Y-m-d H:i:s":
|
|
return tm.Format("2006-01-02 15:04:05")
|
|
case "Y-m-d":
|
|
return tm.Format("2006-01-02")
|
|
case "H:i:s":
|
|
return tm.Format("15:04:05")
|
|
case "m-d":
|
|
return tm.Format("01-02")
|
|
default:
|
|
return tm.Format(format)
|
|
}
|
|
})
|
|
|
|
// dateStr 时间戳转日期字符串
|
|
view.BindFunc("dateStr", func(timestamp int64, format string) string {
|
|
t := time.Unix(timestamp, 0)
|
|
switch format {
|
|
case "Y-m-d H:i:s":
|
|
return t.Format("2006-01-02 15:04:05")
|
|
case "Y-m-d":
|
|
return t.Format("2006-01-02")
|
|
default:
|
|
return t.Format(format)
|
|
}
|
|
})
|
|
|
|
// substr 字符串截取
|
|
view.BindFunc("substr", func(s string, start, length int) string {
|
|
runes := []rune(s)
|
|
if start >= len(runes) {
|
|
return ""
|
|
}
|
|
end := start + length
|
|
if end > len(runes) {
|
|
end = len(runes)
|
|
}
|
|
return string(runes[start:end])
|
|
})
|
|
|
|
// str2html 将值渲染为HTML(支持任意类型)
|
|
view.BindFunc("str2html", func(s interface{}) string {
|
|
return fmt.Sprintf("%v", s)
|
|
})
|
|
|
|
// eq 判断相等
|
|
view.BindFunc("eq", func(a, b interface{}) bool {
|
|
return fmt.Sprintf("%v", a) == fmt.Sprintf("%v", b)
|
|
})
|
|
|
|
// ne 判断不等
|
|
view.BindFunc("ne", func(a, b interface{}) bool {
|
|
return fmt.Sprintf("%v", a) != fmt.Sprintf("%v", b)
|
|
})
|
|
|
|
// inArray 检查值是否在数组中
|
|
view.BindFunc("inArray", func(value interface{}, arr []interface{}) bool {
|
|
for _, v := range arr {
|
|
if fmt.Sprintf("%v", v) == fmt.Sprintf("%v", value) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
})
|
|
|
|
// replace 字符串替换
|
|
view.BindFunc("replace", func(s, old, new string) string {
|
|
return strings.Replace(s, old, new, -1)
|
|
})
|
|
|
|
view.BindFunc("split", func(s string) []string {
|
|
if s == "" {
|
|
return []string{}
|
|
}
|
|
return strings.Split(s, ",")
|
|
})
|
|
}
|