精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

字節(jié)跳動(dòng) Golang 微服務(wù)框架 Hertz 集成 Gorm 實(shí)戰(zhàn)

開(kāi)發(fā) 前端
我們體驗(yàn)了 Hertz 集成 Gorm 的基本操作,涵蓋了用戶的創(chuàng)建、查詢、更新和刪除接口。在 Golang 生態(tài)中,雖然框架沒(méi)有 Java 完善,但 Hertz 帶來(lái)了簡(jiǎn)便的解決方案,有助于開(kāi)發(fā)者快速上手。

hello,大家好,我是千羽。

圖片圖片

上一篇,講了《字節(jié)跳動(dòng) Golang 微服務(wù) HTTP 框架 Hertz》入門,今天我們就通過(guò)一個(gè)實(shí)戰(zhàn)項(xiàng)目,來(lái)體驗(yàn) Hertz 和 Gorm 的集成。

在 Golang 開(kāi)發(fā)中,許多框架和功能不像 Java 那么成熟,需要開(kāi)發(fā)者自己實(shí)現(xiàn)。而字節(jié)跳動(dòng)開(kāi)源的 Hertz 框架,則提供了豐富的功能,堪稱 Golang 版的 Spring Boot。

Step 1:Fork Hertz 官方 Demo

首先,將官方的 Hertz 示例倉(cāng)庫(kù) fork 到自己的 GitHub 倉(cāng)庫(kù),方便后續(xù)操作:

圖片圖片

然后,將項(xiàng)目 clone 到本地,按照官方文檔操作。

圖片圖片

具體倉(cāng)庫(kù)地址:https://github.com/cloudwego/hertz-examples/tree/main/bizdemo/hertz_gorm

Step 2:配置與啟動(dòng)項(xiàng)目

官方 Readme 提供了啟動(dòng)指導(dǎo),根據(jù)文檔說(shuō)明進(jìn)行以下步驟:

  • 使用 Docker 啟動(dòng) MySQL 容器:
cd bizdemo/hertz_gorm && docker-compose up
  • 連接 MySQL 確保數(shù)據(jù)庫(kù)正常運(yùn)行:

圖片圖片

  • 編譯并啟動(dòng)項(xiàng)目:
cd bizdemo/hertz_gorm
go build -o hertz_gorm && ./hertz_gorm

若啟動(dòng)成功,你將看到以下日志輸出:

HERTZ: HTTP server listening on address=[::]:8888

Step 3:接口調(diào)試

在項(xiàng)目啟動(dòng)后,我們可以逐一測(cè)試接口。Hertz 項(xiàng)目包含了一些基本的 CRUD 接口,方便我們進(jìn)行數(shù)據(jù)的操作和驗(yàn)證。

根據(jù)啟動(dòng)的日志,我們進(jìn)行各個(gè)接口驗(yàn)證

absolutePath=/v1/user/create/    
absolutePath=/v1/user/delete/:user_id 
absolutePath=/v1/user/query/        
absolutePath=/v1/user/update/:user_id  
absolutePath=/ping

1. /ping 接口測(cè)試

請(qǐng)求 URL: http://localhost:8888/ping

響應(yīng)示例:

{
    "message": "pong"
}

圖片圖片

2. 創(chuàng)建用戶接口 /v1/user/create/

請(qǐng)求 URL: http://localhost:8888/v1/user/create/

請(qǐng)求參數(shù):

{
    "name": "千羽",
    "gender": 1,
    "age": 18,
    "introduce": "程序員"
}

響應(yīng)示例:

{
    "code": 1,
    "msg": ""
}

圖片圖片

MySQL 查詢效果:

圖片圖片

3. 查詢用戶接口 /v1/user/query/

請(qǐng)求 URL: http://localhost:8888/v1/user/query/

圖片圖片

請(qǐng)求 URL: http://localhost:8888/v1/user/query/

請(qǐng)求參數(shù):

{
    "page": 1,
    "page_size":10,
    "keyword":"千羽"
}

響應(yīng)示例:

{
    "code": 1,
    "msg": "",
    "users": [
        {
            "user_id": 1,
            "name": "千羽",
            "gender": 1,
            "age": 18,
            "introduce": "程序員"
        }
    ],
    "total": 1
}

圖片圖片

3. 刪除用戶接口 /v1/user/delete/1

刪除,軟刪除,不會(huì)真正的刪除

圖片圖片

Step 4:代碼解析

創(chuàng)建用戶的邏輯 /v1/user/create/

Service 層:

// CreateUser .
// @router /v1/user/create/ [POST]
func CreateUser(ctx context.Context, c *app.RequestContext) {
 var err error
 var req user_gorm.CreateUserRequest
 err = c.BindAndValidate(&req)
 if err != nil {
  c.JSON(consts.StatusBadRequest, &user_gorm.CreateUserResponse{Code: user_gorm.Code_ParamInvalid, Msg: err.Error()})
  return
 }
 if err = mysql.CreateUser([]*model.User{
  {
   Name:      req.Name,
   Gender:    int64(req.Gender),
   Age:       req.Age,
   Introduce: req.Introduce,
  },
 }); err != nil {
  c.JSON(consts.StatusInternalServerError, &user_gorm.CreateUserResponse{Code: user_gorm.Code_DBErr, Msg: err.Error()})
  return
 }

 resp := new(user_gorm.CreateUserResponse)
 resp.Code = user_gorm.Code_Success
 c.JSON(consts.StatusOK, resp)
}

MySQL 層

func CreateUser(users []*model.User) error {
 return DB.Create(users).Error
}

查詢用戶的邏輯 /v1/user/query/

Service 層:

// QueryUser .
// @router /v1/user/query/ [POST]
func QueryUser(ctx context.Context, c *app.RequestContext) {
 var err error
 var req user_gorm.QueryUserRequest
 err = c.BindAndValidate(&req)
 if err != nil {
  c.JSON(consts.StatusBadRequest, &user_gorm.QueryUserResponse{Code: user_gorm.Code_ParamInvalid, Msg: err.Error()})
  return
 }

 users, total, err := mysql.QueryUser(req.Keyword, req.Page, req.PageSize)
 if err != nil {
  c.JSON(consts.StatusInternalServerError, &user_gorm.QueryUserResponse{Code: user_gorm.Code_DBErr, Msg: err.Error()})
  return
 }
 c.JSON(consts.StatusOK, &user_gorm.QueryUserResponse{Code: user_gorm.Code_Success, Users: pack.Users(users), Totoal: total})
}

MySQL 層:

func QueryUser(keyword *string, page, pageSize int64) ([]*model.User, int64, error) {
 db := DB.Model(model.User{})
 if keyword != nil && len(*keyword) != 0 {
  db = db.Where(DB.Or("name like ?", "%"+*keyword+"%").
   Or("introduce like ?", "%"+*keyword+"%"))
 }
 var total int64
 if err := db.Count(&total).Error; err != nil {
  return nil, 0, err
 }
 var res []*model.User
 if err := db.Limit(int(pageSize)).Offset(int(pageSize * (page - 1))).Find(&res).Error; err != nil {
  return nil, 0, err
 }
 return res, total, nil
}

更新用戶的邏輯 /v1/user/update/1

圖片圖片

Service 層:

// UpdateUser .
// @router /v1/user/update/:user_id [POST]
func UpdateUser(ctx context.Context, c *app.RequestContext) {
 var err error
 var req user_gorm.UpdateUserRequest
 err = c.BindAndValidate(&req)
 if err != nil {
  c.JSON(consts.StatusBadRequest, &user_gorm.UpdateUserResponse{Code: user_gorm.Code_ParamInvalid, Msg: err.Error()})
  return
 }

 u := &model.User{}
 u.ID = uint(req.UserID)
 u.Name = req.Name
 u.Gender = int64(req.Gender)
 u.Age = req.Age
 u.Introduce = req.Introduce

 if err = mysql.UpdateUser(u); err != nil {
  c.JSON(consts.StatusInternalServerError, &user_gorm.UpdateUserResponse{Code: user_gorm.Code_DBErr, Msg: err.Error()})
  return
 }

 c.JSON(consts.StatusOK, &user_gorm.UpdateUserResponse{Code: user_gorm.Code_Success})
}

mysql 層:

func UpdateUser(user *model.User) error {
 return DB.Updates(user).Error
}

刪除 /v1/user/delete/:user_id

刪除,軟刪除,不會(huì)真正的刪除

Service 層:

// DeleteUser .
// @router /v1/user/delete/:user_id [POST]
func DeleteUser(ctx context.Context, c *app.RequestContext) {
 var err error
 var req user_gorm.DeleteUserRequest
 err = c.BindAndValidate(&req)
 if err != nil {
  c.JSON(consts.StatusBadRequest, &user_gorm.DeleteUserResponse{Code: user_gorm.Code_ParamInvalid, Msg: err.Error()})
  return
 }
 if err = mysql.DeleteUser(req.UserID); err != nil {
  c.JSON(consts.StatusInternalServerError, &user_gorm.DeleteUserResponse{Code: user_gorm.Code_DBErr, Msg: err.Error()})
  return
 }

 c.JSON(consts.StatusOK, &user_gorm.DeleteUserResponse{Code: user_gorm.Code_Success})
}

mysql 層:

func DeleteUser(userId int64) error {
 return DB.Where("id = ?", userId).Delete(&model.User{}).Error
}

圖片圖片

總結(jié)

通過(guò)這個(gè)項(xiàng)目,我們體驗(yàn)了 Hertz 集成 Gorm 的基本操作,涵蓋了用戶的創(chuàng)建、查詢、更新和刪除接口。在 Golang 生態(tài)中,雖然框架沒(méi)有 Java 完善,但 Hertz 帶來(lái)了簡(jiǎn)便的解決方案,有助于開(kāi)發(fā)者快速上手。

參考文章:https://www.cloudwego.io/zh/docs/hertz/

責(zé)任編輯:武曉燕 來(lái)源: 程序員千羽
相關(guān)推薦

2024-11-13 11:02:03

微服務(wù)框架項(xiàng)目

2024-11-07 11:46:41

2022-06-22 06:49:39

Hertz開(kāi)源HTTP 框架

2022-10-14 14:44:04

字節(jié)跳動(dòng)ByteTechHTTP 框架

2022-05-17 17:18:40

Kite字節(jié)跳動(dòng)微服務(wù)框架

2021-09-09 09:05:30

開(kāi)源字節(jié)跳動(dòng)CloudWeGo

2024-08-20 09:59:22

2023-11-17 12:11:26

GORMGo Web

2023-01-03 16:54:27

字節(jié)跳動(dòng)深度學(xué)習(xí)

2022-11-02 10:02:24

BitSail字節(jié)跳動(dòng)數(shù)據(jù)集成

2022-08-25 18:48:29

字節(jié)跳動(dòng)CSS開(kāi)源

2024-01-18 08:31:22

go實(shí)現(xiàn)gorm框架

2018-12-17 16:39:20

Golang微服務(wù)

2018-12-17 16:44:49

Golang微服務(wù)

2018-12-17 16:48:05

Golang微服務(wù)

2023-04-19 16:51:54

分布式Primus開(kāi)源

2022-11-24 09:01:26

HTTPHertz架構(gòu)

2024-09-25 15:57:56

2022-04-09 14:45:02

微服務(wù)常見(jiàn)概念Spring

2023-10-18 11:56:17

開(kāi)源AI
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲天堂一二三| 性少妇bbw张开| 久色国产在线| 成人天堂资源www在线| 九九热在线精品视频| 日韩精品国产一区| 欧美日韩国产观看视频| 国产日韩欧美一区二区三区乱码| 国产精品久久久久久久久久三级| 欧美精品久久久久久久久46p| 国产不卡精品| 欧美视频不卡中文| 亚洲精品在线免费看| 国内自拍第二页| 男人添女人下部高潮视频在线观看| av成人动漫在线观看| 国产精品人人做人人爽| 免费一级a毛片夜夜看| 亚洲欧美成人vr| 欧美精品丝袜中出| 国产精品免费入口| 91蜜桃在线视频| 久久久亚洲综合| 97在线中文字幕| 中文字幕在线看人| 亚洲国产免费| 久久精品国产久精国产思思| 国产精品探花一区二区在线观看| 成人永久在线| 欧美制服丝袜第一页| 粉嫩高清一区二区三区精品视频| 中文字幕免费观看| 影音先锋久久久| 日韩视频第一页| 亚洲色成人网站www永久四虎 | 亚洲欧美一区二区三| 久久se这里有精品| 国产精品88a∨| 亚洲午夜久久久久久久久红桃| 国产精品久久久久久av公交车| 色狠狠色噜噜噜综合网| 欧美激情视频免费看| av大片在线| 国产精品二区一区二区aⅴ污介绍| 精品一区二区三区视频日产| www.日本在线观看| 激情深爱一区二区| 国产精品一区二区在线| 色老头一区二区| 久久成人国产| 亚洲天堂av高清| 亚洲视频在线播放免费| 91精品尤物| 欧美tk—视频vk| 永久免费看片在线观看| 久久国产精品免费一区二区三区| 亚洲另类在线视频| 公共露出暴露狂另类av| 自拍视频在线网| 中文字幕不卡在线观看| 四虎永久国产精品| www.av在线播放| 中文字幕免费观看一区| 色一情一乱一伦一区二区三区丨| 你懂的视频在线| 久久这里只有精品6| 国产一区二区三区四区五区加勒比| 国产成人在线视频观看| 亚洲激情午夜| 青草成人免费视频| 国产污视频网站| 奇米亚洲午夜久久精品| 国产欧美日韩专区发布| 97超碰人人草| 国产精品综合久久| 国产精品二区二区三区| 日本免费网站在线观看| 91在线精品一区二区三区| 欧美精品亚洲| 伊人免费在线| 亚洲美腿欧美偷拍| 日韩a∨精品日韩在线观看| 牛牛精品一区二区| 欧美在线|欧美| 亚洲18在线看污www麻豆 | 亚洲免费成人| 日韩免费观看视频| 亚洲性在线观看| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 欧美一区二区视频在线观看| 国产精品偷伦视频免费观看了| 美女网站色精品尤物极品姐弟| 亚洲精选在线观看| 福利视频第一页| 尤物在线精品| 国产精品久久久久久一区二区 | av色在线观看| 在线亚洲高清视频| 久久aaaa片一区二区| 色综合久久中文| 日韩一级黄色av| 国产在线观看免费av| 久久激情婷婷| 99视频网站| 理论在线观看| 亚洲一区二区在线视频| 在线视频日韩一区| 澳门精品久久国产| 中文字幕不卡av| 日本三级理论片| 精品一区二区成人精品| 精品国产免费一区二区三区| 免费在线你懂的| 日韩欧美国产免费播放| 精产国品一二三区| 黄色不卡一区| 国内精品小视频在线观看| 亚洲自拍偷拍另类| 91视频91自| 欧美乱做爰xxxⅹ久久久| 国产精品久久亚洲不卡| 日韩免费高清av| 美女网站视频色| 免费看黄裸体一级大秀欧美| 999精品视频一区二区三区| eeuss影院在线播放| 午夜欧美2019年伦理| 欧美一级小视频| 欧美日韩久久精品| 欧美壮男野外gaytube| 国产富婆一级全黄大片| 欧美国产一区视频在线观看| 浮妇高潮喷白浆视频| 中文字幕日韩在线| 美日韩丰满少妇在线观看| 最近国语视频在线观看免费播放| 99精品视频在线播放观看| 少妇久久久久久被弄到高潮| 少妇高潮一区二区三区99| 一本色道久久88综合亚洲精品ⅰ| 日韩精品无码一区二区| 国产精品69毛片高清亚洲| 在线国产精品网| 日本国产欧美| 中文字幕成人在线| 久久精品五月天| 久久婷婷国产综合国色天香 | 一级二级黄色片| 久久伊人亚洲| 欧美日韩在线播放一区二区| 亚洲一区站长工具| 日韩成人在线网站| 久久国产精品系列| 99久久er热在这里只有精品66| 久久精品无码中文字幕| 日韩欧美一级| 九色精品免费永久在线| 国产福利资源在线| 亚洲综合色丁香婷婷六月图片| 青青草久久伊人| 久久久国产精品| 成人福利视频在线观看| 国产精品实拍| 日韩你懂的电影在线观看| 免费在线黄色片| 成人av资源站| 少妇高潮喷水久久久久久久久久| 自拍偷拍一区| 国产精品免费一区| 麻豆传媒在线免费| 制服丝袜亚洲播放| 国产一级片视频| 99久久国产免费看| 色悠悠久久综合网| 亚洲色图网站| 国产精品视频500部| 偷拍自拍在线看| 亚洲石原莉奈一区二区在线观看| 中文字幕在线播放不卡| 亚洲免费观看高清完整版在线观看熊| 无码国产精品一区二区高潮| 91久久午夜| 日韩久久久久久久久久久久久| 日韩久久一区| 久久久久亚洲精品国产| 男同在线观看| 91精品国产aⅴ一区二区| 精品在线视频免费| 国产偷国产偷精品高清尤物| 亚洲免费黄色录像| 亚洲国产精品一区| 午夜视频久久久| 一区二区三区视频播放| 日本精品视频网站| a级影片在线观看| 日韩精品免费在线视频| ,亚洲人成毛片在线播放| 亚洲电影第三页| 青青草自拍偷拍| 成人av网址在线| 超碰在线97免费| 激情欧美日韩| 亚洲人一区二区| 欧美成人一区在线观看| 成人国产亚洲精品a区天堂华泰| 国产经典三级在线| 色婷婷综合成人av| 日韩亚洲视频在线观看| 91精品国产综合久久精品麻豆 | 黄色欧美成人| 一区二区不卡在线视频 午夜欧美不卡'| swag国产精品一区二区| 国产精品偷伦免费视频观看的| tube8在线hd| 久久久999精品视频| 久草在现在线| 精品蜜桃在线看| 亚洲一二区视频| 精品国产成人av| 欧美日韩在线视频免费| 国产日韩欧美一区二区三区综合| 午夜视频在线观看国产| 国产在线一区二区综合免费视频| 国产成人久久777777| 伊人久久成人| 艳母动漫在线免费观看| 成人一二三区| 欧美日韩免费观看一区| 黄色美女久久久| 91亚洲精品丁香在线观看| 欧美高清你懂的| 国产福利精品视频| 在线观看欧美日韩电影| 97在线看免费观看视频在线观看| 成人免费网址| 久久视频国产精品免费视频在线| 国产1区2区3区在线| 精品视频www| 天天射天天操天天干| 精品国产电影一区二区| 国内老熟妇对白xxxxhd| 欧美一区二区网站| 99国产在线播放| 91麻豆精品国产91久久久| 亚洲视频久久久| 欧美视频在线观看一区| 五月婷婷激情五月| 欧美丝袜丝交足nylons图片| 亚洲 欧美 日韩 在线| 一本大道av伊人久久综合| 国产高清中文字幕| 欧美视频免费在线| 亚洲GV成人无码久久精品| 欧美视频一二三| 亚洲第一网站在线观看| 在线视频一区二区三区| 中文字幕你懂的| 欧美日韩成人一区二区| 国产又黄又爽视频| 91精品久久久久久久99蜜桃| 国产三级三级在线观看| 日韩精品一区二区三区老鸭窝| 精品免费久久久| 精品成人在线观看| 色猫av在线| 在线电影av不卡网址| 午夜在线播放| 欧美成人网在线| 成人影院在线播放| 2019中文在线观看| 欧美va在线| 91久久久久久| 国产精品tv| 日本欧美色综合网站免费| 成人久久久久| 女女百合国产免费网站| 亚洲大片在线| mm1313亚洲国产精品无码试看| 蜜臀av性久久久久蜜臀aⅴ流畅| 日韩成人精品视频在线观看| 高清在线观看日韩| 一本色道久久综合亚洲精品图片 | 成人在线观看高清| 亚洲国产一区二区视频| 亚洲欧美偷拍视频| 7777女厕盗摄久久久| 四虎免费在线观看| 中文字幕在线日韩| 黑人精品视频| 国产精品久久久久久久久久久久久久 | 欧美极品在线播放| 亚洲午夜天堂| 97久久夜色精品国产九色| 亚洲精品白浆高清| 91免费网站视频| 国产精品久久久久9999高清| 久久这里只精品| www.亚洲免费av| 亚洲一二三四视频| 婷婷久久综合九色综合绿巨人| 乱子伦一区二区三区| 欧美成人a∨高清免费观看| 电影av一区| 国产+成+人+亚洲欧洲| 成人一区视频| 精品一区日韩成人| 综合日韩在线| 久久综合伊人77777麻豆最新章节| 国产激情视频一区二区三区欧美| 欧美做受xxxxxⅹ性视频| 一区二区三区日韩在线观看| 亚洲精品无码久久久久| 亚洲成年人影院在线| 麻豆传媒视频在线| 国产成人精品午夜| 老汉色老汉首页av亚洲| 国产又粗又硬又长| 日韩av网站在线观看| 国产免费一区二区三区最新6| 亚洲欧洲成人精品av97| 国产一卡二卡三卡| 亚洲第一区中文99精品| 菠萝菠萝蜜在线观看| 国产精品你懂得| 四虎5151久久欧美毛片| 国产精品久久久久久久乖乖| 狠狠色丁香久久婷婷综合_中| 51妺嘿嘿午夜福利| 黑人狂躁日本妞一区二区三区| 精品人妻无码一区二区三区蜜桃一| 一本色道久久综合亚洲精品小说 | 国产精品欧美一区二区| 欧美一级一片| 久久视频这里有精品| 国产99精品在线观看| 老妇女50岁三级| 欧美精品1区2区| 日本在线播放| 国产精品一区二区三区久久久| 国产aⅴ精品一区二区三区久久| av在线观看地址| 国产成人综合在线| 欧美三级在线免费观看| 欧美一区二区播放| mm1313亚洲国产精品美女| 91免费国产网站| 亚洲精品久久| 永久看看免费大片| 亚洲最大成人网4388xx| a级片免费视频| 欧美另类xxx| 亚洲日本视频在线| 激情五月六月婷婷| 成人性生交大片免费看视频在线 | 97电影在线看视频| 国产伦精品免费视频| 精品国产一区探花在线观看| www日韩视频| 国产精品人成在线观看免费 | 久久国产剧场电影| 91香蕉国产视频| 欧美丰满嫩嫩电影| 在线āv视频| 国产欧美一区二区在线播放| 亚洲三级色网| 欧美特黄一区二区三区| 欧美性生活一区| 国产乱色在线观看| 国产精品久久7| 午夜在线观看免费一区| 一级黄色片网址| 欧美精品少妇一区二区三区| 亚洲男同gay网站| 国产偷久久久精品专区| 免费国产自线拍一欧美视频| 国产又粗又硬视频| 日韩一区二区三区在线| av资源中文在线| 日产中文字幕在线精品一区| 久久精品久久精品| 久久久久久天堂| 日韩精品中文字幕在线观看| 久久av影院| 欧美亚洲色图视频| 久久―日本道色综合久久| 一区二区自拍偷拍| 欧美精品激情blacked18| 亚洲免费成人av在线| 九九热免费在线观看| 亚洲成人一区在线| aaa在线观看| 国产欧美亚洲日本| 久久成人久久鬼色| 亚洲国产精一区二区三区性色| 亚洲日本成人网| 日本精品在线播放| 亚洲精品一二三四五区| 夜夜揉揉日日人人青青一国产精品| 免费看男男www网站入口在线 | 九九热最新视频//这里只有精品|