sso项目心得第二天 用户模块
1.右侧的textarea框的编辑
<div class="span4" style="box-shadow:inset 1px -1px 1px #dddddd, inset 0px 1px 1px #dddddd;margin:0;height:500px;width: 32.3%"> <div id="head3" style="width: 96%;height:5%;padding:35px 0 10px 10px;border-bottom: 1px solid #dddddd ; "> 用户列表 </div> <div id="body3" style="height:90%;width: 100%"> <div class="span12" style="margin-left:3% "> <h5>所属机构</h5> <div id="groupInfo" class="m-wrap span10" placeholder="运营1号位" style="height: 60px;overflow: auto;border: solid 1px #dddddd"> <input id="returnUserId" type="hidden" name="userId" value="${userId}"> <c:forEach items="${groupchecked}" var="gc"> <c:if test="${gc.checked==1}"> ${gc.groupName} </c:if><br> </c:forEach> </div> <div class="clearfix" style="float: right;margin-right: 16%"> <div class="btn-group"> <input type="button" id="permission" class="btn yellow" onclick="permission1()" value="编辑" /> </div> </div> </div> <div class="span12" style="margin-left:3% "> <h5>所属职位</h5> <div id="positionInfo" class="m-wrap span10" placeholder="运营1号位" style="height: 60px;overflow: auto;border: solid 1px #dddddd"> <input type="hidden" id="positionUserId" value="${updateuserId}"> <c:forEach items="${positionchecked}" var="pc"> <c:if test="${pc.checked==1}"> ${pc.positionName}<br> </c:if> </c:forEach> </div> <div class="clearfix" style="float: right;margin-right: 16%"> <div class="btn-group"> <input type="button" id="permission2" class="btn yellow" onclick="permission2()" value="编辑" /> </div> </div> </div> <div class="span12" style="margin-left:3% "> <h5>所属角色</h5> <div id="roleInfo" class="m-wrap span10" placeholder="运营1号位" style="height: 60px;overflow: auto;border: solid 1px #dddddd"> <c:forEach items="${rolechecked}" var="rc"> <c:if test="${rc.checked==1}"> ${rc.roleName} </c:if><br> </c:forEach> </div> <div class="clearfix" style="float: right;margin-right: 16%"> <div class="btn-group"> <input type="button" id="permission3" class="btn yellow" onclick="permission3()" value="编辑" /> </div> </div> </div> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" onclick="update();">ok,保存当前信息</button></div> </div> </div>
(隐藏的悬浮框)只附了一个角色的模态框,职位、机构类似
(**其中模态框用的是bootstrop2的js、css包)
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none"> <div class="modal-dialog"> <div class="modal-content"> <form action="${ctx}/userWeb/updateRolePermission" method="post"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> <div><input type="text" placeholder="请输入内容"></div> </div> <div class="modal-body"> <table> <input name="userId" type="hidden" value="${userId}"> <c:forEach items="${role }" var="r"> <input id="roleId" type="hidden" value="${r.roleId}"> <tr> <td> <c:if test="${r.checked==1}"> <input type="checkbox" checked style="float: left" value="${r.roleId}" name="checked"> </c:if> <c:if test="${r.checked==0}"> <input type="checkbox" style="float: left" value="${r.roleId}" name="checked"> </c:if> </td> <td>${r.roleName}</td> </tr> </c:forEach> </table> </div> <div class="modal-footer"> <button type="button" class="btn btn-primary" onclick="clear_diaglog();">关闭</button> <input type="submit" class="btn btn-primary" value="保存更改"> </div> </form> </div><!-- /.modal-content --> </div> </div><!--modal end-->
(**form表单上传,用name和后台接收的参数对应。上例中checkedbox的name都一样,后台用Long【】checked接收)
(**checkedbox默认只上传选中的选框中的value)
2.点击隐藏悬浮框的编辑按钮之后显示悬浮框和对应的用户的权限信息(未完成)
在用户的信息显示中增加一个id=“jvform”的form表单来用于编辑机构、职位、角色时传值到后台
<form id="jvForm"><input id="uId" name="userId" type="hidden" ></form>
这里只展示了机构、职位、角色三个编辑中的一个/** * @author duan * 角色编辑 */ function permission3(){ $('#myModal').modal();//显示模态框 $("#jvForm").attr("action",ctx+"/roleWeb/getRolesByUserId"); $("#jvForm").attr("method","post"); $("#jvForm").submit(); }
其中permission3的js将用户id传到后台以用来查询用户对应的角色信息(会将所有的角色都查询出来,最终这个用户对应的角色的CheckBox框会默认选中
**后期需要优化为查询所有系统与此系统对应的角色,并将用户与角色相关联的CheckBox选中)如下图:
下图为现在的状态:
二、后台部分:(以机构、职位、角色中的机构为示例)
1.1.web部分: 点击编辑获取用户对应的机构、职位、角色的信息
controller
@RequestMapping(value = "getPositionsByUserId") public String getPositionsByUserId(UserCondition condition, Model model) { try { Long userId=condition.getUserId(); List<UserPositionRefVo> position= userService.getPositionsByUserId(condition); model.addAttribute("position",position); model.addAttribute("userId",userId); //用于回显用户信息,在window.onload中调用获取id return "user/user_management"; } catch (Exception e) { e.printStackTrace(); return null; } }service
public List<UserGroupRefVo> getGroupsByUserId(Object t) { List<UserGroupRefVo> rev = null; try { String url = ConstantsUtil.domain + "user/getGroupsByUserId"; rev = JSON.parseArray(HttpsUtil.doPost(url, t), UserGroupRefVo.class); } catch (Exception ex) { ex.printStackTrace(); logger.error(ex); } return rev; } 1.2. api部分: 点击编辑获取用户对应的机构、职位、角色的信息 controller
@RequestMapping("/getGroupsByUserId") @ResponseBody public Object getGroupsByUserId(@RequestBody String indexStr) { List<UserGroupRefVo> list = null; try { UserCondition condition = JSON.parseObject(indexStr, UserCondition.class); logger.info("通过用户id查询对应职位开始"); if (condition != null) { if (condition.getUserId() == null) { logger.info("通过用户id查询对应职位结束,由于未传用户id"); return list; } }else{ return list; } list = userService.getGroupsByUserId(condition); if (list != null && list.size() > 0) { logger.info("通过用户id查询对应职位结束,成功"); return list; } } catch (Exception e) { logger.error("通过用户id查询对应职位发生异常" + e.toString()); e.printStackTrace(); return list; } return list; }
service
public List<UserGroupRefVo>getGroupsByUserId(UserCondition condition){ return userDao.getGroupsByUserId(condition); }
Dao
public List<UserGroupRefVo>getGroupsByUserId(UserCondition condition){ return groupMapper.getGroupsByUserId(condition); }
Mapper
List<UserGroupRefVo> getGroupsByUserId(UserCondition condition);
Mapper.xml
<!-- 通过用户Id查询所有的组织机构,并将关联的checked --> <select id="getGroupsByUserId" parameterType="cn.com.hiveview.passportapi.module.user.condition.UserCondition" resultMap="UserGroupRefVoMap"> SELECT org_id as groupId , org_name as groupName, CASE WHEN org_id IN ( SELECT org_id FROM t_user_group WHERE user_id = #{userId} ) THEN 1 ELSE 0 END AS checked FROM t_group </select>2.2.web部分: 点击保存更改,修改用户对应的机构、职位、角色的信息
<form action="${ctx}/userWeb/updateRolePermission" method="post">controller
@RequestMapping(value = "updateRolePermission") public Object updateRolePermission(Long[] checked,Long userId , Model model) { UserCondition condition=new UserCondition(); condition.setUserId(userId); List<RoleVo> roleList=new ArrayList<RoleVo>(); if( checked!=null && checked.length==0 || checked==null){ //checked没有被勾选的 userService.deleteUserRolesRef(condition); List<RoleVo> rolechecked= roleService.getRolesByUserId(condition); List<UserPositionRefVo> positionchecked= userService.getPositionsByUserId(condition); List<UserGroupRefVo> groupchecked= userService.getGroupsByUserId(condition); model.addAttribute("rolechecked",rolechecked); model.addAttribute("positionchecked",positionchecked); model.addAttribute("groupchecked",groupchecked); model.addAttribute("userId",userId); return "user/user_management"; } for(Long roleId:checked){ //因为checkbox 只上传被选中的,遍历放进roleList中的roleId里面 RoleVo roleVo=new RoleVo(); roleVo.setRoleId(roleId); roleVo.setChecked(1); roleList.add(roleVo); } condition.setRoleVoList(roleList); try { userService.updateUserRolesRef(condition); List<RoleVo> rolechecked= roleService.getRolesByUserId(condition); List<UserPositionRefVo> positionchecked= userService.getPositionsByUserId(condition); List<UserGroupRefVo> groupchecked= userService.getGroupsByUserId(condition); model.addAttribute("rolechecked",rolechecked); model.addAttribute("positionchecked",positionchecked); model.addAttribute("groupchecked",groupchecked); model.addAttribute("userId",userId); return "user/user_management"; } catch (Exception e) { e.printStackTrace(); return null; } }service
/* 修改用户 对应角色列表*/ public Object updateUserRolesRef(Object t) { Object rev = null; try { String url = ConstantsUtil.domain + "user/updateUserRolesRef"; rev = HttpsUtil.doPost(url,t); // rev = HttpsUtil.doGet(url); } catch (Exception ex) { logger.error(ex); } return rev; }apicontroller
@RequestMapping("/updateUserRolesRef") @ResponseBody public Object updateUserRolesRef(@RequestBody String indexStr){ Integer returnCount=null; try{ UserCondition condition=JSON.parseObject(indexStr, UserCondition.class); logger.info("修改用户对应角色关系开始"); if(condition!=null ){ if(condition.getUserId()==null){ logger.info("修改用户对应角色关系结束,由于未传用户id,未更新数据"); return JsonMessage.create(-1L, "修改用户对应角色关系结束,由于未传用户id,数据库更新失败", ""); } } returnCount=userService.updateUserRolesRef(condition); if (returnCount!=null && returnCount!=0) { logger.info("修改用户对应角色关系结束,成功"); return JsonMessage.create(0, "",condition); } else { return JsonMessage.create(-1L, "修改用户对应角色关系数据库更新失败", ""); } }catch (Exception e){ logger.error("修改用户对应角色关系发生异常"+e.toString()); e.printStackTrace(); return JsonMessage.create(-1L, e.getMessage(), ""); } }service
@Transactional //修改删除增加需要写上@Transactional
public int updateUserRolesRef(UserCondition condition){ int count=userDao.deleteUserRolesRef(condition); Long userId=condition.getUserId(); List<RoleVo> roleVoList=condition.getRoleVoList(); if(count>0 || roleVoList!=null && roleVoList.size()>0){ List<UserRoleRefVo> list= new ArrayList<UserRoleRefVo>(); for(RoleVo roleVo:roleVoList){ UserRoleRefVo userRoleRefVo=new UserRoleRefVo(); userRoleRefVo.setRoleId(roleVo.getRoleId()); userRoleRefVo.setUserId(userId); list.add(userRoleRefVo); } if(list!=null && list.size()>0){ count=userDao.insertUserRolesRef(list); } } return count; }Dao
public int deleteUserRolesRef(UserCondition condition){ return roleMapper.deleteUserRolesRef(condition); }
public int insertUserRolesRef(List<UserRoleRefVo> list){ return roleMapper.insertUserRolesRef(list); } Mapper
int deleteUserRolesRef(UserCondition userCondition);
int insertUserRolesRef(List<UserRoleRefVo> list);Mapper.xml
<delete id="deleteUserRolesRef" parameterType="cn.com.hiveview.passportapi.module.user.condition.UserCondition"> delete from t_user_role where user_id=#{userId} </delete> <insert id="insertUserRolesRef" parameterType="cn.com.hiveview.entity.module.user.UserRoleRefVo"> insert into t_user_role (user_id,role_id) values <foreach collection="list" separator="," item="item"> //对于list的传入参数需要遍历 ( #{item.userId,jdbcType=BIGINT},#{item.roleId,jdbcType=BIGINT}) </foreach> </insert>在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,
该属性的值是不一样的,主要有一下3种情况:
1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可