一、实现功能:
关于用户的增删改查:
用户的角色设置:
对于用户已经拥有的角色,要默认选中打勾
用户实体:
用户角色实体:
角色实体:
二、代码
1、查询用户列表
controller:
上面大致思路:先获取用户列表,遍历得到每一个用户,
对于每个用户,获取他的角色列表,提取角色名称 拼接起来,设置给该用户的roles属性
service层:
/*** 根据条件分页查询用户信息* @param user* @param page :起始页 * @param pageSize* @param direction :降序或是升序的依据* @param properties* @return* * root:用来获取某个字段信息 cb:用来封装一些条件(like、equal...)* pageRequest的分页对象,第一页是page=0,而前台easyui传来的第一页为1,因此需要 page - 1 * predicate:存储后面构造的查询条件*/@Overridepublic List<User> list(User user, Integer page, Integer pageSize, Direction direction, String... properties) {
Pageable pageable=new PageRequest(page-1,pageSize);//查询所需参数pageablePage<User> pageUser=userRepository.findAll(new Specification<User>() {
@Overridepublic Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate predicate=cb.conjunction();//存储下面构造的查询条件if(user !=null) {
if(StringUtil.isNotEmpty(user.getUserName())) {
predicate.getExpressions().add(cb.like(root.get("userName"), "%"+user.getUserName()+"%"));}predicate.getExpressions().add(cb.notEqual(root.get("id"), 1));// 管理员除外}return predicate;}}, pageable); return pageUser.getContent();}
获取查询记录总数:
/*** 获取总记录数* @param user* @return*/@Overridepublic Long getCount(User user) {
Long count=userRepository.count(new Specification<User>() {
@Overridepublic Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate predicate=cb.conjunction();if(user!=null){
if(StringUtil.isNotEmpty(user.getUserName())){
predicate.getExpressions().add(cb.like(root.get("userName"), "%"+user.getUserName()+"%"));}predicate.getExpressions().add(cb.notEqual(root.get("id"), 1));}return predicate;}});return count;}
Repository:
/*** 用户Repository接口* @author Administrator* JpaRepository<实体,主键类型>*/
public interface UserRepository extends JpaRepository<User,Integer>,JpaSpecificationExecutor<User>{
/** 根据用户名查找用户实体*/@Query(value="select * from t_user where user_name=?1",nativeQuery=true)public User findByUserName(String userName);
}
2.添加或者修改用户信息
js代码:
function saveUser(){
$("#fm").form("submit",{
url:url,onSubmit:function(){
return $(this).form("validate");},success:function(result){
var result=eval('('+result+')');eval方法是将json字符串转换成json对象 便于下面获取result里面的属性if(result.success){
$.messager.alert("系统提示","保存成功!");resetValue();$("#dlg").dialog("close");$("#dg").datagrid("reload");}else{
$.messager.alert("系统提示",result.errorInfo);}}});}
添加或者修改用户可以共用一个接口:
Controller层:
service层:
至于Repository:serviceImpl直接使用userRepository.save(user)接口,不用自己再写其他的sql语句了;
3.删除用户:
Controller层:
service层也是直接调用userRepository.delete(id)接口即可;
4.用户角色设置:
1.页面:
/* val:当前字段的值 row:一行的值 */function formatEdit(val,row){
return "<a href=\"javascript:openRoleChooseDialog('"+row.roles+"',"+row.id+")\"> <img style='margin-top:4px' src='/static/images/edit.gif'/> </a>";}
//打开角色设置对话框function openRoleChooseDialog(roles,userId){
var rolesArr=roles.split(","); //用户有的角色$("#dlg2").dialog("open").dialog("setTitle","选择角色");$("#dg2").datagrid({
url:'/admin/role/listAll',onLoadSuccess:function(data){
//url加载成功后执行此函数var allRows=$("#dg2").datagrid("getRows");for(var i=0;i<allRows.length;i++){
var name=allRows[i].name;if($.inArray(name,rolesArr)>=0){
//用户拥有的角色出现在了角色数组中 就让该角色选中$("#dg2").datagrid("checkRow",i);}}}});$("#userId").val(userId);}
//选择角色设置给用户 然后提交function saveRoleSet(){
var userId=$("#userId").val();var selectedRows=$("#dg2").datagrid("getSelections");var strRoleIds=[];for(var i=0;i<selectedRows.length;i++){
strRoleIds.push(selectedRows[i].id);}var roleIds=strRoleIds.join(","); //将数组转换为以,分割的字符串$.post("/admin/user/saveRoleSet",{
roleIds:roleIds,userId:userId},function(result){
if(result.success){
closeRoleSetDialog();$("#dg").datagrid("reload");}else{
$.messager.alert("系统提示","提交失败,请联系管理员!");}},"json");}
- Controller:
/*** 保存用户角色设置*大致过程:当为某个用户设置角色时,先根据userId删掉指定用户的所有用户角色关联* 然后再统一将选中的角色设置给该用户* @param roleIds* @param userId* @return* @throws Exception*/@ResponseBody @RequestMapping("/saveRoleSet")public Map<String,Object> saveRoleSet(String roleIds,Integer userId) throws Exception{
Map<String,Object> resultMap=new HashMap<>();userRoleService.deleteByUserId(userId);if(StringUtil.isNotEmpty(roleIds)) {
String roleIdStr[]=roleIds.split(",");for(int i=0;i<roleIdStr.length;i++) {
UserRole userRole=new UserRole();userRole.setUser(userService.findById(userId));userRole.setRole(roleService.findById(Integer.parseInt(roleIdStr[i])));userRoleService.save(userRole);}}resultMap.put("success", true);//logService.save(new Log(Log.UPDATE_ACTION,"保存用户角色设置"));return resultMap;}
三、总结 (主要几点)
1.双击 弹出修改对话框
$(document).ready(function(){
$("#dg").datagrid({
onDblClickRow:function(index,row){
$("#dlg").dialog("open").dialog("setTitle","修改用户信息");$("#fm").form("load",row);$("#userName").attr("readonly","readonly");url="/admin/user/save?id="+row.id;}});});
2.什么时候使用var result=eval(’(’+result+’)’)
保存、修改 提交表单时未指定 “json”格式,这时需要使用eval处理结果:
下面删除时,指定了“json”格式:
有的功能可能要删除多条数据,下面补充一下:
function deleteSupplier(){
var selectedRows=$("#dg").datagrid("getSelections");if(selectedRows.length==0){
$.messager.alert("系统提示","请选择要删除的数据!");return;}var strIds=[];for(var i=0;i<selectedRows.length;i++){
strIds.push(selectedRows[i].id);}var ids=strIds.join(",");$.messager.confirm("系统提示","您确定要删除这条数据吗?",function(r){
if(r){
$.post("/admin/supplier/delete",{
ids:ids},function(result){
if(result.success){
$.messager.alert("系统提示","数据已成功删除!");$("#dg").datagrid("reload");}else{
$.messager.alert("系统提示",result.errorInfo);}},"json");}});}
@RequestMapping("/delete")@RequiresPermissions(value="供应商管理")public Map<String,Object> delete(String ids) throws Exception{
Map<String,Object> resultMap=new HashMap<>();String []idsStr=ids.split(",");for(int i=0;i<idsStr.length;i++) {
int id=Integer.parseInt(idsStr[i]);logService.save(new Log(Log.DELETE_ACTION,"删除供应商信息"+supplierService.findById(id)));supplierService.delete(id);}resultMap.put("success", true);return resultMap;}
3.$.inArray()
$.inArray()函数用于在数组中搜索指定的值,并返回其索引值。如果数组中不存在该值,则返回-1。
4.join方法
将数组转换为以,分割的字符串
完整代码地址:
https://gitee.com/never_enough/jxc_system/blob/master/JXC/src/main/webapp/power/user.html