{"id":25546966,"url":"https://github.com/fishjar/gin-boilerplate","last_synced_at":"2026-02-11T20:30:15.590Z","repository":{"id":92247451,"uuid":"286043991","full_name":"fishjar/gin-boilerplate","owner":"fishjar","description":"基于 `Gin` 封装的样板项目","archived":false,"fork":false,"pushed_at":"2020-11-02T15:19:45.000Z","size":93,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-06-20T13:33:08.604Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fishjar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-08T13:01:00.000Z","updated_at":"2023-11-01T15:34:52.000Z","dependencies_parsed_at":"2023-06-08T03:30:30.107Z","dependency_job_id":null,"html_url":"https://github.com/fishjar/gin-boilerplate","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishjar%2Fgin-boilerplate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishjar%2Fgin-boilerplate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishjar%2Fgin-boilerplate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fishjar%2Fgin-boilerplate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fishjar","download_url":"https://codeload.github.com/fishjar/gin-boilerplate/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239808530,"owners_count":19700455,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-20T09:19:00.300Z","updated_at":"2025-02-20T09:19:01.046Z","avatar_url":"https://github.com/fishjar.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Gin boilerplate\n\n基于 `Gin` 封装的样板项目\n\n## 项目特性\n\n- 基础框架 `gin`： github.com/gin-gonic/gin\n  - 跨域中间件：github.com/gin-contrib/cors\n- 数据库 orm 框架 `gorm`： github.com/jinzhu/gorm\n  - 自动创建表，插入初始数据\n  - 支持事务及原始 SQL 查询\n  - 支持查询缓存（待优化）：github.com/8treenet/gcache\n- 多环境配置（yml 文件）依赖包：github.com/jinzhu/configor\n- `jwt` 登录验证功能，依赖包：github.com/dgrijalva/jwt-go\n  - 认证数据缓存在 redis\n  - 可依据路由配置角色权限校验\n- 模型定义中 `validator.v8` 校验： godoc.org/gopkg.in/go-playground/validator.v8\n- `swagger` 文档生成及访问：github.com/go-openapi/swag\n  - 访问支持 BasicAuth\n- 日志依赖包：github.com/sirupsen/logrus\n  - 日志分割：github.com/lestrrat-go/file-rotatelogs\n- `redis` 依赖包：github.com/go-redis/redis/v7\n- 单文件/多文件上传功能\n  - 文件名 hash 处理\n  - 如果是图片，自动生成缩略图，依赖包：github.com/disintegration/imaging\n- 分布式任务队列：github.com/hibiken/asynq\n  - 基于 redis\n- 定时任务：github.com/robfig/cron\n- 分布式业务锁：github.com/bsm/redislock\n  - 基于 redis\n- 基于 docker 部署\n- 每个模型实现 8 个基本接口\n  - 分页查询（GET）\n  - 单条查询（GET）\n  - 创建单条（POST）\n  - 更新单条（PATCH）\n  - 删除单条（DELETE）\n  - 查询或创建单条（POST）\n  - 批量更新（PATCH）\n  - 批量删除（DELETE）\n\n## 目录结构\n\n```sh\n├── config                      # 配置文件目录\n│   ├── config.development.yml  # 开发环境配置\n│   ├── config.go\n│   ├── config.production.yml   # 生产环境配置\n│   └── config.yml              # 默认配置\n├── crons\n│   ├── crons.go\n│   └── jobs.go\n├── db\n│   ├── db.go\n│   └── redis.go\n├── docker-compose-alpine.yml\n├── docker-compose-go-alpine.yml\n├── docker-compose-mysql.yml\n├── docker-compose-redis.yml\n├── docker-compose.yml\n├── Dockerfile\n├── Dockerfile-alpine\n├── Dockerfile-go-alpine\n├── docs\n│   ├── docs.go\n│   ├── swagger.json\n│   └── swagger.yaml\n├── go.mod\n├── go.sum\n├── handler\n│   ├── auth.go\n│   ├── group.go\n│   ├── login.go\n│   ├── menu.go\n│   ├── pong.go\n│   ├── role.go\n│   ├── upload.go\n│   ├── user.go\n│   └── usergroup.go\n├── LICENSE\n├── locker\n│   └── locker.go\n├── logger\n│   └── logger.go\n├── main.go\n├── middleware\n│   ├── jwt.go\n│   ├── req.go\n│   └── role.go\n├── model\n│   ├── auth.go\n│   ├── base.go\n│   ├── group.go\n│   ├── menu.go\n│   ├── role.go\n│   ├── user.go\n│   └── usergroup.go\n├── README.md\n├── router\n│   ├── router.go\n│   └── server.go\n├── script\n│   ├── initdb.go\n│   ├── migrate.go\n│   └── script.go\n├── service\n│   ├── auth.go\n│   ├── file.go\n│   ├── jwt.go\n│   ├── redis.go\n│   ├── service.go\n│   └── user.go\n├── tasks\n│   ├── client.go\n│   ├── new.go\n│   ├── process.go\n│   ├── server.go\n│   └── tasks.go\n├── tmp\n│   ├── db        # sqlite数据库文件目录\n│   ├── log       # 日志保存目录\n│   └── upload    # 上传文件目录\n└── utils\n    ├── sign.go\n    └── utils.go\n```\n\n## 开发指引\n\n```sh\n# 确保已安装go，及$GOPATH环境变量已配置\n# Go 1.13 and above\ngo version\necho $GOPATH\n\n# 设置代理\ngo env -w GO111MODULE=on\ngo env -w GOPROXY=https://goproxy.cn,direct\n\n# 创建并进入目录\nmkdir -p $GOPATH/src/github.com/fishjar/gin-boilerplate \u0026\u0026 cd \"$_\"\n\n# 克隆项目\ngit clone https://github.com/fishjar/gin-boilerplate.git .\n\n# 确认配置文件(尤其数据库相关配置)\nvi config/config.go\nvi config/config.yml\nvi config/config.development.yml\n\n# 如有需要，运行下列命令启动一个mysql数据库服务\ndocker-compose -f docker-compose-mysql.yml up -d\n\n# 如有需要，启动redis\ndocker-compose -f docker-compose-redis.yml up -d\n\n# 安装依赖\ngo get\n\n# 生成Swagger文档\nswag init\n\n# 开发启动\ngo run main.go\n\n# 访问swagger文档\nhttp://localhost:4000/swagger/index.html\n\n# 测试：登录\ncurl -X POST http://localhost:4000/admin/account/login \\\n-H \"Content-Type: application/json\" \\\n-d '{\"username\":\"gabe\",\"password\":\"123456\"}' | python -m json.tool\n\n# 测试：查询记录，注意替换\u003ctoken\u003e为实际值\ncurl http://localhost:4000/admin/users \\\n-H \"Authorization: Bearer \u003ctoken\u003e\" | python -m json.tool\n```\n\n## 部署指引\n\n### 方案一\n\n完整的 `golang` 镜像中编译运行\n\n```sh\ndocker-compose -f docker-compose.yml up -d\n```\n\n### 方案二\n\n`golang:alpine` 镜像中编译运行\n\n```sh\ndocker-compose -f docker-compose-go-alpine.yml up -d\n```\n\n### 方案三（镜像最小）\n\n本地编译，`alpine:latest` 镜像中运行\n\n```sh\n# 本地编译\nGOOS=linux GOARCH=amd64 go build\n# 或？\nCGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build\n\n# docker 启动\ndocker-compose -f docker-compose-alpine.yml up -d\n```\n\n## TODO or 存在问题\n\n- 返回数据结构待整理\n  - 统一定义错误码\n- 数据缓存，ES？redis？\n  - 目前基于 orm 的 redis 数据缓存，连表查询不理想，待封装新的缓存机制\n- 日志搜集，ES？\n- 模型定义时为了插入 `null` 值，字段类型必须使用指针\n  - 如果使用`database/sql`或`github.com/guregu/null`包，则导致 `validator.v8` 数据校验失效\n  - 结构体转 json，忽略部分字段， tags 的方式貌似无效，待研究\n  - 时间字段格式化，待研究\n    - Birthday time.Time `form:\"birthday\" time_format:\"2006-01-02\" time_utc:\"1\"`\n- 基于 `binding` tags 的校验有些简陋，待优化\n  - 只读字段校验，待研究\n- 批量更新时 model 的 Hooks 不会运行\n- 任务队列可视化管理问题\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffishjar%2Fgin-boilerplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffishjar%2Fgin-boilerplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffishjar%2Fgin-boilerplate/lists"}