增加反链计算按钮
This commit is contained in:
@@ -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 响应结构。
|
||||
|
||||
Reference in New Issue
Block a user