- 新增 StudioController,依赖 studioUseCase 接口,遵循 ISP 接口隔离 - PostRepo 新增 FindByUserIDAndStatus 方法,按用户+状态分页查询 - PostService 新增 ListByUser、GetOverview 及 StudioOverview 统计 - /studio 页面路由(概览/管理/草稿箱/写文章/数据分析)+ /api/studio API - 复用 Vditor 编辑器,studio-editor.js 对接 /api/studio/posts 端点 - 新增 studio.css(B站风格三栏布局+统计卡片+状态筛选tabs) - 模板引擎注册 add/subtract 函数,分页模板中直接使用
58 lines
1.5 KiB
Go
58 lines
1.5 KiB
Go
package theme
|
||
|
||
import (
|
||
"html/template"
|
||
"os"
|
||
"path/filepath"
|
||
"strings"
|
||
)
|
||
|
||
// TemplateRoot 模板根目录配置
|
||
type TemplateRoot struct {
|
||
Dir string // 目录路径
|
||
Prefix string // 模板名前缀(如 "admin/" 表示管理后台)
|
||
}
|
||
|
||
// LoadTemplates 加载多个根目录的 .html 模板到同一模板集
|
||
// 模板名 = prefix + 相对于 root.Dir 的相对路径
|
||
func LoadTemplates(roots ...TemplateRoot) (*template.Template, error) {
|
||
funcMap := template.FuncMap{
|
||
"add": func(a, b int) int { return a + b },
|
||
"subtract": func(a, b int) int { return a - b },
|
||
}
|
||
t := template.New("").Funcs(funcMap)
|
||
for _, root := range roots {
|
||
dir := filepath.Clean(root.Dir) + string(os.PathSeparator)
|
||
err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
|
||
if err != nil {
|
||
return err
|
||
}
|
||
if info.IsDir() || filepath.Ext(path) != ".html" {
|
||
return nil
|
||
}
|
||
content, err := os.ReadFile(path)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
// 模板名:prefix + 相对路径
|
||
name := root.Prefix + strings.TrimPrefix(path, dir)
|
||
_, err = t.New(name).Parse(string(content))
|
||
return err
|
||
})
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
}
|
||
return t, nil
|
||
}
|
||
|
||
// LoadContent 读取主题内容文件(准则等),返回不转义的 template.HTML。
|
||
// 后期改为查数据库时,只需修改此函数实现,调用方不变。
|
||
func LoadContent(path string) (template.HTML, error) {
|
||
content, err := os.ReadFile(path)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
return template.HTML(content), nil
|
||
}
|