(14)go-micro微服务服务层Handle开发

news2024/11/23 22:44:18

文章目录

  • 一 Handle层开发功能说明
      • 需要完成的服务开发功能:
      • 从哪找需要开发的功能
  • 二 代码编写
  • 三 最后

一 Handle层开发功能说明

需要完成的服务开发功能:

  1. 登录
  2. 注册
  3. 查询用户信息
  4. 修改信息
  5. 发送注册邮件
  6. 发送重置密码邮件
  7. 重置密码
  8. 获取权限
  9. 修改权限
  10. 退出账号
  11. 删除账号
  12. 禁用账号
  13. 启用账号

从哪找需要开发的功能

  • 找到proto/account/account.pb.micro.go文件,点击结构,点击AccountService
  • 此部分显示的服务功能需要我们重写完成

image.png

二 代码编写

  • 在handle/account.go文件中,先把原来的内容删掉(删掉函数即可)

  • 编写服务功能:

package handler

import (
   "account/common/mail"
   "account/common/snow_flake"
   "account/common/token"
   "account/common/utils"
   "account/domain/model"
   "account/domain/service"
   . "account/proto/account"
   "context"
   "errors"
   "fmt"
   "time"
)

type Account struct {
   AccountService service.IUserService
}

// Login 登录
func (a *Account) Login(ctx context.Context, req *LoginRequest, rsp *LoginResponse) error {
   userInfo, err := a.AccountService.FindUserByName(req.Username)
   isOk, err := a.AccountService.CheckPwd(req.Username, req.Password)
   if err != nil {
      return err
   }
   token2, err := token.GenToken(req.Username)
   if err != nil {
      return err
   }
   token.SetToken(req.Username, token2)
   rsp.IsSuccess = isOk
   rsp.Token = token2
   rsp.UserId = userInfo.UserID
   return nil
}

// Register 注册
func (a *Account) Register(ctx context.Context, req *RegisterRequest, rsp *RegisterResponse) error {
   var sf snow_flake.Snowflake
   userId := sf.NextVal()
   _, err := mail.CheckMail(req.RegisterRequest.Email, req.Code)
   if err != nil {
      return err
   }
   nowTime := time.Now()
   userRegister := &model.User{
      UserID:     userId,
      UserName:   req.RegisterRequest.Username,
      FirstName:  req.RegisterRequest.FirstName,
      LastName:   req.RegisterRequest.LastName,
      PassWord:   req.RegisterRequest.Password,
      Permission: 0,
      CreateDate: nowTime,
      UpdateDate: nowTime,
      IsActive:   1,
      Email:      req.RegisterRequest.Email,
   }
   _, err = a.AccountService.AddUser(userRegister)
   if err != nil {
      return err
   }
   mail.DelMail(req.RegisterRequest.Email)
   rsp.IsSuccess = true
   rsp.UserId = userId
   return nil
}

// GetUserInfo 查询用户信息
func (a *Account) GetUserInfo(ctx context.Context, req *UserIdRequest, rsp *UserInfoResponse) error {
   userInfo, err := a.AccountService.FindUserByID(req.UserId)
   if err != nil {
      return err
   }
   rsp = utils.UserForResponse(rsp, userInfo)
   fmt.Println(rsp)
   return nil
}

// UpdateUserInfo 修改信息
func (a *Account) UpdateUserInfo(ctx context.Context, req *UserInfoRequest, rsp *Response) error {
   var user *model.User
   err := utils.SwapTo(req, user)
   if err != nil {
      return err
   }
   isChangePwd := false
   if req.UserInfo.Password != "" {
      isChangePwd = true
   }
   if err = a.AccountService.UpdateUser(user, isChangePwd); err != nil {
      return err
   }
   rsp.Message = "修改信息成功"
   return nil
}

// SendRegisterMail 发送注册邮件
func (a *Account) SendRegisterMail(ctx context.Context, req *SendMailRequest, rsp *SendMailResponse) error {
   code, err := mail.SendRegisterMail(req.Email)
   if err != nil {
      return err
   }
   mail.SetMail(req.Email, code)
   rsp.Msg = "邮件发送成功"
   rsp.Code = code
   return nil
}

// SendResetPwdMail 发送重置密码邮件
func (a *Account) SendResetPwdMail(ctx context.Context, req *SendMailRequest, rsp *SendMailResponse) error {
   email := req.Email
   code, err := mail.SendResetPwdMail(email)
   if err != nil {
      return err
   }
   mail.SetMail(email, code)
   rsp.Msg = "邮件发送成功"
   return nil
}

// ResetPwd 重置密码
func (a *Account) ResetPwd(ctx context.Context, req *ResetPwdRequest, rsp *Response) error {
   userInfo, err := a.AccountService.FindUserByID(req.UserId)
   if err != nil {
      return err
   }
   code, err := mail.GetMail(userInfo.Email)
   if err != nil {
      return err
   }
   if code != req.Code {
      return errors.New("验证码错误")
   }
   if err := a.AccountService.ResetPwd(req.UserId, req.Password); err != nil {
      return err
   }
   rsp.Message = "重置密码成功"
   return nil
}

// GetUserPermission 获取权限
func (a *Account) GetUserPermission(ctx context.Context, req *UserIdRequest, rsp *GetPermissionResponse) error {
   permission, err := a.AccountService.GetPermission(req.UserId)
   if err != nil {
      return err
   }
   rsp.Permission = permission
   return nil
}

// UpdateUserPermission 修改权限
func (a *Account) UpdateUserPermission(ctx context.Context, req *UpdatePermissionRequest, rsp *Response) error {
   if err := a.AccountService.UpdatePermission(req.UserId, req.Permission); err != nil {
      return err
   }
   rsp.Message = "修改权限成功"
   return nil
}

// Logout 退出账号
func (a *Account) Logout(ctx context.Context, req *UserIdRequest, rsp *Response) error {
   userInfo, err := a.AccountService.FindUserByID(req.UserId)
   if err != nil {
      return err
   }
   _, err = token.GenToken(userInfo.UserName)
   if err != nil {
      return errors.New("账号未登录!")
   }
   token.DelToken(userInfo.UserName)
   rsp.Message = "退出账号成功"
   return nil
}

// DelUser 删除账号
func (a *Account) DelUser(ctx context.Context, req *UserIdRequest, rsp *Response) error {
   if err := a.AccountService.DeleteUser(req.UserId); err != nil {
      return err
   }
   rsp.Message = "账号删除成功"
   return nil
}

// DisableUser 禁用账号
func (a *Account) DisableUser(ctx context.Context, req *UserIdRequest, rsp *Response) error {
   if err := a.AccountService.DisableUser(req.UserId); err != nil {
      return err
   }
   rsp.Message = "账号禁用成功"
   return nil
}

// EnableUser 启用账号
func (a *Account) EnableUser(ctx context.Context, req *UserIdRequest, rsp *Response) error {
   if err := a.AccountService.EnableUser(req.UserId); err != nil {
      return err
   }
   rsp.Message = "账号启用成功"
   return nil
}
  • 至此,handle层开发完毕

三 最后

  • 至此,go-micro微服务项目服务层Handle开发工作就正式完成。

  • 接下来就开始main.go的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。

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

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

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

相关文章

【计算机视觉】梯度消失和爆炸以及解决方法

问题 梯度消失无论是笔试还是面试都是常客了,其实对应于梯度消失,还有一个梯度爆炸的概念,这又是什么导致的呢?下面我们将根据公式推导来解释何为梯度消失与梯度爆炸。 梯度消失和梯度爆炸的表现 网络层数越多,模型训练的时候便越容易出现 梯度消失(gradient vanish) 和…

史上最全| 14种自动化分拣系统合集

导语大家好,我是智能仓储物流技术研习社的社长,你的老朋友,老K。新书上市《智能物流系统构成与技术实践》2023年度-厂商宣传合作位--->点击详情本文为研习社原创,违规转载必究01移栽式02偏转轮式03扫臂式04滑靴式05侧向翻转06推…

C++设计模式(3)——抽象工厂模式

抽象工厂模式 亦称: Abstract Factory 意图 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。 问题 假设你正在开发一款家具商店模拟器。 你的代码中包括一些类, 用于表示: …

Vue3系列二:如何实现对响应式数据的代理

上一篇文章中,我们讲解了 Vue3 中对响应式系统的实现,本章节会更进一步的从数据层面分享 Vue3 中对响应式数据是如何进行代理的,本文主要从引用类型数据和基本类型数据两个方面进行讲解。 实现数据代理的基础 理解 Proxy 和 Reflect 首先&…

26.Isaac教程--导航算法

导航算法 本节详细介绍导航算法。 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html 文章目录导航算法全局路径规划器规划器模型可见性图算法优化器轨迹规划器全局路径规划器 Isaac 框架中的全局规划器问题被分解为三类:规划器模型、…

SpringBoot使用Swagger2

SpringBoot使用Swagger21.引入swagger依赖2.添加swagger配置类3.测试Controller4.测试5.swagger的注解Api注解ApiOperation注解ApiImplicitParam、ApiImplicitParams注解ApiParam注解ApiResponse、ApiResponses注解ResponseHeader注解ApiModel、ApiModelProperty注解6.更多1.引…

Redis 分布式锁实现文章集锦

前言近两年来微服务变得越来越热门,越来越多的应用部署在分布式环境中,在分布式环境中,数据一致性是一直以来需要关注并且去解决的问题,分布式锁也就成为了一种广泛使用的技术,常用的分布式实现方式为Redis&#xff0c…

PDF压缩在线怎么操作?这几个操作谁还不知道

我们在工作里经常处理非常多的文件,如果每个文件都要储存到设备上是非常困难的,因为这需要占用大量的内存,所以我们需要将PDF文件进行压缩,这样就可以释放我们设备的储存空间,不过对于很多人来说,压缩文件并…

自学Java篇之JFrame创建《石头迷阵小游戏》

自学Java篇之JFrame创建《石头迷阵小游戏》 根据黑马程序员java教程自学完java基础,觉得石头迷阵小游戏案例具有一定的编程练习价值,记录之。 最终效果: 案例主要思想流程: ​ 主要是思想是创建一个4*4的二维数组data&#xff…

【openGauss实战5】表管理及CURD

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA工作经验 一位上进心十足的【大数据领域博主】!😜&#x1f61…

汽车网络技术概述

车辆总线是一个专门的内部通信网络,将车辆(如汽车、公共汽车、火车、工业或农业车辆、船舶或飞机)内的部件相互连接。在电子学中,总线只是一个将多个电气或电子设备连接在一起的设备。车辆控制的特殊要求,如保证信息传…

数据分析-深度学习 Pytorch Day7

图像识别:CIFAR10图形识别1.CIFAR10数据集共有60000张彩色图像,这些图像式32*32*3,分为10个类,每个类6000张2.这里面有50000张用于训练,构成5个训练批,每一批10000张图;另外10000张用于测试&…

vhdx中的win10进行大版本系统升级

文章目录前言普通的win10大版本iso升级方式vhdx中的win10大版本升级方式难点分析 - 无法在虚拟驱动器上安装windows解决方案 - HyperV升级vhdx win10过程效果图hyperV虚机创建mbr引导启动项hyperV虚机设置在hyperV中升级过程图问题集锦问题一:hyverV虚机中升级报错&…

力扣刷题记录——561. 数组拆分、566. 重塑矩阵、575. 分糖果

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——561. 数组拆分、566. 重塑矩阵、575. 分…

IDEA远程调试

1 概述 原理:本机和远程主机的两个 VM 之间使用 Debug 协议通过 Socket 通信,传递调试指令和调试信息。 被调试程序的远程虚拟机:作为 Debug 服务端,监听 Debug 调试指令。jdwp是Java Debug Wire Protocol的缩写。 调试程序的本…

初识redis

1.初识Redis Redis是一种键值型的NoSql数据库,这里有两个关键字: 键值型 NoSql 其中键值型,是指Redis中存储的数据都是以key、value对的形式存储,而value的形式多种多样,可以是字符串、数值、甚至json:…

HTTPS一定可靠吗?

HTTPS一定可靠吗?中间人伪装服务器首先我们先看看客户端是如何验证证书的?数字证书签发和验证流程客户端校验服务端数字证书的过程如何出现中间人伪装服务器成服务器的情况?避免该情况中间人伪装服务器 客户端向服务端发起HTTPS建立连接请求时…

你知道吗?python lxml 库也能用于操作 svg 图片

在大多数场景中,我们都用 lxml 库解析网页源码,但你是否知道,lxml 库也是可以操作 svg 图片的。我们可以使用 lxml 中的 etree 模块来解析 SVG 文件,然后使用 SVG 中的各种元素和属性来进行操作。 python lxml 库操作 svg 图片lxm…

传输层协议:TCP协议(上)——协议结构、主要特点以及应用场景

简介 传输控制协议(英语:Transmission Control Protocol,缩写:TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传…

xubuntu系统偶发自动登出

项目场景: 系统:xubuntu-16.04.3-desktop 问题描述 使用xubuntu系统期间,在root用户下进行相关开发,突然系统会回到普通用户登录界面,需要输入密码进入到普通用户下   它会终止所有打开的应用程序和进程&#xff0…