mirror of
https://github.com/skyle1995/NetworkAuth.git
synced 2026-05-25 02:24:05 +08:00
220 lines
5.9 KiB
Go
220 lines
5.9 KiB
Go
package admin
|
|
|
|
import (
|
|
"NetworkAuth/models"
|
|
"NetworkAuth/services"
|
|
"fmt"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// PortalNavigationListHandler 查询门户导航列表
|
|
// 返回后台管理使用的完整导航数据
|
|
func PortalNavigationListHandler(c *gin.Context) {
|
|
db, ok := authBaseController.GetDB(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
var list []models.PortalNavigation
|
|
if err := db.Order("sort ASC, id ASC").Find(&list).Error; err != nil {
|
|
authBaseController.HandleInternalError(c, "查询门户导航失败", err)
|
|
return
|
|
}
|
|
|
|
authBaseController.HandleSuccess(c, "ok", list)
|
|
}
|
|
|
|
// PortalNavigationPublicListHandler 查询公开门户导航列表
|
|
// 返回门户首页展示使用的可见导航数据
|
|
func PortalNavigationPublicListHandler(c *gin.Context) {
|
|
db, ok := authBaseController.GetDB(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
var list []models.PortalNavigation
|
|
if err := db.Where("is_hidden = ?", false).Order("sort ASC, id ASC").Find(&list).Error; err != nil {
|
|
authBaseController.HandleInternalError(c, "查询门户导航失败", err)
|
|
return
|
|
}
|
|
|
|
authBaseController.HandleSuccess(c, "ok", list)
|
|
}
|
|
|
|
// PortalNavigationCreateHandler 创建门户导航
|
|
// 保存新导航并在需要时自动切换唯一首页
|
|
func PortalNavigationCreateHandler(c *gin.Context) {
|
|
var body portalNavigationPayload
|
|
if !authBaseController.BindJSON(c, &body) {
|
|
return
|
|
}
|
|
|
|
item, valid := buildPortalNavigationFromPayload(c, body)
|
|
if !valid {
|
|
return
|
|
}
|
|
|
|
db, ok := authBaseController.GetDB(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
if err := services.SavePortalNavigation(db, &item); err != nil {
|
|
authBaseController.HandleInternalError(c, "创建门户导航失败", err)
|
|
return
|
|
}
|
|
|
|
recordPortalNavigationOperation(c, "新增门户导航", "新增了门户导航:"+item.Name)
|
|
authBaseController.HandleSuccess(c, "创建成功", item)
|
|
}
|
|
|
|
// PortalNavigationUpdateHandler 更新门户导航
|
|
// 按ID更新导航信息并维护唯一首页约束
|
|
func PortalNavigationUpdateHandler(c *gin.Context) {
|
|
var body portalNavigationPayload
|
|
if !authBaseController.BindJSON(c, &body) {
|
|
return
|
|
}
|
|
|
|
switch {
|
|
case body.ID == 0:
|
|
authBaseController.HandleValidationError(c, "导航ID不能为空")
|
|
return
|
|
}
|
|
|
|
item, valid := buildPortalNavigationFromPayload(c, body)
|
|
if !valid {
|
|
return
|
|
}
|
|
|
|
db, ok := authBaseController.GetDB(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
var exists models.PortalNavigation
|
|
if err := db.Where("id = ?", body.ID).First(&exists).Error; err != nil {
|
|
authBaseController.HandleNotFoundError(c, "门户导航")
|
|
return
|
|
}
|
|
|
|
item.ID = body.ID
|
|
if err := services.SavePortalNavigation(db, &item, exists); err != nil {
|
|
authBaseController.HandleInternalError(c, "更新门户导航失败", err)
|
|
return
|
|
}
|
|
|
|
recordPortalNavigationOperation(c, "修改门户导航", "修改了门户导航:"+item.Name)
|
|
authBaseController.HandleSuccess(c, "更新成功", item)
|
|
}
|
|
|
|
// PortalNavigationDeleteHandler 删除门户导航
|
|
// 按ID删除指定导航记录
|
|
func PortalNavigationDeleteHandler(c *gin.Context) {
|
|
var body struct {
|
|
ID uint `json:"id"`
|
|
}
|
|
if !authBaseController.BindJSON(c, &body) {
|
|
return
|
|
}
|
|
|
|
switch {
|
|
case body.ID == 0:
|
|
authBaseController.HandleValidationError(c, "导航ID不能为空")
|
|
return
|
|
}
|
|
|
|
db, ok := authBaseController.GetDB(c)
|
|
if !ok {
|
|
return
|
|
}
|
|
|
|
var item models.PortalNavigation
|
|
if err := db.Where("id = ?", body.ID).First(&item).Error; err != nil {
|
|
authBaseController.HandleNotFoundError(c, "门户导航")
|
|
return
|
|
}
|
|
|
|
switch services.IsPortalNavigationAdminEntry(item) {
|
|
case true:
|
|
authBaseController.HandleValidationError(c, "管理员登录导航为系统保留项,不允许删除")
|
|
return
|
|
}
|
|
|
|
if err := db.Delete(&item).Error; err != nil {
|
|
authBaseController.HandleInternalError(c, "删除门户导航失败", err)
|
|
return
|
|
}
|
|
|
|
recordPortalNavigationOperation(c, "删除门户导航", "删除了门户导航:"+item.Name)
|
|
authBaseController.HandleSuccess(c, "删除成功", nil)
|
|
}
|
|
|
|
// portalNavigationPayload 门户导航请求体
|
|
type portalNavigationPayload struct {
|
|
ID uint `json:"id"`
|
|
Name string `json:"name"`
|
|
Path string `json:"path"`
|
|
Sort int `json:"sort"`
|
|
IsHome bool `json:"is_home"`
|
|
IsHidden bool `json:"is_hidden"`
|
|
IsExternal bool `json:"is_external"`
|
|
}
|
|
|
|
// buildPortalNavigationFromPayload 构建门户导航实体
|
|
// 负责统一做字段校验和数据转换
|
|
func buildPortalNavigationFromPayload(c *gin.Context, body portalNavigationPayload) (models.PortalNavigation, bool) {
|
|
item := models.PortalNavigation{
|
|
Name: body.Name,
|
|
Path: body.Path,
|
|
Sort: body.Sort,
|
|
IsHome: body.IsHome,
|
|
IsHidden: body.IsHidden,
|
|
IsExternal: body.IsExternal,
|
|
}
|
|
services.NormalizePortalNavigation(&item)
|
|
|
|
if err := validatePortalNavigationInput(item); err != nil {
|
|
authBaseController.HandleValidationError(c, err.Error())
|
|
return models.PortalNavigation{}, false
|
|
}
|
|
|
|
return item, true
|
|
}
|
|
|
|
// validatePortalNavigationInput 校验门户导航字段
|
|
// 保证名称和地址满足基础格式要求
|
|
func validatePortalNavigationInput(item models.PortalNavigation) error {
|
|
switch {
|
|
case item.Name == "":
|
|
return fmt.Errorf("名称不能为空")
|
|
case len(item.Name) > 64:
|
|
return fmt.Errorf("名称长度不能超过64个字符")
|
|
case item.Path == "":
|
|
return fmt.Errorf("地址不能为空")
|
|
case len(item.Path) > 255:
|
|
return fmt.Errorf("地址长度不能超过255个字符")
|
|
case item.Sort < 0:
|
|
return fmt.Errorf("排序不能小于0")
|
|
case item.IsHome && item.IsHidden:
|
|
return fmt.Errorf("设为首页后禁止隐藏")
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// recordPortalNavigationOperation 记录门户导航操作日志
|
|
// 统一写入管理员操作日志,便于后台审计
|
|
func recordPortalNavigationOperation(c *gin.Context, logType, message string) {
|
|
operator := c.GetString("admin_username")
|
|
operatorUUID := c.GetString("admin_uuid")
|
|
|
|
switch {
|
|
case operator == "":
|
|
operator = "system"
|
|
}
|
|
|
|
services.RecordOperationLog(logType, operator, operatorUUID, message)
|
|
}
|