backend.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "sync"
  8. "time"
  9. "github.com/allanpk716/ChineseSubFinder/pkg/settings"
  10. "github.com/allanpk716/ChineseSubFinder/frontend/dist"
  11. "github.com/gin-contrib/cors"
  12. "github.com/gin-gonic/gin"
  13. "github.com/sirupsen/logrus"
  14. "github.com/allanpk716/ChineseSubFinder/pkg/logic/cron_helper"
  15. )
  16. type BackEnd struct {
  17. logger *logrus.Logger
  18. settings *settings.Settings
  19. cronHelper *cron_helper.CronHelper
  20. httpPort int
  21. running bool
  22. srv *http.Server
  23. locker sync.Mutex
  24. restartSignal chan interface{}
  25. }
  26. func NewBackEnd(logger *logrus.Logger, settings *settings.Settings, cronHelper *cron_helper.CronHelper, httpPort int, restartSignal chan interface{}) *BackEnd {
  27. return &BackEnd{logger: logger, settings: settings, cronHelper: cronHelper, httpPort: httpPort, restartSignal: restartSignal}
  28. }
  29. func (b *BackEnd) start() {
  30. defer b.locker.Unlock()
  31. b.locker.Lock()
  32. if b.running == true {
  33. b.logger.Debugln("Http Server is already running")
  34. return
  35. }
  36. b.running = true
  37. gin.SetMode(gin.ReleaseMode)
  38. gin.DefaultWriter = ioutil.Discard
  39. engine := gin.Default()
  40. // 默认所有都通过
  41. engine.Use(cors.Default())
  42. v1Router := InitRouter(b.logger, b.settings, engine, b.cronHelper, b.restartSignal)
  43. engine.GET("/", func(c *gin.Context) {
  44. c.Header("content-type", "text/html;charset=utf-8")
  45. c.String(http.StatusOK, string(dist.SpaIndexHtml))
  46. })
  47. engine.StaticFS(dist.SpaFolderJS, dist.Assets(dist.SpaFolderName+dist.SpaFolderJS, dist.SpaJS))
  48. engine.StaticFS(dist.SpaFolderCSS, dist.Assets(dist.SpaFolderName+dist.SpaFolderCSS, dist.SpaCSS))
  49. engine.StaticFS(dist.SpaFolderFonts, dist.Assets(dist.SpaFolderName+dist.SpaFolderFonts, dist.SpaFonts))
  50. engine.StaticFS(dist.SpaFolderIcons, dist.Assets(dist.SpaFolderName+dist.SpaFolderIcons, dist.SpaIcons))
  51. engine.StaticFS(dist.SpaFolderImages, dist.Assets(dist.SpaFolderName+dist.SpaFolderImages, dist.SpaImages))
  52. engine.Any("/api", func(c *gin.Context) {
  53. c.Redirect(http.StatusMovedPermanently, "/")
  54. })
  55. // listen and serve on 0.0.0.0:8080(default)
  56. b.srv = &http.Server{
  57. Addr: fmt.Sprintf(":%d", b.httpPort),
  58. Handler: engine,
  59. }
  60. go func() {
  61. b.logger.Infoln("Try Start Http Server At Port", b.httpPort)
  62. if err := b.srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  63. b.logger.Errorln("Start Server Error:", err)
  64. }
  65. defer func() {
  66. v1Router.Close()
  67. }()
  68. }()
  69. }
  70. func (b *BackEnd) Restart() {
  71. stopFunc := func() {
  72. b.locker.Lock()
  73. defer func() {
  74. b.locker.Unlock()
  75. }()
  76. if b.running == false {
  77. b.logger.Debugln("Http Server is not running")
  78. return
  79. }
  80. b.running = false
  81. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  82. defer cancel()
  83. if err := b.srv.Shutdown(ctx); err != nil {
  84. b.logger.Errorln("Http Server Shutdown:", err)
  85. }
  86. select {
  87. case <-ctx.Done():
  88. b.logger.Warningln("timeout of 5 seconds.")
  89. }
  90. b.logger.Infoln("Http Server exiting")
  91. }
  92. for {
  93. select {
  94. case <-b.restartSignal:
  95. {
  96. stopFunc()
  97. b. ()
  98. }
  99. }
  100. }
  101. }