Giter Club home page Giter Club logo

go-skeleton's Introduction

go-skeleton

基于Go语言(版本:>=v1.22.0)和fiber框架的高性能高并发的Web项目骨架

持续更新中...

基于go-skeleton + Reactjs + shadcn-ui 开发的面向出海的插件化电商系统 敬请期待~

项目地址:https://github.com/MQEnergy/mqshop

GoDoc GitHub license codebeat badge

一、项目结构

├── LICENSE
├── Makefile          # 构建
├── README.md
├── benchmark         # benchmark
├── cmd
│   ├── app           # 接口运行命令
│   └── cli           # 命令行运行命令
├── configs           # 配置文件
├── database          # 数据表文件
├── go.mod
├── go.sum
├── internal
│   ├── app           # 模块目录
│   ├── bootstrap     # 服务启动
│   ├── command       # 命令行
│   ├── middleware    # 中间件
│   ├── request       # 请求参数绑定的结构体目录
│   ├── router        # 路由
│   └── vars          # 全局变量
└── pkg
    ├── cache         # 缓存类 redis sync.Map
    ├── command       # 命令行接口定义
    ├── config        # 配置加载类
    ├── crontab       # 定时任务
    ├── database      # 数据库类
    ├── helper        # 帮助函数
    ├── jwtauth       # jwt类
    ├── logger        # 日志类
    ├── oss           # aliyun oss上传
    ├── response      # 接口返回类
    ├── restyHttp     # 网络请求类
    ├── upload        # 上传类
    └── wecom         # 企业微信

目前已集成和实现:

下一步计划:

  • 支持 cron 定时任务
  • 支持 pprof 性能剖析组件
  • 支持 trace 项目内部链路追踪
  • 支持 rate 接口限流组件
  • 支持 grpc rpc组件
  • 支持 go-rabbitmq 消息队列组件 基于rabbitmq官方 amqp 组件封装实现的消费者和生产者
  • 实现 ticker 定时器组件
  • 实现 mongodb 数据库连接

二、运行项目

# 安装依赖
go mod tidy

# web命令 e: 支持三种环境变量 p: 端口号(默认9527)
go run cmd/app/main.go [-e=dev|test|prod] [-p=9527...]

# 查看帮助
go run cmd/app/main.go -h
go run cmd/cli/main.go -h

# cli命令
go run cmd/cli/main.go [-e=dev|test|prod]

# 热更新
# 安装热更新
go install github.com/cosmtrek/air@latest
air

# 查看帮助
make help

# 格式化代码
make lint

# 打包成window
make windows

# 打包成linux
make linux

# 打包成macos
make darwin

三、基础功能

配置文件存在于configs

1、全局变量

在internal/vars目录中可查看全局可用的参数

var (
    BasePath string              // 根目录
    DB       *gorm.DB            // Mysql数据库
    MDB      map[string]*gorm.DB // mysql多数据库操作
    Redis    *redis.Client       // redis连接池
    Router   *fiber.Router       // 路由
    Config   config.Config      // 配置
	Once     sync.Once
)

2、基于gorm/gen生成model和dao

# 查看帮助
go run cmd/cli/main.go genModel -h

# 命令示例:
# -m: 数据表名称(不填是生成别名为default的数据库的全部模型)
# -e: dev、test、prod(默认环境:dev) 
# -a: 数据库别名(在yaml配置文件中database.mysql.sources.alias里面配置)(默认:default)
go run cmd/cli/main.go genModel [-m=foo] [-e=prod] [-a=demo]

命令使用-a参数 会生成新的dao目录,

参考文档:https://gorm.io/zh_CN/gen/dynamic_sql.html

1、在entity目录中定义模型的查询接口(按需使用)

参考:internal/app/entity/admin/admin.go

代码如下:

type Querier interface {
	// SELECT * FROM @@table WHERE id = @id
	GetByID(id int) (gen.T, error)

	// SELECT * FROM @@table WHERE account = @account
	GetByAccount(account string) (*gen.T, error)
}

2、在entity.go文件中引入数据表的相关接口,

参考:internal/app/entity/entity.go

代码如下:

var methodMaps = MethodMaps{
    "cn_admin": { // 表名称
        func(Querier) {}, // 扩展的查询接口 可多个
        func(admin.Querier) {},
    },
    // ...
}

3、创建command命令

# 查看帮助
go run cmd/cli/main.go genCommand -h

# 命令示例 
# -n: 命令行名称 
# -d: 命令存放目录 支持无限极子目录 如:foo/foo 
# -s: 加载已经存在的服务 如:mysql,redis 格式:多个服务以英文逗号相隔 如:mysql,redis
go run cmd/cli/main.go genCommand -n=foo [-d=foo] [-s=mysql,redis]

4、创建controller

# 查看帮助
go run cmd/cli/main.go genController -h

# 命令示例 -n: 命令行名称 -d: 命令存放目录 支持无限极子目录 如:foo/foo
go run cmd/cli/main.go genController -n=foo [-d=foo]

5、创建service

# 查看帮助
go run cmd/cli/main.go genService -h

# 命令示例 -n: 命令行名称 -d: 命令存放目录 支持无限极子目录 如:foo/foo
go run cmd/cli/main.go genService -n=foo [-d=foo]

6、中间件

1、通过命令创建中间件

# 查看帮助
go run cmd/cli/main.go genMiddleware -h

# 命令示例 -n: 命令行名称
go run cmd/cli/main.go genMiddleware -n=foo

7、日志

import "log/slog"

slog.Info("Info")
slog.Error("Error")
slog.Warning("Warning")
slog.Debug("Debug")

8、验证器

在controller中文件中直接调用Validate方法 示例如下:

package backend

import (
	"github.com/MQEnergy/go-skeleton/pkg/response"
	"github.com/MQEnergy/go-skeleton/internal/app/controller"
)
type FooController struct {
	controller.Controller
} 
// IndexReq 请求参数绑定
type IndexReq struct {
	Name string `form:"name" query:"name" json:"name" xml:"name" validate:"required"`
	Id   int    `form:"id" query:"id" xml:"id" validate:"required"`
}

// Index ...
func (c *FooController) Index(ctx *fiber.Ctx) error {
    var params IndexReq
    if err := c.Validate(ctx, &params); err != nil {
    return response.BadRequestException(ctx, err.Error())
    }
    return response.SuccessJSON(ctx, "", "index")
}

9、响应体

pkg/response/response.go文件中

// 基础返回
response.JSON(ctx *fiber.Ctx, status int, errcode Code, message string, data interface{})

// 成功返回
response.SuccessJSON(ctx *fiber.Ctx, message string, data interface{})
// ...

10、数据迁移 migrate

11、上传类

参考:

1、调用 internal/app/controller/backend/attachment.go

2、组件 pkg/upload/upload.go

12、service查询数据

查看service/backend/auth.go

var (
    u         = dao.YfoAdmin
)
adminInfo, err = u.GetByAccount(reqParams.Account) // 这个是entity暴露的查询方法 可查看entity/admin/admin.go文件
dao.{数据模型}.{查询方法}

四、单元测试

五、格式化代码

# install
go install mvdan.cc/gofumpt@latest

# run 
gofumpt -l -w .   

六、检查shadow变量

# install
go install golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow

# run path为shadow所在目录
go vet -vettool={path}/shadow ./cmd/app/main.go 

七、静态分析

# install
go install go.uber.org/nilaway/cmd/nilaway@latest

# run 根目录
nilaway ./...

八、注意

1、air配置文件 .air.toml在不同环境下需要修改

注意查看.air.toml文件

benchmark (Todo)

wrk -t12 -c1000 -d30s --script=benchmark/login.lua --latency http://127.0.0.1:9527/backend/auth/login

go-skeleton's People

Contributors

chenxi2015 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

Watchers

 avatar  avatar  avatar  avatar

go-skeleton's Issues

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.