Sin descripción
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.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package main
  2. import (
  3. "log"
  4. "git.x2erp.com/qdy/go-db/factory/database"
  5. "git.x2erp.com/qdy/go-base/config"
  6. "git.x2erp.com/qdy/go-base/consul"
  7. "git.x2erp.com/qdy/go-base/container"
  8. "git.x2erp.com/qdy/go-base/ctx"
  9. "git.x2erp.com/qdy/go-base/logger"
  10. "git.x2erp.com/qdy/go-base/middleware"
  11. "git.x2erp.com/qdy/go-base/webx"
  12. "git.x2erp.com/qdy/go-base/webx/health"
  13. "git.x2erp.com/qdy/go-base/webx/router"
  14. )
  15. var (
  16. appName = "svc-mercury"
  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. }
  68. func registerDorisRouter(ws *router.RouterService, dbFactory *database.DBFactory) {
  69. // GET示例:路径参数绑定
  70. ws.GET("/app/users/{id}",
  71. func(id string, reqCtx *ctx.RequestContext) (UserResponse, error) {
  72. log.Print("ctx TenantID:", reqCtx.TenantID)
  73. // id 自动从路径绑定
  74. // 注意:webx版本没有自动注入dbFactory
  75. return getUserOracle(id, dbFactory) // 需要修改getUser函数以获取dbFactory
  76. },
  77. ).Use(middleware.JWTAuthMiddleware).Register()
  78. // POST示例:Body参数绑定
  79. ws.POST("/app/users",
  80. func(req CreateUserRequest, reqCtx *ctx.RequestContext) (UserResponse, error) {
  81. log.Print("ctx TenantID:", reqCtx.TenantID)
  82. // req 自动从JSON Body绑定
  83. return createUser(req, nil) // 需要修改createUser函数以获取dbFactory
  84. },
  85. ).Use(middleware.JWTAuthMiddleware).Register()
  86. // 您的业务路由
  87. ws.POST("/app/query/yaml",
  88. func() (interface{}, error) {
  89. return queryYaml(nil) // 需要修改queryYaml函数以获取dbFactory
  90. },
  91. ).Use(middleware.JWTAuthMiddleware).Register()
  92. ws.POST("/app/init/config/template",
  93. func() (interface{}, error) {
  94. return initConfigTemplate(nil) // 需要修改initConfigTemplate函数以获取dbFactory
  95. },
  96. ).Use(middleware.JWTAuthMiddleware).Register()
  97. }
  98. func registerDefaultRouter(ws *router.RouterService, dbFactory *database.DBFactory) {
  99. // GET示例:路径参数绑定
  100. ws.GET("/api/users/{id}",
  101. func(id string, reqCtx *ctx.RequestContext) (UserResponse, error) {
  102. log.Print("ctx TenantID:", reqCtx.TenantID)
  103. // id 自动从路径绑定
  104. // 注意:webx版本没有自动注入dbFactory
  105. return getUser(id, dbFactory) // 需要修改getUser函数以获取dbFactory
  106. },
  107. ).Use(middleware.JWTAuthMiddleware).Register()
  108. // POST示例:Body参数绑定
  109. ws.POST("/api/users",
  110. func(req CreateUserRequest, reqCtx *ctx.RequestContext) (UserResponse, error) {
  111. log.Print("ctx TenantID:", reqCtx.TenantID)
  112. // req 自动从JSON Body绑定
  113. return createUser(req, nil) // 需要修改createUser函数以获取dbFactory
  114. },
  115. ).Use(middleware.JWTAuthMiddleware).Register()
  116. // 您的业务路由
  117. ws.POST("/api/query/yaml",
  118. func() (interface{}, error) {
  119. return queryYaml(nil) // 需要修改queryYaml函数以获取dbFactory
  120. },
  121. ).Use(middleware.JWTAuthMiddleware).Register()
  122. ws.POST("/api/init/config/template",
  123. func() (interface{}, error) {
  124. return initConfigTemplate(nil) // 需要修改initConfigTemplate函数以获取dbFactory
  125. },
  126. ).Use(middleware.JWTAuthMiddleware).Register()
  127. }
  128. // 4. 创建路由器
  129. // 首先需要创建标准库的ServeMux
  130. //mux := http.NewServeMux()
  131. //router := webx.NewRouter(boot.GetRouter())
  132. //router := webx.NewWebService(mux)
  133. // 5. 注册路由(Spring风格!)
  134. func getUser(id string, dbFactory *database.DBFactory) (UserResponse, error) {
  135. if dbFactory != nil {
  136. dbFactory.TestConnection()
  137. }
  138. // 查询数据库...
  139. return UserResponse{
  140. ID: id,
  141. Name: "掌扇过去-AAAAA",
  142. Email: "zhangsan@example.com",
  143. }, nil
  144. }
  145. // 业务函数示例
  146. func getUserOracle(id string, dbFactory *database.DBFactory) (UserResponse, error) {
  147. if dbFactory != nil {
  148. dbFactory.TestConnection()
  149. }
  150. sql, queryParams := getSQLWithPaginationSQL(0, 10)
  151. jsonData := dbFactory.QueryPositionalToJSON(sql, queryParams, nil)
  152. // 查询数据库...
  153. return UserResponse{
  154. ID: id,
  155. Name: "掌扇过去",
  156. Email: "zhangsan@example.com",
  157. Data: jsonData.Data,
  158. }, nil
  159. }
  160. func createUser(req CreateUserRequest, dbFactory *database.DBFactory) (UserResponse, error) {
  161. logger.Debug("CreateUserRequest:%v", req)
  162. return UserResponse{
  163. ID: "1",
  164. Name: req.Name,
  165. Email: req.Email,
  166. }, nil
  167. }
  168. func queryYaml(dbFactory *database.DBFactory) (interface{}, error) {
  169. // 您的业务逻辑
  170. return map[string]interface{}{"message": "query yaml success"}, nil
  171. }
  172. func initConfigTemplate(dbFactory *database.DBFactory) (interface{}, error) {
  173. // 您的业务逻辑
  174. return map[string]interface{}{"message": "init config success"}, nil
  175. }
  176. // getSQLWithPagination 生成带分页的SQL语句(参数模式)
  177. // 返回SQL语句和参数映射
  178. func getSQLWithPaginationSQL(startRow, endRow int) (string, []interface{}) {
  179. sql := `SELECT
  180. CLOTHING_ID,
  181. CLOTHING_YEAR,
  182. CLOTHING_NAME
  183. FROM (
  184. SELECT a.*, ROWNUM as rn
  185. FROM (
  186. SELECT *
  187. FROM X6_STOCK_DEV.A3_CLOTHING
  188. ORDER BY CLOTHING_ID
  189. ) a
  190. WHERE ROWNUM <= :1
  191. )
  192. WHERE rn > :2`
  193. // 创建参数映射
  194. params := []interface{}{
  195. endRow,
  196. startRow - 1, // WHERE rn > :start_row 所以是startRow-1
  197. }
  198. return sql, params
  199. }