权限页面展示格局
权限页面展示布局
目的:
需要将权限做如下图所示的展示:
1. 数据库表结构
表名: ss_permission
ID VARCHAR2(32) PRIMARY KEY, DISPLAY_NAME VARCHAR2(500), NAME VARCHAR2(300), PARENT_ VARCHAR2(32) LEAF_ VARCHAR2(1)
2. 表数据
其中,parent_ 为空,表示是父权限。
3. 表对应的实体类 SsPermission.java
import java.io.Serializable; import java.util.List; public class SsPermission implements Serializable { /** * @Fields serialVersionUID : 序列化id */ private static final long serialVersionUID = 3410077426635038417L; private String id; private String displayName; private String name; private String parent_; private String leaf_; // 子权限集合 private List<SsPermission> childs; // 省略 setter/getter }
由于需要展示父权限及其子权限,所以实体类中需要有一个子权限集合的属性。
4. 实现思路
首先,查询出所有的父权限信息
public List<SsPermission> findAllParents() throws Exception { List<SsPermission> list = new ArrayList<SsPermission>(10); StringBuffer sql = new StringBuffer(100); sql.append("SELECT ID, NAME, DISPLAY_NAME, PARENT_ "); sql.append(" FROM SS_PERMISSION "); sql.append(" WHERE (PARENT_ IS NULL OR PARENT_ = '') "); sql.append(" AND LEAF_='0'"); list = getJdbcTemplate().query(sql.toString(), new RowMapper<SsPermission>() { @Override public SsPermission mapRow(ResultSet rs, int index) throws SQLException { SsPermission p = new SsPermission(); p.setId(rs.getString("ID")); p.setName(rs.getString("NAME")); p.setDisplayName(rs.getString("DISPLAY_NAME")); p.setParent_(rs.getString("PARENT_")); return p; } }); return list; }
其次,循环父权限,根据父权限id查找其所有的子权限,将结果存入子权限集合childs中。
public List<SsPermission> findChildsById(final String permissionId) throws Exception { List<SsPermission> list = new ArrayList<SsPermission>(10); StringBuffer sql = new StringBuffer(100); sql.append("SELECT ID, NAME, DISPLAY_NAME, PARENT_ "); sql.append(" FROM SS_PERMISSION "); sql.append(" WHERE PARENT_ = ?"); list = getJdbcTemplate().query(sql.toString(), new Object[] { permissionId }, new RowMapper<SsPermission>() { @Override public SsPermission mapRow(ResultSet rs, int index) throws SQLException { SsPermission p = new SsPermission(); p.setId(rs.getString("ID")); p.setName(rs.getString("NAME")); p.setDisplayName(rs.getString("DISPLAY_NAME")); p.setParent_(rs.getString("PARENT_")); return p; } }); return list; }
总的实现方法如下所示:
import java.util.ArrayList; import java.util.List; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @RequestMapping("/toSelectPermission") public String toSelectPermission(Model model) { // 父权限 List<SsPermission> permissions = new ArrayList<SsPermission>(10); try { // 查找所有的父权限 List<SsPermission> parents = permissionService.findAllParents(); if (null != parents && !parents.isEmpty()) { SsPermission per = null; for (SsPermission p : parents) { per = new SsPermission(); per.setId(p.getId()); per.setName(p.getName()); per.setDisplayName(p.getDisplayName()); // 根据父权限id查找对应的子权限 per.setChilds(permissionService.findChildsById(p.getId())); permissions.add(per); } } } catch (Exception e) { log.error("Go to SelectPermission page fail:" + e.getMessage(), e); } model.addAttribute("permissionList", permissions); return "security/selectPermissions"; }
5. jsp 页面展示
<style type="text/css"> .clearfix{zoom:1;} .clearfix:after{content:′.′;display:block;visibility:none;height:0;clear:both;} #bd{/*background-color:#DDD;*/min-height:50px;_height:50px;} #bd .right{/*background-color:red;*/float:right;width:100%;margin-left:-25em;} #bd .right .content{margin-left:100px;/*background-color:blue;color:#FFF;*/} #bd .left{/*background-color:green;color:#FFF;*/width:260px;float:left;} </style> <body> <table align="center" class="bordered" border="0"> <c:forEach items="${permissionList }" var="parentPer" varStatus="status"> <tr> <td> <div class="left"> <p>${parentPer.displayName }: </p> </div> </td> <td> <div class="right"> <div class="content"> <p> <c:forEach items="${parentPer.childs }" var="childPer" varStatus="status"> <input type="checkbox" id="" name="child_name" value="${childPer.id }"/>${childPer.displayName } </c:forEach> </p> </div> </div> </td> </tr> </c:forEach> </table> </body>