package version import ( "fmt" "runtime" "gorm.io/gorm" "git.ilapage.cn/ila/yovision/Sense/server/cmd/migrate/migration" migrationModels "git.ilapage.cn/ila/yovision/Sense/server/cmd/migrate/migration/models" common "git.ilapage.cn/ila/yovision/Sense/server/common/models" ) const senseLayoutMenuName = "SenseManage" var sensePageMenus = []migrationModels.SysMenu{ {MenuName: "SenseDeviceManage", Title: "设备管理", Icon: "monitor", Path: "devices", MenuType: "C", Permission: "sense:device:list", Component: "/sense/device/index", Sort: 1, Visible: "0", IsFrame: "1"}, {MenuName: "SenseAdmission", Title: "视频接入", Icon: "video-camera", Path: "admission", MenuType: "C", Permission: "sense:admission:list", Component: "/sense/admission/index", Sort: 2, Visible: "0", IsFrame: "1"}, {MenuName: "SenseMedia", Title: "视频服务", Icon: "video-play", Path: "media", MenuType: "C", Permission: "sense:media:list", Component: "/sense/media/index", Sort: 3, Visible: "0", IsFrame: "1"}, {MenuName: "SenseLiveview", Title: "实时监看", Icon: "eye-open", Path: "liveview", MenuType: "C", Permission: "sense:liveview:view", Component: "/sense/liveview/index", Sort: 4, Visible: "0", IsFrame: "1"}, {MenuName: "SenseArea", Title: "区域与警戒线", Icon: "guide", Path: "area", MenuType: "C", Permission: "sense:area:list", Component: "/sense/area/index", Sort: 5, Visible: "0", IsFrame: "1"}, } func init() { _, fileName, _, _ := runtime.Caller(0) migration.Migrate.SetVersion(migration.GetFilename(fileName), migrateSenseLayout) } func migrateSenseLayout(db *gorm.DB, version string) error { return db.Transaction(func(tx *gorm.DB) error { if err := alignSenseLayout(tx); err != nil { return err } return tx.Create(&common.Migration{Version: version}).Error }) } func alignSenseLayout(tx *gorm.DB) error { root, err := ensureDeviceMenu(tx, migrationModels.SysMenu{ MenuName: senseLayoutMenuName, Title: "视频感知", Icon: "video-camera", Path: "/sense", MenuType: "M", ParentId: 0, Component: "Layout", Sort: 5, Visible: "0", IsFrame: "1", }) if err != nil { return fmt.Errorf("ensure Sense layout menu: %w", err) } for _, desired := range sensePageMenus { desired.ParentId = root.MenuId desired.Paths = fmt.Sprintf("/0/%d", root.MenuId) if _, err = ensureDeviceMenu(tx, desired); err != nil { return fmt.Errorf("align Sense page menu %s: %w", desired.MenuName, err) } } if err = rebuildSenseMenuPaths(tx, root.MenuId, "/0"); err != nil { return err } return nil } func rebuildSenseMenuPaths(tx *gorm.DB, menuID int, parentPath string) error { path := fmt.Sprintf("%s/%d", parentPath, menuID) if err := tx.Model(&migrationModels.SysMenu{}).Where("menu_id = ?", menuID).Update("paths", path).Error; err != nil { return fmt.Errorf("update menu %d paths: %w", menuID, err) } var children []migrationModels.SysMenu if err := tx.Where("parent_id = ?", menuID).Order("sort, menu_id").Find(&children).Error; err != nil { return fmt.Errorf("list children of menu %d: %w", menuID, err) } for _, child := range children { if err := rebuildSenseMenuPaths(tx, child.MenuId, path); err != nil { return err } } return nil }