yunzer_go/server/controllers/menu.go
2025-11-13 17:24:59 +08:00

286 lines
6.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package controllers
import (
"encoding/json"
"server/models"
"github.com/beego/beego/v2/client/orm"
beego "github.com/beego/beego/v2/server/web"
)
// MenuController 处理菜单相关请求
type MenuController struct {
beego.Controller
}
// GetAllMenus 获取所有菜单
func (c *MenuController) GetAllMenus() {
menus, err := models.GetAllMenus()
if err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "获取菜单失败: " + err.Error(),
"data": nil,
}
c.ServeJSON()
return
}
// 确保返回数组,即使为空
if menus == nil {
menus = []map[string]interface{}{}
}
c.Data["json"] = map[string]interface{}{
"success": true,
"message": "获取菜单成功",
"data": menus,
}
c.ServeJSON()
}
// GetTenantMenus 根据角色获取租户菜单(只返回该角色有权限的菜单)
// @router /menus/tenant/:roleId [get]
func (c *MenuController) GetTenantMenus() {
roleId, err := c.GetInt(":roleId")
if err != nil || roleId <= 0 {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "角色ID无效",
"data": nil,
}
c.ServeJSON()
return
}
menus, err := models.GetTenantMenus(roleId)
if err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "获取菜单失败: " + err.Error(),
"data": nil,
}
c.ServeJSON()
return
}
// 确保返回数组,即使为空
if menus == nil {
menus = []map[string]interface{}{}
}
c.Data["json"] = map[string]interface{}{
"success": true,
"message": "获取菜单成功",
"data": menus,
}
c.ServeJSON()
}
// CreateMenu 创建新菜单
func (c *MenuController) CreateMenu() {
var menu models.Menu
// 解析请求体
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &menu); err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "请求参数错误",
"error": err.Error(),
}
c.ServeJSON()
return
}
// 添加菜单
if _, err := models.AddMenu(&menu); err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "创建菜单失败",
"error": err.Error(),
}
} else {
c.Data["json"] = map[string]interface{}{
"success": true,
"message": "创建菜单成功",
"data": menu,
}
}
c.ServeJSON()
}
// UpdateMenu 更新菜单
func (c *MenuController) UpdateMenu() {
id, err := c.GetInt(":id")
if err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "参数错误",
}
c.ServeJSON()
return
}
// 解析请求体为通用map进行部分字段更新避免未提供字段被置零
var body map[string]interface{}
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &body); err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "请求参数错误",
"error": err.Error(),
}
c.ServeJSON()
return
}
// 允许更新的字段映射前端Key -> 数据库列名
allowed := map[string]string{
"Name": "name",
"Path": "path",
"ParentId": "parent_id",
"Icon": "icon",
"Order": "order",
"Status": "status",
"ComponentPath": "component_path",
"IsExternal": "is_external",
"ExternalUrl": "external_url",
"MenuType": "menu_type",
"Permission": "permission",
"IsShow": "is_show",
}
params := orm.Params{}
for k, col := range allowed {
if v, ok := body[k]; ok {
params[col] = v
}
}
if len(params) == 0 {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "无可更新的字段",
}
c.ServeJSON()
return
}
o := orm.NewOrm()
if _, err := o.QueryTable("yz_menus").Filter("id", id).Update(params); err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "更新菜单失败",
"error": err.Error(),
}
} else {
c.Data["json"] = map[string]interface{}{
"success": true,
"message": "更新菜单成功",
}
}
c.ServeJSON()
}
// UpdateMenuStatus 更新菜单状态
func (c *MenuController) UpdateMenuStatus() {
id, err := c.GetInt(":id")
if err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "参数错误",
}
c.ServeJSON()
return
}
// 解析请求体获取 status 字段
var req struct {
Status int8 `json:"status"`
}
// 尝试从请求体获取数据
requestBody := c.Ctx.Input.RequestBody
if len(requestBody) > 0 {
// 有请求体,从 JSON 解析
if err := json.Unmarshal(requestBody, &req); err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "请求参数错误",
}
c.ServeJSON()
return
}
} else {
// 如果请求体为空,尝试从表单参数或查询参数获取
statusValue, err := c.GetInt("status", -1)
if err != nil || statusValue == -1 {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "请求参数错误:缺少 status 参数",
}
c.ServeJSON()
return
}
req.Status = int8(statusValue)
}
// 先查询该菜单,确保存在
o := orm.NewOrm()
menu := models.Menu{Id: id}
if err = o.Read(&menu); err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "菜单不存在",
}
c.ServeJSON()
return
}
// 更新状态
menu.Status = req.Status
if _, err := o.Update(&menu, "Status"); err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "更新菜单状态失败",
}
} else {
c.Data["json"] = map[string]interface{}{
"success": true,
"message": "菜单状态更新成功",
}
}
c.ServeJSON()
}
// DeleteMenu 删除菜单
func (c *MenuController) DeleteMenu() {
id, err := c.GetInt(":id")
if err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "参数错误",
}
c.ServeJSON()
return
}
// 删除菜单
if err := models.DeleteMenu(id); err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "删除菜单失败",
"error": err.Error(),
}
} else {
c.Data["json"] = map[string]interface{}{
"success": true,
"message": "删除菜单成功",
}
}
c.ServeJSON()
}