Vgo-适合 golang 初学者的开源框架 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
yanchunhao58001
V2EX    Go 编程语言

Vgo-适合 golang 初学者的开源框架
  •  
  •   yanchunhao58001 2024-09-04 11:22:36 +08:00 2436 次点击

    这是一个创建于 413 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Vgo

    介绍

    Vgo 一款基于 Gin 开源的服务端框架,使用了 Redis 、Mysql 、JWT 、队列、等技术栈。 非常适合 Golang 初学者作为学习项目学习。

    代码仓库

    安装使用步骤

    • Clone:
    git clone -b dev https://gitee.com/yan_chunhao_admin/vgo.git 
    • Install:
    mysql 8 导入根目录 sql 、准备好 redis 
    go mod tidy 
    • Run:
    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 # 框架配置文件 

    其他功能还在实现

    敬请期待... 
    第 1 条附言    2024-09-06 15:21:51 +08:00
    15 条回复    2024-09-12 10:33:00 +08:00
    lysShub
        1
    lysShub  
       2024-09-04 11:44:01 +08:00   1
    gitee...
    wogogoing
        2
    wogogoing  
    PRO
       2024-09-04 12:11:05 +08:00
    如果是这样,那我也贴一下我的: https://github.com/keepchen/go-sail

    写的不好的地方大家轻喷 (狗头
    povsister
        3
    povsister  
       2024-09-04 14:06:26 +08:00
    gitee.com
    ...
    AdminUser
    - Router
    bootstrap
    route
    asynq.yml
    config.yaml

    怎么看怎么像是写 java 写的。
    纯路人,建议先统一风格再玩开源。
    ExplodingDragon
        4
    ExplodingDragon  
       2024-09-04 14:09:11 +08:00
    有种 spring cloud 的既视感 ...
    yb2313
        5
    yb2313  
       2024-09-04 14:19:49 +08:00
    @lysShub 用 gitee 一律排除
    ninjashixuan
        6
    ninjashixuan  
       2024-09-04 14:27:03 +08:00
    go 好像这种脚手架不少了,最近再 v 站就看到很多,不过感觉在大模型补全那么智能的情况下,这种脚手架没那么有吸引力了。
    R4rvZ6agNVWr56V0
        7
    R4rvZ6agNVWr56V0  
       2024-09-05 01:45:29 +08:00
    gitee... 为啥,就因为不用科学上网么,不至于吧?
    NothingExist
        8
    NothingExist  
       2024-09-05 09:20:45 +08:00
    不知道为啥,看到 gitee 我也顿时失去兴趣了
    gvison
        9
    gvison  
       2024-09-05 11:35:47 +08:00
    @ninjashixuan 现在大模型还没智能到按要求生成类似脚手架可以一键生成完整的代码,以后可能会有。
    yanchunhao58001
        10
    yanchunhao58001  
    OP
       2024-09-06 14:50:07 +08:00
    @povsister 哈哈哈
    yanchunhao58001
        11
    yanchunhao58001  
    OP
       2024-09-06 14:50:36 +08:00
    下一版会发到 github
    yanchunhao58001
        12
    yanchunhao58001  
    OP
       2024-09-06 14:50:55 +08:00
    @GeekGao 嗯啊呗
    yanchunhao58001
        13
    yanchunhao58001  
    OP
       2024-09-06 14:52:41 +08:00
    @povsister 我不会 java ,哈哈哈
    leven5
        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)
    }
    ```
    yanchunhao58001
        15
    yanchunhao58001  
    OP
       2024-09-12 10:33:00 +08:00
    @leven5 嗯啊,越省事儿越好,自动注册在研究,看看还有没有更好的方案
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5860 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 03:25 PVG 11:25 LAX 20:25 JFK 23:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86