Vgo-适合 golang 初学者的开源框架

78 天前
 yanchunhao58001

Vgo

介绍 📖

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                # 框架配置文件

其他功能还在实现 🏗

敬请期待...
1799 次点击
所在节点    Go 编程语言
15 条回复
lysShub
78 天前
gitee...
wogogoing
78 天前
如果是这样,那我也贴一下我的: https://github.com/keepchen/go-sail

写的不好的地方大家轻喷 (狗头
povsister
78 天前
gitee.com
...
AdminUser
- Router
bootstrap
route
asynq.yml
config.yaml

怎么看怎么像是写 java 写的。
纯路人,建议先统一风格再玩开源。
ExplodingFKL
78 天前
有种 spring cloud 的既视感 ...
yb2313
78 天前
@lysShub 用 gitee 一律排除
ninjashixuan
78 天前
go 好像这种脚手架不少了,最近再 v 站就看到很多,不过感觉在大模型补全那么智能的情况下,这种脚手架没那么有吸引力了。
GeekGao
78 天前
gitee... 为啥,就因为不用科学上网么,不至于吧?
NothingExist
77 天前
不知道为啥,看到 gitee 我也顿时失去兴趣了
gvison
77 天前
@ninjashixuan 现在大模型还没智能到按要求生成类似脚手架可以一键生成完整的代码,以后可能会有。
yanchunhao58001
76 天前
@povsister 哈哈哈
yanchunhao58001
76 天前
下一版会发到 github
yanchunhao58001
76 天前
@GeekGao 嗯啊呗
yanchunhao58001
76 天前
@povsister 我不会 java ,哈哈哈
leven5
73 天前
怎么说,感觉一股浓浓的 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)
}
```
yanchunhao58001
70 天前
@leven5 嗯啊,越省事儿越好,自动注册在研究,看看还有没有更好的方案

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1070122

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX