Defining the Seeder Interface

package models

type (
  Seeder interface {
    Seed() error
  }
  Model interface {
    Store() error
    Update(id string) error
  }
)

Defining the Model

type Menu struct {
  Code           string `xorm:"not null pk comment('编码') VARCHAR(255)"`
  ParentCode     string `xorm:"not null comment('父编码') index VARCHAR(255)"`
  PermissionCode string `xorm:"not null comment('权限编码') index VARCHAR(255)"`
  Name           string `xorm:"not null comment('名称') VARCHAR(255)"`
  Route          string `xorm:"not null comment('前端路由') VARCHAR(255)"`
  Icon           string `xorm:"not null comment('图标') VARCHAR(255)"`
}

// Define the model's table name
func (menu *Menu) TableName() string {
  return "menus"
}

// Data seeder
func (menu *Menu) Seed() error {
  return menu.Store()
}

// Create menu
func (menu *Menu) Store() error {
  _, err := Engine.Insert(menu)
  return err
}

Defining the Seeder Registration Interface and Seeder Structure

package seeds

import (
  "github.com/betterde/ects/models"
  "log"
)

type (
  SeederInterface interface {
    Register(seeder *Seeder)
  }

  Seeder struct {
    instances []models.Seeder
  }
)

func (seeder *Seeder) Run() error {
  seeders := []SeederInterface{
    &MenuSeeder{},
    &PermissionSeeder{},
  }

  for _, item := range seeders {
    item.Register(seeder)
  }

  for _, instalce := range seeder.instances {
    if err := instalce.Seed(); err != nil {
      log.Println(err)
    }
  }
  return nil
}

Implementing the Model’s Seeding Method

Implementing the Register method for the menu model,

package seeds

import "github.com/betterde/ects/models"

type (
  MenuSeeder struct {
  }
)

func (menus *MenuSeeder) Register(seeder *Seeder) {
  items := []models.Seeder{
    &models.Menu{
      Code:           "dashboard",
      ParentCode:     "",
      PermissionCode: "dashboard",
      Name:           "Overview",
      Route:          "/dashboard",
      Icon:           "",
    },
    &models.Menu{
      Code:           "task",
      ParentCode:     "",
      PermissionCode: "task",
      Name:           "Tasks",
      Route:          "/task",
      Icon:           "",
    },
    &models.Menu{
      Code:           "worker",
      ParentCode:     "",
      PermissionCode: "worker",
      Name:           "Nodes",
      Route:          "/worker",
      Icon:           "",
    },
    &models.Menu{
      Code:           "team",
      ParentCode:     "",
      PermissionCode: "team",
      Name:           "Team",
      Route:          "/team",
      Icon:           "",
    },
    &models.Menu{
      Code:           "user",
      ParentCode:     "",
      PermissionCode: "user",
      Name:           "Users",
      Route:          "/user",
      Icon:           "",
    },
    &models.Menu{
      Code:           "log",
      ParentCode:     "",
      PermissionCode: "log",
      Name:           "Logs",
      Route:          "/log",
      Icon:           "",
    },
    &models.Menu{
      Code:           "record",
      ParentCode:     "",
      PermissionCode: "record",
      Name:           "Records",
      Route:          "/record",
      Icon:           "",
    },
    &models.Menu{
      Code:           "setting",
      ParentCode:     "",
      PermissionCode: "setting",
      Name:           "Settings",
      Route:          "/setting",
      Icon:           "",
    },
  }

  seeder.instances = append(seeder.instances, items...)
}

Calling at Service Startup

seedService := seeds.Seeder{}
if err := seedService.Run(); err != nil {
  return response.InternalServerError("Failed to seed system data", err)
}

I hope this is helpful, Happy hacking…