增加搜索功能
This commit is contained in:
@@ -49,6 +49,7 @@ func (s *Server) Handler() http.Handler {
|
||||
mux.HandleFunc("/search", s.handleSearch)
|
||||
mux.HandleFunc("/admin/recent", s.handleAdminRecent)
|
||||
mux.HandleFunc("/admin/stats", s.handleAdminStats)
|
||||
mux.HandleFunc("/admin/priority", s.handleAdminPriority)
|
||||
return mux
|
||||
}
|
||||
|
||||
@@ -201,6 +202,86 @@ func (s *Server) handleAdminStats(w http.ResponseWriter, r *http.Request) {
|
||||
json.NewEncoder(w).Encode(resp)
|
||||
}
|
||||
|
||||
// handleAdminPriority 处理 /admin/priority 的 GET/POST/DELETE 请求。
|
||||
// GET: 返回所有未访问的 priority 条目列表
|
||||
// POST: 添加一条 URL 或域名(body: {url: "..."})
|
||||
// DELETE: 删除指定 URL(query: ?url=...)
|
||||
func (s *Server) handleAdminPriority(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
w.Header().Set("Content-Type", "application/json; charset=utf-8")
|
||||
|
||||
switch r.Method {
|
||||
case http.MethodOptions:
|
||||
w.Header().Set("Access-Control-Allow-Origin", "*")
|
||||
w.Header().Set("Access-Control-Allow-Methods", "GET,POST,DELETE,OPTIONS")
|
||||
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
|
||||
w.WriteHeader(204)
|
||||
return
|
||||
|
||||
case http.MethodGet:
|
||||
entries, err := s.db.GetPriorityURLs()
|
||||
if err != nil {
|
||||
http.Error(w, `{"error":"`+err.Error()+`"}`, 500)
|
||||
return
|
||||
}
|
||||
if entries == nil {
|
||||
entries = []storage.PriorityEntry{}
|
||||
}
|
||||
json.NewEncoder(w).Encode(map[string]any{"items": entries, "count": len(entries)})
|
||||
|
||||
case http.MethodPost:
|
||||
var body struct {
|
||||
URL string `json:"url"`
|
||||
}
|
||||
if err := json.NewDecoder(r.Body).Decode(&body); err != nil || strings.TrimSpace(body.URL) == "" {
|
||||
http.Error(w, `{"error":"missing url field"}`, 400)
|
||||
return
|
||||
}
|
||||
|
||||
raw := strings.TrimSpace(body.URL)
|
||||
entry := storage.PriorityEntry{AddedAt: time.Now().Unix()}
|
||||
|
||||
// 判断是完整 URL 还是纯域名
|
||||
if strings.Contains(raw, "/") || strings.HasPrefix(raw, "http") {
|
||||
u, err := url.Parse(raw)
|
||||
if err != nil || u.Host == "" {
|
||||
http.Error(w, `{"error":"invalid url"}`, 400)
|
||||
return
|
||||
}
|
||||
if u.Scheme == "" {
|
||||
u.Scheme = "https"
|
||||
}
|
||||
entry.URL = u.String()
|
||||
entry.IsDomain = false
|
||||
} else {
|
||||
entry.URL = "https://" + raw
|
||||
entry.IsDomain = true
|
||||
}
|
||||
|
||||
if err := s.db.AddPriorityURL(entry); err != nil {
|
||||
http.Error(w, `{"error":"`+err.Error()+`"}`, 500)
|
||||
return
|
||||
}
|
||||
json.NewEncoder(w).Encode(map[string]string{"status": "added", "url": entry.URL})
|
||||
|
||||
case http.MethodDelete:
|
||||
urlParam := r.URL.Query().Get("url")
|
||||
if urlParam == "" {
|
||||
http.Error(w, `{"error":"missing url parameter"}`, 400)
|
||||
return
|
||||
}
|
||||
if err := s.db.RemovePriorityURL(urlParam); err != nil {
|
||||
http.Error(w, `{"error":"`+err.Error()+`"}`, 500)
|
||||
return
|
||||
}
|
||||
json.NewEncoder(w).Encode(map[string]string{"status": "removed"})
|
||||
|
||||
default:
|
||||
w.Header().Set("Allow", "GET,POST,DELETE")
|
||||
http.Error(w, `{"error":"method not allowed"}`, 405)
|
||||
}
|
||||
}
|
||||
|
||||
// ---- 搜索处理器 ----
|
||||
|
||||
// searchResponse 是搜索 API 的 JSON 响应结构。
|
||||
|
||||
Reference in New Issue
Block a user