go-micro微服务domain层开发示例详解
作者:夏沫的梦 发布时间:2024-04-26 17:25:04
一 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层包含功能:
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层开发
在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配置、注册中心的代码编写了,更多关于go-micro微服务domain层的资料请关注脚本之家其它相关文章!
来源:https://juejin.cn/post/7186490052279533626
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- mysql select into给多个字段变量赋值在into之后顺序写上要赋值的变量就行SELECT
- 前言不知道什么是版本库的,扇自己两个大嘴巴;知道但不用的,扇自己四个大嘴巴。快扇去。你真扇了?那你是个大傻瓜。扇什么扇,有扇自己的功夫,还不
- 01 目标假设我们要实现一个blog系统,在该系统中有以下两个结构体:type Category struct {  
- 函数原型:DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=
- 目前pytorch中的交叉熵损失函数主要分为以下三类,我们将其使用的要点以及场景做一下总结。类型一:F.cross_entropy()与to
- 接着上一篇,统一思想,遵循标准。如何遵循标准,其实标准有很多,结构标准,表现标准,行为标准。选择标准规范,就优先选择W3C推荐的标准。结构标
- 本文实例为大家分享了js省市县 * 级联特效的实现代码,供大家参考,具体内容如下主要思想1.省改变,市改变,并初始化县2.市改变,县改变htm
- 我们可用下面的代码将服务器端变量转换为客户端的JavaScrit变量:<%@ Language=VBScript
- 为了网站的安全,肯定不让上传php文件,如果有人进入你的后台,上传了一个php文件,你的网站源码,全部救变成他的了,直接打包看你的代码。所以
- 表结构很简单CREATE TABLE `oplogs` (`id` int(10) unsigned NOT NULL AUTO_INCRE
- 简介程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作,一般是将数字化为二进制数后进行操作
- Matlab函数对应关系(Numpy)首先给出官网链接,其中详细说明了在Python下如何用Numpy实现Matlab下相同的函数功能。博主
- 注:代码用 jupyter notebook跑的,分割线线上为代码,分割线下为运行结果1.导入库生成缺失值通过pandas生成一个6行4列的
- 常用分支首先分享一下我们的分支规范,然后再介绍摸索出的打tag的规范。mastermaster : 主分支 , 最终在master分支对外发
- 1.简介TensorFlow是一个由Google Brain团队开发的开源软件库,用于各种人工智能和机器学习应用,包括神经网络、深度学习、强
- 如何使用Iframe实现本页提交?例:chunfeng.html< html>< head>&n
- 实例如下:# bytes object b = b"example" # str object s = "ex
- 核心导出作业的 代码 和 作业备份是相似的 代码如下:alter PROC DumpJob (@job VARCHAR(100)
- 一 下载安装驱动官方文档https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo下载地址ht
- Python列表和字典前面我们了解了 “大O表示法” 以及对不同的算法的评估,下面来讨论下 Python 两种内置数据类型有关的各种操作的大