-reload or a restart."
}
diff --git a/internal/panel/locales/zh-CN.json b/internal/panel/locales/zh-CN.json
index 77ce38c..2774db3 100644
--- a/internal/panel/locales/zh-CN.json
+++ b/internal/panel/locales/zh-CN.json
@@ -14,7 +14,7 @@
"action.copy": "复制",
"action.copied": "已复制",
"nav.overview": "概览",
- "nav.repos": "仓库规则",
+ "nav.patterns": "仓库规则",
"nav.bots": "飞书机器人",
"nav.events": "事件集合",
"nav.templates": "消息模板",
@@ -28,7 +28,7 @@
"login.password": "管理员密码",
"dashboard.title": "运行概览",
"dashboard.subtitle": "查看通知配置、投递健康度与配置关系。",
- "dashboard.repoRules": "仓库规则",
+ "dashboard.patternRules": "仓库规则",
"dashboard.bots": "飞书机器人",
"dashboard.eventSets": "事件集合",
"dashboard.templates": "模板文件",
@@ -49,7 +49,7 @@
"topology.title": "配置图谱",
"topology.subtitle": "选择节点查看或修改对应配置。",
"topology.empty": "暂无可展示的配置关系。先创建仓库规则并关联事件和机器人。",
- "topology.legend.repo": "仓库规则",
+ "topology.legend.pattern": "仓库规则",
"topology.legend.event": "事件或集合",
"topology.legend.bot": "通知目标",
"topology.routes": "条配置规则",
@@ -57,7 +57,7 @@
"topology.edges": "条关联",
"topology.events": "个事件",
"topology.targets": "个通知目标",
- "topology.column.repo": "仓库规则",
+ "topology.column.pattern": "仓库规则",
"topology.column.event": "事件与集合",
"topology.column.target": "通知目标",
"bots.title": "飞书机器人",
@@ -71,24 +71,24 @@
"bot.editTitle": "编辑机器人",
"bot.subtitle": "别名用于在仓库规则中引用此机器人。",
"bot.templateHint": "可选,默认使用 default",
- "repos.title": "仓库规则",
- "repos.subtitle": "仓库匹配模式、订阅事件与通知目标按配置顺序匹配。",
- "repos.pattern": "模式",
- "repos.events": "事件",
- "repos.notifyTo": "通知目标",
- "repos.eventsCount": "个事件",
- "repos.empty": "暂无仓库规则,点击“新建”添加。",
- "repos.deleteConfirm": "删除该仓库规则?",
- "repos.customSecret": "自定义密钥",
- "repo.newTitle": "新建仓库规则",
- "repo.editTitle": "编辑仓库规则",
- "repo.subtitle": "设置规则的事件与通知目标。",
- "repo.patternHint": "支持 glob,例如 org/*",
- "repo.secret": "Webhook 密钥",
- "repo.secretHint": "可选;留空则使用全局 server.secret",
- "repo.secretPlaceholder": "留空则使用全局密钥",
- "repo.notifyHint": "每行一个",
- "repo.eventsHint": "事件可直接引用 events.yaml 中的事件,也可叠加 event_sets 中的模板名称。",
+ "patterns.title": "仓库规则",
+ "patterns.subtitle": "仓库匹配模式、订阅事件与通知目标。按 weight 降序评估(数值越大优先级越高)。",
+ "patterns.pattern": "模式",
+ "patterns.events": "事件",
+ "patterns.notifyTo": "通知目标",
+ "patterns.eventsCount": "个事件",
+ "patterns.empty": "暂无仓库规则,点击“新建”添加。",
+ "patterns.deleteConfirm": "删除该仓库规则?",
+ "patterns.customSecret": "自定义密钥",
+ "pattern.newTitle": "新建仓库规则",
+ "pattern.editTitle": "编辑仓库规则",
+ "pattern.subtitle": "设置规则的事件与通知目标。",
+ "pattern.patternHint": "支持 glob,例如 org/*",
+ "pattern.secret": "Webhook 密钥",
+ "pattern.secretHint": "可选;留空则使用全局 server.secret",
+ "pattern.secretPlaceholder": "留空则使用全局密钥",
+ "pattern.notifyHint": "每行一个",
+ "pattern.eventsHint": "事件可直接引用 events.yaml 中的事件,也可叠加 event_sets 中的模板名称。",
"events.title": "事件集合",
"events.subtitle": "编辑事件集合和事件定义。",
"events.preserve": "注释与格式会完整保留。",
@@ -107,6 +107,10 @@
"template.saveWarning": "保存会移除该文件中的 // 注释,并按字母顺序重排键;功能不变。",
"settings.title": "服务设置",
"settings.subtitle": "编辑 server.yaml。端口和密钥的修改需要重启服务后生效。",
+ "settings.migrateTitle": "迁移旧版配置",
+ "settings.migrateDesc": "检测到旧版单文件配置。迁移会把它们拆分为新的分文件格式(patterns/、events/、templates/<语言>/),并按原有顺序为仓库规则注入 weight;原文件连同注释完整备份到 configs/legacy/,迁移后立即生效。旧格式本身可一直正常使用,是否迁移完全由你决定。",
+ "settings.migrateConfirm": "确定迁移到新配置格式吗?原文件会备份到 configs/legacy/。",
+ "settings.migrateBtn": "迁移到新配置格式",
"settings.host": "监听主机",
"settings.port": "端口",
"settings.secret": "Webhook 密钥",
@@ -139,11 +143,11 @@
"flash.botFieldsRequired": "别名和 URL 不能为空。",
"flash.botSaved": "机器人已保存。",
"flash.botDeleted": "机器人已删除。",
- "flash.repoNotFound": "仓库规则不存在。",
+ "flash.patternNotFound": "仓库规则不存在。",
"flash.patternRequired": "模式不能为空。",
"flash.eventsParseFailed": "events YAML 解析失败:%s",
- "flash.repoSaved": "仓库规则已保存。",
- "flash.repoDeleted": "仓库规则已删除。",
+ "flash.patternSaved": "仓库规则已保存。",
+ "flash.patternDeleted": "仓库规则已删除。",
"flash.eventsSaved": "事件配置已保存。",
"flash.templateLoadFailed": "读取模板失败:%s",
"flash.eventRequired": "未选择事件。",
@@ -156,6 +160,10 @@
"flash.settingsUsernamePasswordSaved": "服务设置、用户名和密码已保存。",
"flash.settingsUsernameSaved": "服务设置和用户名已保存。",
"flash.settingsPasswordSaved": "服务设置和密码已保存。",
+ "flash.migrateDone": "迁移完成:%s。原文件已备份到 configs/legacy/,新格式已生效。",
+ "flash.migrateFailed": "迁移失败:%s",
+ "flash.migrateNone": "没有需要迁移的旧版配置。",
+ "patterns.legacyNote": "当前使用旧版单文件 repos.yaml(按原顺序首条匹配,无 weight)。规则会直接写回该文件;如需分文件格式与 weight 优先级,请到「服务设置」页迁移。",
"footer.tagline": "Feishu GitHub Tracker · GitHub → 飞书 webhook 转发。",
"footer.note": "面板内修改保存后会自动 reload;手动编辑配置文件则需以 -reload 启动或重启进程。"
}
diff --git a/internal/panel/middleware.go b/internal/panel/middleware.go
index e55f674..94c4847 100644
--- a/internal/panel/middleware.go
+++ b/internal/panel/middleware.go
@@ -66,26 +66,26 @@ func (a *App) requireAuth(h http.HandlerFunc) http.HandlerFunc {
}
}
-func (a *App) issueCookie(w http.ResponseWriter, token string) {
+func (a *App) issueCookie(w http.ResponseWriter, token string, secure bool) {
http.SetCookie(w, &http.Cookie{
Name: a.cookieName,
Value: token,
Path: "/",
HttpOnly: true,
SameSite: http.SameSiteLaxMode,
- Secure: false,
+ Secure: secure,
MaxAge: int(sessionTTL.Seconds()),
})
}
-func (a *App) clearCookie(w http.ResponseWriter) {
+func (a *App) clearCookie(w http.ResponseWriter, secure bool) {
http.SetCookie(w, &http.Cookie{
Name: a.cookieName,
Value: "",
Path: "/",
HttpOnly: true,
SameSite: http.SameSiteLaxMode,
- Secure: false,
+ Secure: secure,
MaxAge: -1,
})
}
diff --git a/internal/panel/templates/dashboard.html b/internal/panel/templates/dashboard.html
index 59daa95..9800e47 100644
--- a/internal/panel/templates/dashboard.html
+++ b/internal/panel/templates/dashboard.html
@@ -6,7 +6,7 @@ {{.}} {{end}}