// 对外服务 package webservice import ( "crypto/tls" _ "embed" "encoding/json" "fmt" "log" "net/http" be "spidercreator/backend" bdb "spidercreator/backend/db" ) const ( LISTEN_ADDR = ":8080" ) type ( SpiderConfigItem struct { Key string `json:"key"` Css string `json:"css"` } WebService struct { db *bdb.SpiderDb enf be.EventNotifyFace currentSpiderConfig *be.SpiderConfig } ) var ( //go:embed cert.pem certBytes []byte //go:embed key.pem keyBytes []byte ) // NewWebService func NewWebService(db *bdb.SpiderDb, enf be.EventNotifyFace, csf *be.SpiderConfig) *WebService { return &WebService{db, enf, csf} } func (ws *WebService) RunHttpServe() { // 设置HTTP服务器 mux := http.NewServeMux() // 解析证书 cert, err := tls.X509KeyPair(certBytes, keyBytes) if err != nil { log.Println(err.Error()) return } // 创建一个TLS配置 tlsConfig := &tls.Config{ // 可以在这里添加其他TLS配置 Certificates: []tls.Certificate{cert}, ServerName: "localhost", InsecureSkipVerify: true, } server := &http.Server{ Addr: LISTEN_ADDR, Handler: mux, TLSConfig: tlsConfig, } //这里注册HTTP服务 mux.HandleFunc("/save", ws.SaveSpiderConfig) mux.HandleFunc("/load", ws.LoadSpiderConfig) // log.Println("Starting HTTPS server on ", LISTEN_ADDR) err = server.ListenAndServeTLS("", "") if err != nil { log.Println("Failed to start server: ", err.Error()) return } } // LoadCurrentSpiderConfig,json处理 func (ws *WebService) SaveSpiderConfig(w http.ResponseWriter, r *http.Request) { log.Println("保存设置") w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") var req = new(SpiderConfigItem) err := json.NewDecoder(r.Body).Decode(req) if err != nil { log.Println("序列化失败") http.Error(w, err.Error(), http.StatusBadRequest) return } log.Println("CSS", req.Key, req.Css) //TODO 业务操作 switch req.Key { case "listItemCss": ws.currentSpiderConfig.ListItemCss = req.Css case "listLinkCss": ws.currentSpiderConfig.ListLinkCss = req.Css case "listPublishTimeCss": ws.currentSpiderConfig.ListPubtimeCss = req.Css case "listNextPageCss": ws.currentSpiderConfig.ListNextPageCss = req.Css case "listBodyCss": ws.currentSpiderConfig.ListBodyCss = req.Css case "titleCss": ws.currentSpiderConfig.TitleCss = req.Css case "publishUnitCss": ws.currentSpiderConfig.PublishUnitCss = req.Css case "publishTimeCss": ws.currentSpiderConfig.PublishTimeCss = req.Css case "contentCss": ws.currentSpiderConfig.ContentCss = req.Css case "attachCss": ws.currentSpiderConfig.AttachCss = req.Css } fmt.Fprint(w, "{'code':200}") ws.db.SaveOrUpdate(ws.currentSpiderConfig) //TODO 通知开发工具端,CSS选择器有变动 ws.enf.Dispatch("spiderConfigChange", ws.currentSpiderConfig) } // LoadCurrentSpiderConfig,加载,返回当前配置项 func (ws *WebService) LoadSpiderConfig(w http.ResponseWriter, r *http.Request) { log.Println("加载当前配置项") w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Content-Type", "application/json") err := json.NewEncoder(w).Encode(ws.currentSpiderConfig) if err != nil { log.Println("反向序列化失败") http.Error(w, err.Error(), http.StatusBadRequest) return } }