Go/Gin Gower 一款 Web 快速启动框架

falling-ts · · 2738 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

# Go/Gin Gower Web 启动框架 ![logo.png](https://static.golangjob.cn/230330/3e2ce4739f713b452d17b7b470f95e54.png) [![benchmark](https://img.shields.io/badge/github-gower-green?style=flat-square&logo=Github)](https://github.com/falling-ts/gower) [![benchmark](https://img.shields.io/badge/gitee-gower-blue?style=flat-square&logo=Gitee)](https://gitee.com/falling-ts/gower) [![benchmark](https://img.shields.io/badge/gower-benchmark-red?style=flat-square&logo=Sencha)]() [![actions](https://img.shields.io/badge/github-actions-green?style=flat-square&logo=GitHub)](https://github.com/falling-ts/gower/actions) [![version](https://img.shields.io/badge/version-0.2.0-yellow?style=flat-square&logo=V)]() --- Gower 是基于 [Go/Gin](https://github.com/gin-gonic/gin) 的 Web 快速启动框架, 架构核心思想主要借鉴 [Laravel](https://github.com/laravel/laravel) 的设计理念。目录结构与 Laravel 大同小异,功能基本类似。基于 Go/Gin 的路由设计,在保证基本性能的前提下,尽量提高代码开发的优雅性,借助 Go 的反射与类型断言机制,通过实现依赖注入的功能,将参数校验、模型初始化放在逻辑之前,很好的简化了代码。 主要特性: - 命令即本体,命令行工具与构建的程序相结合 - 服务与服务提供者,通过 key 与函数绑定,实现动态服务构建 - 服务间通过依赖注入,避免环形依赖陷阱 - 业务即核心,核心内容通过 app 提供服务能力,app 通过服务提供者获得服务能力 - Gin 路由函数包装,实现控制器方法参数与返回值自定义功能,即自由控制器 - 控制器方法注入请求结构体,实现自动验证请求参数 - 非前后分离,也可用作前后分离 - 前端借助 Vite 实现库打包模式,为模板提供 css 与 js - 整体环境,分开发、测试、生产,前后端各有自己的环境文件 - 整体发布,主要由 Docker 提供容器化运行,主要好处是避免了环境不一致带来的问题 系统要求: > go >= v1.20 > > nodejs >= v16.13 > > pnpm >= v7.0 > > docker >= v20.10 > > docker compose >= v2.0 > > git >= 2.39 ## 快速开始 ### 源码安装[推荐] #### 1.执行远程编译安装 ```shell $ go install -tags cli github.com/falling-ts/gower@latest ``` > 验证结果: `$ gower --version` #### 2.创建项目,自动初始化 ```shell $ gower create myproject ``` > 将执行创建项目,初始化文件,环境,仓库,前后端依赖,执行基准测试 #### 3.使用 Docker ```shell $ ./run-dev ``` #### 4.使用 Goland 进行 debug 在 main.go 文件中,右键绿色三角形,选择 debug。第一次执行只会打印命令的提示文字,不会运行。然后在正上方选择编辑 `Edit Configurations`,在创建的 `go build gower` 中,添加 `run` 到 Program arguments 中,保存执行 debug ### 使用 Git 安装 #### 1.下载 ```shell $ git clone https://github.com/falling-ts/gower.git 或 $ git clone https://gitee.com/falling-ts/gower.git ``` #### 2.切换到发布版 ```shell git checkout v0.2.2 ``` > 切换完成,你可以删除 `.git` 目录,自行创建自己的仓库 #### 3.安装前后端依赖 ```shell $ pnpm install $ go mod tidy $ go install -tags cli ``` > 注意: 先到 [goproxy.cn](https://goproxy.cn) 配置加速代理,再使用 `go mod tidy` #### 4.初始化环境 在根目录下,复制出 `.env.test` 和 `.env.production` 两个前端环境文件 在 `envs/` 目录下,复制出 `.env.test` 和 `.env.production` 两个后端环境文件 生成 APP 和 JWT 的密钥 ```shell $ gower init key $ gower jwt key ``` #### 5.通过 Docker 运行 dev 开发环境 ```shell $ ./run-dev ``` > windows 已测试通过,其它系统有问题,请提 issues #### 6.不使用 Docker ##### 构建前端 ```shell $ npm run dev ``` > 将在 `public/static` 下构建出 js 和 css 以及 images 内容 ##### 构建后端与运行 ```shell $ go test $ go install $ gower run # 要在项目根目录下执行,记得把 $GOPATH/bin 加入环境变量 ``` > 如果需要打包静态资源请执行 `go install -tags tmpl,static` ###### tags: ``` test: 打包测试环境的程序文件 prod: 打包生成环境的程序文件 tmpl: 打包模板 static: 打包静态资源 cli: 命令行模式 ``` > 打包这些内容好处是无需关心程序迁移时,需要携带的内容,因为都打包进程序了,一个文件就是整套系统,灵活性极高 ## 快速开发 ### 创建控制器 ```shell $ gower make --controller Hello ``` `app/http/controllers/hello_controller.go` ```go package controllers import ( "gower/app" "gower/app/http/requests" "gower/services" ) type HelloController struct { app.Controller } var Hello = new(HelloController) // Index 获取页面 func (*HelloController) Index(req *requests.HelloRequest) (services.Response, error) { return res.Ok("home/hello", app.Data{ "name": req.Name, }), nil } ``` ### 创建请求 ```shell $ gower make --request Hello ``` `app\http\requests\hello_request.go` ```go package requests import "gower/app" type HelloRequest struct { app.Request Name *string `form:"name" json:"name" binding:"required"` } ``` ### 创建模型 ```shell $ gower make --model Hello ``` `app\models\hello.go` ```go package models func init() { migrate(new(Hello)) } type Hello struct { Model Name *string `gorm:"type:string;default:'';comment:名称"` } ``` > 注: 如果命令输出很多 Debug 内容,那是因为 envs/.env.development 的 APP_MODE 是开发模式, 修改为测试模式就可以了 ### 添加路由 `routes/web.go` ```go package routes import ( web "gower/app/http/controllers" mws "gower/app/http/middlewares" "gower/public" ) func init() { // ... route.GET("/hello", web.Hello.Index) } ``` ### 执行请求 ```shell $ curl -i http://localhost:8080/hello?name=Gower ``` ## 使用的第三方库和内容,同时表达对开源的感谢 ``` github.com/golang/go v1.20 github.com/alexedwards/argon2id v0.0.0-20230305115115-4b3c3280a736 github.com/caarlos0/env/v7 v7.0.0 github.com/gin-contrib/cors v1.4.0 github.com/gin-gonic/gin v1.9.0 github.com/go-playground/locales v0.14.1 github.com/go-playground/universal-translator v0.18.1 github.com/go-playground/validator/v10 v10.11.2 github.com/go-sql-driver/mysql v1.7.0 github.com/golang-jwt/jwt/v5 v5.0.0-rc.1 github.com/jaevor/go-nanoid v1.3.0 github.com/joho/godotenv v1.5.1 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/stretchr/testify v1.8.1 github.com/urfave/cli/v2 v2.25.0 go.uber.org/zap v1.24.0 golang.org/x/crypto v0.7.0 gorm.io/driver/mysql v1.4.7 gorm.io/gorm v1.24.6 github.com/rclone/rclone v1.62.2 github.com/laravel/laravel github.com/moby/moby github.com/docker/compose FROM caddy:2.6 FROM grafana/grafana:9.4.3 FROM grafana/loki:main-0295fd4 FROM mysql/mysql-server:5.7.41 FROM grafana/promtail:main-0295fd4 FROM pingcap/tidb:v6.5.1 nodejs pnpm "animate.css": "^4.1.1", "autoprefixer": "^10.4.13", "daisyui": "^2.51.2", "jquery": "^3.6.3", "js-cookie": "^3.0.1", "localforage": "^1.10.0", "postcss": "^8.4.21", "resize-observer-polyfill": "^1.5.1", "simplebar": "^6.2.1", "stylus": "^0.59.0", "tailwindcss": "^3.2.7", "vue": "^3.2.47" "@rollup/plugin-replace": "^5.0.2", "@types/jquery": "^3.5.16", "@types/js-cookie": "^3.0.3", "@types/node": "^18.15.10", "@types/vue": "^2.0.0", "@vitejs/plugin-vue": "^4.0.0", "cross-env": "^7.0.3", "vite": "^4.1.4" ``` ## 文档 [Wiki 地址](https://gitee.com/falling-ts/gower/wikis/Home) ## LICENSE [MIT License](LICENSE) ## 主页页面 ![](https://note.youdao.com/yws/api/personal/file/WEBfa31ed8b7640b2319ed8ca1833693f76?method=download&shareKey=e7d915c29821defeb07a91947871f4fd) ## 示例主题 通过修改 `.env.xxx` 的 `VIEW_THEME`, 详情见 [DaisyUI](https://daisyui.com/docs/themes/) ### cupcake ![](https://note.youdao.com/yws/api/personal/file/WEB63c72d6782bea22fae71044784e78466?method=download&shareKey=e7d915c29821defeb07a91947871f4fd) ### forest ![](https://note.youdao.com/yws/api/personal/file/WEBdae2a762a5e2362fdda1b5804e06aefb?method=download&shareKey=e7d915c29821defeb07a91947871f4fd) ### halloween ![](https://note.youdao.com/yws/api/personal/file/WEB1bf3d621216042a2fa5ed95053e37906?method=download&shareKey=e7d915c29821defeb07a91947871f4fd) ### lofi ![](https://note.youdao.com/yws/api/personal/file/WEB587e67ea6512ad60e927a8e559853eba?method=download&shareKey=e7d915c29821defeb07a91947871f4fd) ### synthwave ![](https://note.youdao.com/yws/api/personal/file/WEB95a27217b466531f466fb01b2445e7ac?method=download&shareKey=e7d915c29821defeb07a91947871f4fd)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2738 次点击  ∙  1 赞  
加入收藏 微博
2 回复  |  直到 2023-03-31 11:14:01
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传