增加反链计算按钮

This commit is contained in:
2026-04-09 13:43:58 +08:00
parent f307e30496
commit 351b9d36bb
7 changed files with 127 additions and 13 deletions
+48
View File
@@ -46,6 +46,12 @@ type Server struct {
indexCache map[string][]storage.IndexEntry
indexCacheMu sync.RWMutex
indexCacheHits int64 // 缓存命中计数(原子)
// backlinkRunner 反向链接计算器(可为 nil,仅用于 admin 手动触发)
backlinkRunner interface {
Status() map[string]interface{}
RunNow() error
}
}
// New 创建一个 search Server(内嵌收获服务,统一在同一端口)。
@@ -64,6 +70,14 @@ func New(db *storage.DB, infoSvc *info.Service, a *analyzer.Analyzer) *Server {
return s
}
// SetBacklinkRunner 注入反向链接计算器(用于 admin 手动触发)。
func (s *Server) SetBacklinkRunner(r interface {
Status() map[string]interface{}
RunNow() error
}) {
s.backlinkRunner = r
}
// runPeriodicFlush 每隔 FlushIntervalSeconds 秒触发一次刷盘。
func (s *Server) runPeriodicFlush() {
ticker := time.NewTicker(time.Duration(config.FlushIntervalSeconds()) * time.Second)
@@ -91,6 +105,7 @@ func (s *Server) Handler() http.Handler {
mux.HandleFunc("/admin/flush", s.handleAdminFlush)
mux.HandleFunc("/admin/pending", s.handleAdminPending)
mux.HandleFunc("/admin/workers", s.handleAdminWorkers)
mux.HandleFunc("/admin/backlink", s.handleAdminBacklink)
// 静态文件(SPA fallback
mux.Handle("/", spaHandler{dist: "dist"})
return mux
@@ -458,6 +473,39 @@ func (s *Server) handleAdminWorkers(w http.ResponseWriter, r *http.Request) {
}
}
// handleAdminBacklink 查看反链计算状态和手动触发。
// GET 返回 running(是否计算中)、next_run(下次执行时间)、last_run(上次完成时间)
// POST 触发立即执行一次反链计算
func (s *Server) handleAdminBacklink(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Content-Type", "application/json; charset=utf-8")
if s.backlinkRunner == nil {
http.Error(w, `{"error":"backlink runner not available"}`, 503)
return
}
switch r.Method {
case http.MethodOptions:
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET,POST,OPTIONS")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
w.WriteHeader(204)
return
case http.MethodGet:
json.NewEncoder(w).Encode(s.backlinkRunner.Status())
case http.MethodPost:
go s.backlinkRunner.RunNow() // 异步执行,避免阻塞 HTTP 请求
json.NewEncoder(w).Encode(map[string]string{"status": "started"})
default:
w.Header().Set("Allow", "GET,POST")
http.Error(w, `{"error":"method not allowed"}`, 405)
}
}
// ---- 搜索处理器 ----
// searchResponse 是搜索 API 的 JSON 响应结构。