Project Icon

go-web-wire-starter

Go Web开发脚手架 集成依赖注入与CRUD快速构建

go-web-wire-starter是一个基于Go-Wire和Gin框架的Web开发脚手架,旨在简化CRUD应用的构建过程。该项目整合了依赖注入、参数校验、JWT认证、文件存储和分布式锁等功能,并支持定时任务与自定义命令行。其清晰的项目结构和先进的技术栈,为Go Web开发者提供了实用的学习和开发资源。

go-web-wire-starter

简介

这是一个使用go-wire框架和gin框架构建的Web开发脚手架,旨在帮助Web开发者快速实现CRUD操作,并学习go-wire框架的工程化实践。

项目结构

├─cmd               // 项目根入口
│  └─app            
├─conf              // 配置文件
├─config            // 配置映射模型
├─example           // 示例代码
│  ├─captcha        // 行为验证码vue示例
│  ├─email          // 邮件功能示例
│  └─storage        // 文件存储功能示例
├─internal          // 核心目录
│  ├─compo          // 其他组件
│  ├─dao            // dao数据层
│  ├─domain         // 业务模型
│  ├─handler        // handler层(controller层)
│  ├─mildware       // 中间件
│  ├─model          // 数据模型
│  ├─pkg            // 其他功能类
│  │  ├─error       // 错误码
│  │  ├─request     // 请求参数模型
│  │  └─response    // 请求响应数据
│  └─service        // service层
├─router            // Http路由
├─static            // 静态文件(如web网页)
├─storage           // 项目生成的日志等文件
│  └─logs           // 项目日志
└─util              // 工具
    ├─fileUtil
    ├─hash
    ├─path
    ├─str
    └─validator

实现的功能

• 全局依赖注入(go-wire)

• 自定义参数校验规则与校验失败响应

• viper配置统一管理

• Jwt令牌生成、校验、续签、黑名单

• 定时任务

• 文件存储(支持本地、七牛云Kodo、阿里云Oss、腾讯云Cos等存储服务,支持扩展)

• Redis分布式锁

• 请求限流器(基于令牌桶算法)

• 邮件服务

• 自定义命令行命令(代码中以数据库迁移migrate命令为示例)

后续待添加的功能

• Mq消息队列

技术栈

gin: https://gin-gonic.com/zh-cn/ "性能极好的HTTP Web框架"

go-wire: https://github.com/google/wire "谷歌官方的依赖注入代码生成器"

gorm: https://gorm.io/ "强大的Go语言ORM库,用于与数据库交互操作"

cobra: https://github.com/spf13/cobra "用于构建强大的命令行接口的库,可以很方便地组织命令行参数和子命令"

go-playground/validator: https://github.com/go-playground/validator "Go结构和字段验证"

golang-jwt/jwt/v5: https://github.com/golang-jwt/jwt "web网站的身份令牌"

zap: https://github.com/uber-go/zap "高性能日志库,可以用于记录请求日志"

pflag: https://github.com/spf13/pflag "命令行参数和标志解析库,常与cobra一起使用"

viper: https://github.com/spf13/viper "可以从配置文件(json、yaml等)或环境变量中读取配置的库"

sonyflake: https://github.com/sony/sonyflake "分布式ID生成算法实现,用于生成唯一ID"

........

运行

  • go build

    $ go generate
    $ go build -o ./bin/ ./...
    $ ./bin/app
    
  • go run

    $ go generate
    $ go run cmd/app/main.go cmd/app/wire_gen.go cmd/app/app.go
    
  • make

    $ make generate
    $ make build
    $ ./bin/app
    
  • 数据库迁移(cobra命令测试)

    $ go generate
    $ go run cmd/app/main.go cmd/app/wire_gen.go cmd/app/app.go
    

文件存储功能示例

这里我们以项目中的media_service.go的代码为例,需要使用到internal/compo/中的storage.Storage

type MediaService struct {
    conf     *config.Configuration
    log      *zap.Logger
    mediaDao *dao.MediaDao
    storage  *storage.Storage
}

// NewMediaService .
func NewMediaService(conf *config.Configuration, log *zap.Logger, mediaDao *dao.MediaDao,
    s *storage.Storage) *MediaService {
    return &MediaService{conf: conf, log: log, mediaDao: mediaDao, storage: s}
}
  1. FileDriver()获取对应存储驱动

func (storage *Storage) FileDriver(disk ...string) (StorageDriver, error)

可传入参数disk选择存储驱动,若不填,则使用配置中的默认驱动

// 获取默认驱动(可通过修改Storage.default配置)
disk, err := s.storage.FileDriver()
// 获取腾讯云Cos存储驱动
disk, err := s.storage.FileDriver(storage.Cos)
// 获取七牛云Kodo存储驱动
disk, err := s.storage.FileDriver(storage.KoDo)
// 获取阿里云Oss服务
disk, err := s.storage.FileDriver(storage.Oss)

存储驱动方法

	// Put 上传文件
	Put(key string, r io.Reader, dataLength int64) error
	// PutFile 上传本地文件
	PutFile(key string, localFile string) error
	// Get 获取文件
	Get(key string) (io.ReadCloser, error)
	// Rename 重命名文件
	Rename(srcKey string, destKey string) error
	// Copy 复制文件
	Copy(srcKey string, destKey string) error
	// Exists 判断文件是否存在
	Exists(key string) (bool, error)
	// Size 获取文件大小
	Size(key string) (int64, error)
	// Delete 删除文件
	Delete(key string) error
	// Url 获取文件访问URL
	Url(key string) string

简单使用示例

	// 读取文件
	file, err := params.Image.Open()
	defer file.Close()
	if err != nil {
		return nil, cErr.BadRequest("上传失败")
	}

	// 获取存储驱动
	disk, err := s.storage.FileDriver(storage.Oss)
	if err != nil {
		return nil, cErr.BadRequest(s.storage.GetDefaultDiskType() + "disk not found")
	}
	// 生成路径和文件名
	key := s.makeFaceDir(params.Business) + "/" + s.HashName(params.Image.Filename)
	// 上传文件到本地(服务器)
	err = disk.Put(key, file, params.Image.Size)
	if err != nil {
		return nil, cErr.BadRequest("上传失败")
	}

邮件功能示例

  1. 配置邮箱服务信息:
# conf/config.yaml
email: # 邮件配置
  sender_name: kitie # 发件人名称
  sender_email: xxxxx # 发件人邮箱
  sender_password: xxxxxxxx # 发件人密码
  host: smtp.qq.com # smtp服务器地址
  port: 587 # smtp服务器端口
  max_connection: 4 # 最大并发SMTP连接数
  max_timeout: 20  # 最大超时时间(秒)
  1. 使用到的对象为email.EmailDriver,我们这里以CaptchaService验证码服务层举例:// 验证码服务层
type CaptchaService struct {
    conf    *config.Configuration
    log     *zap.Logger
    email   *email.EmailDriver //邮件服务驱动
    rdb     *redis.Client
    captcha *compo.CaptchaCompo
}

func NewCaptchaService(conf *config.Configuration, log *zap.Logger,
    email *email.EmailDriver, rdb *redis.Client, captcha *compo.CaptchaCompo) *CaptchaService {
    return &CaptchaService{conf: conf, log: log, email: email, rdb: rdb, captcha: captcha}
}
  1. 发送邮件
// email为目标邮箱地址,title为邮箱标题,content为邮箱内容
err := s.email.SendRegisterMail(email, title, content)

行为验证码示例

验证码前端界面可参考example/captcha/案例(vue编写)

安装依赖

npm install 

运行项目

npm run serve

go-wire依赖注入代码生成(在cmd/app/目录下)

wire gen wire.go
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号