gowire 是基于 wire (依赖注入) 构建的一个web项目,wire基于代码生成技术,编译期审查代码,更加容易发现问题,无反射,运行效率更高
- Wire: https://github.com/google/wire
- Gin: https://github.com/gin-gonic/gin
- Gorm: https://github.com/go-gorm/gorm
- Viper: https://github.com/spf13/viper
- Go-redis: https://github.com/redis/go-redis/v9
- logrus: https://github.com/sirupsen/logrus
- excelize: https://github.com/xuri/excelize/v2
- lumberjack: https://gopkg.in/natefinch/lumberjack.v2
- base64Captcha: https://github.com/mojocn/base64Captcha
- carbon: https://github.com/golang-module/carbon/v2
- session: https://github.com/gin-contrib/sessions
- layui: https://github.com/layui/layui
借鉴 go 标准目录结构以及 mvc :
cmd:可执行文件目录,例如server/main.goserver: 服务名称,每个服务对应一个目录wire:每个服务用于wire生成wire_gen.go的入口目录
config:项目配置文件,例如config.yamlinternal:项目内部代码,不对外暴露common:公共使用的函数/struct等数据controller:业务逻辑核心目录(包含了路由注册)dao:数据访问对象(Data Access Object),每张表对应一个daomiddleware:业务中的中间件model:表结构到go结构体的映射,每张表对应一个数据模型provider:用于wire.Build()进行依赖注入server:构建 HTTP 服务器的代码test:项目测试文件view:html模板文件
pkg:可重用的代码,对外暴露config:用于读取配置文件信息(基于viper)http:启动http(gin.Engine)用于支持Shutdown服务器优雅退出verificationcode:图形验证码插件writer:用于实现gin,gorm,logrus的io.Writer接口,支持自定义文件大小,文件保存周期,文件分割等功能,具体可以参考 lumberjack
static:静态资源文件(css/js等)upload:存放用户上传的附件log:项目的日志文件(启动项目后自动生成):db:用于记录数据库操作日志(gorm)http:用于记录HTTP请求日志(gin)server:用于记录项目业务日志(controller等业务模块)
- Golang >= 1.16
- Git
- MySQL >= 5.7
- Redis(可选 | 6.0)
- docker&docker-compose(可选)
- 安装 wire 并确保将 $GOPATH/bin 添加到 $PATH 中
go install github.com/google/wire/cmd/wire@latest本地:- 在
gowire项目根目录下执行go run cmd/server/main.go - 打开浏览器访问 127.0.0.1:8080
- 在
docker:Linux环境需要安装docker-compose,windows的Docker Desktop默认已安装,下面是 Linux 安装方法,具体信息可以参考docker官网Ubuntu 和 Debian
sudo apt-get update sudo apt-get install docker-compose-plugin
RPM-based
sudo yum update sudo yum install docker-compose-plugin
- 在
gowire项目根目录下执行docker-compose up -d,等待构建完毕。。。🍵☕🧋 - Linux本机浏览器访问
127.0.0.1:8080,虚拟机则需在宿主浏览器访问虚拟机IP:8080
注册路由: 路由注册统一放在internal/controller/router.go,业务controller如果需要注册路由,只需各自实现RegisterRouter方法,系统会自动注册路由添加controller:- 一个业务模块一个文件,均放在
internal/controller/目录下 - 新增或删除一个
contoller文件- 1: 修改
internal/controller/router.go文件中的RegisterController结构体(用于自动注册路由) - 2: 修改
internal/provider/controller.go,添加对应controller的provider,以及修改provider.CommonController(CommonController仅仅用于减少wire.build()的代码量,使其看起来比较”优雅“🙂)
- 1: 修改
- 一个业务模块一个文件,均放在
添加dao:一张表一个dao文件,文件名为数据库表名,均放在internal/dao/目录下- 每新增或删除一个
dao文件:- 1:修改
internal/provider/provider.go,提供对应dao的provider,具体请参照provider.go - 2(可选):修改
common/server.CommonDao(controller共用的dao)
- 1:修改
- 每新增或删除一个
重新构建项目:如果更改了cmd/server/wire/wire.go文件或其中wire.Build所需要的provider被修改,均需要重新执行wire命令重新生成wire_gen.go文件(除第一次调用wire,以后只需要对wire_gen.go执行go generate即可🙂)
gowire是根据MIT许可证发布的。有关更多信息,请参见LICENSE文件。