golang实现动态路由的项目实践

 更新时间:2025年05月23日 11:09:31   作者:restrain1  
本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、动态路由

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:是否是基础路由(开发中)"` // 是否是基础路由(开发中)
	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 时,再次触发数据库查询,出现 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
}

创建新用户时,用户Menus字段为要添加的路由(从数据库中查询出来的),然后直接create即可。创建之后,数据库中不会显示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实现动态路由的项目实践的文章就介绍到这了,更多相关golang 动态路由内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go并发读写文件、分片写、分片下载文件的实现示例

    Go并发读写文件、分片写、分片下载文件的实现示例

    读写文件在很多项目中都可以用到,本文主要介绍了Go并发读写文件、分片写、分片下载文件的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    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框架没有内置静态文件服务,但可以使用gin.Static或gin.StaticFS中间件来提供静态文件服务,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-03-03
  • Golang协程池的实现与应用

    Golang协程池的实现与应用

    这篇文章主要介绍了Golang协程池的实现与应用,使用协程池的好处是减少在创建和销毁协程上所花的时间以及资源的开销,解决资源不足的问题,需要详细了解可以参考下文
    2023-05-05
  • Golang发送Get和Post请求的实现

    Golang发送Get和Post请求的实现

    做第三方接口有时需要用Get或者Post请求访问,本文主要介绍了Golang发送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语言单元测试的实现及用例

    在日常开发中,我们通常需要针对现有的功能进行单元测试,以验证开发的正确性,本文主要介绍了Go语言单元测试的实现及用例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Golang使用Swag搭建api文档的全过程

    Golang使用Swag搭建api文档的全过程

    Gin是Golang目前最为常用的Web框架之一,公司项目验收需要API接口设计说明书(Golang后端服务基于Gin框架编写),所以本文给大家介绍了Golang使用Swag搭建api文档的全过程,需要的朋友可以参考下
    2024-02-02

最新评论