自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

字節(jié)跳動 Golang 微服務框架 Hertz 集成 Gorm 實戰(zhàn)

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

hello,大家好,我是千羽。

圖片圖片

上一篇,講了《字節(jié)跳動 Golang 微服務 HTTP 框架 Hertz》入門,今天我們就通過一個實戰(zhàn)項目,來體驗 Hertz 和 Gorm 的集成。

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

Step 1:Fork Hertz 官方 Demo

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

圖片圖片

然后,將項目 clone 到本地,按照官方文檔操作。

圖片圖片

具體倉庫地址:https://github.com/cloudwego/hertz-examples/tree/main/bizdemo/hertz_gorm

Step 2:配置與啟動項目

官方 Readme 提供了啟動指導,根據(jù)文檔說明進行以下步驟:

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

圖片圖片

  • 編譯并啟動項目:
cd bizdemo/hertz_gorm
go build -o hertz_gorm && ./hertz_gorm

若啟動成功,你將看到以下日志輸出:

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

Step 3:接口調試

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

根據(jù)啟動的日志,我們進行各個接口驗證

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

1. /ping 接口測試

請求 URL: http://localhost:8888/ping

響應示例:

{
    "message": "pong"
}

圖片圖片

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

請求 URL: http://localhost:8888/v1/user/create/

請求參數(shù):

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

響應示例:

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

圖片圖片

MySQL 查詢效果:

圖片圖片

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

請求 URL: http://localhost:8888/v1/user/query/

圖片圖片

請求 URL: http://localhost:8888/v1/user/query/

請求參數(shù):

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

響應示例:

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

圖片圖片

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

刪除,軟刪除,不會真正的刪除

圖片圖片

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

刪除,軟刪除,不會真正的刪除

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
}

圖片圖片

總結

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

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

責任編輯:武曉燕 來源: 程序員千羽
相關推薦

2024-11-13 11:02:03

微服務框架項目

2024-11-07 11:46:41

2022-06-22 06:49:39

Hertz開源HTTP 框架

2022-10-14 14:44:04

字節(jié)跳動ByteTechHTTP 框架

2022-05-17 17:18:40

Kite字節(jié)跳動微服務框架

2021-09-09 09:05:30

開源字節(jié)跳動CloudWeGo

2023-11-17 12:11:26

GORMGo Web

2023-01-03 16:54:27

字節(jié)跳動深度學習

2024-08-20 09:59:22

2022-11-02 10:02:24

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

2022-08-25 18:48:29

字節(jié)跳動CSS開源

2024-01-18 08:31:22

go實現(xiàn)gorm框架

2023-04-19 16:51:54

分布式Primus開源

2024-09-25 15:57:56

2018-12-17 16:44:49

Golang微服務

2018-12-17 16:39:20

Golang微服務

2018-12-17 16:48:05

Golang微服務

2022-11-24 09:01:26

HTTPHertz架構

2022-04-09 14:45:02

微服務常見概念Spring

2023-10-18 11:56:17

開源AI
點贊
收藏

51CTO技術棧公眾號