diff --git a/src/model/domain.go b/src/model/domain.go index ef871c10587e693ac39b7b5043a2c5a045b9c64f..7975aee8079e7179709ce8d0ae2d9c745d215644 100644 --- a/src/model/domain.go +++ b/src/model/domain.go @@ -1,5 +1,7 @@ package model +import "time" + type ClsBase struct { Title string `yaml:"title"` Desc string `yaml:"desc"` @@ -156,6 +158,7 @@ type ResFile struct { Title string `json:"title"` Desc string `json:"desc"` ResType string `json:"resType"` + UpdatedAt time.Time `json:"updatedAt"` } type ResField struct { Index int `json:"index"` diff --git a/src/model/model.go b/src/model/model.go index f0f707b7d8e25a37ea0653874118a478f2c86139..0a362f3afd3ce1db6dadb0bcfe937a7e944ce4a5 100644 --- a/src/model/model.go +++ b/src/model/model.go @@ -19,7 +19,7 @@ type ZdDef struct { Yaml string `gorm:"yaml" json:"yaml"` Path string `gorm:"column:path" json:"path" yaml:"-"` - Folder string `gorm:"folder" json:"folder" yaml:"-"` + Folder string `gorm:"column:folder" json:"folder" yaml:"-"` } func (*ZdDef) TableName() string { return constant.TablePrefix + "def" diff --git a/src/server/repo/config.go b/src/server/repo/config.go index 0f7f743ab05432ff8c8bdd16ed506844b32d924d..fc1bb76a92630f923312c4291ef0e31e7284960b 100644 --- a/src/server/repo/config.go +++ b/src/server/repo/config.go @@ -10,6 +10,11 @@ type ConfigRepo struct { db *gorm.DB } +func (r *ConfigRepo) ListAll() (models []*model.ZdConfig) { + r.db.Find(&models) + return +} + func (r *ConfigRepo) List(keywords string, page int) (models []*model.ZdConfig, total int, err error) { query := r.db.Select("id,title,folder,path").Order("id ASC") if keywords != "" { diff --git a/src/server/repo/def.go b/src/server/repo/def.go index cc767dd6cbad76be75ff4ef20a4722a1be5aaf4a..d4ecf23e1204fb3768c5267b80d80e6891136424 100644 --- a/src/server/repo/def.go +++ b/src/server/repo/def.go @@ -10,6 +10,11 @@ type DefRepo struct { db *gorm.DB } +func (r *DefRepo) ListAll() (models []*model.ZdDef) { + r.db.Find(&models) + return +} + func (r *DefRepo) List(keywords string, page int) (models []*model.ZdDef, total int, err error) { query := r.db.Select("id,title,folder,path").Order("id ASC") if keywords != "" { diff --git a/src/server/repo/excel.go b/src/server/repo/excel.go index 0308d1a4575bcaf9e005dd1dc81b89e7d130579d..51742237843e273aa83575baa7b5a321171de10b 100644 --- a/src/server/repo/excel.go +++ b/src/server/repo/excel.go @@ -10,6 +10,11 @@ type ExcelRepo struct { db *gorm.DB } +func (r *ExcelRepo) ListAll() (models []*model.ZdExcel) { + r.db.Find(&models) + return +} + func (r *ExcelRepo) List(keywords string, page int) (models []*model.ZdExcel, total int, err error) { query := r.db.Select("id,title,folder,path").Order("id ASC") if keywords != "" { diff --git a/src/server/repo/instances.go b/src/server/repo/instances.go index 39440e07e37079072057be5755697098fddbdf2e..f2f2c0320315ffadd488e5d752cf6847756fa2aa 100644 --- a/src/server/repo/instances.go +++ b/src/server/repo/instances.go @@ -10,6 +10,11 @@ type InstancesRepo struct { db *gorm.DB } +func (r *InstancesRepo) ListAll() (models []*model.ZdInstances) { + r.db.Find(&models) + return +} + func (r *InstancesRepo) List(keywords string, page int) (models []*model.ZdInstances, total int, err error) { query := r.db.Select("id,title,folder,path").Order("id ASC") if keywords != "" { diff --git a/src/server/repo/ranges.go b/src/server/repo/ranges.go index 52def37b796a2a46c767d4bcbc31fa8d109b2707..70325c11fbbf485ba2afb5d2a04cc9a9a857e6a8 100644 --- a/src/server/repo/ranges.go +++ b/src/server/repo/ranges.go @@ -10,6 +10,11 @@ type RangesRepo struct { db *gorm.DB } +func (r *RangesRepo) ListAll() (models []*model.ZdRanges) { + r.db.Find(&models) + return +} + func (r *RangesRepo) List(keywords string, page int) (models []*model.ZdRanges, total int, err error) { query := r.db.Select("id,title,folder,path").Order("id ASC") if keywords != "" { diff --git a/src/server/repo/text.go b/src/server/repo/text.go index 443ed85f83700da4185fd2bc943531fd6ca7e6aa..0fc0cdc3aa4b70cf12d8696a4a2f8a83c0edac34 100644 --- a/src/server/repo/text.go +++ b/src/server/repo/text.go @@ -10,6 +10,11 @@ type TextRepo struct { db *gorm.DB } +func (r *TextRepo) ListAll() (models []*model.ZdText) { + r.db.Find(&models) + return +} + func (r *TextRepo) List(keywords string, page int) (models []*model.ZdText, total int, err error) { query := r.db.Select("id,title,folder,path").Order("id ASC") if keywords != "" { diff --git a/src/server/service/def.go b/src/server/service/def.go index 708d2ecec361cd1f9f3f450ef690c093a9b84f27..994e2b7ba87981ebff996ce3c91fa5695e422ea2 100644 --- a/src/server/service/def.go +++ b/src/server/service/def.go @@ -22,12 +22,7 @@ type DefService struct { } func (s *DefService) List(keywords string, page int) (list []*model.ZdDef, total int) { - defs := s.resService.LoadRes("yaml") - list, _, _ = s.defRepo.List("", -1) - s.saveDataToDB(defs, list) - list, total, _ = s.defRepo.List(strings.TrimSpace(keywords), page) - return } @@ -124,33 +119,21 @@ func (s *DefService) dataToYaml(def *model.ZdDef) (str string) { return } -func (s *DefService) saveDataToDB(defs []model.ResFile, list []*model.ZdDef) (err error) { - names := make([]string, 0) - for _, item := range list { - names = append(names, item.Path) +func (s *DefService) Sync(files []model.ResFile) (err error) { + defList := s.defRepo.ListAll() + + defMap := map[string]*model.ZdDef{} + for _, item := range defList { + defMap[item.Path] = item } - for _, def := range defs { - if !stringUtils.FindInArrBool(def.Path, names) { - content, _ := ioutil.ReadFile(def.Path) - yamlContent := stringUtils.ReplaceSpecialChars(content) - defPo := model.ZdDef{} - err = yaml.Unmarshal(yamlContent, &defPo) - defPo.Title = def.Title - defPo.Type = def.ResType - defPo.Desc = def.Desc - defPo.Path = def.Path - defPo.Folder = serverUtils.GetRelativePath(defPo.Path) - defPo.Yaml = string(content) - - s.defRepo.Create(&defPo) - - rootField, _ := s.fieldRepo.CreateTreeNode(defPo.ID, 0, "字段", "root") - s.referRepo.CreateDefault(rootField.ID, constant.ResTypeDef) - for i, field := range defPo.Fields { - field.Ord = i + 1 - s.saveFieldToDB(&field, rootField.ID, defPo.ID) - } + for _, fi := range files { + _, found := defMap[fi.Path] + if found { + s.defRepo.Remove(defMap[fi.Path].ID) + } + if !found || fi.UpdatedAt.Unix() > defMap[fi.Path].UpdatedAt.Unix() { + s.SyncToDB(fi) } } @@ -166,6 +149,34 @@ func (s *DefService) saveFieldToDB(item *model.ZdField, parentID, defID uint) { } } +func (s *DefService) SyncToDB(fi model.ResFile) (err error) { + content, _ := ioutil.ReadFile(fi.Path) + yamlContent := stringUtils.ReplaceSpecialChars(content) + defPo := model.ZdDef{} + err = yaml.Unmarshal(yamlContent, &defPo) + defPo.Title = fi.Title + defPo.Type = fi.ResType + defPo.Desc = fi.Desc + defPo.Path = fi.Path + defPo.Folder = serverUtils.GetRelativePath(defPo.Path) + defPo.Yaml = string(content) + + s.defRepo.Create(&defPo) + + rootField, _ := s.fieldRepo.CreateTreeNode(defPo.ID, 0, "字段", "root") + s.referRepo.CreateDefault(rootField.ID, constant.ResTypeDef) + for i, field := range defPo.Fields { + field.Ord = i + 1 + s.saveFieldToDB(&field, rootField.ID, defPo.ID) + } + + return +} +func (s *DefService) SyncFromDB(files []model.ResFile) (err error) { + + return +} + func NewDefService(defRepo *serverRepo.DefRepo, fieldRepo *serverRepo.FieldRepo, referRepo *serverRepo.ReferRepo) *DefService { return &DefService{defRepo: defRepo, fieldRepo: fieldRepo, referRepo: referRepo} diff --git a/src/server/service/res.go b/src/server/service/res.go index 38562f3249eff3e2a153dac9a69c2d7ed381ff1a..b6839dfdc1ab5db85f732b27cbe258e1538c7344 100644 --- a/src/server/service/res.go +++ b/src/server/service/res.go @@ -45,17 +45,17 @@ func (s *ResService) LoadRes(resType string) (ret []model.ResFile) { func (s *ResService) ListReferForSelection(resType string) (ret interface{}) { if resType == "ranges" { - ret, _, _ = s.rangesRepo.List("",-1) + ret = s.rangesRepo.ListAll() } else if resType == "instances" { - ret, _, _ = s.instancesRepo.List("",-1) + ret = s.instancesRepo.ListAll() } else if resType == "config" { - ret, _, _ = s.configRepo.List("",-1) + ret = s.configRepo.ListAll() } else if resType == "yaml" { - ret, _, _ = s.defRepo.List("",-1) + ret = s.defRepo.ListAll() } else if resType == "excel" { - ret, _, _ = s.excelRepo.List("",-1) + ret = s.excelRepo.ListAll() } else if resType == "text" { - ret, _, _ = s.textRepo.List("",-1) + ret = s.textRepo.ListAll() } return diff --git a/src/server/service/sync.go b/src/server/service/sync.go new file mode 100644 index 0000000000000000000000000000000000000000..dfe1398cc7657100a457664626feba30d828b8f0 --- /dev/null +++ b/src/server/service/sync.go @@ -0,0 +1,54 @@ +package serverService + +import "github.com/easysoft/zendata/src/model" + +type SyncService struct { + defService *DefService + fieldService *FieldService + rangesService *RangesService + instancesService *InstancesService + configService *ConfigService + excelService *ExcelService + textService *TextService + referService *ReferService + resService *ResService +} + +func (s *SyncService) SyncData(mode string) { // TODO: overwrite or not + files := s.resService.LoadRes("") + + fileMap := map[string][]model.ResFile{} + for _, fi := range files { + if fileMap[fi.ResType] == nil { + fileMap[fi.ResType] = make([]model.ResFile, 0) + } + fileMap[fi.ResType] = append(fileMap[fi.ResType], fi) + } + + defs := fileMap["yaml"] + + s.defService.Sync(defs) +} + +func NewSyncService( + defService *DefService, + fieldService *FieldService, + rangesService *RangesService, + instancesService *InstancesService, + configService *ConfigService, + excelService *ExcelService, + textService *TextService, + referService *ReferService, + resService *ResService) *SyncService { + return &SyncService{ + defService: defService, + fieldService: fieldService, + rangesService: rangesService, + instancesService: instancesService, + configService: configService, + excelService: excelService, + textService: textService, + referService: referService, + resService: resService, + } +} diff --git a/src/zd.go b/src/zd.go index 1b37346403bee4edb2b16155a86746a4630d9f59..0662de74cb66a8258eb2e41d73bc153b0b6cc0ce 100644 --- a/src/zd.go +++ b/src/zd.go @@ -279,6 +279,7 @@ type Server struct { sectionService *serverService.SectionService referService *serverService.ReferService resService *serverService.ResService + syncService *serverService.SyncService rangesService *serverService.RangesService instancesService *serverService.InstancesService @@ -305,8 +306,6 @@ func Init() (err error) { defService := serverService.NewDefService(defRepo, fieldRepo, referRepo) fieldService := serverService.NewFieldService(defRepo, fieldRepo, referRepo) sectionService := serverService.NewSectionService(fieldRepo, sectionRepo) - referService := serverService.NewReferService(fieldRepo, referRepo) - rangesService := serverService.NewRangesService(rangesRepo) instancesService := serverService.NewInstancesService(instancesRepo, referRepo) textService := serverService.NewTextService(textRepo) @@ -315,8 +314,13 @@ func Init() (err error) { resService := serverService.NewResService(rangesRepo, instancesRepo, configRepo, excelRepo, textRepo, defRepo) + referService := serverService.NewReferService(fieldRepo, referRepo) + syncService := serverService.NewSyncService(defService, + fieldService, rangesService, instancesService, configService, excelService, textService, + referService, resService) + server := NewServer(config, defService, fieldService, sectionService, referService, - rangesService, instancesService, textService, excelService, configService, resService) + rangesService, instancesService, textService, excelService, configService, resService, syncService) server.Run() return @@ -358,6 +362,8 @@ func (s *Server) admin(writer http.ResponseWriter, req *http.Request) { ret := model.ResData{ Code: 1, Msg: "success"} switch reqData.Action { // def + case "syncData": + s.syncService.SyncData(reqData.Mode) case "listDef": ret.Data, ret.Total = s.defService.List(reqData.Keywords, reqData.Page) case "getDef": @@ -533,7 +539,7 @@ func NewServer(config *serverConfig.Config, defService *serverService.DefService referService *serverService.ReferService, rangesService *serverService.RangesService, instancesService *serverService.InstancesService, textService *serverService.TextService, excelService *serverService.ExcelService, configService *serverService.ConfigService, - resService *serverService.ResService) *Server { + resService *serverService.ResService, syncService *serverService.SyncService) *Server { return &Server{ config: config, defService: defService, @@ -546,6 +552,7 @@ func NewServer(config *serverConfig.Config, defService *serverService.DefService excelService: excelService, configService: configService, resService: resService, + syncService: syncService, } } diff --git a/ui/src/api/manage.js b/ui/src/api/manage.js index 4989a5c34b21fd6308d393eb4a729f7ea06b3e57..b3262c617b6f62a54687ad5bdac45bd15c58d747 100644 --- a/ui/src/api/manage.js +++ b/ui/src/api/manage.js @@ -378,3 +378,13 @@ export function removeExcel (id) { data: data }) } + +export function syncData () { + const data = {'action': 'syncData', mode: ''} + + return request({ + url: api.admin, + method: 'post', + data: data + }) +} diff --git a/ui/src/layout/ColLayout.vue b/ui/src/layout/ColLayout.vue index 7b3421b2aafe4f2fe6306abcc5d7860b6241b244..c0d724d82a91dd4b19496734197d5dc675a574c4 100644 --- a/ui/src/layout/ColLayout.vue +++ b/ui/src/layout/ColLayout.vue @@ -14,6 +14,7 @@