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

news2024/11/17 16:18:14

文章目录

  • 一 domain层介绍说明
  • 二 model层开发
  • 三 repository层开发
  • 四 service层开发
  • 五 最后

一 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配置、注册中心的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。

欢迎大家加入 夏沫の梦的学习交流 进行学习交流经验,点击 夏沫の梦学习交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/149712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JIMDB 大KEY治理

大KEY判定条件 单个String类型的Key大小达到20KB并且OPS高 单个String达到100KB 集合类型的Key总大小达到1MB 集合类型的Key中元素超过8000个 大KEY影响 严重影响 QPS 、TP99 等指标,对大Key进行的慢操作会导致后续的命令被阻塞,从而导致一系列慢查询。…

前端——周总结系列一

1 JS数据类型判断 typeof:判断JS数据类型,返回一个字符串类型 注:在 javaScript 中,如果二进制的前三位都为 0 的话,会判定为是 Object 类型。 null 的存储二进制是 000 ,也是前三位,所以系统…

面试官:说说Event Loop事件循环、微任务、宏任务

前言 JS是一门单线程语言,单线程就意味着,所有的任务需要排队,前一个任务结束,才会执行下一个任务。这样所导致的问题是:如果JS执行的时间过长,这样就会造成页面的渲染不连贯,导致页面渲染加载…

SOLIDWORKS有哪些好用的插件丨慧德敏学

SOLIDWORKS软件本身就带有很多插件,比如ToolBox、motion、routing、simulation等,都是直接嵌入到软件内部使用的。同时由于其API接口是完全开放的,因此还支持第三方插件的使用,SW第三方插件有很多,常用的有比如SolidKi…

React源码解读之ReactFiber

开始之前,先讲一下该文章能帮你解决哪些问题? facebook为什么要使用重构ReactReact Fiber是什么React Fiber的核心算法 - react是如何中断重启任务的react fiber部分源码简化版 前言 该文章涉及的源码部分基于React v17.0.2 why React Fiber 浏览器…

Spring常见面试题

Spring面试问题汇总①⭐Spring是什么对AOP的理解⭐对IOC的理解⭐如何实现IOC容器SpringBoot、SpringMVC、Spring的区别⭐⭐ApplicationContext和BeanFactory的区别⭐⭐⭐SpringBean的生命周期⭐⭐解释下Spring支持的几种bean的作用域⭐⭐Spring框架中的单例bean是线程安全的吗&…

数据库视图注意事项

视图(view)是一种虚拟存在的表,其内容由查询定义 本身并不包含数据。 它是作为一个select语法查询到的结果集,以此为基表创建的一张虚拟表 基表 行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成 …

【ReadPaper学术交流会】结构重参数化

提出结构重参数化的论文RepVGG 重参数化已经用在了各个领域的各个方面:比如YOLO-V6,YOLO-V7,可以autoperform YOLO-V6和YOLO-V7的一个PP-YOLO 1 我们想要一个像VGG一样的全是3*3卷积,一卷到底的结构,这样的结构并行度高、速度快而且省显存。…

剑指offer----C语言版----第十三天

目录 1. 删除链表的节点 1.1 题目描述 1.2 Leetcode解题的思路一(双指针) 1.3 Leetcode解题的思路二(单指针) 1.4 剑指offer上的原题 1. 删除链表的节点 原题链接:剑指 Offer 18. 删除链表的节点 - 力扣&#xff…

【python】类型约束(类型提示的作用)

文章目录前言一、类型系统1.动态类型2.静态类型3.鸭子类型二、变量注解1.变量注解的语法2.注解鸭子类型三、复杂(复合型)变量的注解1.引入2.难题3. Any的妙用4.类型变量5.类型Optional总结前言 python是一种解释型强类型动态语言python3.5以前是没有类型…

【Python】基于高德地图API的坐标转换函数

【Python】基于高德地图API的坐标转换函数 API申请: lbs.amap.com/api/webservice/guide/api/convert/产品介绍 坐标转换是一类简单的HTTP接口,能够将用户输入的非高德坐标(GPS坐标、mapbar坐标、baidu坐标)转换成高德坐标。 …

【学习笔记之Linux】权限之目录权限与默认权限

权限概念 一件事是否允许被谁“做”,这就是权限。权限 用户 文件属性。   在Linux上,用户分为普通用户和root。root是超级管理员 ≈ 天王老子,只能够有一个。root的命令提示符是#;普通用户通过root创建,可以有多个…

【Android安全】Protobuf原理与解析

protobuf 简介 抓包时看到header中有这个: content-type: application/x-protobuf说明包的content是以protobuf格式编码的 关于protobuf的介绍,可以参考: https://techkranti.com/what-is-protobuf-explained-for-hackers/ protobuf 的背…

C++——类和对象(一)

目录 一. 面向过程和面向对象 二. 类的引入 三. 类的定义 1.结构 2.类的作用域 3.类的两种定义方式 四. 类的访问限定符及封装 1.引入 2.访问限定符 3.封装 五. 类的实例化 六. 类对象模型 七. this指针 1.this指针的引出 2.this指针的特性 一. …

JavaScript设计模式之面向对象编程

为了深入地学习 javascript ,奔着一名标准 Web 开发人员的标准,想要深入了解一下面向对象的编程思想,提高自己模块化开发的能力,编写可维护、高效率、可拓展的代码,最近一直拜读 《JavaScript设计模式》 ,对…

【LeetBook】二叉树

参考资料:LeetBook / 二叉树 前言 差不多的解题思路就是dfs能够解决,其次就是bfs。 主要是递归的解法。 一刷就是了解了 解题的 思路 后序再补一些二叉树的题再刷一刷 目录树的介绍树的遍历前序遍历中序遍历后序遍历层序遍历(广度优先搜索)递归解决问题“…

【FPGA】中值滤波处理BMP图片

文章目录一、中值滤波二、BMP图片格式三、功能实现1.代码设计思路2.shift IP核3.代码实现四、结果测试参考博客一、中值滤波 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。 中值滤波是基于排序统计理论…

【GO】K8s 管理系统项目[API部分--Ingress]

K8s 管理系统项目[API部分–Ingress] 1. 接口实现 service/dataselector.go import ("sort""strings""time"appsv1 "k8s.io/api/apps/v1"corev1 "k8s.io/api/core/v1"nwv1 "k8s.io/api/networking/v1" )// Ing…

JavaScript client screen offset scroll

文章目录JavaScript client screen offset scrollclientX和clientY、offsetX和offsetY、screenX和screenY、pageX和pageYclientWidth、offsetWidth、scrollWidthwindow.outerWidth、window.innerWidth、document.documentElement.clientWidthJavaScript client screen offset s…

【开发工具】Gradle的安装 与 配置环境变量

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Gradle安装配置教程一、安装Gradle二、配置环境…