项目路由及文件方法梳理(不包含项目内容,新写的demo接口)
                    
                
                
                    
                
                
                    
                    
                         理清该项目路由机制,后续关注代码实现即可 路由主路径文件+代码解释 1. main.go文件  
2. core/server.go 文件 1 routers := initialize.Routers() 
 
3. initialize/router.go 文件 //初始化各种路由的地方 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 // 方便统一添加路由组前缀 多服务器上线使用 配置的是api pubRouter := engine.Group(global.Cfg.System.RouterPrefix) { 	// Health monitoring  心跳检测,第一次运行后,需要数据库等初始化完成才能请求别的接口 	health.HealthRouter(pubRouter) }     appRouter := pubRouter.Group("")    // 这个方法初始化了 api 的 router initAppRouter(appRouter) // open web api  if global.Cfg.System.RouterPrefixWeb != "" {     // 这个是基于 api 生成的,假如配置了web,则链接是api/web 	webRouter := pubRouter.Group(global.Cfg.System.RouterPrefixWeb)        // 这个方法初始化了 web 的 router 	iniWebRouter(webRouter) } 
 
介绍下 iniWebRouter ,因其与initAppRouter一致则initAppRouter不介绍了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // 初始化管理后台路由 func iniWebRouter(pubRouter *gin.RouterGroup) { 	privateGroup := pubRouter.Group("") 	// 中间件,开启可使用     	// privateGroup.Use(mw.AuthorityMiddleware(), mw.AutoBackupMiddleware())      	// 下方新开内容目录4、5 介绍 这个结构体 RouterGroupApp 	routerFunc := router.RouterGroupApp 	for { 		//心跳检测 全部初始化好后才注册路由 		if health.IsHealth() { 			{ 				//参考下方目录4、5 的结构体 RouterGroupApp  				routerFunc.Web.InitProjectRouter(privateGroup) 			} 			global.Log.Info(" iniWebRouter server health check done, enabled all route.") 			break 		} 		time.Sleep(time.Millisecond * 300) 	} } 
 
4. internal/router/router.go 包含所有注册路由的结构体 1 2 3 4 5 6 7 8 9 10 11 12 package router import ( 	"crypto-evaluate/internal/router/web" ) type RouterGroup struct { 	Web       web.RouterGroup //有几个结构体写几个,import后 } var RouterGroupApp = new(RouterGroup) 
 
5. internal/router/web/enter.go web对应包下的enter.go 文件 结构体RouterGroup 定义 1 2 3 4 5 6 package web type RouterGroup struct { 	ProjectRouter } 
 
6. internal/router/web/project.go  结构体成员 ProjectRouter的实现文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package web import ( 	v1 "crypto-evaluate/internal/api/web/v1" 	"github.com/gin-gonic/gin" ) type ProjectRouter struct{} func (e *ProjectRouter) InitProjectRouter(Router *gin.RouterGroup) (R gin.IRoutes) { 	projectRouter := Router.Group("project") 	projectApi := v1.ApiGroupWeb.CryptoApiGroup.ProjectApi 	{ 		projectRouter.GET("add", projectApi.Add) 	} 	return projectRouter } 
 
逻辑代码主路径文件+代码解释 7. internal/api/web/v1/v1.go 该版本所有接口的汇总 1 2 3 4 5 6 7 8 9 10 11 package v1 import ( 	"crypto-evaluate/internal/api/web/v1/crypto" //这就是我新写的包 crypto ) type ApiGroup struct { 	CryptoApiGroup crypto.ApiGroup //新写的包,在这里汇总,有几个加几个 } var ApiGroupWeb = new(ApiGroup) 
 
8. internal/api/web/v1/crypto/enter.go 新写的包 crypto 将其内的结构体及service里的方法汇总 1 2 3 4 5 6 7 8 9 10 11 12 package crypto import "crypto-evaluate/internal/service" type ApiGroup struct { 	ProjectApi //有多少结构体则写多少,我这里同目录只新增了一个,故只有一个 } var ( 	// service 层的方法,在这里饮用下,方便使用 	projectService = service.ServiceGroupApp.WebServiceGroup.ProjectService ) 
 
9. internal/api/web/v1/crypto/project.go 新写的包内的一个结构体,即上一个目录的 ProjectApi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 package crypto import ( 	"crypto-evaluate/common" 	"crypto-evaluate/internal/model" 	request2 "crypto-evaluate/internal/model/app/app_req/crypto/request" 	"github.com/gin-gonic/gin" ) // 在enter 里汇总  type ProjectApi struct{} // Add // //	@Tags		项目 //	@Summary	添加项目 //	@Security	ApiKeyAuth //	@accept		application/json //	@Produce	application/json //	@Param		req	body		request.ProjectAddReq	true	"请求" //	@Success	200	{object}	model.Response //	@Router		/project/add [post] func (p *ProjectApi) Add(c *gin.Context) { 	var req request2.ProjectAddReq 	err := c.ShouldBindJSON(&req) 	if err != nil { 		model.FailWithError(common.ParameterException, err, c) 		return 	}     //使用了 enter 文件里的引用 	err = projectService.Add(req) 	if err != nil { 		model.FailWithError(common.AddFailed, err, c) 		return 	} 	model.OkWithMessage(common.AddSuccess, c) } 
 
服务层逻辑代码主路径文件+代码解释 10. internal/service/web/enter.go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package web import ( 	"crypto-evaluate/internal/service/system" ) type ServiceGroup struct { 	ProjectService //有多少结构体则写多少,我这里同目录只新增了一个,故只有一个 } var ( 	//引入该文件,方便调用方法 	ProjectSrv = ProjectService{} 	//system的运行被其他service调用 但是system不要调用其他 	configService = system.ConfigService{} ) 
 
11. internal/service/web/project.go 新增的结构体,代码逻辑在这里,然后在目录6里调用 1 2 3 4 5 6 7 8 9 10 package web import ( ) type ProjectService struct{} func (p *ProjectService) Add(req request.ProjectAddReq) error { } 
 
12. internal/service/service.go 汇总在一起,方便使用,例如目录8里的引用 1 2 3 4 5 6 7 8 9 10 11 package service import ( 	webService "crypto-evaluate/internal/service/web" ) type ServiceGroup struct { 	WebServiceGroup       webService.ServiceGroup } var ServiceGroupApp = new(ServiceGroup) 
 
路由基本如此,可以写业务逻辑了,我他妈也是服了,就两层,一层路由,一层service,能搞的这么麻烦