86 lines
3.2 KiB
Go
86 lines
3.2 KiB
Go
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
|
|
}
|