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 6.2KB

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