clearlove2.1
1// 视图能力反向注入。
2//
3// 依赖方向是 handlers -> plugin,因此 plugin 不能 import handlers。
4// 插件页面/模板渲染需要模板与会话能力,这里用接口由 handlers 在启动时注入。
5package plugin
6
7import (
8 "io/fs"
9 "net/http"
10)
11
12// ViewProvider 由 handlers 实现的视图能力
13type ViewProvider interface {
14 // RenderTemplate 渲染插件目录(fsys)下的模板片段
15 RenderTemplate(fsys fs.FS, name string, data any) (string, error)
16 // CSRF 当前请求的 CSRF 令牌(插件表单需要带上)
17 CSRF(r *http.Request) string
18 // UserID 当前登录用户 ID(未登录返回 0)
19 UserID(r *http.Request) int64
20 // AdminID 当前登录管理员 ID(未登录返回 0)
21 AdminID(r *http.Request) int64
22 // AdminPerm 当前管理员是否拥有指定权限
23 AdminPerm(r *http.Request, perm string) bool
24}
25
26var viewProvider ViewProvider
27
28// SetViewProvider 由 handlers 在模板初始化完成后调用
29func SetViewProvider(v ViewProvider) { viewProvider = v }
30
31// HasViewProvider 是否已完成装配(测试环境可能未装配)
32func HasViewProvider() bool { return viewProvider != nil }