Giter VIP home page Giter VIP logo

gin-admin's Introduction

Gin-Admin

A lightweight, flexible, elegant and full-featured RBAC scaffolding based on GIN + GORM 2.0 + Casbin 2.0 + Wire DI.

English | 中文

LICENSE Language Go Report Card GitHub release GitHub release date GoDoc

Features

  • 📜 Follow the RESTful API design specification & interface-based programming specification
  • 🏠 More concise project structure, modular design, improve code readability and maintainability
  • 🧰 Based on the GIN framework, it provides rich middleware support (JWTAuth, CORS, RequestLogger, RequestRateLimiter, TraceID, Casbin, Recover, GZIP, StaticWebsite)
  • 🔐 RBAC access control model based on Casbin
  • 🗃️ Database access layer based on GORM 2.0
  • 🔌 Dependency injection based on WIRE -- the role of dependency injection itself is to solve the cumbersome initialization process of hierarchical dependencies between modules
  • ⚡ Log output based on Zap & Context, and unified output of key fields such as TraceID/UserID through combination with Context (also supports log hooks written to GORM)
  • 🔑 User authentication based on JWT
  • 🔬 Automatically generate Swagger documentation based on Swaggo - Preview
  • 🧪 Implement API unit testing based on testify
  • 💯 Stateless service, horizontally scalable, improves service availability - dynamic permission management of Casbin is implemented through scheduled tasks and Redis
  • 🔨 Complete efficiency tools, can develop complete code modules through configuration - gin-admin-cli

swagger

Frontend

Dependencies

  • Go 1.19+
  • Wire go install github.com/google/wire/cmd/wire@latest
  • Swag go install github.com/swaggo/swag/cmd/swag@latest
  • GIN-ADMIN-CLI go install github.com/gin-admin/gin-admin-cli/v10@latest

Quick Start

Create a new project

gin-admin-cli new -d ~/go/src --name testapp --desc 'A test API service based on golang.' --pkg 'github.com/xxx/testapp'

Start the service

cd ~/go/src/testapp
make start
# or
go run main.go start

Generate a new module

For more detailed usage instructions, please refer to gin-admin-cli

gin-admin-cli gen -d . -m CMS --structs Article --structs-comment 'Article management'

Remove a module

gin-admin-cli rm -d . -m CMS --structs Article

Build the service

make build
# or
go build -ldflags "-w -s -X main.VERSION=v1.0.0" -o ginadmin

Generate swagger docs

make swagger
# or
swag init --parseDependency --generalInfo ./main.go --output ./internal/swagger

Generate wire inject

make wire
# or
wire gen ./internal/wirex

Project Layout

├── cmd
│   ├── start.go
│   ├── stop.go
│   └── version.go
├── configs
│   ├── dev
│   │   ├── logging.toml           (Log configuration file)
│   │   ├── middleware.toml        (Middleware configuration file)
│   │   └── server.toml            (Service configuration file)
│   ├── menu.json                  (Initialize menu file)
│   └── rbac_model.conf            (Casbin RBAC model configuration file)
├── internal
│   ├── bootstrap
│   │   ├── bootstrap.go          (Initialization)
│   │   ├── http.go               (HTTP service)
│   │   └── logger.go             (Log service)
│   ├── config                    (Configuration file)
│   │   ├── config.go
│   │   ├── consts.go
│   │   ├── middleware.go
│   │   └── parse.go
│   ├── mods
│   │   ├── rbac                  (RBAC module)
│   │   │   ├── api               (API layer)
│   │   │   ├── biz               (Business logic layer)
│   │   │   ├── dal               (Data access layer)
│   │   │   ├── schema            (Data model layer)
│   │   │   ├── casbin.go         (Casbin initialization)
│   │   │   ├── main.go           (Module initialization)
│   │   │   └── wire.go           (Dependency injection)
│   │   ├── sys
│   │   │   ├── api
│   │   │   ├── biz
│   │   │   ├── dal
│   │   │   ├── schema
│   │   │   ├── main.go
│   │   │   └── wire.go
│   │   └── mods.go
│   ├── utility
│   │   └── prom
│   │       └── prom.go           (Prometheus)
│   └── wirex                     (Dependency injection)
│       ├── injector.go
│       ├── wire.go
│       └── wire_gen.go
├── test                          (Unit test)
│   ├── menu_test.go
│   ├── role_test.go
│   ├── test.go
│   └── user_test.go
├── Dockerfile
├── Makefile
├── README.md
├── go.mod
├── go.sum
└── main.go                       (Entry)

Community

gin-admin's People

Contributors

chenyu1990 avatar conight avatar crazyrunsnail avatar ezewu avatar fan-tastic-z avatar gopkg-dev avatar linzhengen avatar longlycode avatar lostmaniac avatar luky-jing avatar lvisei avatar lyrictian avatar peanut-cc avatar pingtest avatar yz271544 avatar zbml avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gin-admin's Issues

这里是bug吗?没理解这里的 Code Name Memo为什么是指针

下面的代码全部来自internal/app/model/impl/gorm/internal/entity/e_demo.go

// Demo demo实体
type Demo struct {
	Model
	RecordID string  `gorm:"column:record_id;size:36;index;"` // 记录内码
	Code     *string `gorm:"column:code;size:50;index;"`      // 编号
	Name     *string `gorm:"column:name;size:100;index;"`     // 名称
	Memo     *string `gorm:"column:memo;size:200;"`           // 备注
	Status   *int    `gorm:"column:status;index;"`            // 状态(1:启用 2:停用)
	Creator  *string `gorm:"column:creator;size:36;"`         // 创建者
}

这里的 Code Name Memo是指针有什么其他考虑吗? 没理解这里是怎么考虑,为什么是指针.

这里用指针后,当修改demo实体的数据时,会把空值也覆盖掉,比如说修改用户信息,如果不填写新的用户密码,就会把密码一栏赋值为空,因为gorm只会判断是否是空值,空值不更新,非空值进行更新,改成指针后,就算指针指向的字符串是空值,也会把指针判断为非空值,因为指针的空值是null,这样就会把数据库原来的值覆盖掉,

我觉得这里应该不用指针,比如说用户的密码字段,因为没填数据的时候就应该不更改,而不是改为空

如果这里使用指针仅仅是因为想要提高效率,降低内存使用,我觉得没必要,因为Demo这个结构体实例化后,只要每次结构体传参数的时候都用指针就可以了,不会增加内存,因为传递的只是一个指针的空间,并没有整个结构体一起传参,比如说:

func (a Demo) String() string {
	return toString(a)
}

// TableName 表名
func (a Demo) TableName() string {
	return a.Model.TableName("demo")
}

改成下面这种,直接使用指针就可以

func (a *Demo) String() string {
	return toString(a)
}

// TableName 表名
func (a *Demo) TableName() string {
	return a.Model.TableName("demo")
}

跨域配置无效

配置如下

# 跨域请求
[cors]
# 是否启用
enable = true
# 允许跨域请求的域名列表(*表示全部允许)
allow_origins = ["*"]
# 允许跨域请求的请求方式列表
allow_methods = ["GET","POST","PUT","DELETE","PATCH", "OPTIONS"]
# 允许客户端与跨域请求一起使用的非简单标头的列表
allow_headers = []
# 请求是否可以包含cookie,HTTP身份验证或客户端SSL证书等用户凭据
allow_credentials = true
# 可以缓存预检请求结果的时间(以秒为单位)
max_age = 7200

response headers 返回如下

Allow: GET,POST,OPTIONS,HEAD
Connection: Keep-Alive
Content-Length: 0
Date: Wed, 22 May 2019 15:27:55 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.38 (Ubuntu)

我试过不开启和开启跨域配置 response headers 返回不变, 感觉像跨域配置没生效,请问是不是我哪里设置的不对?

windows系统如何使用air热重启?

更改完配置文件后,可以检测到文件变化,并且重新编译。
但是结束不掉原来的进程文件,导致端口bind失败。。
请问如何解决?

2.0版本二级菜单的BUG

如下图,在1.2版本中,通过修改前端的限制后可以创建二级菜单,而功能选择是正常的。
image

在2.0版本中,创建了二级菜单后,因为此处长度相同而导致无法选择二级菜单
image

在GO111MODULE=on下无法编译

非常感谢作者开发了一个如此完善的后台框架。
刚才下载最新的代码,在GO111MODULE下编译会报错。
image
请问应该如何解决?谢谢

登陆验证时没有对密码进行加密再比较

// GetRootUser 获取root用户
func GetRootUser() *schema.User {
	user := config.Global().Root
	return &schema.User{
		RecordID: user.UserName,
		UserName: user.UserName,
		RealName: user.RealName,
		Password: util.MD5HashString(user.Password),//这里的密码是进行过加密处理的
	}
}

func (a *Login) Verify(ctx context.Context, userName, password string) (*schema.User, error) {
	// 检查是否是超级用户
	root := GetRootUser()
	if userName == root.UserName && root.Password == password {//而这里的password却没有进行加密再比较
		return root, nil
	}

	result, err := a.UserModel.Query(ctx, schema.UserQueryParam{
		UserName: userName,
	})

权限控制这样算是bug吗

准备学习呢,发现:
权限控制,当用户只分配给了一个首页时,用户看到的界面就只有首页。但是用户手动输入/system/role的网址,可以进入角色管理
这算bug吗?有些疑惑
TIM截图20190710234133

go build -o server报错

go build -o server

github.com/LyricTian/gin-admin/src/web/router

../../src/web/router/r_mw_recover.go:29:17: too many arguments in call to logger.System
have (string, string)
want ("context".Context)
../../src/web/router/r_mw_recover.go:36:5: ctx.Next undefined (type *"github.com/LyricTian/gin-admin/src/web/context".Context has no field or method Next)

无法正确根据角色获取用户列表

选择角色时获取的用户列表不正确
internal/app/model/impl/gorm/internal/model/m_user.go 47行 db = db.Where("record_id IN (?) ",subQuery)
IN后面多了一对括号,导致生成的查询语句执行结果与预期不符,去了括号就正确了

module declares its path as: github.com/sirupsen/logrus but was required as: github.com/Sirupsen/logrus

go get -v github.com/LyricTian/gin-admin/cmd/server
go: finding github.com/facebookgo/inject latest
go: finding github.com/LyricTian/retry latest
go: finding github.com/facebookgo/structtag latest
go: github.com/LyricTian/gin-admin/cmd/server imports
	github.com/LyricTian/gin-admin/src imports
	github.com/LyricTian/logrus-mysql-hook imports
	github.com/Sirupsen/logrus: github.com/Sirupsen/[email protected]: parsing go.mod:
	module declares its path as: github.com/sirupsen/logrus
	        but was required as: github.com/Sirupsen/logrus

Provide English version (UI, README)

As you may know, Casbin have users from different countries. Most of them use English. I think it will be better for them to use this project if it provides English UI and documentation.

GOCACHE is not defined 出现这个错误

`
$ make start

build cache is required, but could not be located: GOCACHE is not defined and %L ocalAppData% is not defined

make: *** [Makefile:15: start] Error 1
`
执行Makefile出错,但是我看了,这个编译代码,怎么会提示这个错误呢

一些小建议

首先感谢开源,下面是一些小建议
1、QueryParam可以用gin的bind绑定整个实体,不用一个个属性赋值
2、QueryParam可以继承分页,不用每次调用方法GetPaginationParam
3、swagger不指定host
4、校验不通过,将详细的错误返回
5、实体增加required (cli)

ginplus.go line35 冗余代码

ginplus.go line35 parent = logger.NewTraceIDContext(parent, GetTraceID(c)) 中的 GetTraceID(c)这次调用为冗余操作

func NewContext(c *gin.Context) context.Context {
	parent := context.Background()

	if v := GetTraceID(c); v != "" {
		parent = icontext.NewTraceID(parent, v)
		parent = logger.NewTraceIDContext(parent, GetTraceID(c))
	}

	if v := GetUserID(c); v != "" {
		parent = icontext.NewUserID(parent, v)
		parent = logger.NewUserIDContext(parent, v)
	}

	return parent
}

首先感谢作者开源;另外,想请教下为什么这里要这么多层ctx(在只有traceID和userID且均为已知的情况下)?

github.com/LyricTian/captcha

您好,在看您的代码的时候发现您仓库中github.com/LyricTian/captcha 这个代码和您vendor中的github.com/LyricTian/captcha 并不是一致的,可以更改成一致的么,还是说出于其他考虑没有更改,我这边直接用的go module 做的包管理,所以直接是go get github.com/LyricTian/captcha 但是包里是缺少redis_options.go 文件的

v2.0.0版本功能列表

  • 重构服务端代码,实现业务逻辑和存储完全分离,提供统一的事务处理上下文和完整的日志跟踪
  • 加入gorm存储层的支持
  • 加入日志管理功能,支持日志查询及清理
  • 加入接口管理功能,支持服务端动态注入
  • 加入查询个人信息及修改个人密码的功能
  • 菜单管理支持以选择接口的方式批量增加资源
  • 引入JWT认证的支持,提供参数配置,支持session与jwt
  • 引入Swagger的支持,可提供一整套完整的接口文档
  • 引入CORS中间件,可作为参数项配置,支持跨域
  • 引入静态文件服务中间件,可作为命令行参数项,提供静态文件服务
  • 引入请求频次限制中间件,支持GET/POST的请求频次限制,可接入memory/redis
  • 提供HTTP优雅重启的支持
  • 用户登录增加图形验证码的支持,支持memory/redis存储

关于依赖注入的问题

Lyric您好,我看您在4.0版引入了依赖注入的特性,我以前只是听做Java的朋友说过,但是从来没有用过。今天在重构4.0版里看见了这个特性,在阅读代码的时候发现没有以前版本的可读性高了,很多地方不理解。您能说说开发思路吗?引入了依赖注入对项目的优势是什么?谢谢

cannot load gin-admin/internal/app

我是这么做的.
`
gin-admin-cli new -m -d ${GOPATH}/src/gin-admin -p gin-admin

cd ${GOPATH}/src/gin-admin `

make start

`
build github.com/LyricTian/gin-admin/cmd/server: cannot load gin-admin/internal/app: cannot find module providing package gin-admin/internal/app
make: *** [start] Error 1

`

编译运行时候提示资源不存在?

$ ./server -c ../../config/config.toml -m ../../config/model.conf
开始运行服务,服务版本号:1.2.0-dev
INFO[0000] 服务已运行在[test]模式下,运行版本:1.2.0-dev,进程号:8878 span_function= span_id=61b97f94-b06d-418e-8f1f-5882e8851c0e span_title= started_at="2019-01-16 10:47:40.631298875 +0800 CST m=+0.105783090" trace_id=cdb4c6b1-f010-4ca3-8d17-d721afe353ba user_id=
INFO[0000] HTTP服务开始启动,监听地址为:[127.0.0.1:8086] span_function= span_id=1b38453f-12c3-43cb-bd02-6d63b484a4cf span_title= started_at="2019-01-16 10:47:40.63526605 +0800 CST m=+0.109750342" trace_id=cdb4c6b1-f010-4ca3-8d17-d721afe353ba user_id=
WARN[0009] [请求错误] 资源不存在

日志跟踪 # 服务监控

根据您的项目修改了一些web服务器,但最近频繁出错重启进程,想请教一下 项目里面的日志跟踪
和服务监控 大概怎么使用? 能否给一些相关知识文档.因为服务重启了会丢一些内存中的数据,很头疼.

app.go 中的重复代码

正在完整的阅读你的代码,学习,发现这里写重复了

        if v := o.SwaggerDir; v != "" {
		cfg.Swagger = v
	}
	if v := o.SwaggerDir; v != "" {
		cfg.Swagger = v
	}

stat cmd/server/main.go: no such file or directory

➜ gin-admin git:(master) go run cmd/server/main.go -c ./configs/config.toml -m ./configs/model.conf -swagger ./docs/swagger -menu ./configs/menu.json
stat cmd/server/main.go: no such file or directory

cannot find module providing package github.com/LyricTian/gin-admin

我是go语言小白,请教,以下问题如何解决呢?

我用了goproxy.io 代理

$ go build                                                                                                                                                                                                             go: finding github.com/LyricTian latest
go: finding github.com latest
can't load package: package github.com/LyricTian/gin-admin: unknown import path 
"github.com/LyricTian/gin-admin": cannot find module providing package github.com/LyricTian/gin-dmin

不用代理,则提示:

$ go build
can't load package: package github.com/LyricTian/gin-admin: unknown import path
"github.com/LyricTian/gin-admin": cannot find module providing package github.com/LyricTian /gin-dmin

谢谢

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.