Vgo 一款基于 Gin 开源的服务端框架,使用了 Redis 、Mysql 、JWT 、队列、等技术栈。 非常适合 Golang 初学者作为学习项目学习。
git clone -b dev https://gitee.com/yan_chunhao_admin/vgo.git
mysql 8 导入根目录 sql 、准备好 redis
go mod tidy
go run main.go
Vgo ├─ app # Vite 配置项 ├─ AdminUser # 模块 │ ├─ Bapi # Bapi 后台接口 │ ├─ Api # Api 前台接口 │ ├─ Model # Model 模型 │ ├─ Router # Router 路由 ├─ bootstrap # 框架启动文件 ├─ core # 框架核心文件 │ ├─ ... ├─ job # 队列 ├─ route # 路由 ├─ storage # 日志或静态资源 │ ├─ logs # 日志 ├─ asynq.yml # asynq 配置文件 ├─ config.yaml # 框架配置文件
敬请期待...
-- 最好都拉取dev
![]() | 1 lysShub 2024-09-04 11:44:01 +08:00 ![]() gitee... |
![]() | 2 wogogoing PRO |
![]() | 3 povsister 2024-09-04 14:06:26 +08:00 |
4 ExplodingDragon 2024-09-04 14:09:11 +08:00 有种 spring cloud 的既视感 ... |
6 ninjashixuan 2024-09-04 14:27:03 +08:00 go 好像这种脚手架不少了,最近再 v 站就看到很多,不过感觉在大模型补全那么智能的情况下,这种脚手架没那么有吸引力了。 |
![]() | 7 R4rvZ6agNVWr56V0 2024-09-05 01:45:29 +08:00 gitee... 为啥,就因为不用科学上网么,不至于吧? |
![]() | 8 NothingExist 2024-09-05 09:20:45 +08:00 不知道为啥,看到 gitee 我也顿时失去兴趣了 |
9 gvison 2024-09-05 11:35:47 +08:00 @ninjashixuan 现在大模型还没智能到按要求生成类似脚手架可以一键生成完整的代码,以后可能会有。 |
![]() | 10 yanchunhao58001 OP @povsister 哈哈哈 |
![]() | 11 yanchunhao58001 OP 下一版会发到 github |
![]() | 12 yanchunhao58001 OP @GeekGao 嗯啊呗 |
![]() | 13 yanchunhao58001 OP @povsister 我不会 java ,哈哈哈 |
14 leven5 2024-09-10 01:04:14 +08:00 怎么说,感觉一股浓浓的 laravel 味儿。 拿 route 给你提一个小小的建议吧,我觉得可能要比你在 route.go 注册路由可能要方便一些,尤其后台,几百个路由都是稀松平常,到后期注册路由会非常不方便。 我觉得把注册的逻辑交给 controller ,然后全部挂到一个 controller 集合的结构体上,再通过反射实现注册路由,可能会比你现在方便一些,当然也有可能是因为我用 wire 才会方便,反正就是个小建议,供你参考。 ```GO // controller.go 的 wire provider ,这是我的逻辑,不用 wire 的话手动注入各个 controller 到 Controller struct 中也是一样 var COntrollerProviderSet= wire.NewSet( wire.Struct(new(Controller), "*"), NewUserController, NewRouteRegistrar, ) // controller.go type Controller struct { User *UserController } type setupable interface { setup(engine *gin.Engine) } var _ server.Routes = (*Controller)(nil) func (c Controller) SetupRoutes(engine *gin.Engine) { ref := reflect.ValueOf(c) for i := 0; i < ref.NumField(); i++ { iterateField := ref.Field(i) if iterateField.Kind() == reflect.Ptr { iterateField = iterateField.Elem() } if iterateField.Kind() != reflect.Struct { continue } if !iterateField.CanInterface() || iterateField.Interface() == nil { continue } iterateController, ok := iterateField.Interface().(setupable) if !ok { continue } iterateController.setup(engine) } } func NewRouteRegistrar(c *Controller) server.Routes { return c } // user_controller.go func (c UserController) setup(server *gin.Engine) { g := server.Group("/user") g.POST("/login", c.Login) } // server/server.go type Routes interface { SetupRoutes(s *gin.Engine) } func NewServer(r Routes) { s := gin.New() r.SetupRoutes(s) } ``` |
![]() | 15 yanchunhao58001 OP @leven5 嗯啊,越省事儿越好,自动注册在研究,看看还有没有更好的方案 |