亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

golang實現動態(tài)路由的項目實踐

 更新時間:2025年05月23日 11:09:31   作者:restrain1  
本文主要介紹了golang實現動態(tài)路由項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、動態(tài)路由

1.結構體(數據庫的定義)

包含了角色數據庫、菜單數據庫、角色和菜單關系表。

type Role struct {
	gorm.Model
	Rolename  string `json:"rolename"`
	Authority string `json:"authority"`
	Order     int    `json:"order" gorm:"column:order"`
	Status    bool   `json:"status"`
	Menus     []Menu `json:"menus" gorm:"many2many:role_menu_table"`
	Remark    string `json:"remark"`
}
type Menu struct {
	gorm.Model
	ParentID  uint   `json:"parentid" gorm:"column:parentid"`
	Path      string `json:"path"`
	Name      string `json:"name"`
	Component string `json:"component"`
	Sort      int    `json:"sort"`
	Meta      `json:"meta"`
	Children  []Menu `json:"children" gorm:"-"`
	Roles     []Role `json:"rolse" gorm:"many2many:role_menu_table"`
}

type Meta struct {
	ActiveName  string `json:"activeName" gorm:"comment:高亮菜單"`
	KeepAlive   bool   `json:"keepalive" gorm:"comment:是否緩存"`           // 是否緩存
	DefaultMenu bool   `json:"defaultmenu" gorm:"comment:是否是基礎路由(開發(fā)中)"` // 是否是基礎路由(開發(fā)中)
	Title       string `json:"title" gorm:"comment:菜單名"`                // 菜單名
	Icon        string `json:"icon" gorm:"comment:菜單圖標"`                // 菜單圖標
	CloseTab    bool   `json:"closeTab" gorm:"comment:自動關閉tab"`         // 自動關閉tab
}
type RoleMenu struct {
	MenuId string `json:"menuid" gorm:"colume:menuid"`
	RoleId string `json:"roleid" gorm:"colume:roleid"`
}

2.預加載preload

var role Role
err = db.Preload("Menus").Find(&role,roleid).Error
if err != nil {
	fmt.Println("Error:", err)
	return
}else{
    fmt.Printf("Role's Menus: %+v\n", role.Menus)
}

Preload("Menus"):在查詢 Role 時,預加載 Menus 字段,即查詢出 Role 對應的所有 Menu 數據。通過這種方式,可以避免在訪問 role.Menus 時,再次觸發(fā)數據庫查詢,出現 N+1 查詢問題。

3.添加關聯的方法

var role models.Role
role.ID = reqRole.ID
role.Rolename = reqRole.Rolename
role.Authority = reqRole.Authority
role.Order = reqRole.Order
role.Status = reqRole.Status
role.Menus = menus
role.Remark = reqRole.Remark

if err := config.DB.Create(&role).Error; err != nil {
	return err
}

創(chuàng)建新用戶時,用戶Menus字段為要添加的路由(從數據庫中查詢出來的),然后直接create即可。創(chuàng)建之后,數據庫中不會顯示Menus字段,但是role_menu_table會自動添加關聯。

默認情況下,Updates 方法只更新主表的數據,不會自動更新關聯關系,因為 Menus 是通過 many2many 關系維護的,因此需要顯式操作來同步 Menus 和 role_menu_table 的關聯數據:

if err := config.DB.Model(&role).Association("Menus").Replace(menus); err != nil {
    return err
}

刪除時,要先刪除關聯。First時也要Preload,否則會clear失敗導致最終刪除失敗

//找到實例并刪除
if err := tx.Preload("Menus").First(&role, id).Error; err != nil {
	return err
}

//刪除關聯Menus
if len(role.Menus) > 0 {
	if err := tx.Model(&role).Association("Menus").Clear(); err != nil {
		return err
	}
}

//刪除實例
if err := tx.Unscoped().Delete(&role).Error; err != nil {
	return err
}

到此這篇關于golang實現動態(tài)路由的項目實踐的文章就介紹到這了,更多相關golang 動態(tài)路由內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Go并發(fā)讀寫文件、分片寫、分片下載文件的實現示例

    Go并發(fā)讀寫文件、分片寫、分片下載文件的實現示例

    讀寫文件在很多項目中都可以用到,本文主要介紹了Go并發(fā)讀寫文件、分片寫、分片下載文件的實現示例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Golang通脈之方法詳情

    Golang通脈之方法詳情

    這篇文章主要介紹了Golang通脈方法,Go語言中的方法(Method)是一種作用于特定類型變量的函數。這種特定類型變量叫做接收者(Receiver)。接收者的概念就類似于,其他語言中的this或者 self,具體內容請和小編一起來學習下面文章內容吧
    2021-10-10
  • Golang干貨分享之利用AST實現AOP功能

    Golang干貨分享之利用AST實現AOP功能

    本文主要是一個純干貨分享,主要介紹了Golang如何利用AST實現AOP功能,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-04-04
  • Go?gin框架加載Html模板文件的方法

    Go?gin框架加載Html模板文件的方法

    這篇文章主要介紹了Go?gin框架加載Html模板文件的方法,Gin框架沒有內置靜態(tài)文件服務,但可以使用gin.Static或gin.StaticFS中間件來提供靜態(tài)文件服務,文中有相關的代碼示例供大家參考,需要的朋友可以參考下
    2024-03-03
  • Golang協程池的實現與應用

    Golang協程池的實現與應用

    這篇文章主要介紹了Golang協程池的實現與應用,使用協程池的好處是減少在創(chuàng)建和銷毀協程上所花的時間以及資源的開銷,解決資源不足的問題,需要詳細了解可以參考下文
    2023-05-05
  • Golang發(fā)送Get和Post請求的實現

    Golang發(fā)送Get和Post請求的實現

    做第三方接口有時需要用Get或者Post請求訪問,本文主要介紹了Golang發(fā)送Get和Post請求的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-05-05
  • go 對象池化組件 bytebufferpool使用詳解

    go 對象池化組件 bytebufferpool使用詳解

    這篇文章主要為大家介紹了go 對象池化組件 bytebufferpool使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Go語言使用defer+recover解決panic導致程序崩潰的問題

    Go語言使用defer+recover解決panic導致程序崩潰的問題

    如果協程出現了panic,就會造成程序的崩潰,這時可以在goroutine中使用recover來捕獲panic,進行處理,本文就詳細的介紹一下,感興趣的可以了解一下
    2021-09-09
  • Go語言單元測試的實現及用例

    Go語言單元測試的實現及用例

    在日常開發(fā)中,我們通常需要針對現有的功能進行單元測試,以驗證開發(fā)的正確性,本文主要介紹了Go語言單元測試的實現及用例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Golang使用Swag搭建api文檔的全過程

    Golang使用Swag搭建api文檔的全過程

    Gin是Golang目前最為常用的Web框架之一,公司項目驗收需要API接口設計說明書(Golang后端服務基于Gin框架編寫),所以本文給大家介紹了Golang使用Swag搭建api文檔的全過程,需要的朋友可以參考下
    2024-02-02

最新評論