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

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: (14)go-micro微服务服务层Handle开发

一 Handle层开发功能说明

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

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


从哪找需要开发的功能

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


64.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的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。
相关文章
|
17天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
4天前
|
NoSQL 前端开发 测试技术
👀探秘微服务:从零开启网关 SSO 服务搭建之旅
单点登录(Single Sign-On,简称SSO)是一种认证机制,它允许用户只需一次登录就可以访问多个应用程序或系统。本文结合网关和SaToken快速搭建可用的Session管理服务。
29 8
|
23天前
|
弹性计算 持续交付 API
构建高效后端服务:微服务架构的深度解析与实践
在当今快速发展的软件行业中,构建高效、可扩展且易于维护的后端服务是每个技术团队的追求。本文将深入探讨微服务架构的核心概念、设计原则及其在实际项目中的应用,通过具体案例分析,展示如何利用微服务架构解决传统单体应用面临的挑战,提升系统的灵活性和响应速度。我们将从微服务的拆分策略、通信机制、服务发现、配置管理、以及持续集成/持续部署(CI/CD)等方面进行全面剖析,旨在为读者提供一套实用的微服务实施指南。
|
19天前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
21天前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
17天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
31 1
|
19天前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
38 1
|
20天前
|
负载均衡 监控 API
后端开发中的微服务架构实践与挑战
本文深入探讨了微服务架构在后端开发中的应用,分析了其优势和面临的挑战,并通过案例分析提出了相应的解决策略。微服务架构以其高度的可扩展性和灵活性,成为现代软件开发的重要趋势。然而,它同时也带来了服务间通信、数据一致性等问题。通过实际案例的剖析,本文旨在为开发者提供有效的微服务实施指导,以优化系统性能和用户体验。
|
20天前
|
弹性计算 Kubernetes API
构建高效后端服务:微服务架构的深度剖析与实践####
本文深入探讨了微服务架构的核心理念、设计原则及实现策略,旨在为开发者提供一套系统化的方法论,助力其构建灵活、可扩展且易于维护的后端服务体系。通过案例分析与实战经验分享,揭示了微服务在提升开发效率、优化资源利用及增强系统稳定性方面的关键作用。文章首先概述了微服务架构的基本概念,随后详细阐述了其在后端开发中的应用优势与面临的挑战,最后结合具体实例,展示了如何从零开始规划并实施一个基于微服务的后端项目。 ####
|
23天前
|
消息中间件 监控 API
后端开发中的微服务架构实践与挑战####
本文深入探讨了微服务架构在现代后端开发中的应用,分析了其优势、实施过程中的关键考虑因素及面临的挑战。不同于传统的单体应用,微服务通过拆分功能模块为独立服务,提升了系统的灵活性和可维护性。我们将从微服务的基本概念入手,逐步剖析其在真实场景下的应用案例,并讨论如何有效应对服务间通信、数据一致性等复杂问题,旨在为开发者提供一套实用的微服务落地指南。 ####
20 0