domain層專注於資料庫資料領域開發,我們把資料庫相關操作全部寫在domain層。
model層:資料表欄位定義與開發
repository層:資料庫資料CURD操作
service層:資料庫相關業務操作
對於複雜的業務操作,這樣可以使業務邏輯更加清晰,有利於後期開發與維護。
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層開發目錄下新建 user_repository.go 檔案
repository層包含功能:
InitTable 初始化資料表
FindUserByName 根據使用者名稱稱查詢使用者資訊
FindUserByID 根據使用者ID查詢使用者資訊
CreateUser 建立使用者
DeleteUserByID 根據使用者ID刪除使用者
UpdateUser 更新使用者資訊
FindAll 查詢所有使用者
ResetPwd 重置密碼
GetPermission 獲取許可權
UpdatePermission 修改許可權
EnableUser 啟用賬號
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目錄下新建 user_service.go 檔案
service層包含功能:
AddUser 插入使用者
DeleteUser 刪除使用者
UpdateUser 更新使用者
FindUserByName 根據使用者名稱稱查詢使用者資訊
FindUserByID 根據使用者ID查詢使用者資訊
CheckPwd 比對賬號密碼是否正確
ResetPwd 重置密碼
GetPermission 獲取許可權
UpdatePermission 修改許可權
EnableUser 啟用賬號
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設定、註冊中心的程式碼編寫了,希望大家關注博主和關注專欄,第一時間獲取最新內容,每篇部落格都乾貨滿滿。