仰望星辰工作室

clearlove2.1

clearlove2.1/ internal/plugin/admininfo.go 2.7 KB · 108 行 原始文件
1// 面向后台管理页的运行时信息查询与模板覆盖支持。
2package plugin
3
4import (
5 "errors"
6 "os"
7 "path/filepath"
8
9 "clearlove/internal/database"
10)
11
12// JobInfo 后台展示用的定时任务信息
13type JobInfo struct {
14 Name string `json:"name"`
15 Every string `json:"every"`
16}
17
18// AppInfo 应用型插件在后台展示的运行时概况
19type AppInfo struct {
20 Running bool `json:"running"`
21 Routes int `json:"routes"`
22 Pages int `json:"pages"`
23 Menus int `json:"menus"`
24 Slots int `json:"slots"`
25 Events int `json:"events"`
26 Filters int `json:"filters"`
27 Jobs []JobInfo `json:"jobs"`
28 Perms []string `json:"perms"`
29 Fails int `json:"fails"` // 连续失败次数(熔断进度)
30}
31
32// AppInfoOf 查询某插件目录的运行时概况(未加载时 Running=false)
33func AppInfoOf(dir string) AppInfo {
34 a := GetApp(filepath.Base(dir))
35 if a == nil || a.Plugin == nil {
36 return AppInfo{}
37 }
38 info := AppInfo{
39 Running: true,
40 Perms: a.Plugin.Permissions,
41 Fails: FailCount(a.Plugin.SlugOf()),
42 Routes: len(a.Routes),
43 Pages: len(a.Pages),
44 Menus: len(a.Menus),
45 }
46 for _, fns := range a.Slots {
47 info.Slots += len(fns)
48 }
49 for _, fns := range a.Events {
50 info.Events += len(fns)
51 }
52 for _, list := range a.Filters {
53 info.Filters += len(list)
54 }
55 for _, j := range a.Jobs {
56 info.Jobs = append(info.Jobs, JobInfo{Name: j.Name, Every: j.Every.String()})
57 }
58 return info
59}
60
61// EnabledTemplateDirs 返回已启用插件中带有 templates/ 目录的绝对路径。
62// 内核按顺序重新解析这些目录下的模板,实现"插件覆盖内核同名模板片段"。
63func EnabledTemplateDirs() []string {
64 enabled := enabledSet()
65 var out []string
66 for name, p := range cachedPlugins() {
67 if !enabled[p.Name] {
68 continue
69 }
70 dir := filepath.Join(dir(), filepath.Base(name), "templates")
71 if st, err := os.Stat(dir); err == nil && st.IsDir() {
72 out = append(out, dir)
73 }
74 }
75 return out
76}
77
78// PluginLogs 读取运行日志(后台日志页使用)
79func PluginLogs(slug string, limit int) []map[string]any {
80 if database.DB == nil {
81 return nil
82 }
83 if limit <= 0 || limit > 500 {
84 limit = 200
85 }
86 q := "SELECT id, plugin_slug, action, IFNULL(detail,'') AS detail, duration_ms, IFNULL(created_at,'') AS created_at FROM plugin_logs"
87 var args []any
88 if slug != "" {
89 q += " WHERE plugin_slug=?"
90 args = append(args, slug)
91 }
92 q += " ORDER BY id DESC LIMIT ?"
93 args = append(args, limit)
94 rows, err := queryMaps(database.DB, q, args)
95 if err != nil {
96 return nil
97 }
98 return rows
99}
100
101// ClearPluginLogs 清空运行日志
102func ClearPluginLogs() error {
103 if database.DB == nil {
104 return errors.New("数据库未连接")
105 }
106 _, err := database.DB.Exec("DELETE FROM plugin_logs")
107 return err
108}