(5)go-micro微服务domain层开发

简介: (5)go-micro微服务domain层开发

一 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配置、注册中心的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
4月前
|
监控 算法 NoSQL
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
🌟蒋星熠Jaxonic:Go微服务限流熔断实践者。分享基于滑动窗口、令牌桶与自适应阈值的智能防护体系,助力高并发系统稳定运行。
Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
|
4月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
423 4
|
6月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
557 0
|
4月前
|
JavaScript 前端开发 Java
【GoWails】Go做桌面应用开发?本篇文章带你上手Wails框架!一步步带你玩明白前后端双端的数据绑定!
wails是一个可以让你使用Go和Web技术编写桌面应用的项目 可以将它看作Go的快并且轻量级的Electron替代品。可以使用Go的功能,并结合现代化UI完成桌面应用程序的开发
979 4
|
10月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
370 5
|
8月前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
435 61
|
7月前
|
IDE Java API
Java 17 新特性与微服务开发的实操指南
本内容涵盖Java 11至Java 17最新特性实战,包括var关键字、字符串增强、模块化系统、Stream API、异步编程、密封类等,并提供图书管理系统实战项目,帮助开发者掌握现代Java开发技巧与工具。
355 0
|
8月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
9月前
|
人工智能 数据可视化 JavaScript
颠覆开发效率!国内首个微服务编排框架Juggle开源啦!
Juggle是国内首个开源的微服务编排框架,专注于解决企业微服务进程中接口重复开发、系统对接复杂等问题。它提供零代码、低代码和AI增强功能,通过可视化拖拽快速组装简单API为复杂接口,支持多协议、多语言脚本和流程多版本管理。相比国外框架如Conductor,Juggle更贴合国内需求,具备高效开发、企业级可靠性及信创适配等优势,助力企业实现敏捷创新与数字化转型。
颠覆开发效率!国内首个微服务编排框架Juggle开源啦!
|
9月前
|
人工智能 缓存 安全
Go开发遇见的一次Data Race
本文通过一段 Go 语言代码示例,分析了并发编程中的数据竞争(Data Race)问题。代码实现了一个带缓存的内存存储系统,包含 `LRUCache` 和 `MemoryCache` 两个核心组件。尽管在 `MemoryCache` 的 `Set` 方法中加了锁保护,但由于直接调用 `LRUCache` 的 `GetLength` 方法时未加锁,导致底层数据结构在多 goroutine 环境下被同时读写,从而触发 Data Race。文章详细解析了问题根源,并提出了解决方案:为 `LRUCache` 的 `Add` 方法添加锁保护,确保并发安全。
117 1