package com.usky.service.sys.menuService; import com.usky.annotion.DataScope; import com.usky.dao.impl.BaseDaoImpl; import com.usky.entity.sys.SysMenuDTO; import com.usky.entity.sys.vo.SysMenuVO; import com.usky.entity.sys.vo.SysUserVO; import com.usky.utils.BeanHelp; import com.usky.utils.ShiroUtils; import org.apache.commons.lang3.StringUtils; import org.hibernate.transform.Transformers; import org.springframework.stereotype.Service; import java.math.BigInteger; import java.sql.Timestamp; import java.util.*; /** * @author laowo * @version v1.0 * @date 2021/8/23 15:13 * @description TODO **/ @Service public class MenuServiceImpl extends BaseDaoImpl implements MenuService { @Override public Set qyeryPermsByUserId(long userId) { @SuppressWarnings("all") String sql = "SELECT DISTINCT\n" + "\tm.perms \n" + "FROM\n" + "\tsys_menu m\n" + "\tLEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id\n" + "\tLEFT JOIN sys_user_role ur ON rm.role_id = ur.role_id\n" + "\tLEFT JOIN sys_role r ON r.role_id = ur.role_id \n" + "WHERE\n" + "\tm.visible = '0' \n" + "\tAND r.STATUS = '0' AND ur.user_id = " + userId + ""; List perms = getSession().createSQLQuery(sql).list(); Set permsSet = new HashSet<>(); for (String perm : perms) { if (StringUtils.isNotBlank(perm)) { permsSet.addAll(Arrays.asList(perm.trim().split(","))); } } return permsSet; } @Override @SuppressWarnings("all") @DataScope(deptAlias = "d") public List queryMenuList(SysUserVO user) { String sql = null; List menus = new LinkedList(); // 管理员显示所有菜单信息 if (user.isAdmin()) { sql = "SELECT DISTINCT\n" + "\tm.menu_id AS menuId,\n" + "\tm.parent_id AS parentId,\n" + "\tm.menu_name AS menuName,\n" + "\tm.url,\n" + "\tm.visible,\n" + "\tm.is_refresh as isRefresh,\n" + "\tifnull( m.perms, '' ) AS perms,\n" + "\tm.target,\n" + "\tm.menu_type AS menuType,\n" + "\tm.icon,\n" + "\tm.order_num AS orderNum\n" + // "\tm.create_time AS createTime \n" + "FROM\n" + "\tsys_menu m\n" + "\tLEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id\n" + "\tLEFT JOIN sys_user_role ur ON rm.role_id = ur.role_id\n" + "\tLEFT JOIN sys_role ro ON ur.role_id = ro.role_id \n" + "WHERE\n" + "\t m.menu_type in ('M', 'C') and m.visible = 0 AND ro.status = 0\n" + "\t\n" + "ORDER BY\n" + "\tm.parent_id,\n" + "\tm.order_num"; menus = getSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(SysMenuVO.class)).list(); } else { String dataScope = (String) user.getParams().get("dataScope"); sql = "SELECT DISTINCT\n" + "\tm.menu_id AS menuId,\n" + "\tm.parent_id AS parentId,\n" + "\tm.menu_name AS menuName,\n" + "\tm.url,\n" + "\tm.visible,\n" + "\tm.is_refresh as isRefresh,\n" + "\tifnull( m.perms, '' ) AS perms,\n" + "\tm.target,\n" + "\tm.menu_type AS menuType,\n" + "\tm.icon,\n" + "\tm.order_num AS orderNum,\n" + "\tm.create_time AS createTime \n" + "FROM\n" + "\tsys_menu m\n" + "\tLEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id\n" + "\tLEFT JOIN sys_user_role ur ON rm.role_id = ur.role_id\n" + "\tLEFT JOIN sys_role ro ON ur.role_id = ro.role_id \n" + "WHERE\n" + "\tur.user_id = " + user.getUserId() + " and m.menu_type in ('M', 'C') and m.visible = 0 AND ro.status = 0 ORDER BY\n" + "\tm.parent_id,\n" + "\tm.order_num"; menus = getSession().createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(SysMenuVO.class)).list(); } return getChildPerms(menus, 0); } @Override public List list(SysMenuVO sysMenuVO, String menuName, String visible, Integer userId) { List menuList = null; if (SysUserVO.isAdmin(userId)) //管理员查看全部菜单 { StringBuffer sb = new StringBuffer(); sb.append("select menu_id AS menuId, menu_name AS menuName, parent_id AS parentId, order_num AS orderNum, url, target, menu_type AS menuType, visible, is_refresh as isRefresh, ifnull(perms,'') as perms, icon, create_by AS createBy, create_time AS createTime from sys_menu where 1 = 1"); if (StringUtils.isNotBlank(menuName)) { sb.append(" and menu_name like '%" + menuName + "%'"); } if (StringUtils.isNotBlank(visible)) { sb.append(" and visible='" + visible + "'"); } sb.append(" order by parent_id, order_num"); menuList = getSession().createSQLQuery(sb.toString()).setResultTransformer(Transformers.aliasToBean(SysMenuVO.class)).list(); } else { StringBuffer sb = new StringBuffer(); //根据用户id查询菜单 sb.append("select distinct m.menu_id AS menuId, m.parent_id AS parentId, m.menu_name AS menuName, m.url, m.visible, m.is_refresh AS isRefresh, ifnull(m.perms,'') as perms, m.target, m.menu_type AS menuType, m.icon, m.order_num AS orderNum, m.create_time AS createTime from sys_menu m\n" + "\t\tleft join sys_role_menu rm on m.menu_id = rm.menu_id\n" + "\t\tleft join sys_user_role ur on rm.role_id = ur.role_id\n" + "\t\tLEFT JOIN sys_role ro on ur.role_id = ro.role_id where ur.user_id = " + userId + ""); if (StringUtils.isNotBlank(menuName)) { sb.append(" and menu_name like '%" + menuName + "%'"); } if (StringUtils.isNotBlank(visible)) { sb.append(" and visible='" + visible + "'"); } sb.append(" order by parent_id, order_num"); menuList = getSession().createSQLQuery(sb.toString()).setResultTransformer(Transformers.aliasToBean(SysMenuVO.class)).list(); } return menuList; } @Override public int queryMenuById(Integer menuId) { List list = getSession().createSQLQuery("select count(1) from sys_menu where parent_id=" + menuId + "").list(); return ((BigInteger) list.get(0)).intValue(); } @Override public int queryRoleMenuByMenuId(Integer menuId) { List list = getSession().createSQLQuery("select count(1) from sys_role_menu where menu_id=" + menuId + "").list(); return ((BigInteger) list.get(0)).intValue(); } @Override public void deleteMenuById(Integer menuId) { getSession().createSQLQuery("delete from sys_menu where menu_id = " + menuId + " or parent_id = " + menuId + "").executeUpdate(); } @Override public List queryMenuByName(String menuName, Integer parentId) { List list = getSession().createQuery("from SysMenuDTO t where t.menuName='" + menuName + "' and t.parentId=parentId").list(); return list; } @Override public void add(SysMenuVO menu) { menu.setCreateBy(ShiroUtils.getLoginName()); menu.setCreateTime(new Timestamp(System.currentTimeMillis())); SysMenuDTO sysMenuDTO = BeanHelp.copyProperties(menu, SysMenuDTO.class); getSession().save(sysMenuDTO); } @Override public void updateMenu(SysMenuVO menu) { SysMenuDTO sysMenuDTO = BeanHelp.copyProperties(menu, SysMenuDTO.class); String loginName = ShiroUtils.getLoginName(); sysMenuDTO.setUpdateBy(loginName); sysMenuDTO.setUpdateTime(new Timestamp(System.currentTimeMillis())); getSession().update(sysMenuDTO); } /** * 根据父节点的ID获取所有子节点 * * @param list 分类表 * @param parentId 传入的父节点ID * @return String */ public List getChildPerms(List list, int parentId) { List returnList = new ArrayList(); for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { SysMenuVO t = (SysMenuVO) iterator.next(); // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 if (t.getParentId() == parentId) { recursionFn(list, t); returnList.add(t); } } return returnList; } /** * 递归列表 * * @param list * @param t */ private void recursionFn(List list, SysMenuVO t) { // 得到子节点列表 List childList = getChildList(list, t); t.setChildren(childList); for (SysMenuVO tChild : childList) { if (hasChild(list, tChild)) { recursionFn(list, tChild); } } } /** * 得到子节点列表 */ private List getChildList(List list, SysMenuVO t) { List tlist = new ArrayList(); Iterator it = list.iterator(); while (it.hasNext()) { SysMenuVO n = (SysMenuVO) it.next(); if (n.getParentId() == t.getMenuId()) { tlist.add(n); } } return tlist; } /** * 判断是否有子节点 */ private boolean hasChild(List list, SysMenuVO t) { return getChildList(list, t).size() > 0 ? true : false; } }