Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package main
  2. import (
  3. "log"
  4. "git.x2erp.com/qdy/go-base/config"
  5. "git.x2erp.com/qdy/go-base/container"
  6. "git.x2erp.com/qdy/go-base/graceful"
  7. "git.x2erp.com/qdy/go-base/logger"
  8. "git.x2erp.com/qdy/go-base/webx"
  9. "git.x2erp.com/qdy/go-base/webx/router"
  10. "git.x2erp.com/qdy/go-db/factory/database"
  11. "git.x2erp.com/qdy/go-db/sqldef"
  12. "git.x2erp.com/qdy/go-svc-configure/internal/routes"
  13. _ "git.x2erp.com/qdy/go-svc-configure/internal/tables" // 导入表定义包,触发 init() 函数
  14. )
  15. ////go:embed web/dist
  16. //var frontendFS embed.FS
  17. var (
  18. appName = "svc-configure"
  19. appVersion = "1"
  20. )
  21. func main() {
  22. // 0. 初始化日志
  23. logBootFactory := logger.InitBootLog()
  24. // 1. 获取配置文件
  25. cfg := config.GetConfig()
  26. cfg.SetAppName(appName)
  27. cfg.SetAppVersion(appVersion)
  28. // 2. 创建关闭容器
  29. ctr := container.NewContainer(cfg)
  30. // 注册日志,实现自动关闭
  31. container.Reg(ctr, logBootFactory)
  32. // 3. 创建数据库工厂
  33. dbFactory := container.Create(ctr, database.CreateDBFactory)
  34. dbFactory.TestConnection()
  35. // 创建表
  36. creteTabel(dbFactory)
  37. //启用运行日志
  38. container.Create(ctr, logger.InitRuntimeLogger)
  39. //建立httpservice
  40. //得到webservice服务工厂
  41. webxFactory := webx.GetWebServiceFactory()
  42. //建立hhtpService服务
  43. webServcie, _ := webxFactory.CreateService(cfg.GetServiceConfig())
  44. //建立路由-api
  45. routerService := router.NewWebService(webServcie.GetRouter())
  46. //注册路由--api
  47. registerRoutes(routerService, dbFactory)
  48. // 注册前端静态文件服务
  49. //frontendHandler := ServeFrontend()
  50. //webServcie.GetRouter().Handle("/", frontendHandler)
  51. //启动服务
  52. webServcie.Run()
  53. //等待关闭
  54. graceful.WaitForShutdown(cfg.GetServiceConfig().ServiceName, ctr, webServcie.GetServer())
  55. }
  56. // 注册所有路由
  57. func registerRoutes(ws *router.RouterService, dbFactory *database.DBFactory) {
  58. // Token 管理路由
  59. routes.RegisterTokenRoutes(ws, dbFactory)
  60. // SVC 启动配置路由
  61. routes.RegisterSvcstartupRoutes(ws, dbFactory)
  62. // 微服务管理路由
  63. routes.RegisterServiceManagementRoutes(ws, dbFactory)
  64. // 启动配置路由
  65. routes.RegisterStartupRoutes(ws, dbFactory)
  66. // Boot 配置路由
  67. routes.RegisterBootconfigRoutes(ws, dbFactory)
  68. // 初始化配置元数据路由
  69. routes.RegisterRegisterRoutes(ws, dbFactory)
  70. // 配置元数据管理路由
  71. routes.RegisterMetaManagementRoutes(ws, dbFactory)
  72. // 项目技能管理路由
  73. routes.RegisterSkillRoutes(ws, dbFactory)
  74. // 项目管理路由
  75. routes.RegisterProjectRoutes(ws, dbFactory)
  76. // 项目树结构路由
  77. routes.RegisterProjectTreeRoutes(ws, dbFactory)
  78. // 同步方案管理路由
  79. routes.RegisterSolutionManagementRoutes(ws, dbFactory)
  80. // 数据库字典管理路由
  81. routes.RegisterDicManagementRoutes(ws, dbFactory)
  82. // 别名字典管理路由
  83. routes.RegisterAliasManagementRoutes(ws, dbFactory)
  84. // 项目代理管理路由
  85. routes.RegisterProjectAgentRoutes(ws, dbFactory)
  86. // 租户管理路由
  87. routes.RegisterTenantRoutes(ws, dbFactory)
  88. // 角色管理路由
  89. routes.RegisterRoleRoutes(ws, dbFactory)
  90. // 用户认证路由
  91. routes.RegisterUserRoutes(ws, dbFactory)
  92. // 管理员登录路由(无需 dbFactory)
  93. routes.RegisterAdminRoutes(ws)
  94. }
  95. func creteTabel(factory *database.DBFactory) {
  96. // 获取数据库连接和类型
  97. db := factory.GetDB()
  98. dbType := factory.GetDBType()
  99. // 创建表同步器
  100. syncer, err := sqldef.NewTableSyncer(db, dbType)
  101. if err != nil {
  102. log.Printf("创建 - 建立器失败: %v", err)
  103. }
  104. // 创建表
  105. if err := syncer.CreateTables(); err != nil {
  106. log.Printf("建表失败: %v", err)
  107. }
  108. log.Println("数据库表建立完成!")
  109. }
  110. // // ServeFrontend 返回处理前端静态文件的服务处理器
  111. // func ServeFrontend() http.Handler {
  112. // // 从嵌入的文件系统中获取 dist 子目录
  113. // fsys, err := fs.Sub(frontendFS, "web/dist")
  114. // if err != nil {
  115. // // 如果失败,回退到空文件系统
  116. // return http.FileServer(http.FS(frontendFS))
  117. // }
  118. // // 创建自定义文件服务器,处理 SPA 路由
  119. // return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  120. // // 只处理 GET 和 HEAD 请求
  121. // if r.Method != "GET" && r.Method != "HEAD" {
  122. // // 对于非 GET/HEAD 请求,返回 404 让 API 路由处理
  123. // http.NotFound(w, r)
  124. // return
  125. // }
  126. // // API 路径不处理
  127. // if strings.HasPrefix(r.URL.Path, "/api/") {
  128. // http.NotFound(w, r)
  129. // return
  130. // }
  131. // // 尝试从文件系统读取请求的文件
  132. // filePath := strings.TrimPrefix(r.URL.Path, "/")
  133. // if filePath == "" {
  134. // filePath = "index.html"
  135. // }
  136. // // 检查文件是否存在
  137. // _, err := fs.Stat(fsys, filePath)
  138. // if err != nil {
  139. // // 文件不存在,返回 index.html 用于 SPA 路由
  140. // indexData, err := frontendFS.ReadFile("web/dist/index.html")
  141. // if err != nil {
  142. // http.Error(w, "Not Found", http.StatusNotFound)
  143. // return
  144. // }
  145. // w.Header().Set("Content-Type", "text/html; charset=utf-8")
  146. // w.Write(indexData)
  147. // return
  148. // }
  149. // // 文件存在,正常提供
  150. // http.FileServer(http.FS(fsys)).ServeHTTP(w, r)
  151. // })
  152. // }