Files
nxxmdata/backend/routes/menus.js
2025-09-12 20:08:42 +08:00

318 lines
8.5 KiB
JavaScript
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.

/**
* 菜单管理路由
* @file menus.js
* @description 定义菜单管理相关的API路由
*/
const express = require('express');
const router = express.Router();
const menuController = require('../controllers/menuController');
const { verifyToken } = require('../middleware/auth');
const { requirePermission } = require('../middleware/permission');
// 公开API路由不需要验证token
const publicRoutes = express.Router();
router.use('/public', publicRoutes);
// 公开获取角色菜单权限(用于权限管理)
publicRoutes.get('/role/:roleId', menuController.getRoleMenus);
// 所有其他路由都需要认证
router.use(verifyToken);
// 需要认证的菜单API
router.get('/', menuController.getAllMenus);
router.get('/:id', menuController.getMenuById);
/**
* @swagger
* components:
* schemas:
* MenuPermission:
* type: object
* properties:
* id:
* type: integer
* description: 菜单ID
* name:
* type: string
* description: 菜单名称
* path:
* type: string
* description: 菜单路径
* component:
* type: string
* description: 组件路径
* icon:
* type: string
* description: 图标
* parent_id:
* type: integer
* description: 父菜单ID
* sort_order:
* type: integer
* description: 排序
* status:
* type: boolean
* description: 状态
* description:
* type: string
* description: 描述
* permission_code:
* type: string
* description: 权限代码
* created_at:
* type: string
* format: date-time
* description: 创建时间
* updated_at:
* type: string
* format: date-time
* description: 更新时间
*/
/**
* @swagger
* /api/menus:
* get:
* summary: 获取菜单列表
* tags: [Menus]
* parameters:
* - in: query
* name: roleId
* schema:
* type: integer
* description: 角色ID可选
* responses:
* 200:
* description: 成功获取菜单列表
* content:
* application/json:
* schema:
* type: object
* properties:
* success:
* type: boolean
* data:
* type: array
* items:
* $ref: '#/components/schemas/MenuPermission'
* message:
* type: string
*/
router.get('/', requirePermission('menu:view'), menuController.getAllMenus);
/**
* @swagger
* /api/menus/{id}:
* get:
* summary: 获取菜单详情
* tags: [Menus]
* parameters:
* - in: path
* name: id
* required: true
* schema:
* type: integer
* description: 菜单ID
* responses:
* 200:
* description: 成功获取菜单详情
* 404:
* description: 菜单不存在
*/
router.get('/:id', requirePermission('menu:view'), menuController.getMenuById);
/**
* @swagger
* /api/menus:
* post:
* summary: 创建菜单
* tags: [Menus]
* security:
* - bearerAuth: []
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* required:
* - name
* - path
* properties:
* name:
* type: string
* description: 菜单名称
* path:
* type: string
* description: 菜单路径
* component:
* type: string
* description: 组件路径
* icon:
* type: string
* description: 图标
* parent_id:
* type: integer
* description: 父菜单ID
* sort_order:
* type: integer
* description: 排序
* status:
* type: boolean
* description: 状态
* description:
* type: string
* description: 描述
* permission_code:
* type: string
* description: 权限代码
* responses:
* 201:
* description: 菜单创建成功
* 400:
* description: 请求参数错误
*/
router.post('/', requirePermission('menu:create'), menuController.createMenu);
/**
* @swagger
* /api/menus/{id}:
* put:
* summary: 更新菜单
* tags: [Menus]
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: id
* required: true
* schema:
* type: integer
* description: 菜单ID
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* properties:
* name:
* type: string
* description: 菜单名称
* path:
* type: string
* description: 菜单路径
* component:
* type: string
* description: 组件路径
* icon:
* type: string
* description: 图标
* parent_id:
* type: integer
* description: 父菜单ID
* sort_order:
* type: integer
* description: 排序
* status:
* type: boolean
* description: 状态
* description:
* type: string
* description: 描述
* permission_code:
* type: string
* description: 权限代码
* responses:
* 200:
* description: 菜单更新成功
* 404:
* description: 菜单不存在
*/
router.put('/:id', requirePermission('menu:update'), menuController.updateMenu);
/**
* @swagger
* /api/menus/{id}:
* delete:
* summary: 删除菜单
* tags: [Menus]
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: id
* required: true
* schema:
* type: integer
* description: 菜单ID
* responses:
* 200:
* description: 菜单删除成功
* 404:
* description: 菜单不存在
*/
router.delete('/:id', requirePermission('menu:delete'), menuController.deleteMenu);
/**
* @swagger
* /api/menus/role/{roleId}:
* get:
* summary: 获取角色的菜单权限
* tags: [Menus]
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: roleId
* required: true
* schema:
* type: integer
* description: 角色ID
* responses:
* 200:
* description: 成功获取角色菜单权限
* 404:
* description: 角色不存在
*/
router.get('/role/:roleId', requirePermission('menu:view'), menuController.getRoleMenus);
/**
* @swagger
* /api/menus/role/{roleId}:
* post:
* summary: 设置角色的菜单权限
* tags: [Menus]
* security:
* - bearerAuth: []
* parameters:
* - in: path
* name: roleId
* required: true
* schema:
* type: integer
* description: 角色ID
* requestBody:
* required: true
* content:
* application/json:
* schema:
* type: object
* properties:
* menuIds:
* type: array
* items:
* type: integer
* description: 菜单ID数组
* responses:
* 200:
* description: 设置角色菜单权限成功
* 404:
* description: 角色不存在
*/
router.post('/role/:roleId', requirePermission('menu:assign'), menuController.setRoleMenus);
module.exports = router;