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

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

(5)go-micro微服务domain层开发的更多相关文章

  1. 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。

    微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...

  2. 基于DDD的微服务设计和开发实战

    你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...

  3. 驱动领域DDD的微服务设计和开发实战

    你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...

  4. maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目

    项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...

  5. [Abp vNext微服务实践] - 业务开发

    前几篇分别介绍了abp vNext微服务框架.开发环境搭建和vue element admin前端框架接入,在vue element admin中实现用户角色管理基本功能后就可以开始进行业务开发了,本 ...

  6. Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台

    Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud

  7. 微服务与敏捷开发(Scrum/Kanban)的核心思想之我见

    微服务与敏捷开发(Scrum/Kanban)的核心思想之我见   关于"微服务"和"敏捷开发"的文章网络上有很多,所以这里不再重复叙述这些概念的解释和特点,而是 ...

  8. Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  9. Taurus.MVC 微服务框架 入门开发教程:项目部署:2、让Kestrel支持绑定多个域名转发,替代Ngnix使用。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

  10. Taurus.MVC 微服务框架 入门开发教程:项目部署:3、微服务应用程序版本升级:全站升级和局部模块升级。

    系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...

随机推荐

  1. day49-JDBC和连接池05

    JDBC和连接池05 11.BasicDAO 先来分析一个问题 前面我们使用了Apache-DBUtils和Druid简化了JDBC开发,但仍存在以下不足: SQL语句是固定的,不能通过参数传入,通用 ...

  2. 0025:2011年NOIp普及组真题——瑞士轮题解

    题目链接:https://www.luogu.com.cn/problem/P1309 如果是新手可能马上会想到sort排序,每比一次就排一次,但是这样的时间复杂度有点高,只有60分: 这是因为每次比 ...

  3. 7.httprunner-pytest风格用例

    用例设计原则 py文件名以test_开头或者_test结尾 函数名以test_开头 类名以Test开头,并且不能有init初始化方法 所有的包pakege必须有_init_.py文件   pychar ...

  4. 【原创】All in One i.MXRT1050/RT1020 SPI Flash Algorithm for J-Flash

    2020年,这个给大家一种很漫长的恍惚感的一年,终于是过去了.这一年我们很多新的人生第一次就这么被发生了,第一次居家办公这么长时间(很多人肥膘都长了不少,我却瘦了2斤,不知是工作太积极了还是被家里小怪 ...

  5. Codeforces Round #827 (Div. 4) A-G

    比赛链接 A 题解 知识点:模拟. 时间复杂度 \(O(1)\) 空间复杂度 \(O(1)\) 代码 #include <bits/stdc++.h> #define ll long lo ...

  6. 题解 UVA439 骑士的移动 Knight Moves

    前言 最近板子题刷多了-- 题意 一个 \(8\times 8\) 的棋盘,问马从起点到终点的最短步数为多少. \(\sf Solution\) 要求最短路径嘛,显然 bfs 更优. 读入 这个读入处 ...

  7. Java多线程-线程生命周期(一)

    如果要问我Java当中最难的部分是什么?最有意思的部分是什么?最多人讨论的部分是什么?那我会毫不犹豫地说:多线程. Java多线程说它难,也不难,就是有点绕:说它简单,也不简单,需要理解的概念很多,尤 ...

  8. Oracle数据库的导出和导入

    本次数据库的导入导出操作是导出公司环境的Oracle数据库,再导入本地数据库,采用impdp和expdp命令进行导入导出操作. 一.导出52数据库 1.用system用户登录到数据库,查看是否有创建d ...

  9. Https Webservice接口的免证书调用

    目录 前言 思路 方案 Axis调用 HttpClient调用 参考链接 前言 在调用https协议的Webservice接口时,如果没有做证书验证,一般会报javax.net.ssl.SSLHand ...

  10. go GMP

    动态栈 操作系统的线程一般都有固定的栈内存(通常为2MB),而 Go 语言中的 goroutine 非常轻量级,一个 goroutine 的初始栈空间很小(一般为2KB),所以在 Go 语言中一次创建 ...