feat: opaque session、安装/发帖 SSR 与最小 Admin 后台
浏览器登录改为 DB sessions(可吊销);敏感词与 OIDC PEM 入 settings; 落地安装向导、注册发帖与 /admin 仪表盘/板块/审核/设置。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -19,6 +19,7 @@ var (
|
||||
|
||||
func funcMap() template.FuncMap {
|
||||
return template.FuncMap{
|
||||
"safeHTML": func(s string) template.HTML { return template.HTML(s) },
|
||||
"sortURL": func(boardID uint, sort string) string {
|
||||
q := url.Values{}
|
||||
if sort != "" && sort != "latest" {
|
||||
@@ -50,13 +51,36 @@ func funcMap() template.FuncMap {
|
||||
}
|
||||
return path
|
||||
},
|
||||
"postURL": func(id uint) string {
|
||||
return fmt.Sprintf("/post/%d", id)
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
var parseGlobs = []string{
|
||||
"*.tmpl",
|
||||
"base/*.tmpl",
|
||||
"home/*.tmpl",
|
||||
"post/*.tmpl",
|
||||
"shared/*.tmpl",
|
||||
"status/*.tmpl",
|
||||
"auth/*.tmpl",
|
||||
"admin/*.tmpl",
|
||||
}
|
||||
|
||||
// Load 解析全部模板(进程内一次)
|
||||
func Load() (*template.Template, error) {
|
||||
loadOnce.Do(func() {
|
||||
tpl, loadErr = template.New("root").Funcs(funcMap()).ParseFS(apptemplates.FS, "*.tmpl")
|
||||
root := template.New("root").Funcs(funcMap())
|
||||
var err error
|
||||
for _, g := range parseGlobs {
|
||||
root, err = root.ParseFS(apptemplates.FS, g)
|
||||
if err != nil {
|
||||
loadErr = err
|
||||
return
|
||||
}
|
||||
}
|
||||
tpl = root
|
||||
})
|
||||
return tpl, loadErr
|
||||
}
|
||||
@@ -69,3 +93,10 @@ func Execute(w io.Writer, name string, data any) error {
|
||||
}
|
||||
return t.ExecuteTemplate(w, name, data)
|
||||
}
|
||||
|
||||
// ResetForTest 测试用重置
|
||||
func ResetForTest() {
|
||||
loadOnce = sync.Once{}
|
||||
tpl = nil
|
||||
loadErr = nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user