data.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package data
  2. import (
  3. "encoding/json"
  4. "gadmin/internal/admin/forms"
  5. "gadmin/utility/character"
  6. "io/ioutil"
  7. "os"
  8. "sync"
  9. "time"
  10. "github.com/sirupsen/logrus"
  11. )
  12. type Notice struct {
  13. MsgId string `json:"id"`
  14. Type string `json:"type"`
  15. Content string `json:"content"`
  16. CreateAt int64 `json:"create_at"`
  17. UpdateAt int64 `json:"update_at"`
  18. StartAt int64 `json:"start_at"`
  19. EndAt int64 `json:"end_at"`
  20. Interval int64 `json:"interval"`
  21. LastInterval int64 `json:"last"`
  22. }
  23. var (
  24. Db = make(map[string]Notice)
  25. // once sync.Once
  26. lock sync.RWMutex
  27. bakFile = ""
  28. )
  29. func getBakFile() string {
  30. if bakFile != "" {
  31. return bakFile
  32. }
  33. bakFile = os.Getenv("STORAGE_NOTICE")
  34. return bakFile
  35. }
  36. func AddNotice(params forms.AddNoticeReq) *Notice {
  37. notice := Notice{
  38. Type: params.Type,
  39. Content: params.Content,
  40. StartAt: params.StartAt,
  41. EndAt: params.EndAt,
  42. Interval: params.Interval,
  43. }
  44. if params.MsgId != "" {
  45. notice.MsgId = params.MsgId
  46. notice.UpdateAt = time.Now().Unix()
  47. } else {
  48. data, _ := json.Marshal(notice)
  49. msgId := character.Md5Content(data)
  50. notice.MsgId = msgId
  51. notice.CreateAt = time.Now().Unix()
  52. }
  53. Db[notice.MsgId] = notice
  54. logrus.Infoln("Db :", Db)
  55. return &notice
  56. }
  57. func InitWorker() {
  58. worker := sentry{watcher: SendToWorld, Name: "sentry1"}
  59. go func() {
  60. worker.Run()
  61. }()
  62. }
  63. func SaveToBak() (err error) {
  64. lock.Lock()
  65. defer lock.Unlock()
  66. content, _ := json.Marshal(Db)
  67. err = ioutil.WriteFile(getBakFile(), content, 0666) //写入文件(字节数组)
  68. if err != nil {
  69. logrus.Panic("cannot Notices SaveToBak, err:" + err.Error())
  70. }
  71. return
  72. }
  73. func InitNotices() {
  74. go func() {
  75. // var err error
  76. for {
  77. time.Sleep(3 * time.Minute)
  78. if err := SaveToBak(); err != nil {
  79. logrus.Error("Notice SaveToBak err:", err)
  80. return
  81. }
  82. }
  83. }()
  84. go InitWorker()
  85. logrus.Info("start InitNotices...")
  86. }
  87. func LoadFromBak() (err error) {
  88. file, err := os.OpenFile(getBakFile(), os.O_RDONLY, 0666)
  89. if err != nil {
  90. return
  91. }
  92. content, err := ioutil.ReadAll(file)
  93. if err != nil {
  94. return
  95. }
  96. err = json.Unmarshal(content, &Db)
  97. logrus.Warnf("加载公告Db:%#v", Db)
  98. return
  99. }