Ingen beskrivning
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.go 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. package main
  2. import (
  3. "log"
  4. "git.x2erp.com/qdy/go-base/config"
  5. "git.x2erp.com/qdy/go-base/consul"
  6. "git.x2erp.com/qdy/go-base/container"
  7. "git.x2erp.com/qdy/go-base/webx"
  8. "git.x2erp.com/qdy/go-base/webx/health"
  9. "git.x2erp.com/qdy/go-base/webx/router"
  10. "git.x2erp.com/qdy/go-db/factory/database"
  11. "git.x2erp.com/qdy/go-base/ctx"
  12. "git.x2erp.com/qdy/go-base/logger"
  13. "git.x2erp.com/qdy/go-base/middleware"
  14. )
  15. var (
  16. appName = "svc-ai"
  17. appVersion = "1"
  18. )
  19. // 定义结构体
  20. type CreateUserRequest struct {
  21. Name string `json:"name"`
  22. Email string `json:"email"`
  23. Age int `json:"age"`
  24. }
  25. type UserResponse struct {
  26. ID string `json:"id"`
  27. Name string `json:"name"`
  28. Email string `json:"email"`
  29. Data []map[string]interface{}
  30. }
  31. func main() {
  32. //0.日志
  33. //logger.InitBootLog()
  34. logBootFactory := logger.InitBootLog()
  35. //1.获取配置文件
  36. cfg := config.GetConfig()
  37. cfg.SetAppName(appName)
  38. cfg.SetAppVersion(appVersion)
  39. //2.创建关闭容器
  40. ctr := container.NewContainer(cfg)
  41. //注册日志,实现自动关闭
  42. container.Reg(ctr, logBootFactory)
  43. //3.创建数据库工厂--如果需求
  44. dbFactory := container.Create(ctr, database.CreateDBFactory)
  45. // 赋值认证中间件参数
  46. middleware.JWTAuthMiddlewareInit(cfg)
  47. //测试数据库连接
  48. dbFactory.TestConnection()
  49. //得到webservice服务工厂
  50. webxFactory := webx.GetWebServiceFactory()
  51. //建立hhtpService服务
  52. webServcie, _ := webxFactory.CreateService(cfg.GetServiceConfig())
  53. //建立路由-api
  54. routerService := router.NewWebService(webServcie.GetRouter())
  55. //注册路由--api
  56. registerDorisRouter(routerService, dbFactory)
  57. // 注册健康检查-api
  58. health.RegisterConsulHealthCheck(routerService)
  59. //启动服务
  60. webServcie.Run()
  61. //启用运行日志
  62. container.Create(ctr, logger.InitRuntimeLogger)
  63. //注册到注册中心
  64. container.Create(ctr, consul.Register)
  65. //等待关闭
  66. webServcie.WaitForServiceShutdown(ctr)
  67. //consul.Register(service.serviceName, service.Ip, service.Port, b.Cfg.GetConsulConfig())
  68. // service.NewWebService()
  69. // // 1. 初始化基础启动器
  70. // //boot := bootstraps.NewBootstrapper(serviceName, serviceVersion)
  71. // // 2. 初始化数据库(都在bootstraps包中)
  72. // dbBoot := dbstart.NewDBBootstrapper(boot.GetConfig())
  73. // dbBoot.Init()
  74. // agentDB := dbBoot.GetDBFactory("agent")
  75. // // 赋值认证中间件参数
  76. // middleware.JWTAuthMiddlewareInit(boot.GetConfig())
  77. // // 3. 启动服务
  78. // //boot.StartService("default")
  79. // router := boot.GetRouter("default")
  80. // // 3. 创建 WebService 并传入数据库接口
  81. // ws := webx.NewWebService(router)
  82. // // ✅ 为默认服务注册健康检查(端口 6060)
  83. // log.Println("注册默认服务健康检查...")
  84. // webx.RegisterDefaultHealthCheck(ws, "svc-ai")
  85. // //使用默认数据库
  86. // registerDefaultRouter(ws, dbBoot.GetDefaultDBFactory())
  87. // //启动第2个服务
  88. // routerDoris := boot.GetRouter("doris")
  89. // wsDoris := webx.NewWebService(routerDoris)
  90. // registerDorisRouter(wsDoris, agentDB)
  91. // //注册健康检查
  92. // webx.RegisterDefaultHealthCheck(wsDoris, "svc-doris")
  93. // // 6. 运行服务
  94. // boot.Run(dbBoot)
  95. }
  96. func registerDorisRouter(ws *router.RouterService, dbFactory *database.DBFactory) {
  97. // GET示例:路径参数绑定
  98. ws.GET("/app/users/{id}",
  99. func(id string, reqCtx *ctx.RequestContext) (UserResponse, error) {
  100. log.Print("ctx TenantID:", reqCtx.TenantID)
  101. // id 自动从路径绑定
  102. // 注意:webx版本没有自动注入dbFactory
  103. return getUserOracle(id, dbFactory) // 需要修改getUser函数以获取dbFactory
  104. },
  105. ).Use(middleware.JWTAuthMiddleware).Register()
  106. // POST示例:Body参数绑定
  107. ws.POST("/app/users",
  108. func(req CreateUserRequest, reqCtx *ctx.RequestContext) (UserResponse, error) {
  109. log.Print("ctx TenantID:", reqCtx.TenantID)
  110. // req 自动从JSON Body绑定
  111. return createUser(req, nil) // 需要修改createUser函数以获取dbFactory
  112. },
  113. ).Use(middleware.JWTAuthMiddleware).Register()
  114. // 您的业务路由
  115. ws.POST("/app/query/yaml",
  116. func() (interface{}, error) {
  117. return queryYaml(nil) // 需要修改queryYaml函数以获取dbFactory
  118. },
  119. ).Use(middleware.JWTAuthMiddleware).Register()
  120. ws.POST("/app/init/config/template",
  121. func() (interface{}, error) {
  122. return initConfigTemplate(nil) // 需要修改initConfigTemplate函数以获取dbFactory
  123. },
  124. ).Use(middleware.JWTAuthMiddleware).Register()
  125. }
  126. func registerDefaultRouter(ws *router.RouterService, dbFactory *database.DBFactory) {
  127. // GET示例:路径参数绑定
  128. ws.GET("/api/users/{id}",
  129. func(id string, reqCtx *ctx.RequestContext) (UserResponse, error) {
  130. log.Print("ctx TenantID:", reqCtx.TenantID)
  131. // id 自动从路径绑定
  132. // 注意:webx版本没有自动注入dbFactory
  133. return getUser(id, dbFactory) // 需要修改getUser函数以获取dbFactory
  134. },
  135. ).Use(middleware.JWTAuthMiddleware).Register()
  136. // POST示例:Body参数绑定
  137. ws.POST("/api/users",
  138. func(req CreateUserRequest, reqCtx *ctx.RequestContext) (UserResponse, error) {
  139. log.Print("ctx TenantID:", reqCtx.TenantID)
  140. // req 自动从JSON Body绑定
  141. return createUser(req, nil) // 需要修改createUser函数以获取dbFactory
  142. },
  143. ).Use(middleware.JWTAuthMiddleware).Register()
  144. // 您的业务路由
  145. ws.POST("/api/query/yaml",
  146. func() (interface{}, error) {
  147. return queryYaml(nil) // 需要修改queryYaml函数以获取dbFactory
  148. },
  149. ).Use(middleware.JWTAuthMiddleware).Register()
  150. ws.POST("/api/init/config/template",
  151. func() (interface{}, error) {
  152. return initConfigTemplate(nil) // 需要修改initConfigTemplate函数以获取dbFactory
  153. },
  154. ).Use(middleware.JWTAuthMiddleware).Register()
  155. }
  156. // 4. 创建路由器
  157. // 首先需要创建标准库的ServeMux
  158. //mux := http.NewServeMux()
  159. //router := webx.NewRouter(boot.GetRouter())
  160. //router := webx.NewWebService(mux)
  161. // 5. 注册路由(Spring风格!)
  162. func getUser(id string, dbFactory *database.DBFactory) (UserResponse, error) {
  163. if dbFactory != nil {
  164. dbFactory.TestConnection()
  165. }
  166. // 查询数据库...
  167. return UserResponse{
  168. ID: id,
  169. Name: "掌扇过去-AAAAA",
  170. Email: "zhangsan@example.com",
  171. }, nil
  172. }
  173. // 业务函数示例
  174. func getUserOracle(id string, dbFactory *database.DBFactory) (UserResponse, error) {
  175. if dbFactory != nil {
  176. dbFactory.TestConnection()
  177. }
  178. sql, queryParams := getSQLWithPaginationSQL(0, 10)
  179. jsonData := dbFactory.QueryPositionalToJSON(sql, queryParams, nil)
  180. // 查询数据库...
  181. return UserResponse{
  182. ID: id,
  183. Name: "掌扇过去",
  184. Email: "zhangsan@example.com",
  185. Data: jsonData.Data,
  186. }, nil
  187. }
  188. func createUser(req CreateUserRequest, dbFactory *database.DBFactory) (UserResponse, error) {
  189. logger.Debug("CreateUserRequest:%v", req)
  190. return UserResponse{
  191. ID: "1",
  192. Name: req.Name,
  193. Email: req.Email,
  194. }, nil
  195. }
  196. func queryYaml(dbFactory *database.DBFactory) (interface{}, error) {
  197. // 您的业务逻辑
  198. return map[string]interface{}{"message": "query yaml success"}, nil
  199. }
  200. func initConfigTemplate(dbFactory *database.DBFactory) (interface{}, error) {
  201. // 您的业务逻辑
  202. return map[string]interface{}{"message": "init config success"}, nil
  203. }
  204. // getSQLWithPagination 生成带分页的SQL语句(参数模式)
  205. // 返回SQL语句和参数映射
  206. func getSQLWithPaginationSQL(startRow, endRow int) (string, []interface{}) {
  207. sql := `SELECT
  208. CLOTHING_ID,
  209. CLOTHING_YEAR,
  210. CLOTHING_NAME
  211. FROM (
  212. SELECT a.*, ROWNUM as rn
  213. FROM (
  214. SELECT *
  215. FROM X6_STOCK_DEV.A3_CLOTHING
  216. ORDER BY CLOTHING_ID
  217. ) a
  218. WHERE ROWNUM <= :1
  219. )
  220. WHERE rn > :2`
  221. // 创建参数映射
  222. params := []interface{}{
  223. endRow,
  224. startRow - 1, // WHERE rn > :start_row 所以是startRow-1
  225. }
  226. return sql, params
  227. }