package models import "time" // FrontMenuDefault 全局默认前端导航项定义 type FrontMenuDefault struct { Title string Path string Type int8 // 菜单类型:2 页面 / 4 单页 Sort int } // FrontMenuDefaults 所有租户共用的默认导航(不可删除)。 // 以 tenant_id=0 存放于同一张菜单表,表示全局共享: // 租户端增删改接口都带 tenant_id 过滤,天然无法触碰这些行。 // 路径对应官网前台路由:新闻中心 /news,其余为单页 /page/:path // (单页内容在 backend 端 - 单页管理 中按 path 维护)。 var FrontMenuDefaults = []FrontMenuDefault{ {Title: "新闻中心", Path: "/news", Type: 2, Sort: 1}, {Title: "产品展示", Path: "/page/products", Type: 4, Sort: 2}, {Title: "解决方案", Path: "/page/solutions", Type: 4, Sort: 3}, {Title: "关于我们", Path: "/page/about", Type: 4, Sort: 4}, {Title: "联系我们", Path: "/page/contact", Type: 4, Sort: 5}, } // EnsureGlobalDefaultFrontMenus 保证全局默认导航(tenant_id=0)齐全: // 缺失的自动新增;被误删(软删)的自动恢复;已存在(含改名)的不动。 // 以"在库生效数量 >= 默认项总数"作为短路条件,避免改名后重复插入。 // 供后台菜单列表与前台导航渲染前调用,任何失败均静默忽略不阻断主流程。 func EnsureGlobalDefaultFrontMenus() { if Orm == nil { return } qs := Orm.QueryTable(new(BackendMenuFront)).Filter("tenant_id", 0) activeCnt, err := qs.Filter("delete_time__isnull", true).Count() if err != nil || activeCnt >= int64(len(FrontMenuDefaults)) { return } // 含软删记录一起取,用于恢复被误删的默认菜单 var rows []BackendMenuFront if _, err := qs.All(&rows); err != nil { return } exist := make(map[string]*BackendMenuFront, len(rows)) for i := range rows { exist[rows[i].Title] = &rows[i] } now := time.Now() for _, def := range FrontMenuDefaults { if row, ok := exist[def.Title]; ok { if row.DeleteTime != nil { _, _ = Orm.QueryTable(new(BackendMenuFront)). Filter("id", row.ID). Update(map[string]interface{}{ "delete_time": nil, "status": 1, "is_visible": 1, "update_time": now, }) } continue } _, _ = Orm.Insert(&BackendMenuFront{ TenantID: 0, Pid: 0, Title: def.Title, Path: def.Path, Sort: def.Sort, Status: 1, IsVisible: 1, Type: def.Type, }) } }