Files
NetworkAuth/services/portal_navigation.go

81 lines
2.3 KiB
Go

package services
import (
"NetworkAuth/models"
"strings"
"gorm.io/gorm"
)
const portalNavigationAdminPath = "admin"
const portalNavigationAdminSort = 999
// NormalizePortalNavigation 规范化门户导航数据
// 统一清理首尾空白,并处理首页与排序约束
func NormalizePortalNavigation(item *models.PortalNavigation) {
item.Name = strings.TrimSpace(item.Name)
item.Path = strings.TrimSpace(item.Path)
if item.Sort < 0 {
item.Sort = 0
}
if item.IsHome {
item.IsHidden = false
}
}
// IsPortalNavigationAdminEntry 判断是否为管理员入口
// 管理员入口属于系统保留导航项,不允许修改基础信息
func IsPortalNavigationAdminEntry(item models.PortalNavigation) bool {
return strings.EqualFold(strings.TrimSpace(item.Path), portalNavigationAdminPath)
}
// LockPortalNavigationProtectedFields 锁定系统保留导航字段
// 管理员入口仅允许调整隐藏状态,其余字段保持系统固定值
func LockPortalNavigationProtectedFields(item *models.PortalNavigation, exists models.PortalNavigation) {
switch IsPortalNavigationAdminEntry(exists) {
case true:
item.Name = "管理员登录"
item.Path = portalNavigationAdminPath
item.Sort = portalNavigationAdminSort
item.IsHome = false
item.IsExternal = false
default:
return
}
}
// SavePortalNavigation 保存门户导航
// 当当前记录被设置为门户首页时,会自动取消其他记录的首页状态
func SavePortalNavigation(db *gorm.DB, item *models.PortalNavigation, exists ...models.PortalNavigation) error {
if len(exists) > 0 {
LockPortalNavigationProtectedFields(item, exists[0])
}
NormalizePortalNavigation(item)
return db.Transaction(func(tx *gorm.DB) error {
if item.IsHome {
query := tx.Model(&models.PortalNavigation{}).Where("is_home = ?", true)
if item.ID > 0 {
query = query.Where("id <> ?", item.ID)
}
if err := query.Update("is_home", false).Error; err != nil {
return err
}
}
switch {
case item.ID == 0:
return tx.Create(item).Error
default:
return tx.Model(&models.PortalNavigation{}).Where("id = ?", item.ID).Updates(map[string]interface{}{
"name": item.Name,
"path": item.Path,
"sort": item.Sort,
"is_home": item.IsHome,
"is_hidden": item.IsHidden,
"is_external": item.IsExternal,
}).Error
}
})
}