content: package me.flyray.rbac.controller;
  
  import java.util.HashMap;
  import java.util.List;
  import java.util.Set;
  
  import org.apache.commons.lang.StringUtils;
  import org.apache.shiro.authz.annotation.RequiresPermissions;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.web.bind.annotation.PathVariable;
  import org.springframework.web.bind.annotation.RequestBody;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RestController;
  
  import me.flyray.rbac.annotation.SysLog;
  import me.flyray.rbac.entity.SysMenuEntity;
  import me.flyray.rbac.service.SysMenuService;
  import me.flyray.rbac.utils.Constant;
  import me.flyray.rbac.utils.Constant.MenuType;
  import me.flyray.rbac.utils.R;
  import me.flyray.rbac.utils.RRException;
  
  /**
   * 系统菜单
   * 
   * @author chenshun
   * @email sunlightcs@gmail.com
   * @date 2016年10月27日 下午9:58:15
   */
  @RestController
  @RequestMapping("/sys/menu")
  public class SysMenuController extends AbstractController {
  	@Autowired
  	private SysMenuService sysMenuService;
  	
  	/**
  	 * 所有菜单列表
  	 */
  	@RequestMapping("/list")
  	@RequiresPermissions("sys:menu:list")
  	public List<SysMenuEntity> list(){
  		List<SysMenuEntity> menuList = sysMenuService.queryList(new HashMap<String, Object>());
  
  		return menuList;
  	}
  	
  	/**
  	 * 选择菜单(添加、修改菜单)
  	 */
  	@RequestMapping("/select")
  	@RequiresPermissions("sys:menu:select")
  	public R select(){
  		//查询列表数据
  		List<SysMenuEntity> menuList = sysMenuService.queryNotButtonList();
  		
  		//添加顶级菜单
  		SysMenuEntity root = new SysMenuEntity();
  		root.setMenuId(0L);
  		root.setName("一级菜单");
  		root.setParentId(-1L);
  		root.setOpen(true);
  		menuList.add(root);
  		
  		return R.ok().put("menuList", menuList);
  	}
  	
  	/**
  	 * 角色授权菜单
  	 */
  	@RequestMapping("/perms")
  	@RequiresPermissions("sys:menu:perms")
  	public R perms(){
  		//查询列表数据
  		List<SysMenuEntity> menuList = null;
  		
  		//只有超级管理员，才能查看所有管理员列表
  		if(getUserId() == Constant.SUPER_ADMIN){
  			menuList = sysMenuService.queryList(new HashMap<String, Object>());
  		}else{
  			menuList = sysMenuService.queryUserList(getUserId());
  		}
  		
  		return R.ok().put("menuList", menuList);
  	}
  	
  	/**
  	 * 菜单信息
  	 */
  	@RequestMapping("/info/{menuId}")
  	@RequiresPermissions("sys:menu:info")
  	public R info(@PathVariable("menuId") Long menuId){
  		SysMenuEntity menu = sysMenuService.queryObject(menuId);
  		return R.ok().put("menu", menu);
  	}
  	
  	/**
  	 * 保存
  	 */
  	@SysLog("保存菜单")
  	@RequestMapping("/save")
  	@RequiresPermissions("sys:menu:save")
  	public R save(@RequestBody SysMenuEntity menu){
  		//数据校验
  		verifyForm(menu);
  		
  		sysMenuService.save(menu);
  		
  		return R.ok();
  	}
  	
  	/**
  	 * 修改
  	 */
  	@SysLog("修改菜单")
  	@RequestMapping("/update")
  	@RequiresPermissions("sys:menu:update")
  	public R update(@RequestBody SysMenuEntity menu){
  		//数据校验
  		verifyForm(menu);
  				
  		sysMenuService.update(menu);
  		
  		return R.ok();
  	}
  	
  	/**
  	 * 删除
  	 */
  	@SysLog("删除菜单")
  	@RequestMapping("/delete")
  	@RequiresPermissions("sys:menu:delete")
  	public R delete(long menuId){
  		if(menuId <= 30){
  			return R.error("系统菜单，不能删除");
  		}
  
  		//判断是否有子菜单或按钮
  		List<SysMenuEntity> menuList = sysMenuService.queryListParentId(menuId);
  		if(menuList.size() > 0){
  			return R.error("请先删除子菜单或按钮");
  		}
  
  		sysMenuService.deleteBatch(new Long[]{menuId});
  		
  		return R.ok();
  	}
  	
  	/**
  	 * 用户菜单列表
  	 */
  	@RequestMapping("/user")
  	public R user(){
  		List<SysMenuEntity> menuList = sysMenuService.getUserMenuList(getUserId());
  		Set<String> permissions =  sysMenuService.getUserPermissions(getUserId());
  		return R.ok().put("menuList", menuList).put("permissions", permissions);
  	}
  	
  	/**
  	 * 验证参数是否正确
  	 */
  	private void verifyForm(SysMenuEntity menu){
  		if(StringUtils.isBlank(menu.getName())){
  			throw new RRException("菜单名称不能为空");
  		}
  		
  		if(menu.getParentId() == null){
  			throw new RRException("上级菜单不能为空");
  		}
  		
  		//菜单
  		if(menu.getType() == MenuType.MENU.getValue()){
  			if(StringUtils.isBlank(menu.getUrl())){
  				throw new RRException("菜单URL不能为空");
  			}
  		}
  		
  		//上级菜单类型
  		int parentType = MenuType.CATALOG.getValue();
  		if(menu.getParentId() != 0){
  			SysMenuEntity parentMenu = sysMenuService.queryObject(menu.getParentId());
  			parentType = parentMenu.getType();
  		}
  		
  		//目录、菜单
  		if(menu.getType() == MenuType.CATALOG.getValue() ||
  				menu.getType() == MenuType.MENU.getValue()){
  			if(parentType != MenuType.CATALOG.getValue()){
  				throw new RRException("上级菜单只能为目录类型");
  			}
  			return ;
  		}
  		
  		//按钮
  		if(menu.getType() == MenuType.BUTTON.getValue()){
  			if(parentType != MenuType.MENU.getValue()){
  				throw new RRException("上级菜单只能为菜单类型");
  			}
  			return ;
  		}
  	}
  }
  