package cmd import ( "context" "fmt" "log" "management/internal/erpserver/handler" "management/internal/erpserver/repository" systemrepo "management/internal/erpserver/repository/system" commonservice "management/internal/erpserver/service/v1/common" systemservice "management/internal/erpserver/service/v1/system" "management/internal/pkg/binding" "management/internal/pkg/config" "management/internal/pkg/database" "management/internal/pkg/middleware" "management/internal/pkg/redis" "management/internal/pkg/session" "management/internal/pkg/tpl" "github.com/drhin/logger" "github.com/spf13/cobra" ) var erpCmd = &cobra.Command{ Use: "erp", Short: "Start erp management server", Long: `A Service to erp management`, Run: func(cmd *cobra.Command, args []string) { err := runErp(cmd.Context()) if err != nil { log.Fatalf("run erp failed: %v", err) } }, } func init() { erpCmd.Flags().StringVarP(&configPath, "config", "c", "", "Custom config file path") rootCmd.AddCommand(erpCmd) } func runErp(ctx context.Context) error { conf, err := config.New(configPath) checkError(err) // 初始化数据 // dbinit.InitSeed() // mustInit(redis.Init) err = binding.SetValidatorTrans("zh") checkError(err) contextx, err := newAppContext(conf) checkError(err) address := fmt.Sprintf("%s:%d", conf.App.Host, conf.App.Port) log.Printf("Starting erp manage server on %s", address) server := InitServer(address, contextx.Router()) return server.ListenAndServe() } func newAppContext(conf *config.Config) (*handler.AppContext, error) { // initialize DB dbOptions := &database.PostgreSQLOptions{ Addr: conf.DB.Host, Username: conf.DB.Username, Password: conf.DB.Password, Database: conf.DB.DBName, } gdb, err := database.NewPostgreSQL(dbOptions) if err != nil { return nil, err } repo := repository.NewStore(gdb) // initialize Redis redis, err := redis.New(conf.Redis) if err != nil { return nil, err } // initialize Session db, err := gdb.DB() if err != nil { return nil, err } session := session.New(db, conf.App.Prod) // initialize Logger log, err := logger.NewProduction() if err != nil { return nil, err } ctx := &handler.AppContext{ DB: gdb, Store: repo, Redis: redis, Session: session, Config: conf, Log: log, } setRepository(ctx) setService(ctx) setMiddleware(ctx) if err := setRender(ctx); err != nil { return nil, err } return ctx, nil } func setRepository(ctx *handler.AppContext) { ctx.UserRepo = systemrepo.NewUserRepository(ctx.Store) ctx.LoginLogRepo = systemrepo.NewLoginLogRepository(ctx.Store) ctx.AuditLogRepo = systemrepo.NewAuditLogRepository(ctx.Store) ctx.RoleRepo = systemrepo.NewRoleRepository(ctx.Store) ctx.DepartmentRepo = systemrepo.NewDepartmentRepository(ctx.Store) ctx.ConfigRepo = systemrepo.NewConfigRepository(ctx.Store) ctx.RoleMenuRepo = systemrepo.NewRoleMenuRepository(ctx.Store) ctx.MenuRepo = systemrepo.NewMenuRepository(ctx.Store) } func setService(ctx *handler.AppContext) { ctx.CaptchaService = commonservice.NewCaptchaService() ctx.ConfigService = systemservice.NewConfigService(ctx.ConfigRepo, ctx.Redis) ctx.LoginLogService = systemservice.NewLoginLogService(ctx.LoginLogRepo) ctx.AuditLogService = systemservice.NewAuditLogService(ctx.AuditLogRepo) ctx.RoleService = systemservice.NewRoleService(ctx.RoleRepo) ctx.UserService = systemservice.NewUserService(ctx.Session, ctx.Log, ctx.UserRepo, ctx.RoleService, ctx.LoginLogService) ctx.DepartmentService = systemservice.NewDepartmentService(ctx.DepartmentRepo) ctx.RoleMenuService = systemservice.NewRoleMenuService(ctx.RoleMenuRepo) ctx.MenuService = systemservice.NewMenuService(ctx.Redis, ctx.Store, ctx.MenuRepo, ctx.RoleService, ctx.RoleMenuService) } func setMiddleware(ctx *handler.AppContext) { ctx.Middleware = middleware.New(ctx.Session, ctx.MenuService, ctx.AuditLogService) } func setRender(ctx *handler.AppContext) error { var err error ctx.Render, err = tpl.New(ctx.Session, ctx.MenuService) if err != nil { return err } return nil } func checkError(err error) { if err != nil { log.Fatalf("init failed: %v", err) } }