duckybsd / gin_example_with_generic

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Gin Example With Generic - Gin Example 的泛型实现

Build Status

代码目录结构

├── cmd                             // 程序入口
├── config                          // 读取配置文件方法
├── config_file                     // 配置文件
├── controller                      // 控制器层
│   └── api                         // 控制器层的api
│       ├── universal               // 通用api(404、健康检测等接口)
│       └── v1                      // 具体的api
├── generic                         // 泛型实现
│   ├── controller.go               // 控制器层的泛型实现
│   ├── model.go                    // 重写gorm的Model结构体(为了实现特定方法)
│   ├── paginate.go                 // 分页器
│   ├── repository.go               // 数据库操作的泛型实现
│   ├── request.go                  // 请求体的接口
│   └── service.go                  // service层的泛型实现
├── pkg                             // 通用包
│   ├── ecode                       // 错误码
│   ├── errors                      // 重写pkg/errors包(结合错误码)
│   ├── http                        // 对Gin的一些方法的封装
│   │   ├── bind                    // 数据绑定
│   │   ├── middleware              // 中间件
│   │   │   ├── cross_domain        // 跨域
│   │   │   ├── handle_error        // 统一的错误处理
│   │   │   └── logging             // 日志(access log)
│   │   └── render                  // 数据渲染
│   ├── json                        // json序列化(fast)
│   ├── log                         // 日志(app log)
│   ├── mysql                       // mysql连接函数
│   └── validator                   // 参数校验
├── router                          // 路由
├── server                          // 服务
├── service                         // 服务层
├── store                           // 数据层
│   ├── db_engine.go                // 数据库引擎
│   ├── model                       // 模型
│   └── repository                  // 数据库操作
├── tools                           // 第三方工具(ecode生成)
└── types                           // 类型
    ├── config                      // 配置文件结构体
    ├── const.go                    // 常量 
    ├── paginate                    // 分页结构体
    ├── request                     // 入参结构体
    └── result                      // 返回结构体

默认支持JSON、XML、YAML格式返回

  • JSON:

    # Input
    curl http://127.0.0.1:8080/api/v1/user | jq
    // Output
    {
      "data": {
        "items": [
          {
            "id": 1,
            "created_at": "2022-05-17T13:55:39.354+08:00",
            "updated_at": "2022-05-17T13:55:39.354+08:00",
            "name": "tiancheng92",
            "country": {
              "id": 1,
              "created_at": "2022-05-17T12:50:22.28+08:00",
              "updated_at": "2022-05-17T12:50:22.28+08:00",
              "name": "china",
              "name_cn": "**",
              "short_name": "cn"
            },
            "email": "kiritoeva@icloud.com"
          }
        ],
        "paginate": {
          "total": 1,
          "page": 1,
          "page_size": 20
        }
      },
      "msg": "Success",
      "code": 100000
    }
  • XML:

    # Input
    curl http://127.0.0.1:8080/api/v1/user  -H 'accept: application/xml'
    # Output
    <result>
        <data>
            <items>
                <id>1</id>
                <created_at>2022-05-17T13:55:39.354+08:00</created_at>
                <updated_at>2022-05-17T13:55:39.354+08:00</updated_at>
                <name>tiancheng92</name>
                <country>
                    <id>1</id>
                    <created_at>2022-05-17T12:50:22.28+08:00</created_at>
                    <updated_at>2022-05-17T12:50:22.28+08:00</updated_at>
                    <name>china</name>
                    <name_cn>**</name_cn>
                    <short_name>cn</short_name>
                </country>
                <email>kiritoeva@icloud.com</email>
            </items>
            <paginate>
                <total>1</total>
                <page>1</page>
                <page_size>20</page_size>
            </paginate>
        </data>
        <msg>Success</msg>
        <code>100000</code>
    </result>
  • YAML:

    # Input
    curl http://127.0.0.1:8080/api/v1/user  -H 'accept: application/x-yaml'
    # Output
    data:
      items:
      - id: 1
        created_at: 2022-05-17T13:55:39.354+08:00
        updated_at: 2022-05-17T13:55:39.354+08:00
        name: tiancheng92
        country:
          id: 1
          created_at: 2022-05-17T12:50:22.28+08:00
          updated_at: 2022-05-17T12:50:22.28+08:00
          name: china
          name_cn: **
          short_name: cn
        email: kiritoeva@icloud.com
      paginate:
        total: 1
        page: 1
        page_size: 20
    msg: Success
    code: 100000

默认实现Restful接口

  • 入参(request)只需实现RequestInterface接口即可
  • 数据库模型(model)只需实现ModelInterface接口即可
  • model、service、controller层只需New出泛型对象与interface,无需自己实现具体方法,参考country系列接口的实现
  • 如有特殊需求,如:model层外键关联、service层特殊业务逻辑等,可以自行对底层泛型方法进行覆盖或添加实现,参考user系列接口的实现

About

License:MIT License


Languages

Language:Go 100.0%