diff --git a/client/src/environments/environment.ts b/client/src/environments/environment.ts index 1a61762..33630d7 100644 --- a/client/src/environments/environment.ts +++ b/client/src/environments/environment.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - api: '', + api: 'https://recipe.taobin.io:8090/api/', }; diff --git a/server/data/data.go b/server/data/data.go index 24e739f..a461406 100644 --- a/server/data/data.go +++ b/server/data/data.go @@ -7,6 +7,7 @@ import ( "path/filepath" "recipe-manager/models" "sort" + "time" ) func readFile(version string) *models.Recipe { @@ -32,10 +33,16 @@ func readFile(version string) *models.Recipe { return data } +type RecipeWithTimeStamps struct { + Recipe models.Recipe + TimeStamps int64 +} + type Data struct { CurrentVersion string AllVersions []string - recipe *models.Recipe + currentRecipe *models.Recipe + recipeMap map[string]RecipeWithTimeStamps } func NewData() *Data { @@ -65,42 +72,102 @@ func NewData() *Data { files[i] = filepath.Base(files[i]) } + defaultVersion := "coffeethai02_580.json" + defaultRecipe := readFile(defaultVersion) + return &Data{ - CurrentVersion: "coffeethai02_580.json", + CurrentVersion: defaultVersion, AllVersions: files, - recipe: readFile("coffeethai02_580.json"), + currentRecipe: defaultRecipe, + recipeMap: map[string]RecipeWithTimeStamps{ + defaultVersion: { + Recipe: *defaultRecipe, + TimeStamps: time.Now().Unix(), + }, + }, } } func (d *Data) GetRecipe(version string) models.Recipe { if version == "" || version == d.CurrentVersion { - return *d.recipe + return *d.currentRecipe } log.Println("Change recipe to version:", version) + if recipe, ok := d.recipeMap[version]; ok { + d.CurrentVersion = version + return recipe.Recipe + } + // change current version and read new recipe d.CurrentVersion = version - d.recipe = readFile(version) - return *d.recipe + d.currentRecipe = readFile(version) + + // save to map + if len(d.recipeMap) > 5 { // limit keep in memory 5 version + // remove oldest version + var oldestVersion string + var oldestTime int64 + for k, v := range d.recipeMap { + if oldestTime == 0 || v.TimeStamps < oldestTime { + oldestTime = v.TimeStamps + oldestVersion = k + } + } + delete(d.recipeMap, oldestVersion) + } + + d.recipeMap[version] = RecipeWithTimeStamps{ + Recipe: *d.currentRecipe, + TimeStamps: time.Now().Unix(), + } + + return *d.currentRecipe } func (d *Data) GetRecipe01() []models.Recipe01 { - return d.recipe.Recipe01 + return d.currentRecipe.Recipe01 } func (d *Data) GetMaterialSetting(version string) []models.MaterialSetting { result := make([]models.MaterialSetting, 0) if version == "" || version == d.CurrentVersion { - copy(result, d.recipe.MaterialSetting) + copy(result, d.currentRecipe.MaterialSetting) + return result + } + + if recipe, ok := d.recipeMap[version]; ok { + copy(result, recipe.Recipe.MaterialSetting) + d.CurrentVersion = version return result } d.CurrentVersion = version - d.recipe = readFile(version) - copy(result, d.recipe.MaterialSetting) + d.currentRecipe = readFile(version) + + // save to map + if len(d.recipeMap) > 5 { // limit keep in memory 5 version + // remove oldest version + var oldestVersion string + var oldestTime int64 + for k, v := range d.recipeMap { + if oldestTime == 0 || v.TimeStamps < oldestTime { + oldestTime = v.TimeStamps + oldestVersion = k + } + } + delete(d.recipeMap, oldestVersion) + } + + d.recipeMap[version] = RecipeWithTimeStamps{ + Recipe: *d.currentRecipe, + TimeStamps: time.Now().Unix(), + } + + copy(result, d.currentRecipe.MaterialSetting) return result } @@ -108,11 +175,34 @@ func (d *Data) GetMaterialCode(ids []uint64, version string) []models.MaterialCo var result []models.MaterialCode if version == "" || version == d.CurrentVersion { - result = d.recipe.MaterialCode + result = d.currentRecipe.MaterialCode + } else if recipe, ok := d.recipeMap[version]; ok { + d.CurrentVersion = version + return recipe.Recipe.MaterialCode } else { d.CurrentVersion = version - d.recipe = readFile(version) - result = d.recipe.MaterialCode + d.currentRecipe = readFile(version) + + // save to map + if len(d.recipeMap) > 5 { // limit keep in memory 5 version + // remove oldest version + var oldestVersion string + var oldestTime int64 + for k, v := range d.recipeMap { + if oldestTime == 0 || v.TimeStamps < oldestTime { + oldestTime = v.TimeStamps + oldestVersion = k + } + } + delete(d.recipeMap, oldestVersion) + } + + d.recipeMap[version] = RecipeWithTimeStamps{ + Recipe: *d.currentRecipe, + TimeStamps: time.Now().Unix(), + } + + result = d.currentRecipe.MaterialCode } if len(ids) == 0 {