国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
【Go實(shí)戰(zhàn) | 電商平臺(tái)】(4) 用戶注冊(cè)

文章目錄

用到的包

github.com/gin-contrib/sessions

github.com/gin-contrib/sessions/cookie

github.com/gin-gonic/gin

1. 編寫(xiě)路由

  • 新建一個(gè)WSGI應(yīng)用程序?qū)嵗?/li>
r := gin.Default()
  • 設(shè)置全局變量store
store := cookie.NewStore([]byte("something-very-secret"))
  • 在路由中使用中間件調(diào)用store
r.Use(sessions.Sessions("mysession", store))

2. 注冊(cè)路由

  • 分一個(gè)基礎(chǔ)路由組
v1 := r.Group("api/v1")
  • 在這個(gè)基礎(chǔ)路由編寫(xiě)用戶注冊(cè)路由
v1 := r.Group("api/v1")
{
//用戶操作
v1.POST("user/register", api.UserRegister)
}

3. 注冊(cè)接口

3.1 service層

  • service先創(chuàng)建一個(gè)user.go

  • 再在service層上編寫(xiě)用戶注冊(cè)服務(wù)的結(jié)構(gòu)體
//UserRegisterService 管理用戶注冊(cè)服務(wù)
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上編寫(xiě)用戶注冊(cè)register方法
func (service *UserRegisterService) Register() {

}

3.2 api層

  • api層創(chuàng)建user.go

  • 申請(qǐng)一個(gè) UserRegisterService用戶注冊(cè)服務(wù)對(duì)象。
var userRegisterService service.UserRegisterService

但是這個(gè)服務(wù)我們還沒(méi)有寫(xiě),先把這個(gè)接口寫(xiě)完,再把這個(gè)服務(wù)補(bǔ)上。

  • 上下文綁定數(shù)據(jù)
c.ShouldBind(&userRegisterService)
  • 調(diào)用這個(gè)服務(wù)的register方法
res := userRegisterService.Register()
  • 返回這個(gè)服務(wù)的處理結(jié)果
c.JSON(200, res)
  • api 層的用戶注冊(cè)服務(wù)全部代碼
func UserRegister(c *gin.Context) {
var userRegisterService service.UserRegisterService 
//相當(dāng)于創(chuàng)建了一個(gè)UserRegisterService對(duì)象
if err := c.ShouldBind(&userRegisterService); err == nil {
res := userRegisterService.Register()
//調(diào)用這個(gè)對(duì)象中的Register方法。
c.JSON(200, res)
} else {
c.JSON(200, ErrorResponse(err))
logging.Info(err)
}
}
  • 創(chuàng)建一個(gè)common.go文件, 進(jìn)行錯(cuò)誤的返回

//返回錯(cuò)誤信息 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:    "參數(shù)錯(cuò)誤",
Error:  fmt.Sprint(err),
}
}

3.2 serializer

  • 創(chuàng)建一個(gè)基礎(chǔ)的序列化返回結(jié)構(gòu)體
// Response 基礎(chǔ)序列化器
type Response struct {
Status int         `json:"status"`
Data   interface{} `json:"data"`
Msg    string      `json:"msg"`
Error  string      `json:"error"`
}

4. 注冊(cè)服務(wù)

接下來(lái)我們就可以編寫(xiě)register()注冊(cè)服務(wù)了

  • 先對(duì)傳過(guò)來(lái)的用戶名進(jìn)行驗(yàn)證,查看是否已經(jīng)存在了
model.DB.Model(&model.User{}).Where("user_name=?",service.UserName).Count(&count)
if count == 1 {
code = e.ErrorExistUser
return serializer.Response{
Status: code,
Msg:    e.GetMsg(code),
}
}
  • 再對(duì)密碼進(jìn)行加密
if err := user.SetPassword(service.Password); err != nil {
logging.Info(err)
code = e.ErrorFailEncryption
return serializer.Response{
Status: code,
Msg:    e.GetMsg(code),
}
}

注意: 我們可以直接再model/user.go下編寫(xiě)密碼加密方法

const (
PassWordCost        = 12         //密碼加密難度
Active       string = "active"   //激活用戶
)

//SetPassword 設(shè)置密碼
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
}
  • 確認(rèn)無(wú)誤之后對(duì)用戶進(jìn)行創(chuàng)建
if err := model.DB.Create(&user).Error; err != nil {
logging.Info(err)
code = e.ErrorDatabase
return serializer.Response{
Status: code,
Msg:    e.GetMsg(code),
}
}

服務(wù)層中用戶注冊(cè)的完整代碼

func (service *UserRegisterService) Register() serializer.Response {
var user model.User
var count int
code := e.SUCCESS
model.DB.Model(&model.User{}).Where("user_name=?",service.UserName).Count(&count)
if count == 1 {
code = e.ErrorExistUser
return 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.ErrorFailEncryption
return serializer.Response{
Status: code,
Msg:    e.GetMsg(code),
}
}
user.Avatar = "http://q1.qlogo.cn/g?b=qq&nk=294350394&s=640"
//創(chuàng)建用戶
if err := model.DB.Create(&user).Error; err != nil {
logging.Info(err)
code = e.ErrorDatabase
return serializer.Response{
Status: code,
Msg:    e.GetMsg(code),
}
}
return serializer.Response{
Status: code,
Msg:    e.GetMsg(code),
}
}

下一章中,我們編寫(xiě)用戶登錄的業(yè)務(wù)邏輯。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
實(shí)時(shí)檢測(cè)微信域名防紅攔截檢測(cè)API-最新騰訊域名屏蔽檢測(cè)官方接口
[系列] Go - 統(tǒng)一定義 API 錯(cuò)誤碼
ANN: DataSnap-like Client-Server JSON RESTful Services in Delphi 7-2010
Android客戶端獲取服務(wù)器的json數(shù)據(jù)(二)
thinkphp5.0 助手函數(shù)的使用
php最新微信域名攔截檢測(cè)api源碼
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服