暫無描述
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 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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. //使用默认数据库
  43. registerDefaultRouter(ws, dbBoot.GetDefaultDBFactory())
  44. //启动第2个服务
  45. routerDoris := boot.GetRouter("doris")
  46. wsDoris := webx.NewWebService(routerDoris)
  47. registerDorisRouter(wsDoris, agentDB)
  48. // 6. 运行服务
  49. boot.Run(dbBoot)
  50. }
  51. func registerDorisRouter(ws *webx.WebService, dbFactory *database.DBFactory) {
  52. // GET示例:路径参数绑定
  53. ws.GET("/app/users/{id}",
  54. func(id string, reqCtx *ctx.RequestContext) (UserResponse, error) {
  55. log.Print("ctx TenantID:", reqCtx.TenantID)
  56. // id 自动从路径绑定
  57. // 注意:webx版本没有自动注入dbFactory
  58. return getUserOracle(id, dbFactory) // 需要修改getUser函数以获取dbFactory
  59. },
  60. ).Use(middleware.JWTAuthMiddleware).Register()
  61. // POST示例:Body参数绑定
  62. ws.POST("/app/users",
  63. func(req CreateUserRequest, reqCtx *ctx.RequestContext) (UserResponse, error) {
  64. log.Print("ctx TenantID:", reqCtx.TenantID)
  65. // req 自动从JSON Body绑定
  66. return createUser(req, nil) // 需要修改createUser函数以获取dbFactory
  67. },
  68. ).Use(middleware.JWTAuthMiddleware).Register()
  69. // 您的业务路由
  70. ws.POST("/app/query/yaml",
  71. func() (interface{}, error) {
  72. return queryYaml(nil) // 需要修改queryYaml函数以获取dbFactory
  73. },
  74. ).Use(middleware.JWTAuthMiddleware).Register()
  75. ws.POST("/app/init/config/template",
  76. func() (interface{}, error) {
  77. return initConfigTemplate(nil) // 需要修改initConfigTemplate函数以获取dbFactory
  78. },
  79. ).Use(middleware.JWTAuthMiddleware).Register()
  80. }
  81. func registerDefaultRouter(ws *webx.WebService, dbFactory *database.DBFactory) {
  82. // GET示例:路径参数绑定
  83. ws.GET("/api/users/{id}",
  84. func(id string, reqCtx *ctx.RequestContext) (UserResponse, error) {
  85. log.Print("ctx TenantID:", reqCtx.TenantID)
  86. // id 自动从路径绑定
  87. // 注意:webx版本没有自动注入dbFactory
  88. return getUser(id, dbFactory) // 需要修改getUser函数以获取dbFactory
  89. },
  90. ).Use(middleware.JWTAuthMiddleware).Register()
  91. // POST示例:Body参数绑定
  92. ws.POST("/api/users",
  93. func(req CreateUserRequest, reqCtx *ctx.RequestContext) (UserResponse, error) {
  94. log.Print("ctx TenantID:", reqCtx.TenantID)
  95. // req 自动从JSON Body绑定
  96. return createUser(req, nil) // 需要修改createUser函数以获取dbFactory
  97. },
  98. ).Use(middleware.JWTAuthMiddleware).Register()
  99. // 您的业务路由
  100. ws.POST("/api/query/yaml",
  101. func() (interface{}, error) {
  102. return queryYaml(nil) // 需要修改queryYaml函数以获取dbFactory
  103. },
  104. ).Use(middleware.JWTAuthMiddleware).Register()
  105. ws.POST("/api/init/config/template",
  106. func() (interface{}, error) {
  107. return initConfigTemplate(nil) // 需要修改initConfigTemplate函数以获取dbFactory
  108. },
  109. ).Use(middleware.JWTAuthMiddleware).Register()
  110. }
  111. // 4. 创建路由器
  112. // 首先需要创建标准库的ServeMux
  113. //mux := http.NewServeMux()
  114. //router := webx.NewRouter(boot.GetRouter())
  115. //router := webx.NewWebService(mux)
  116. // 5. 注册路由(Spring风格!)
  117. func getUser(id string, dbFactory *database.DBFactory) (UserResponse, error) {
  118. if dbFactory != nil {
  119. dbFactory.TestConnection(dbFactory.GetDBType())
  120. }
  121. // 查询数据库...
  122. return UserResponse{
  123. ID: id,
  124. Name: "掌扇过去-AAAAA",
  125. Email: "zhangsan@example.com",
  126. }, nil
  127. }
  128. // 业务函数示例
  129. func getUserOracle(id string, dbFactory *database.DBFactory) (UserResponse, error) {
  130. if dbFactory != nil {
  131. dbFactory.TestConnection(dbFactory.GetDBType())
  132. }
  133. sql, queryParams := getSQLWithPaginationSQL(0, 10)
  134. jsonData := dbFactory.QueryPositionalToJSON(sql, queryParams, nil)
  135. // 查询数据库...
  136. return UserResponse{
  137. ID: id,
  138. Name: "掌扇过去",
  139. Email: "zhangsan@example.com",
  140. Data: jsonData.Data,
  141. }, nil
  142. }
  143. func createUser(req CreateUserRequest, dbFactory *database.DBFactory) (UserResponse, error) {
  144. logger.Debug("CreateUserRequest:%v", req)
  145. return UserResponse{
  146. ID: "1",
  147. Name: req.Name,
  148. Email: req.Email,
  149. }, nil
  150. }
  151. func queryYaml(dbFactory *database.DBFactory) (interface{}, error) {
  152. // 您的业务逻辑
  153. return map[string]interface{}{"message": "query yaml success"}, nil
  154. }
  155. func initConfigTemplate(dbFactory *database.DBFactory) (interface{}, error) {
  156. // 您的业务逻辑
  157. return map[string]interface{}{"message": "init config success"}, nil
  158. }
  159. // getSQLWithPagination 生成带分页的SQL语句(参数模式)
  160. // 返回SQL语句和参数映射
  161. func getSQLWithPaginationSQL(startRow, endRow int) (string, []interface{}) {
  162. sql := `SELECT
  163. CLOTHING_ID,
  164. CLOTHING_YEAR,
  165. CLOTHING_NAME
  166. FROM (
  167. SELECT a.*, ROWNUM as rn
  168. FROM (
  169. SELECT *
  170. FROM X6_STOCK_DEV.A3_CLOTHING
  171. ORDER BY CLOTHING_ID
  172. ) a
  173. WHERE ROWNUM <= :1
  174. )
  175. WHERE rn > :2`
  176. // 创建参数映射
  177. params := []interface{}{
  178. endRow,
  179. startRow - 1, // WHERE rn > :start_row 所以是startRow-1
  180. }
  181. return sql, params
  182. }