Ejemplo n.º 1
0
  /**
   * 根据id获取用户的详细信息(包括权限、角色、菜单等信息)
   *
   * @param id 用户id
   * @return
   */
  public User getUserDetail(int id) {
    Connection conn = DbUtil.getConnection();
    PreparedStatement ps = null;
    ResultSet rs = null;
    User user = null;
    try {
      // 获取用户信息
      ps =
          conn.prepareStatement(
              "SELECT au.id,au.department_id,au.create_time,au.user_name,au.user_password,au.user_real_name,au.use_status from auth_user au where au.id=?");
      ps.setInt(1, id);
      rs = ps.executeQuery();
      if (rs.next()) {
        user = new User();
        user.setId(rs.getInt("id"));
        user.setUserName(rs.getString("user_name"));
        user.setDepartmentId(rs.getInt("department_id"));
        user.setCreateTime(rs.getTimestamp("create_time"));
        user.setUserPassword(rs.getString("user_password"));
        user.setUserRealName(rs.getString("user_real_name"));
        user.setUseStatus(rs.getInt("use_status"));
      }

      // 获取用户的所有权限
      List<Resource> resourceList = new ArrayList<Resource>();
      StringBuilder sql = new StringBuilder();
      sql.append("SELECT res.id,res.res_name,res.res_url");
      sql.append(" from auth_user_role ur join auth_role r on ur.role_id=r.id and ur.user_id=?");
      sql.append(" join auth_role_resource rr on r.id=rr.role_id");
      sql.append(" join auth_resource res on rr.res_id=res.id");
      ps = conn.prepareStatement(sql.toString());
      ps.setInt(1, id);
      rs = ps.executeQuery();
      Resource r = null;
      while (rs.next()) {
        r = new Resource();
        r.setId(rs.getString("id"));
        r.setResName(rs.getString("res_name"));
        r.setResUrl(rs.getString("res_url"));
        resourceList.add(r);
      }
      user.setResourceList(resourceList);

      if (!resourceList.isEmpty()) {
        // 获取用户的所有菜单
        List<Menu> menuList = new ArrayList<Menu>();
        sql = new StringBuilder();
        sql.append("SELECT m.id,m.parent_id,m.menu_name,m.res_id,r.res_url");
        sql.append(" from auth_menu m join auth_resource r on m.res_id=r.id and r.id in(");
        for (Resource res : resourceList) {
          sql.append("'").append(res.getId()).append("',");
        }
        sql.deleteCharAt(sql.length() - 1).append(")");
        sql.append("ORDER BY m.id");
        ps = conn.prepareStatement(sql.toString());
        rs = ps.executeQuery();
        Menu menu = null;
        while (rs.next()) {
          menu = new Menu();
          menu.setId(rs.getString("id"));
          menu.setParentId(rs.getString("parent_id"));
          menu.setMenuName(rs.getString("menu_name"));
          r = new Resource();
          r.setId(rs.getString("res_id"));
          r.setResUrl(rs.getString("res_url"));
          menu.setResource(r);
          menuList.add(menu);
        }
        // 组装树形结构的菜单
        List<Menu> menuTree = new ArrayList<Menu>();
        Menu preMenu = null; // 记录上一个菜单对象
        for (Menu m : menuList) {
          // 一级
          if (StringUtils.isBlank(m.getParentId())) {
            menuTree.add(m);
          }
          // 儿子
          else if (m.getParentId().equals(preMenu.getId())) {
            m.setParent(preMenu);
            preMenu.getChildren().add(m);
          }
          // 兄弟
          else if (m.getParentId().equals(preMenu.getParentId())) {
            m.setParent(preMenu.getParent());
            preMenu.getParent().getChildren().add(m);
          }
          // 是前一个的长辈
          else if (m.getId().length() < preMenu.getId().length()) {
            // 找到当前节点的父亲
            Menu p = preMenu.getParent();
            for (int i = 0; i < (preMenu.getId().length() - m.getId().length()) / 2 - 1; i++) {
              p = p.getParent();
            }
            m.setParent(p);
            p.getChildren().add(m);
          }
          preMenu = m;
        }
        user.setMenuList(menuTree);
      }
    } catch (Exception e) {
      log.error("根据id获取用户的详细信息时出现异常:", e);
    } finally {
      DbUtil.closeConnection(rs, ps, conn);
    }
    return user;
  }