286 lines
6.1 KiB
Go
286 lines
6.1 KiB
Go
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()
|
||
}
|