简易笔记的简易实现(1)模型的定义与数据处理 | 青训营笔记

51 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第5天

前言

在 long long ago(也就10天吧),我介绍了在后端开发时常用的三大框架——gormhertzkitex,并简要说明了上节课所介绍的项目。今天我们来实现一个单体的应用。

此项目的代码已开源,lhou/easy-note,欢迎访问和提issue。如果能给个star就更好了。

项目介绍

简易笔记——一个使用gormhertzkitex的笔记后端项目。

开发前准备

在正式开发前,需要进行两项准备工作——模型的定义与开发环境的搭建。

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. 安装开发环境(参考这篇文章
  2. 安装框架。由于今天的开发用不到微服务,因此,不安装kitex。(参考这篇文章

正式开发

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
}

先写这么多,剩下的部分预计在几天内写完。

未完待续