webservice.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // 对外服务
  2. package webservice
  3. import (
  4. "crypto/tls"
  5. _ "embed"
  6. "encoding/json"
  7. "fmt"
  8. "log"
  9. "net/http"
  10. be "spidercreator/backend"
  11. bdb "spidercreator/backend/db"
  12. )
  13. const (
  14. LISTEN_ADDR = ":8080"
  15. )
  16. type (
  17. SpiderConfigItem struct {
  18. Key string `json:"key"`
  19. Css string `json:"css"`
  20. }
  21. WebService struct {
  22. db *bdb.SpiderDb
  23. enf be.EventNotifyFace
  24. currentSpiderConfig *be.SpiderConfig
  25. }
  26. )
  27. var (
  28. //go:embed cert.pem
  29. certBytes []byte
  30. //go:embed key.pem
  31. keyBytes []byte
  32. )
  33. // NewWebService
  34. func NewWebService(db *bdb.SpiderDb, enf be.EventNotifyFace, csf *be.SpiderConfig) *WebService {
  35. return &WebService{db, enf, csf}
  36. }
  37. func (ws *WebService) RunHttpServe() {
  38. // 设置HTTP服务器
  39. mux := http.NewServeMux()
  40. // 解析证书
  41. cert, err := tls.X509KeyPair(certBytes, keyBytes)
  42. if err != nil {
  43. log.Println(err.Error())
  44. return
  45. }
  46. // 创建一个TLS配置
  47. tlsConfig := &tls.Config{
  48. // 可以在这里添加其他TLS配置
  49. Certificates: []tls.Certificate{cert},
  50. ServerName: "localhost",
  51. InsecureSkipVerify: true,
  52. }
  53. server := &http.Server{
  54. Addr: LISTEN_ADDR,
  55. Handler: mux,
  56. TLSConfig: tlsConfig,
  57. }
  58. //这里注册HTTP服务
  59. mux.HandleFunc("/save", ws.SaveSpiderConfig)
  60. mux.HandleFunc("/load", ws.LoadSpiderConfig)
  61. //
  62. log.Println("Starting HTTPS server on ", LISTEN_ADDR)
  63. err = server.ListenAndServeTLS("", "")
  64. if err != nil {
  65. log.Println("Failed to start server: ", err.Error())
  66. return
  67. }
  68. }
  69. // LoadCurrentSpiderConfig,json处理
  70. func (ws *WebService) SaveSpiderConfig(w http.ResponseWriter, r *http.Request) {
  71. log.Println("保存设置")
  72. w.Header().Set("Access-Control-Allow-Origin", "*")
  73. w.Header().Set("Content-Type", "application/json")
  74. var req = new(SpiderConfigItem)
  75. err := json.NewDecoder(r.Body).Decode(req)
  76. if err != nil {
  77. log.Println("序列化失败")
  78. http.Error(w, err.Error(), http.StatusBadRequest)
  79. return
  80. }
  81. log.Println("CSS", req.Key, req.Css)
  82. //TODO 业务操作
  83. switch req.Key {
  84. case "listItemCss":
  85. ws.currentSpiderConfig.ListItemCss = req.Css
  86. case "listLinkCss":
  87. ws.currentSpiderConfig.ListLinkCss = req.Css
  88. case "listPublishTimeCss":
  89. ws.currentSpiderConfig.ListPubtimeCss = req.Css
  90. case "listNextPageCss":
  91. ws.currentSpiderConfig.ListNextPageCss = req.Css
  92. case "listBodyCss":
  93. ws.currentSpiderConfig.ListBodyCss = req.Css
  94. case "titleCss":
  95. ws.currentSpiderConfig.TitleCss = req.Css
  96. case "publishUnitCss":
  97. ws.currentSpiderConfig.PublishUnitCss = req.Css
  98. case "publishTimeCss":
  99. ws.currentSpiderConfig.PublishTimeCss = req.Css
  100. case "contentCss":
  101. ws.currentSpiderConfig.ContentCss = req.Css
  102. case "attachCss":
  103. ws.currentSpiderConfig.AttachCss = req.Css
  104. }
  105. fmt.Fprint(w, "{'code':200}")
  106. ws.db.SaveOrUpdate(ws.currentSpiderConfig)
  107. //TODO 通知开发工具端,CSS选择器有变动
  108. ws.enf.Dispatch("spiderConfigChange", map[string]interface{}{"key": req.Key, "sc": ws.currentSpiderConfig})
  109. }
  110. // LoadCurrentSpiderConfig,加载,返回当前配置项
  111. func (ws *WebService) LoadSpiderConfig(w http.ResponseWriter, r *http.Request) {
  112. log.Println("加载当前配置项")
  113. w.Header().Set("Access-Control-Allow-Origin", "*")
  114. w.Header().Set("Content-Type", "application/json")
  115. err := json.NewEncoder(w).Encode(ws.currentSpiderConfig)
  116. if err != nil {
  117. log.Println("反向序列化失败")
  118. http.Error(w, err.Error(), http.StatusBadRequest)
  119. return
  120. }
  121. }