(5)go-micro微服務domain層開發

2023-01-09 12:00:18

一 domain層介紹說明

  • domain層專注於資料庫資料領域開發,我們把資料庫相關操作全部寫在domain層。

  • model層:資料表欄位定義與開發

  • repository層:資料庫資料CURD操作

  • service層:資料庫相關業務操作

  • 對於複雜的業務操作,這樣可以使業務邏輯更加清晰,有利於後期開發與維護。

二 model層開發

  • 在model目錄下新建 user.go 檔案
package model

import (
   "time"
)

type User struct {
   //主鍵
   ID int64 `gorm:"primary_key;not_null;auto_increment" json:"id"`
   UserID int64 `gorm:"unique_index;not_null" json:"user_id"`
   UserName string `gorm:"unique_index;not_null" json:"username"`
   FirstName string `json:"first_name"`
   LastName string `json:"last_name"`
   PassWord string `json:"password"`
   Permission int64 `json:"permission"`
   CreateDate time.Time `json:"create_date"`
   UpdateDate time.Time `json:"update_date"`
   IsActive int64 `json:"is_active"`
   Email string `json:"email"`
}

三 repository層開發

  • 在repository層開發目錄下新建 user_repository.go 檔案

  • repository層包含功能:

    1. InitTable 初始化資料表

    2. FindUserByName 根據使用者名稱稱查詢使用者資訊

    3. FindUserByID 根據使用者ID查詢使用者資訊

    4. CreateUser 建立使用者

    5. DeleteUserByID 根據使用者ID刪除使用者

    6. UpdateUser 更新使用者資訊

    7. FindAll 查詢所有使用者

    8. ResetPwd 重置密碼

    9. GetPermission 獲取許可權

    10. UpdatePermission 修改許可權

    11. EnableUser 啟用賬號

    12. DisableUser 禁用賬號

package repository

import (
   "account/domain/model"
   "github.com/jinzhu/gorm"
)

type IUserRepository interface {
   // InitTable 初始化資料表
   InitTable() error
   // FindUserByName 根據使用者名稱稱查詢使用者資訊
   FindUserByName(string) (*model.User, error)
   // FindUserByID 根據使用者ID查詢使用者資訊
   FindUserByID(int64) (*model.User, error)
   // CreateUser 建立使用者
   CreateUser(*model.User) (int64, error)
   // DeleteUserByID 根據使用者ID刪除使用者
   DeleteUserByID(int64) error
   // UpdateUser 更新使用者資訊
   UpdateUser(*model.User) error
   // FindAll 查詢所有使用者
   FindAll() ([]model.User, error)
   // ResetPwd 重置密碼
   ResetPwd(int64, string) error
   // GetPermission 獲取許可權
   GetPermission(int64) (int64, error)
   // UpdatePermission 修改許可權
   UpdatePermission(int64, int64) error
   // EnableUser 啟用賬號
   EnableUser(int64) error
   // DisableUser 禁用賬號
   DisableUser(int64) error
}

// NewUserRepository 建立UserRepository
func NewUserRepository(db *gorm.DB) IUserRepository {
   return &UserRepository{mysqlDb: db}
}

type UserRepository struct {
   mysqlDb *gorm.DB
}

// InitTable 初始化表
func (u *UserRepository) InitTable() error {
   return u.mysqlDb.CreateTable(&model.User{}).Error
}

// FindUserByName 根據使用者名稱稱查詢使用者資訊
func (u *UserRepository) FindUserByName(name string) (user *model.User, err error) {
   user = &model.User{}
   return user, u.mysqlDb.Where("username=?", name).Find(user).Error
}

// FindUserByID 根據使用者ID查詢使用者資訊
func (u *UserRepository) FindUserByID(userID int64) (user *model.User, err error) {
   user = &model.User{}
   return user, u.mysqlDb.Where("user_id=?", userID).Find(user).Error
}

// CreateUser 建立使用者
func (u *UserRepository) CreateUser(user *model.User) (userID int64, err error) {
   return user.ID, u.mysqlDb.Create(user).Error
}

// DeleteUserByID 刪除使用者
func (u *UserRepository) DeleteUserByID(userID int64) error {
   return u.mysqlDb.Where("user_id=?", userID).Delete(&model.User{}).Error
}

// UpdateUser 更新使用者資訊
func (u *UserRepository) UpdateUser(user *model.User) error {
   return u.mysqlDb.Model(user).Update(&user).Error
}

// FindAll 查詢所有使用者
func (u *UserRepository) FindAll() (userAll []model.User, err error) {
   return userAll, u.mysqlDb.Find(&userAll).Error
}

// ResetPwd 重置密碼
func (u *UserRepository) ResetPwd(userID int64, Pwd string) error {
   return u.mysqlDb.Where("user_id=?",userID).Update(model.User{PassWord:Pwd}).Error
}

// GetPermission 獲取許可權
func (u *UserRepository) GetPermission(userID int64) (Permission int64, err error) {
   var user model.User
   return user.Permission,u.mysqlDb.Where("user_id=?",userID).Find(user).Error
}

// UpdatePermission 修改許可權
func (u *UserRepository) UpdatePermission(userID int64, Permission int64) error {
   return u.mysqlDb.Where("user_id=?",userID).Update(model.User{Permission:Permission}).Error
}

// EnableUser 啟用賬號
func (u *UserRepository) EnableUser(userID int64) error {
   return u.mysqlDb.Where("user_id=?",userID).Update(&model.User{IsActive: 1}).Error
}

// DisableUser 禁用賬號
func (u *UserRepository) DisableUser(userID int64) error {
   return u.mysqlDb.Where("user_id=?",userID).Update(&model.User{IsActive: 0}).Error
}

四 service層開發

  • 在service目錄下新建 user_service.go 檔案

  • service層包含功能:

    1. AddUser 插入使用者

    2. DeleteUser 刪除使用者

    3. UpdateUser 更新使用者

    4. FindUserByName 根據使用者名稱稱查詢使用者資訊

    5. FindUserByID 根據使用者ID查詢使用者資訊

    6. CheckPwd 比對賬號密碼是否正確

    7. ResetPwd 重置密碼

    8. GetPermission 獲取許可權

    9. UpdatePermission 修改許可權

    10. EnableUser 啟用賬號

    11. DisableUser 禁用賬號

package service

import (
   "account/domain/model"
   "account/domain/repository"
   "errors"
   "golang.org/x/crypto/bcrypt"
)

type IUserService interface {
   // AddUser 插入使用者
   AddUser(user *model.User) (int64, error)
   // DeleteUser 刪除使用者
   DeleteUser(int64) error
   // UpdateUser 更新使用者
   UpdateUser(user *model.User, isChangePwd bool) (err error)
   // FindUserByName 根據使用者名稱稱查詢使用者資訊
   FindUserByName(string) (*model.User, error)
   // FindUserByID 根據使用者ID查詢使用者資訊
   FindUserByID(int64) (*model.User, error)
   // CheckPwd 比對賬號密碼是否正確
   CheckPwd(userName string, pwd string) (isOk bool, err error)
   // ResetPwd 重置密碼
   ResetPwd(int64, string) error
   // GetPermission 獲取許可權
   GetPermission(int64) (int64, error)
   // UpdatePermission 修改許可權
   UpdatePermission(int64, int64) error
   // EnableUser 啟用賬號
   EnableUser(int64) error
   // DisableUser 禁用賬號
   DisableUser(int64) error
}

// NewUserService 建立範例
func NewUserService(userRepository repository.IUserRepository) IUserService {
   return &UserService{UserRepository: userRepository}
}

type UserService struct {
   UserRepository repository.IUserRepository
}

// GeneratePassword 加密使用者密碼
func GeneratePassword(userPassword string) ([]byte, error) {
   return bcrypt.GenerateFromPassword([]byte(userPassword), bcrypt.DefaultCost)
}

// ValidatePassword 驗證使用者密碼
func ValidatePassword(userPassword string, hashed string) (isOk bool, err error) {
   if err = bcrypt.CompareHashAndPassword([]byte(hashed), []byte(userPassword)); err != nil {
      return false, errors.New("密碼比對錯誤")
   }
   return true, nil
}

// AddUser 插入使用者
func (u *UserService) AddUser(user *model.User) (userID int64, err error) {
   pwdByte, err := GeneratePassword(user.PassWord)
   if err != nil {
      return user.ID, err
   }
   user.PassWord = string(pwdByte)
   return u.UserRepository.CreateUser(user)
}

// DeleteUser 刪除使用者
func (u *UserService) DeleteUser(userID int64) error {
   return u.UserRepository.DeleteUserByID(userID)
}

// UpdateUser 更新使用者
func (u *UserService) UpdateUser(user *model.User, isChangePwd bool) (err error) {
   if isChangePwd {
      pwdByte, err := GeneratePassword(user.PassWord)
      if err != nil {
         return nil
      }
      user.PassWord = string(pwdByte)
   }
   return u.UserRepository.UpdateUser(user)
}

// FindUserByName 根據使用者名稱稱查詢使用者資訊
func (u *UserService) FindUserByName(userName string) (user *model.User, err error) {
   return u.UserRepository.FindUserByName(userName)
}

// FindUserByID 根據使用者名稱稱查詢使用者資訊
func (u *UserService) FindUserByID(userId int64) (user *model.User, err error) {
   return u.UserRepository.FindUserByID(userId)
}

// CheckPwd 比對賬號密碼是否正確
func (u *UserService) CheckPwd(userName string, pwd string) (isOk bool, err error) {
   user, err := u.UserRepository.FindUserByName(userName)
   if err != nil {
      return false, err
   }
   return ValidatePassword(pwd, user.PassWord)
}

// ResetPwd 重置密碼
func (u *UserService) ResetPwd(userID int64, pwd string) error {
   return u.UserRepository.ResetPwd(userID,pwd)
}

// GetPermission 獲取許可權
func (u *UserService) GetPermission(userID int64) (permission int64, err error) {
   return u.UserRepository.GetPermission(userID)
}

// UpdatePermission 修改許可權
func (u *UserService) UpdatePermission(userID int64, permission int64) error {
   return u.UserRepository.UpdatePermission(userID,permission)
}

// EnableUser 啟用賬號
func (u *UserService) EnableUser(userID int64) error {
   return u.UserRepository.EnableUser(userID)
}

// DisableUser 禁用賬號
func (u *UserService) DisableUser(userID int64) error {
   return u.UserRepository.DisableUser(userID)
}

五 最後

  • 至此,go-micro微服務domain層開發工作就正式完成。

  • 接下來就開始consul設定、註冊中心的程式碼編寫了,希望大家關注博主和關注專欄,第一時間獲取最新內容,每篇部落格都乾貨滿滿。

歡迎大家加入 夏沫の夢的學習交流群 進行學習交流經驗,點選 夏沫の夢學習交流