package main import ( "bytes" "fmt" "os" "strings" ) var repoStub = `package repositories import ( "gorm.io/gorm" "sorbet/internal/entities" "sorbet/pkg/db" ) type {{pascal}}Repository struct { *db.Repository[entities.{{pascal}}] } // New{{pascal}}Repository 创建{{label}}仓库 func New{{pascal}}Repository(orm *gorm.DB) *{{pascal}}Repository { return &{{pascal}}Repository{ db.NewRepositoryWith[entities.{{pascal}}](orm, "id"), } } ` var labels = map[string]string{ "Company": "公司", "CompanyDepartment": "公司部门", "CompanyStaff": "公司员工", "Config": "配置", "ConfigGroup": "配置组", "Feature": "栏目", "FeatureCategory": "栏目分类", "FeatureConfig": "栏目配置", "FeatureContent": "栏目内容", "FeatureContentChapter": "栏目内容章回", "FeatureContentDetail": "栏目内容详情", "Resource": "资源", "ResourceCategory": "资源分类", "SystemLog": "系统日志", "SystemMenu": "系统菜单", "SystemPermission": "系统权限", "SystemRole": "系统用户角色", "SystemRolePower": "角色授权", "SystemUser": "系统用户", } func main() { dirs, err := os.ReadDir("../internal/entities") if err != nil { panic(err) } os.MkdirAll("../internal/repositories", os.ModePerm) var camels []string var pascals []string var iocStr string var createdCount int for _, dir := range dirs { name := dir.Name() if !strings.HasSuffix(name, ".go") { continue } name = strings.TrimSuffix(name, ".go") parts := strings.Split(name, "_") for i, part := range parts { parts[i] = string(append(bytes.ToUpper([]byte{part[0]}), part[1:]...)) } pascal := strings.Join(parts, "") camel := string(bytes.ToLower([]byte{pascal[0]})) + pascal[1:] pascals = append(pascals, pascal) camels = append(camels, camel) label, ok := labels[pascal] if !ok { fmt.Println("跳过 " + dir.Name()) continue } iocStr += "\tioc.MustSingleton(New" + pascal + "Repository)\n" repository := "../internal/repositories/" + dir.Name() if PathExists(repository) { fmt.Println("跳过 " + dir.Name()) } else { code := strings.ReplaceAll(repoStub, "{{pascal}}", pascal) code = strings.ReplaceAll(code, "{{camel}}", camel) code = strings.ReplaceAll(code, "{{label}}", label) os.WriteFile("../internal/repositories/"+dir.Name(), []byte(code), os.ModePerm) fmt.Println("创建 " + dir.Name()) createdCount++ } } if createdCount > 0 { os.WriteFile("../internal/repositories/ioc.go", []byte(`package repositories import "sorbet/pkg/ioc" func init() { `+iocStr+`} `), os.ModePerm) } } func PathExists(path string) bool { _, err := os.Stat(path) if err == nil { return true } if os.IsNotExist(err) { return false } panic(err) }