miniblog 实现的功能
用户管理: 支持 用户注册、用户登录、获取用户列表、获取用户详情、更新用户信息、修改用户密码、注销用户 7 种用户操作;
博客管理: 支持 创建博客、获取博客列表、获取博客详情、更新博客内容、删除博客、批量删除博客 6 种博客操作。
涉及技术栈,点击github
miniblog 目录结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 ├── api # Swagger / OpenAPI 文档存放目录 │ └── openapi │ └── openapi.yaml # OpenAPI 3.0 API 接口文档 ├── cmd # main 文件存放目录 │ └── miniblog │ └── miniblog.go ├── configs # 配置文件存放目录 │ ├── miniblog.sql # 数据库初始化 SQL │ ├── miniblog.yaml # miniblog 配置文件 │ └── nginx.conf # Nginx 配置 ├── docs # 项目文档 │ ├── devel # 开发文档 │ │ ├── en-US # 英文文档 │ │ └── zh-CN # 中文文档 │ │ ├── architecture.md # miniblog 架构介绍 │ │ ├── conversions # 规范文档存放目录 │ │ │ ├── api.md # 接口规范 │ │ │ ├── commit.md # Commit 规范 │ │ │ ├── directory.md # 目录结构规范 │ │ │ ├── error_code.md # 错误码规范 │ │ │ ├── go_code.md # 代码规范 │ │ │ ├── log.md # 日志规范 │ │ │ └── version.md # 版本规范 │ │ └── README.md │ ├── guide # 用户文档 │ │ ├── en-US # 英文文档 │ │ └── zh-CN # 中文文档 │ │ ├── announcements.md # 动态与公告 │ │ ├── best-practice # 最佳实践 │ │ ├── faq # 常见问题 │ │ ├── installation # 安装指南 │ │ ├── introduction # 产品介绍 │ │ ├── operation-guide # 操作指南 │ │ ├── quickstart # 快速入门 │ │ └── README.md │ └── images # 项目图片存放目录 ├── examples # 示例源码 ├── go.mod ├── go.sum ├── init # Systemd Unit 文件保存目录 │ ├── miniblog.service # miniblog systemd unit ├── internal # 内部代码保存目录,这里面的代码不能被外部程序引用 │ ├── miniblog # miniblog 代码实现目录 │ │ ├── biz # biz 层代码 │ │ ├── controller # controller 层代码 │ │ │ └── v1 # API 接口版本 │ │ │ ├── post # 博客相关代码实现 │ │ │ │ ├── create.go # 创建博客 │ │ │ │ ├── delete_collection.go #批量删除博客 │ │ │ │ ├── delete.go # 删除博客 │ │ │ │ ├── get.go # 获取博客详情 │ │ │ │ ├── list.go # 获取博客列表 │ │ │ │ ├── post.go # 博客 Controller 结构定义、创建 │ │ │ │ └── update.go # 更新博客 │ │ │ └── user │ │ │ ├── change_password.go # 修改用户密码 │ │ │ ├── create.go #创建用户 │ │ │ ├── delete.go # 删除用户 │ │ │ ├── get.go # 获取用户详情 │ │ │ ├── list.go # 获取用户列表 │ │ │ ├── login.go # 用户登录 │ │ │ ├── update.go # 更新用户 │ │ │ └── user.go # 用户 Controller 结构定义、创建 │ │ ├── helper.go # 工具类代码存放文件 │ │ ├── miniblog.go # miniblog 主业务逻辑实现代码 │ │ ├── router.go # Gin 路由加载代码 │ │ └── store # store 层代码 │ └── pkg # 内部包保存目录 │ ├── core # core 包,用来保存一些核心的函数 │ ├── errno # errno 包,实现了 miniblog 的错误码功能 │ │ ├── code.go # 错误码定义文件 │ │ └── errno.go # errno 包功能函数文件 │ ├── known # 存放项目级的常量定义 │ ├── log # miniblog 自定义 log 包 │ ├── middleware # Gin 中间件包 │ │ ├── authn.go # 认证中间件 │ │ ├── authz.go # 授权中间件 │ │ ├── header.go # 指定 HTTP Response Header │ │ └── requestid.go # 请求 / 返回头中添加 X-Request-ID │ └── model # GORM Model ├── LICENSE # 声明代码所遵循的开源协议 ├── Makefile # Makefile 文件,一般大型软件系统都是采用 make 来作为编译工具 ├── _output # 临时文件存放目录 ├── pkg # 可供外部程序直接使用的 Go 包存放目录 │ ├── api # REST API 接口定义存放目录 │ ├── proto # Protobuf 接口定义存放目录 │ ├── auth # auth 包,用来完成认证、授权功能 │ │ ├── authn.go # 认证功能 │ │ └── authz.go # 授权功能 │ ├── db # db 包,用来完成 MySQL 数据库连接 │ ├── token # JWT Token 的签发和解析 │ ├── util # 工具类包存放目录 │ │ └── id # id 包,用来生成唯一短 ID │ └── version # version 包,用来保存 / 输出版本信息 ├── README-en.md # 英文 README ├── README.md # 中文 README ├── scripts # 脚本文件 │ ├── boilerplate.txt # 指定版权头信息 │ ├── coverage.awk # awk 脚本,用来计算覆盖率 │ ├── make-rules # 子 Makefile 保存目录 │ │ ├── common.mk # 存放通用的 Makefile 变量 │ │ ├── golang.mk # 用来编译源码 │ │ └── tools.mk # 用来完成工具的安装 │ └── wrktest.sh # wrk 性能测试脚本 └── third_party # 第三方 Go 包存放目录
QA 为什么考虑用mariadb而不是mysql 查看MariaDB中文文档 提到
当 MariaDB Server 的前身 MySQL 于 2009 年被 Oracle 收购时,MySQL 创始人 Michael “Monty” Widenius 出于对 Oracle 管理权的担忧而分叉了该项目,并将新项目命名为 MariaDB。 MySQL 以他的第一个女儿 My 命名,而 MariaDB 则以他的第二个女儿 Maria 命名。 它可用于高可用性事务数据、分析、作为嵌入式服务器。
mariadb基于mysql做了优化,所以可以将mariadb当做mysql使用。
Biz层相当于SpringBoot中的Service层? 是的。
type UserBiz interface
存在的意义?
为了确保代码可测,不然,你测试Service层的代码时,要去创建一个Biz层的实例,Biz层的实例,有时候可能会有一些依赖,这些依赖测试环境不一定能满足。 用接口,可以直接用mock工具,mock一个。 按照mockgen的规则来写,然后一键生成mock文件。
1 2 3 module github.com/marmotedu/miniblog go 1.19
深入Go Module之go.mod文件解析
go.mod的第一行是module path, 一般采用仓库+module name的方式定义。这样我们获取一个module的时候,就可以到它的仓库中去查询,或者让go proxy到仓库中去查询。
每个Go文件前加Copyright的意义是什么? 1 2 3 4 // Copyright 2022 Innkeeper Belm(孔令飞) <nosbelm@qq.com>. All rights reserved. // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file. The original repo for // this file is https://github.com/marmotedu/miniblog.
这个版权应该是可以在Goland中设置,跟LICENSE
文件绑定
miniblog封装的log库,要写一个key,这样设计书出于什么业务场景的考虑?
格式化的日志,方便日志系统按字段过滤,解析。
总结 综上所述,miniblog完全可以作为中小项目的脚手架,我目前已经将在企业中开发的设备服务基于miniblog
重构,后期考虑实现minidocker
,miniredis
项目也统一用这个设计。