(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配置、注册中心的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。
欢迎大家加入 夏沫の梦的学习交流群 进行学习交流经验,点击
(5)go-micro微服务domain层开发的更多相关文章
- 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。
微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...
- 基于DDD的微服务设计和开发实战
你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...
- 驱动领域DDD的微服务设计和开发实战
你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...
- maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目
项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...
- [Abp vNext微服务实践] - 业务开发
前几篇分别介绍了abp vNext微服务框架.开发环境搭建和vue element admin前端框架接入,在vue element admin中实现用户角色管理基本功能后就可以开始进行业务开发了,本 ...
- Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台
Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud
- 微服务与敏捷开发(Scrum/Kanban)的核心思想之我见
微服务与敏捷开发(Scrum/Kanban)的核心思想之我见 关于"微服务"和"敏捷开发"的文章网络上有很多,所以这里不再重复叙述这些概念的解释和特点,而是 ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:2、让Kestrel支持绑定多个域名转发,替代Ngnix使用。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:3、微服务应用程序版本升级:全站升级和局部模块升级。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
随机推荐
- 使用FreeMarker配置动态模板
FreeMarker动态模板 目录 FreeMarker动态模板 前言 准备工作 FreeMarker 代码构建 项目结构 创建 Configuration 实例 调用 模板文件 调用结果 Tips ...
- 一篇文章带你了解轻量级Web服务器——Nginx简单入门
一篇文章带你了解轻量级Web服务器--Nginx简单入门 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器 在本篇中我们会简单介绍Nginx的特点,安装,相关指令使用以及配置信 ...
- Nginx反向代理实现Tomcat+Jpress和halo
一.利用Nginx反向代理Jpress+Tomcat 1.环境准备 服务器 IP地址 作用 系统版本 Proxy代理服务器 10.0.0.101 负载均衡Nginx Web服务器 Ubuntu2004 ...
- 设置CMD命令的初始目录
本文提供两种方式,第一种通过打开桌面上的快捷方式实现,第二种可以通过 CMD 命令直接进入. 快捷方式 "开始 ---> 程序 ---> 附件",右键单击 " ...
- Uniapp And Taro一些小测评
前情 最近公司准备新开发一个小程序项目,对于使用哪一款小程序框架有一些犹豫,我有过2年左右的uniapp项目开发经验,Taro在刚刚出来的时候有尝试过,经常莫名报错需要重启,在内心是有些偏向uniap ...
- Websocket集群解决方案
最近在项目中在做一个消息推送的功能,比如客户下单之后通知给给对应的客户发送系统通知,这种消息推送需要使用到全双工的websocket推送消息. 所谓的全双工表示客户端和服务端都能向对方发送消息.不使用 ...
- Java代码审计sql注入
java_sec_code 该项目也可以叫做Java Vulnerability Code(Java漏洞代码). 每个漏洞类型代码默认存在安全漏洞(除非本身不存在漏洞),相关修复代码在注释里.具体可查 ...
- 造个Python轮子,实现根据Excel生成Model和数据导入脚本
前言 最近遇到一个需求,有几十个Excel,每个的字段都不一样,然后都差不多是第一行是表头,后面几千上万的数据,需要把这些Excel中的数据全都加入某个已经上线的Django项目 这就需要每个Exce ...
- <三>使用类模板实现STL Vector
使用类模板实现STL Vector,点击查看代码 #include <iostream> using namespace std; template<typename T> c ...
- Windows之应用安装程序 —— winget
大家都用过Linux中的应用程序安装工具,如yum.apt.rpm等工具进行安装自己想要的一些工具或则软件之类的,当然Linux操作系统还是很强大的有很多类似的命令来安装我们所需要的程序,但是wind ...