GoFastCrud 是一个基于 Gin 框架的快速 CRUD 开发框架,帮助开发者快速构建 RESTful API。
- 🚀 快速生成标准 CRUD 接口
- 📚 自动生成 Swagger 文档
- 🛠 支持自定义控制器和路由
- 🔌 灵活的中间件支持
- 🎯 类型安全的泛型实现
- 📦 工厂模式简化注册流程
- 💡 支持自定义响应处理
- 🔒 内置权限验证机制
- 📊 支持多种数据库(待开发)
- 🔍 丰富的查询条件支持
- 📝 完整的日志记录
- ⚡️ 高性能设计(待开发)
- 🔄 支持事务处理
- 🛡 内置安全防护(待开发)
go get github.com/kruily/gofastcrud// config.yaml
server:
address: ":8080" // 服务地址
database:
driver: "mysql" // 数据库驱动
host: "localhost" // 数据库地址
port: 3306 // 数据库端口
username: "root" // 数据库用户名
password: "password" // 数据库密码
database: "test_crud" // 数据库名称// main.go
type User struct {
...
}
func main() {
// 创建应用实例
app := app.NewDefaultGoFastCrudApp()
// 发布API版本
app.PublishVersion(server.V1)
// 注册控制器
app.RegisterControllers(func(factory *crud.ControllerFactory, server *server.Server) {
factory.Register(server, User{})
})
// 启动服务
app.Start()
}启动服务,访问主页:http://localhost:8080

现在用户各个接口均已自动注册到GIN ROUTER中,可以点击主页API Documentation查看Swagger文档或访问:http://localhost:8080/api/v1/swagger/index.html

需要继承 crud.BaseEntity 并实现 crud.ICrudEntity 接口的 Table 方法
// models/user.go
type User struct {
// 嵌入crud基础实体
*crud.BaseEntity `json:"-"` //不参与json序列化
Username string `json:"username" binding:"required" description:"用户名"`
Email string `json:"email" description:"邮箱地址"`
}
// 定义表名 必须实现
func (u *User) TableName() string {
return "users"
}
// 初始化 必须实现
func (u *User)Init(){
if u.BaseUUIDEntity == nil {
u.BaseUUIDEntity = &crud.BaseUUIDEntity{}
}
}有两种方式创建控制器:
只需传入实体模型
factory.Register(server, models.User{})需要继承 crud.CrudController(标准控制器) 并定义出创建控制器实例的方法
// controllers/user_controller.go
type UserController struct {
// ***嵌入 CrudController***
*crud.CrudController[models.User]
}
// 创建控制器实例
func NewUserController(db *gorm.DB) *UserController {
controller := &UserController{
CrudController: crud.NewCrudController(db, models.User{}),
}
// 应用中间件(可选)
controller.UseMiddleware("*", middleware.Auth())
// 某类方法应用中间件(可选)
controller.UseMiddleware("POST", middleware.Validate())
// 添加自定义路由
controller.AddRoute(types.APIRoute{
Path: "/login",
Method: "POST",
// swagger 信息
Tags: []string{controller.GetEntityName()},
Summary: "用户登录",
Description: "通过用户名和密码进行登录",
// 请求处理函数
Handler: controller.Login,
// 只对当前路由应用中间件(可选)
Middleware: []gin.HandlerFunc{middleware.Auth()},
})
// 或者
controller.AddRoutes([]*types.APIRoute{
// 链式写法
types.Post("/register", controller.Registor). // Post、Get、Put、Delete 等方法
WithSummary("注册用户"). // swagger 标题 信息
WithDescription("注册用户"). // swagger 简介 信息
WithTags([]string{controller.GetEntityName()}). // swagger tags 信息
WithRequest(&UserRegister{}). // 请求参数类型
WithResponse(&Userinfo{}). // 返回参数类型
WithMiddlewares(), // 中间件 信息
...
})
return controller
}
// 自定义方法 返回值必须为(interface{}, error)
//interface{} 为返回数据 error 为错误信息
// 无需关注Response 框架会自动处理
func (c *UserController) Login(ctx *gin.Context)(interface{}, error) {
...
}factory.RegisterCustom(server, controllers.NewUserController)然后有兄弟就要问了:小登小登,上面的标准控制器我会了,可我有些需求要不了某些接口或者我想要个没有接口的控制器,有没有什么办法呢?
有的,兄弟有的。可以使用"空"的控制器crud.BlankController即可,对应的实例化方法为crud.NewBlankController,于标准控制器的用法一模一样,除了没有接口。
GET /{entity}- 获取列表POST /{entity}- 创建实体GET /{entity}/:id- 获取单个实体POST /{entity}/{id}- 更新实体DELETE /{entity}/{id}- 删除实体POST /{entity}/batch- 批量创建POST /{entity}/batch- 批量更新DELETE /{entity}/batch- 批量删除
// 控制器全局中间件,* 表示所有方法,POST 表示指定方法
controller.UseMiddleware("*", middleware.Auth())
// 方法特定中间件
controller.UseMiddleware("POST", middleware.Validate())
// 自定义方法应用中间件
controller.AddRoute(types.APIRoute{
Path: "/login",
Method: "POST",
...
Middleware: []gin.HandlerFunc{middleware.Check()},
})app := app.NewDefaultGoFastCrudApp(WithResponse(CustomResponser{}))CustomResponser 需要实现 ICrudResponse 接口
// internal/crud/response.go
type ICrudResponse interface {
Success(data interface{}) interface{}
Error(err error) interface{}
Pagenation(items interface{}, total int64, page int, size int) interface{}
}然后在NewDefaultGoFastCrudApp中传入即可 NewDefaultGoFastCrudApp(WithResponse(CustomResponser{}))
# 获取DI
di.SINGLE()
# 注册依赖 单例
di.BindSingletonWithName("SERVICE", &Service{})
di.BindSingletonWithType(&Service{})
# 获取依赖 单例
di.GetSingletonByName("SERVICE")
di.GetSingletonByType(&Service{})// 获取Repository
repo := di.GetSingletonByName(models.User{}.Table())Repository 实现 ICrudRepository 接口
在model中定义filter tag,以逗号分隔各操作符 支持的操作符(只允小写):
gt大于gte大于等于lt小于lte小于等于eq等于neq不等于in在...中nin不在...中like模糊查询(像)nlike不模糊查询(不像)between范围查询null为空all包含所有
示例:
type User struct {
*crud.BaseUUIDEntity
Username string `gorm:"type:varchar(20);not null;unique" json:"username" filter:"eq,neq,like,nlike,in,nin"`
Password string `gorm:"type:varchar(20);not null" json:"-"`
Email string `gorm:"type:varchar(20);not null;unique" json:"email" filter:"eq,neq,like,nlike,in,nin"`
}
func (*User) TableName() string {
return "users"
}
func (u *User) Init() {
if u.BaseUUIDEntity == nil {
u.BaseUUIDEntity = &crud.BaseUUIDEntity{}
}
}自定义接口同样可以使用filter查询,在录入接口信息时,使用crud.ModeParam()
controller.AddRoutes([]*types.APIRoute{
types.Get("/list", controller.List).
WithSummary("获取用户列表").
...
WithParameters(crud.ModeParams(controller)...). // 添加这行
...
})- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 提交 Pull Request
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情