goblog:基于gin、gorm和中间件的个人博客

goblog:基于gin、gorm和中间件的个人博客

前言

一直想尝试在互联网中留下属于自己的足迹,故搭建了一个从数据存储到页面展示都自主开发的个人博客;同时也是使用go语言开发,进行web练手学习。

github:https://github.com/SwordHarry/goblog

博客地址:http://www.huangzijian.top

主要围绕 gin 和 gorm 进行博客网页部分和api部分的业务开发,现支持 markdown 文件的上传

部分细节参考于《Go 语言编程之旅》一书,好评

业务

总体上分为用于浏览的网页业务和用于管理 article 文章和 tag 标签的api业务

网页

  • 首页:个人信息展示和博客列表概况展示;分页器
  • 博客详情页:博客内容 markdown 转 html
  • 标签博客列表页:复用首页,展示该标签下的博客列表
  • search 功能,根据博客 title 搜索相关博客列表

api

  • 认证接口:通过使用 jwt 实现 token 认证
  • articles 文章相关的管理接口
  • tags 标签相关的管理接口

架构

目录结构
  • configs 配置
  • docs 文档和swagger
  • frontend 前端代码
  • global 全局配置变量
  • internal 主要业务逻辑
  • pkg 通用组件
  • scripts 脚本,如 sql sh 等
  • storage 资源和日志存储目录
MVC 三层架构

业务代码主要在 internal 包中,采用 MVC 架构

goblog:基于gin、gorm和中间件的个人博客_第1张图片

gin 路由框架

主要用于

  • 路由注册
  • 中间件管理
  • 请求参数校验:c.ShouldBind()

gorm 数据映射框架

主要用于

  • 数据注入 dao
  • 回调方法

中间件

中间件虽和业务逻辑不强关联,但是也起到举足轻重的作用,本项目用到的中间件有:

acess_log 访问日志记录
func AccessLog() gin.HandlerFunc {
   
	return func(c *gin.Context) {
   
		bodyWriter := &AccessLogWriter{
   body: bytes.NewBufferString(""), ResponseWriter: c.Writer}
		// 替换原有的写入流,扩展一个 body 出来
		c.Writer = bodyWriter
		beginTime := time.Now().Unix()
		// 响应前
		c.Next()
		// 响应后
		endTime := time.Now().Unix()
		fields := logger.Fields{
   
			"request":  c.Request.PostForm.Encode(), // 请求参数
			"response": bodyWriter.body.String(),    // 请求结果
		}
		global.Logger.WithFields(fields).
			Infof(c, "access log: method: %s, status_code: %d, begin_time: %d, end_time: %d",
				c.Request.Method, bodyWriter.Status(), beginTime, endTime)
		// 控制台打印
		fmt.Printf("access log: method: %s, status_code: %d, begin_time: %d, end_time: %d",
			c.Request.Method, bodyWriter.Status(), beginTime, endTime)
	}
}
统一超时处理
func ContextTimeout(t time.Duration) gin.HandlerFunc {
   
	return func(c *gin.Context) {
   
		// 设置当前 context 的超时时间
		ctx, cancel := context.WithTimeout(c.Request.Context(), t)
		defer cancel()
		// 覆盖原请求
		c.Request = c.Request.WithContext

你可能感兴趣的:(go,go,mysql定时备份)