【Go实战 | 电商平台】(4) 用户注册

文章目录

  • 1. 编写路由
  • 2. 注册路由
  • 3. 注册接口
    • 3.1 service层
    • 3.2 api层
    • 3.2 serializer
  • 4. 注册服务

用到的包

github.com/gin-contrib/sessions

github.com/gin-contrib/sessions/cookie

github.com/gin-gonic/gin

1. 编写路由

  • 新建一个WSGI应用程序实例。
	r := gin.Default()
  • 设置全局变量store
	store := cookie.NewStore([]byte("something-very-secret"))
  • 在路由中使用中间件调用store
	r.Use(sessions.Sessions("mysession", store))

2. 注册路由

  • 分一个基础路由组
v1 := r.Group("api/v1")
  • 在这个基础路由编写用户注册路由
v1 := r.Group("api/v1")
{//用户操作v1.POST("user/register", api.UserRegister)
}

3. 注册接口

3.1 service层

  • service先创建一个user.go

在这里插入图片描述

  • 再在service层上编写用户注册服务的结构体
//UserRegisterService 管理用户注册服务
type UserRegisterService struct {Nickname  string `form:"nickname" json:"nickname" binding:"required,min=2,max=10"`UserName  string `form:"user_name" json:"user_name" binding:"required,min=5,max=15"`Password  string `form:"password" json:"password" binding:"required,min=8,max=16"`
}
  • 在service上编写用户注册register方法
func (service *UserRegisterService) Register() {}

在这里插入图片描述

3.2 api层

  • api层创建user.go

在这里插入图片描述

  • 申请一个 UserRegisterService用户注册服务对象。
var userRegisterService service.UserRegisterService

但是这个服务我们还没有写,先把这个接口写完,再把这个服务补上。

  • 上下文绑定数据
c.ShouldBind(&userRegisterService)
  • 调用这个服务的register方法
res := userRegisterService.Register()
  • 返回这个服务的处理结果
c.JSON(200, res)
  • api 层的用户注册服务全部代码
func UserRegister(c *gin.Context) {var userRegisterService service.UserRegisterService //相当于创建了一个UserRegisterService对象if err := c.ShouldBind(&userRegisterService); err == nil {res := userRegisterService.Register()//调用这个对象中的Register方法。c.JSON(200, res)} else {c.JSON(200, ErrorResponse(err))logging.Info(err)}
}
  • 创建一个common.go文件, 进行错误的返回

在这里插入图片描述

//返回错误信息 ErrorResponse
func ErrorResponse(err error) serializer.Response {if ve, ok := err.(validator.ValidationErrors); ok {for _, e := range ve {field := conf.T(fmt.Sprintf("Field.%s", e.Field))tag := conf.T(fmt.Sprintf("Tag.Valid.%s", e.Tag))return serializer.Response{Status: 40001,Msg:    fmt.Sprintf("%s%s", field, tag),Error:  fmt.Sprint(err),}}}if _, ok := err.(*json.UnmarshalTypeError); ok {return serializer.Response{Status: 40001,Msg:    "JSON类型不匹配",Error:  fmt.Sprint(err),}}return serializer.Response{Status: 40001,Msg:    "参数错误",Error:  fmt.Sprint(err),}
}

3.2 serializer

  • 创建一个基础的序列化返回结构体
// Response 基础序列化器
type Response struct {Status int         `json:"status"`Data   interface{} `json:"data"`Msg    string      `json:"msg"`Error  string      `json:"error"`
}

在这里插入图片描述

4. 注册服务

接下来我们就可以编写register()注册服务了

  • 先对传过来的用户名进行验证,查看是否已经存在了
	model.DB.Model(&model.User{}).Where("user_name=?",service.UserName).Count(&count)if count == 1 {code = e.ErrorExistUserreturn serializer.Response{Status: code,Msg:    e.GetMsg(code),}}
  • 再对密码进行加密
	if err := user.SetPassword(service.Password); err != nil {logging.Info(err)code = e.ErrorFailEncryptionreturn serializer.Response{Status: code,Msg:    e.GetMsg(code),}}

注意: 我们可以直接再model/user.go下编写密码加密方法

const (PassWordCost        = 12         //密码加密难度Active       string = "active"   //激活用户
)//SetPassword 设置密码
func (user *User) SetPassword(password string) error {bytes, err := bcrypt.GenerateFromPassword([]byte(password), PassWordCost)if err != nil {return err}user.PasswordDigest = string(bytes)return nil
}
  • 确认无误之后对用户进行创建
	if err := model.DB.Create(&user).Error; err != nil {logging.Info(err)code = e.ErrorDatabasereturn serializer.Response{Status: code,Msg:    e.GetMsg(code),}}

服务层中用户注册的完整代码

func (service *UserRegisterService) Register() serializer.Response {var user model.Uservar count intcode := e.SUCCESSmodel.DB.Model(&model.User{}).Where("user_name=?",service.UserName).Count(&count)if count == 1 {code = e.ErrorExistUserreturn serializer.Response{Status: code,Msg:    e.GetMsg(code),}}user = model.User{Nickname: service.Nickname,UserName: service.UserName,Status:   model.Active,}//加密密码if err := user.SetPassword(service.Password); err != nil {logging.Info(err)code = e.ErrorFailEncryptionreturn serializer.Response{Status: code,Msg:    e.GetMsg(code),}}user.Avatar = "http://q1.qlogo.cn/g?b=qq&nk=294350394&s=640"//创建用户if err := model.DB.Create(&user).Error; err != nil {logging.Info(err)code = e.ErrorDatabasereturn serializer.Response{Status: code,Msg:    e.GetMsg(code),}}return serializer.Response{Status: code,Msg:    e.GetMsg(code),}
}

下一章中,我们编写用户登录的业务逻辑。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue电商项目--登录与注册

登录注册静态组件 刚刚报了一个错误,找不到图片的资源 assets文件夹--放置全部组件共用静态资源 在样式当中也可以使用符号【src别名】。切记在前面加上 注册业务上 先修改原先的接口成这个按钮 然后把input框里面的数据保存到data中 注册业务下 就是点击获…

C++面经

编译、链接与库编译单文件编译多文件编译 动态链接与静态链接静态链接动态链接 面向对象c⾯向对象 三大特性封装继承多态静态多态(模板或重载)动态多态(面向对象、继承、多态、虚函数) 面向对象和面向过程语言的区别面向过程面向对…

GPT-4,究竟强大在哪里?

2023年3月15日,OpenAI向全世界进行了GPT-4的发布会,整个世界都为之沸腾了。GPT-4究竟是有多厉害?为什么能造成这么大的影响?今天小灰来仔细讲解一下。 基础配置 先说说基础配置,之前小灰分享过,GPT-3.5有17…

【EasyPoi实战系列】Spring Boot集成EasyPoi - 第467篇

历史文章(文章累计460) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 6…

解密Prompt系列1. Tunning-Free Prompt:GPT2 GPT3 LAMA AutoPrompt

借着ChatGPT的东风,我们来梳理下prompt范式的相关模型。本系列会以A Systematic Survey of Prompting Methods in Natural Language Processing这篇综述为基础,分门别类的整理下这几年比较有代表性的prompt模型。或许你还以其他形式看到过prompt概念&…

未来式人工智能教育在国内的现状

无论是高空户外还是深海水下,或者火灾、地震现场,危险环境让身处其中的工作人员面临巨大威胁。而正在兴起的特种机器人,有望代替人类,在危险现场完成任务。格物斯坦表示:特种机器人,是机器人的一个重要分支…

chatgpt赋能python:Python如何隐藏进程

Python如何隐藏进程 介绍 进程是指运行中的程序在操作系统中的一个实例。在计算机系统中,进程通常都可以被用户或者其他程序所看到。然而,有时候我们需要隐藏进程,比如保护敏感信息或者防止恶意攻击。 Python是一种高级编程语言&#xff0…

UP主高薪裸辞转型独立开发者;LLM权威学习路线图;游戏开发最全AI工具盘点;LOGO制作保姆教程 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🤖 Hugging Face 全球开源AI游戏开发挑战赛,7月8日开始 Open Source AI Game Jam 是 Hugging Face 举办的首场开源游戏开发挑…

ChatGPT到底是什么,带领大家详细解读!

前言 ChatGPT的强大程度相信很多同学都已经体验过了,无论是编写文章,问答,写代码展现除了非常惊艳的能力。一定喜欢技术的同学一定好奇,ChatGPT是如何做到“全知全能”,即会写文章,又会表达总结&#xff0…

IDE + ChatGPT,这款编辑器真的做到可以自动写代码了!

介绍 Cursor 是集成了 GPT-4 的 IDE 工具,目前免费并且无需 API Key,支持 Win、Mac、Linux 平台,可以按要求生成代码,或者让 AI 帮助优化代码,分析代码。Cursor目前已经集成了openai的GPT-4,它或将彻底改变…

CSDN周赛第30期题目解析(天然气定单、小艺读书、买苹果、圆桌)

CSDN周赛第30期,我应试成绩“0”分。试着对天然气定单、小艺读书、买苹果🍎、圆桌四个题目,完成算法解析。 (本文获得CSDN质量评分【91】) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖…

猿人学逆向比赛第四题-gRPC题解 | Go版本

大家好,我是TheWeiJun,欢迎来到我的公众号。在现代互联网中,某些网站、App会使用gRPC进行数据传输,以加强数据的安全性和保密性。然而,逆向加密算法并不是一件简单的事情。本文将探讨如何逆向猿人学App的gRPC协议&…

ChatGPT 扩展来自动化你的生活

除非您一直生活在岩石下,否则您可能知道 ChatGPT 如何改变业务以及我们的工作和沟通方式。您只需访OpenAI 的网站即可解锁 ChatGPT 的强大功能。 但是,如果我们不仅可以在其官方网站上使用 ChatGPT,还可以在 微信、Excel、Word 以及更多地方使…

chatGPT的到来,是否意味新时代的来临

chatGPT是一种人工智能技术驱动的自然语言处理工具,是一种基于语言对话场景的语言模型,它使用了Transformer神经网络架构,也是GPT-3.5架构,功能具备上知天文下知地理,还可以进行撰写邮件、视频脚本、文案、翻译、代码等…

windows的软件能在鸿蒙系统运行吗,如果鸿蒙系统能不能兼容windows的所有应用软件,会让你惊喜吗...

如果华为能够让鸿蒙系统兼容Windows系统上所有的应用,那华为鸿蒙系统可能已经超脱时代了。 你得知道在两个不同平台,硬件和内核不同的情况下,华为如果想兼容所有的平台,可能所花费的人力,财力会更巨大。我们知道鸿蒙系…

为什么鸿蒙内核是安卓,鸿蒙系统发布,为什么有人说其为安卓换壳?

2021年4月,鸿蒙系统内测版正式面向消费者开放,而我由于在校读书也变没有时间去专门去进行鸿蒙系统的深度体验只是回来后简单的体验一下 首先我要说的是-鸿蒙它……不是安卓套壳!!!我之前在评论区经常看见有人说鸿蒙就是…

华为p10 鸿蒙,全面上线!华为鸿蒙新消息传来,这是要彻底替换安卓

自从手机出现后,手机操作系统就掌握在少数几个厂商手中,在功能机时代,诺基亚几乎掌控了塞班系统,而微则掌握Windows mobie系统。 苹果开启智能手机时代后,手机系统主要被苹果和谷歌掌控。其中,苹果的IOS系统…

鸿蒙OS到底是不是Android套皮?(不多说,看源码!)

人生就像一场旅行,不必在乎目的地。在乎的,是沿途的风景以及看风景的心情。 #正文 某人曾说「没有调查就没有发言权」 最近鸿蒙系统关注度好高,支持与反对、看好和看衰、「自主的全场景分布式系统」和「Android套壳」各执一词,吵…

鸿蒙会干掉安卓吗?刚刚 ,首款搭载华为鸿蒙OS终端正式亮相!

点击“开发者技术前线”,选择“星标?” 13:21 在看|星标|留言, 真爱 编辑:可可| 来源:华为,创业邦 8月9日,也就是昨天下午,华为鸿蒙OS终于揭开了面纱。 8月10日下午,在华为开发者大…

谷歌失算了,华为的鸿蒙系统在海外市场撕开了一大口子

近日媒体报道指出华为手机在北方某国的销量暴涨三倍,成为该国出货量增速第一的手机品牌,带动鸿蒙系统用户激增,这也是鸿蒙系统在海外市场首次取得突破,对谷歌的安卓系统造成了新一轮的挑战。 由于众所周知的原因,谷歌对…