113 lines
2.5 KiB
Go
113 lines
2.5 KiB
Go
package cmd
|
||
|
||
import (
|
||
"fmt"
|
||
"log"
|
||
"net/http"
|
||
"runtime"
|
||
"time"
|
||
|
||
"management/internal/erpserver"
|
||
"management/internal/erpserver/repository/seed"
|
||
"management/internal/pkg/config"
|
||
"management/internal/pkg/mid"
|
||
|
||
"github.com/drhin/logger"
|
||
"github.com/fvbock/endless"
|
||
"github.com/spf13/cobra"
|
||
)
|
||
|
||
var configPath string
|
||
|
||
// erpCmd 代表erp命令
|
||
var erpCmd = &cobra.Command{
|
||
Use: "erp",
|
||
Short: "启动 ERP 管理服务器",
|
||
Long: `启动 ERP 管理服务器,可根据指定配置文件加载服务配置。
|
||
|
||
示例:
|
||
# 使用默认配置文件启动服务
|
||
./management erp
|
||
|
||
# 使用自定义配置文件启动服务
|
||
./management erp -c config.prod.yaml
|
||
|
||
该命令会初始化配置、日志系统,然后启动 HTTP 服务器监听指定端口。在 Windows 系统上使用标准的 http.Server,其他系统使用 endless 实现热重启。
|
||
`,
|
||
Run: func(cmd *cobra.Command, args []string) {
|
||
if err := runErp(); err != nil {
|
||
log.Fatalf("run erp failed: %v", err)
|
||
}
|
||
},
|
||
}
|
||
|
||
func runErp() error {
|
||
conf, err := config.New(configPath)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
l, err := logger.NewDevelopment()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
app, fn, err := erpserver.NewWire(conf, l)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
// database seed
|
||
if err = seed.Init(
|
||
app.ConfigRepo,
|
||
app.DepartmentRepo,
|
||
app.RoleRepo,
|
||
app.UserRepo,
|
||
app.MenuRepo,
|
||
); err != nil {
|
||
return err
|
||
}
|
||
|
||
defer fn()
|
||
|
||
// 初始化审计缓冲器
|
||
mid.InitAuditBuffer(app.AuditLogService, l)
|
||
|
||
address := fmt.Sprintf("%s:%d", conf.App.Host, conf.App.Port)
|
||
log.Printf("Starting manage server on %s", address)
|
||
|
||
if runtime.GOOS == "windows" {
|
||
s := &http.Server{
|
||
Addr: address,
|
||
Handler: app.Router,
|
||
ReadTimeout: 20 * time.Second,
|
||
WriteTimeout: 20 * time.Second,
|
||
MaxHeaderBytes: 1 << 20,
|
||
}
|
||
return s.ListenAndServe()
|
||
} else {
|
||
s := endless.NewServer(address, app.Router)
|
||
s.ReadHeaderTimeout = 20 * time.Second
|
||
s.WriteTimeout = 20 * time.Second
|
||
s.MaxHeaderBytes = 1 << 20
|
||
return s.ListenAndServe()
|
||
}
|
||
|
||
//return nil
|
||
}
|
||
|
||
func init() {
|
||
rootCmd.AddCommand(erpCmd)
|
||
|
||
// 在这里,您将定义您的标志和配置设置。
|
||
|
||
// Cobra支持适用于此命令的持久标志
|
||
// 以及所有子命令,例如:
|
||
// erpCmd.PersistentFlags().String("foo", "", "A help for foo")
|
||
|
||
// Cobra支持仅在执行以下命令时运行的本地标志
|
||
// 直接调用,例如:
|
||
// erpCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
|
||
erpCmd.Flags().StringVarP(&configPath, "config", "c", "configs/config.dev.yaml", "custom config file")
|
||
}
|