这是我参与「第五届青训营」伴学笔记创作活动的第5天
前言
在 long long ago(也就10天吧),我介绍了在后端开发时常用的三大框架——gorm、hertz和kitex,并简要说明了上节课所介绍的项目。今天我们来实现一个单体的应用。
此项目的代码已开源,lhou/easy-note,欢迎访问和提issue。如果能给个star就更好了。
项目介绍
简易笔记——一个使用gorm、hertz和kitex的笔记后端项目。
开发前准备
在正式开发前,需要进行两项准备工作——模型的定义与开发环境的搭建。
1. 模型的定义
参考上篇文章中对功能实现的要求,很容易发现我们需要定义两个模型——用户和笔记。下面是我定义的模型
type User struct {
Id int
Username string
Password string
Gender int
Avatar string
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt
}
type NoteTnfo struct {
Id int
Name string
Note string
UserId int
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt
}
2. 开发前准备
正式开发
1. 定义目录结构
虽然hz工具会帮我们生成一个简易的应用,但是其中有些东西我们并不需要,因此我们需要重新定义目录的结构,帮助我们梳理项目。
easy-note
|
|----config // 处理配置文件
|
|----handler // 逻辑处理
|
|----models // 模型
|
|----repo // 数据处理
|
|----routers // 路由
|
|----main.go // 程序入口
2.模型定义
根据上文对模型的定义,这里直接给出我定义的模型。
// models/model
package models
import (
"gorm.io/gorm"
"time"
)
type BaseModel struct {
Id int
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt
}
type User struct {
BaseModel
Username string
Password string
Gender int
Avatar string
}
type NoteInfo struct {
BaseModel
Name string
Note string
UserId string
}
注意到,id,创建时间,修改时间,删除时间这四个字段在每个模型中均有,因此我将其抽出单独建立模型。而这四个字段gorm也给了单独的结构体gorm.Model。单独抽出的原因是因为后面生成的json数据更好处理。
3.数据处理函数的实现
这部分主要是一些增删改查的代码的实现
基本处理函数
// repo/base.go基础代码实现
package repo
import "gorm.io/gorm"
var DB *gorm.DB
type IBaseRepo interface {
Insert(model any) error
Delete(model any, id int) error
Updates(model, value any) error
FirstById(model any, id int) error
First(model, where any) error
GetPages(model, where, out any, page, size int, total *int64) error
}
type BaseRepo struct{}
func (baseRepo *BaseRepo) Insert(model any) error {
return DB.Create(model).Error
}
func (baseRepo *BaseRepo) Delete(model any, id int) error {
return DB.Delete(model, &id).Error
}
func (baseRepo *BaseRepo) Updates(model, value any) error {
return DB.Model(model).Updates(value).Error
}
func (baseRepo *BaseRepo) FirstById(model any, id int) error {
return DB.First(model, id).Error
}
func (baseRepo *BaseRepo) First(model any, where any) error {
return DB.Where(where).First(model).Error
}
func (baseRepo *BaseRepo) GetPages(model, where, out any, page, size int, total *int64) error {
db := DB.Model(model).Where(where)
err := db.Count(total).Error
if err != nil {
return err
}
if *total == 0 {
return nil
}
return db.Offset((page - 1) * size).Limit(size).Find(out).Error
}
用户相关的处理函数
// repo/user.go 用户相关的处理逻辑
package repo
import "easy-note/models"
type IUserRepo interface {
InsertUser(user *models.User) bool
CheckUser(username, password string) bool
GetUserById(id int) *models.User
}
type UserRepo struct {
Repo BaseRepo
}
func (userRepo *UserRepo) InsertUser(user *models.User) bool {
err := userRepo.Repo.Insert(user)
if err != nil {
return false
}
return true
}
func (userRepo *UserRepo) CheckUser(username, password string) bool {
var user *models.User
err := userRepo.Repo.First(user, models.User{Username: username, Password: password})
if err != nil || user == nil {
return false
}
return true
}
func (userRepo *UserRepo) GetUserById(id int) *models.User {
var user *models.User
err := userRepo.Repo.FirstById(user, id).Error
if err != nil {
return nil
}
return user
}
笔记相关的处理函数
package repo
import (
"easy-note/models"
)
type INoteRepo interface {
InsertNote(note *models.NoteInfo) bool
DeleteNote(id int) bool
UpdateNote(note *models.NoteInfo) bool
GetNoteById(id int) *models.NoteInfo
ListNote(page, size int, total *int64, where any) []*models.NoteInfo
}
type NoteRepo struct {
Repo BaseRepo
}
func (noteRepo *NoteRepo) InsertNote(note *models.NoteInfo) bool {
err := noteRepo.Repo.Insert(note)
if err != nil {
return false
}
return true
}
func (noteRepo *NoteRepo) DeleteNote(id int) bool {
err := noteRepo.Repo.Delete(&models.NoteInfo{}, id)
if err != nil {
return false
}
return true
}
func (noteRepo *NoteRepo) UpdateNote(note *models.NoteInfo) bool {
err := noteRepo.Repo.Updates(&models.NoteInfo{}, note)
if err != nil {
return false
}
return true
}
func (noteRepo *NoteRepo) GetNoteById(id int) *models.NoteInfo {
var note *models.NoteInfo
err := noteRepo.Repo.FirstById(note, id)
if err != nil {
return nil
}
return note
}
func (noteRepo *NoteRepo) ListNote(page, size int, total *int64, where any) []*models.NoteInfo {
var notes []*models.NoteInfo
err := noteRepo.Repo.GetPages(&models.NoteInfo{}, where, notes, page, size, total)
if err != nil {
return nil
}
return notes
}
先写这么多,剩下的部分预计在几天内写完。
未完待续