ToDoList笔记|青训营

134 阅读3分钟

Todo List 备忘录

此项目使用Gin+Gorm ,基于RESTful API实现的一个备忘录

来自github.com/CocaineCong…

1.项目运行

本项目使用Go Mod管理依赖

启动环境

# 运行一次即可
make env-up

下载依赖

go mod tidy

运行

go run ./cmd/main.go

将所有环境关闭并删除

make env-down

2.项目主要功能介绍

  • 用户注册登录 ( jwt-go鉴权 )
  • 新增/删除/修改/查询 备忘录
  • 存储每条备忘录的浏览次数
  • 分页功能

3.项目主要依赖:

  • Gin
  • Gorm
  • mysql
  • redis
  • ini
  • jwt-go
  • logrus
  • go-swagger

4.配置文件

由于mysql和redis都是基于docker安装,所以address是host.docker.internal,访问端口为3000,开发环境为ubuntu时,需要将端口映射到本地,所以需要在PORTS一栏加入3000端口

image.png

  • config.ini
[service]
AppMode = debug
HttpPort = :3000

# redis:存储备忘录的浏览次数
[redis]
RedisDb = redis
RedisAddr = host.docker.internal:6379
RedisPw =
RedisDbName = 2

# mysql:存储主要数据
[mysql]
Db = mysql
DbHost = host.docker.internal
DbPort = 3307
DbUser = todolist
DbPassWord = todolist
DbName = todolist

5.项目结构

TodoList/
├── api # 用于定义接口函数,也就是controller层
├── cmd # 程序启动
├── conf # 用于存储配置文件
├── consts 
├── docs # swagger文档
├── middleware # 应用中间件
├── pkg
│  ├── e # 封装错误码
│  └── util # 工具函数
├── repository # 仓库放置所有存储
│  ├── cache # 放置redis缓存
│  └── db # 持久层MySQL仓库
│     ├── dao # 对db进行操作的dao层
│     └── model # 定义所有持久层数据库表结构的model层
├── routes # 路由逻辑处理
├── service # 接口函数的实现
└── types # 放置所有的定义的结构体

5.1 repository

5.1.1 cache:存放redis缓存

  • key.go
const (
	RankKey = "rank" // 排行榜的缓存键
)

// 返回 Task点击数的缓存key
func TaskViewKey(id uint) string {
	// 缓存key的格式:view:task:{id},id为任务ID转换为字符串后的值
	// 例如:view:task:1
	return fmt.Sprintf("view:task:%s", strconv.Itoa(int(id)))
}
  • common.go
// RedisClient 是redis客户端的实例
var RedisClient *redis.Client

// 初始化redis链接
func Redis() {
	// 从配置文件中获取redis的配置
	db, _ := strconv.ParseUint(conf.RedisDbName, 10, 64)
	// 创建redis客户端
	client := redis.NewClient(&redis.Options{
		Addr:     conf.RedisAddr,
		Password: conf.RedisPw,
		DB:       int(db),
	})
	// 检测redis是否连接成功
	_, err := client.Ping().Result()
	if err != nil {
		logging.Info(err)
		panic(err)
	}
	RedisClient = client // 赋值给实例
}

5.1.2 db:存放MySQL仓库

  • 'dao':对db进行操作的dao层
    • 对于每个task、user的增删改查操作,都需要在dao层进行封装
    • 数据库连接
    • 数据库迁移
  • 'model':定义所有持久层数据库表结构的model层
    • 对于每个表的结构体,都需要在model层进行定义
    • 设置密码、检查密码

5.2 service

5.2.1 user

用户注册和登录

5.2.2 task

新增/删除/修改/查询 备忘录

5.3 pkg

5.3.1

  • ctl
    • ctl.go:封装了一些公共的函数,例如:返回错误码、返回成功码、返回数据、返回分页数据
    • user_info.go:从上下文中获取用户信息

6.在docker-desktop里查看数据库

  • 查看mysql

image-1.png image-2.png

  • 查看redis

image-3.png