(14)go-micro微服务服务层Handle开发
一 Handle层开发功能说明
需要完成的服务开发功能:
- 登录
- 注册
- 查询用户信息
- 修改信息
- 发送注册邮件
- 发送重置密码邮件
- 重置密码
- 获取权限
- 修改权限
- 退出账号
- 删除账号
- 禁用账号
- 启用账号
从哪找需要开发的功能
- 找到proto/account/account.pb.micro.go文件,点击结构,点击AccountService
- 此部分显示的服务功能需要我们重写完成
二 代码编写
在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的代码编写了,希望大家关注博主和关注专栏,第一时间获取最新内容,每篇博客都干货满满。
欢迎大家加入 夏沫の梦的学习交流群 进行学习交流经验,点击
(14)go-micro微服务服务层Handle开发的更多相关文章
- 微服务平台(Micro Service Platform : MSP)旨在提供一个集开发、测试、运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效。
微服务平台(Micro Service Platform : MSP)旨在提供一个集开发.测试.运维于一体的开发者专属平台,让开发者能快速构建或使用微服务,让开发更简单,让运维更高效. MSP采用业界 ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:7、微服务节点的监控与告警。
系统目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 开源地址:https://github.com/cyq1162/Taurus.MVC 本系列第一篇:Tauru ...
- maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目
项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...
- Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台
Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud
- 微服务与敏捷开发(Scrum/Kanban)的核心思想之我见
微服务与敏捷开发(Scrum/Kanban)的核心思想之我见 关于"微服务"和"敏捷开发"的文章网络上有很多,所以这里不再重复叙述这些概念的解释和特点,而是 ...
- [Abp vNext微服务实践] - 业务开发
前几篇分别介绍了abp vNext微服务框架.开发环境搭建和vue element admin前端框架接入,在vue element admin中实现用户角色管理基本功能后就可以开始进行业务开发了,本 ...
- 基于DDD的微服务设计和开发实战
你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...
- 驱动领域DDD的微服务设计和开发实战
你是否还在为微服务应该拆多小而争论不休?到底如何才能设计出收放自如的微服务?怎样才能保证业务领域模型与代码模型的一致性?或许本文能帮你找到答案. 本文是基于 DDD 的微服务设计和开发实战篇,通过借鉴 ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:1、微服务应用程序常规部署实现多开,节点扩容。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- Taurus.MVC 微服务框架 入门开发教程:项目部署:2、让Kestrel支持绑定多个域名转发,替代Ngnix使用。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
随机推荐
- 完全背包问题 —— 贪心优化 DP 范围
题意: 现在有 \(2n+1\) 个物品(\(n\le 300\)),体积分别为 \(-n,-n+1,\dots,-1,0,1,\dots,n\),第 \(i\) 个物品有 \(a_i\) 个,求选出 ...
- k8s健康检查报错
编辑yaml去掉健康检查 kubectl edit deployment deploymentname 服务恢复
- mybatis-自定义映射resultMap
自定义映射resultMap resultMap处理字段和属性的映射关系 resultMap:设置自定义映射 属性: id:表示自定义映射的唯一标识,不能重复 type:查询的数据要映射的实体类的类型 ...
- Golang 和 Python 随机生成N位字符串
Golang: func RandomString(n int) string { var letters = []byte("ABCDEFGHIGKLMNOPQRSTUVWXYZabcde ...
- Python基础部分:8、for循环和range的使用
目录 一.while循环补充说明 1.死循环 2.嵌套及全局标志位 二.for...循环 1.for...循环特点 2.for...循环语法结构 三.range方法 1.什么是range 2.不同版本 ...
- Go语言核心36讲04
我们已经知道,环境变量GOPATH指向的是一个或多个工作区,每个工作区中都会有以代码包为基本组织形式的源码文件. 这里的源码文件又分为三种,即:命令源码文件.库源码文件和测试源码文件,它们都有着不同的 ...
- kubeedge架构与核心设计---https://bbs.huaweicloud.com/webinar/100009
今天是kubeedge的第一节课,今天主要带大家回顾一下云原生和边缘计算的发展历程 然后我们会重点介绍一下kubeedge这个项目,他的设计背景和核心理念与我们整体的架构 首先是我们来简单回归一下云原 ...
- KubeEdge架构问题汇总
Q1 :KubeEdge云和边的数据协同有什么优势? A : K8s的原生架构中, Node (Kubelet) 是通过List-watch机制主动与Master通信.List-watch机制有几个 ...
- 【RocketMQ】顺序消息实现原理
全局有序 在RocketMQ中,如果使消息全局有序,可以为Topic设置一个消息队列,使用一个生产者单线程发送数据,消费者端也使用单线程进行消费,从而保证消息的全局有序,但是这种方式效率低,一般不使用 ...
- 零基础入门数据挖掘——二手车交易价格预测:baseline
零基础入门数据挖掘 - 二手车交易价格预测 赛题理解 比赛要求参赛选手根据给定的数据集,建立模型,二手汽车的交易价格. 赛题以预测二手车的交易价格为任务,数据集报名后可见并可下载,该数据来自某交易平台 ...