Przeglądaj źródła

新增单独用户权限管理。用户权限=所有角色权限合集+加权限-减权限。优先级:减权限>加权限>角色权限

shuzheng 9 lat temu
rodzic
commit
99d3bf3c5b

+ 2 - 0
zheng-upms/zheng-upms-rpc-api/src/main/java/com/zheng/upms/rpc/api/UpmsPermissionService.java

@@ -13,4 +13,6 @@ public interface UpmsPermissionService extends BaseService<UpmsPermission, UpmsP
 
     JSONArray getTreeByRoleId(Integer roleId);
 
+    JSONArray getTreeByUserId(Integer usereId, Byte type);
+
 }

+ 7 - 1
zheng-upms/zheng-upms-rpc-api/src/main/java/com/zheng/upms/rpc/api/UpmsPermissionServiceMock.java

@@ -18,7 +18,13 @@ public class UpmsPermissionServiceMock extends BaseServiceMock<UpmsPermissionMap
 
     @Override
     public JSONArray getTreeByRoleId(Integer roleId) {
-        _log.info("UpmsPermissionServiceMock => getTree");
+        _log.info("UpmsPermissionServiceMock => getTreeByRoleId");
+        return null;
+    }
+
+    @Override
+    public JSONArray getTreeByUserId(Integer usereId, Byte type) {
+        _log.info("UpmsPermissionServiceMock => getTreeByUserId");
         return null;
     }
 

+ 5 - 2
zheng-upms/zheng-upms-rpc-service/src/main/java/com/zheng/upms/rpc/mapper/UpmsApiMapper.xml

@@ -41,12 +41,15 @@
 	<select id="selectUpmsPermissionByUpmsUserId" parameterType="java.lang.Integer" resultMap="UpmsPermissionResultMap">
 		select
 			<include refid="UpmsPermission_Column_List" />
-		from upms_permission up where up.permission_id in (
+		from upms_permission up where up.`status`=1 and up.permission_id in (
 			select permission_id from upms_role_permission urp where urp.role_id in (
 				select uur.role_id role_id from upms_user_role uur where uur.user_id=#{upmsUserId,jdbcType=INTEGER}
 			)
 			union
-			select permission_id from upms_user_permission uup where uup.user_id=#{upmsUserId,jdbcType=INTEGER}
+			select permission_id from upms_user_permission uup1 where uup1.user_id=#{upmsUserId,jdbcType=INTEGER} and uup1.type=1
+		)
+		and up.permission_id not in (
+			select permission_id from upms_user_permission uup2 where uup2.user_id=#{upmsUserId,jdbcType=INTEGER} and uup2.type=-1
 		) order by up.orders asc
 	</select>
 

+ 105 - 1
zheng-upms/zheng-upms-rpc-service/src/main/java/com/zheng/upms/rpc/service/impl/UpmsPermissionServiceImpl.java

@@ -6,6 +6,7 @@ import com.zheng.common.annotation.BaseService;
 import com.zheng.common.base.BaseServiceImpl;
 import com.zheng.upms.dao.mapper.UpmsPermissionMapper;
 import com.zheng.upms.dao.mapper.UpmsSystemMapper;
+import com.zheng.upms.dao.mapper.UpmsUserPermissionMapper;
 import com.zheng.upms.dao.model.*;
 import com.zheng.upms.rpc.api.UpmsApiService;
 import com.zheng.upms.rpc.api.UpmsPermissionService;
@@ -37,6 +38,9 @@ public class UpmsPermissionServiceImpl extends BaseServiceImpl<UpmsPermissionMap
     @Autowired
     UpmsApiService upmsApiService;
 
+    @Autowired
+    UpmsUserPermissionMapper upmsUserPermissionMapper;
+
     @Override
     public JSONArray getTreeByRoleId(Integer roleId) {
         // 角色已有权限
@@ -58,7 +62,7 @@ public class UpmsPermissionServiceImpl extends BaseServiceImpl<UpmsPermissionMap
             systems.add(node);
         }
 
-        if (!systems.isEmpty()) {
+        if (systems.size() > 0) {
             for (Object system: systems) {
                 UpmsPermissionExample upmsPermissionExample = new UpmsPermissionExample();
                 upmsPermissionExample.createCriteria()
@@ -131,4 +135,104 @@ public class UpmsPermissionServiceImpl extends BaseServiceImpl<UpmsPermissionMap
         }
         return systems;
     }
+
+    @Override
+    public JSONArray getTreeByUserId(Integer usereId, Byte type) {
+        // 角色权限
+        UpmsUserPermissionExample upmsUserPermissionExample = new UpmsUserPermissionExample();
+        upmsUserPermissionExample.createCriteria()
+                .andUserIdEqualTo(usereId)
+                .andTypeEqualTo(type);
+        List<UpmsUserPermission> upmsUserPermissions = upmsUserPermissionMapper.selectByExample(upmsUserPermissionExample);
+
+        JSONArray systems = new JSONArray();
+        // 系统
+        UpmsSystemExample upmsSystemExample = new UpmsSystemExample();
+        upmsSystemExample.createCriteria()
+                .andStatusEqualTo((byte) 1);
+        upmsSystemExample.setOrderByClause("orders asc");
+        List<UpmsSystem> upmsSystems = upmsSystemMapper.selectByExample(upmsSystemExample);
+        for (UpmsSystem upmsSystem : upmsSystems) {
+            JSONObject node = new JSONObject();
+            node.put("id", upmsSystem.getSystemId());
+            node.put("name", upmsSystem.getTitle());
+            node.put("nocheck", true);
+            node.put("open", true);
+            systems.add(node);
+        }
+
+        if (systems.size() > 0) {
+            for (Object system: systems) {
+                UpmsPermissionExample upmsPermissionExample = new UpmsPermissionExample();
+                upmsPermissionExample.createCriteria()
+                        .andStatusEqualTo((byte) 1)
+                        .andSystemIdEqualTo(((JSONObject) system).getIntValue("id"));
+                upmsPermissionExample.setOrderByClause("orders asc");
+                List<UpmsPermission> upmsPermissions = upmsPermissionMapper.selectByExample(upmsPermissionExample);
+                if (upmsPermissions.size() == 0) continue;
+                // 目录
+                JSONArray folders = new JSONArray();
+                for (UpmsPermission upmsPermission: upmsPermissions) {
+                    if (upmsPermission.getPid().intValue() != 0 || upmsPermission.getType() != 1) continue;
+                    JSONObject node = new JSONObject();
+                    node.put("id", upmsPermission.getPermissionId());
+                    node.put("name", upmsPermission.getName());
+                    node.put("open", true);
+                    for (UpmsUserPermission upmsUserPermission : upmsUserPermissions) {
+                        if (upmsUserPermission.getPermissionId().intValue() == upmsPermission.getPermissionId().intValue()) {
+                            node.put("checked", true);
+                        }
+                    }
+                    folders.add(node);
+                    // 菜单
+                    JSONArray menus = new JSONArray();
+                    for (Object folder : folders) {
+                        for (UpmsPermission upmsPermission2: upmsPermissions) {
+                            if (upmsPermission2.getPid().intValue() != ((JSONObject) folder).getIntValue("id") || upmsPermission2.getType() != 2) continue;
+                            JSONObject node2 = new JSONObject();
+                            node2.put("id", upmsPermission2.getPermissionId());
+                            node2.put("name", upmsPermission2.getName());
+                            node2.put("open", true);
+                            for (UpmsUserPermission upmsUserPermission : upmsUserPermissions) {
+                                if (upmsUserPermission.getPermissionId().intValue() == upmsPermission2.getPermissionId().intValue()) {
+                                    node2.put("checked", true);
+                                }
+                            }
+                            menus.add(node2);
+                            // 按钮
+                            JSONArray buttons = new JSONArray();
+                            for (Object menu : menus) {
+                                for (UpmsPermission upmsPermission3: upmsPermissions) {
+                                    if (upmsPermission3.getPid().intValue() != ((JSONObject) menu).getIntValue("id") || upmsPermission3.getType() != 3) continue;
+                                    JSONObject node3 = new JSONObject();
+                                    node3.put("id", upmsPermission3.getPermissionId());
+                                    node3.put("name", upmsPermission3.getName());
+                                    node3.put("open", true);
+                                    for (UpmsUserPermission upmsUserPermission : upmsUserPermissions) {
+                                        if (upmsUserPermission.getPermissionId().intValue() == upmsPermission3.getPermissionId().intValue()) {
+                                            node3.put("checked", true);
+                                        }
+                                    }
+                                    buttons.add(node3);
+                                }
+                                if (buttons.size() > 0) {
+                                    ((JSONObject) menu).put("children", buttons);
+                                    buttons = new JSONArray();
+                                }
+                            }
+                        }
+                        if (menus.size() > 0) {
+                            ((JSONObject) folder).put("children", menus);
+                            menus = new JSONArray();
+                        }
+                    }
+                }
+                if (folders.size() > 0) {
+                    ((JSONObject) system).put("children", folders);
+                }
+            }
+        }
+        return systems;
+    }
+
 }

+ 4 - 22
zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/controller/manage/UpmsPermissionController.java

@@ -16,6 +16,7 @@ import com.zheng.upms.rpc.api.UpmsSystemService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -24,6 +25,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -104,28 +106,8 @@ public class UpmsPermissionController extends BaseController {
     @RequiresPermissions("upms:permission:read")
     @RequestMapping(value = "/user/{id}", method = RequestMethod.POST)
     @ResponseBody
-    public Object user(@PathVariable("id") int id) {
-        // 所有正常系统
-        UpmsSystemExample upmsSystemExample = new UpmsSystemExample();
-        upmsSystemExample.createCriteria()
-                .andStatusEqualTo((byte) 1);
-        List<UpmsSystem> systems = upmsSystemService.selectByExample(upmsSystemExample);
-        // 所有正常权限
-        UpmsPermissionExample upmsPermissionExample = new UpmsPermissionExample();
-        upmsPermissionExample.createCriteria()
-                .andStatusEqualTo((byte) 1);
-        List<UpmsPermission> permissions = upmsPermissionService.selectByExample(upmsPermissionExample);
-        // 用户已有权限
-        List<UpmsUserPermission> rolePermissions = upmsApiService.selectUpmsUserPermissionByUpmsUserId(id);
-        // 用户已有角色
-        List<UpmsRole> roles = upmsApiService.selectUpmsRoleByUpmsUserId(id);
-        // 返回结果集
-        Map result = new HashMap();
-        result.put("systems", systems);
-        result.put("permissions", permissions);
-        result.put("rolePermissions", rolePermissions);
-        result.put("roles", roles);
-        return result;
+    public Object user(@PathVariable("id") int id, HttpServletRequest request) {
+        return upmsPermissionService.getTreeByUserId(id, NumberUtils.toByte(request.getParameter("type")));
     }
 
     @ApiOperation(value = "新增权限")

+ 2 - 2
zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/controller/manage/UpmsRoleController.java

@@ -77,14 +77,14 @@ public class UpmsRoleController extends BaseController {
             if (!json.getBoolean("checked")) {
                 deleteIds.add(json.getIntValue("id"));
             } else {
-                // 权限
+                // 新增权限
                 UpmsRolePermission upmsRolePermission = new UpmsRolePermission();
                 upmsRolePermission.setRoleId(id);
                 upmsRolePermission.setPermissionId(json.getIntValue("id"));
                 upmsRolePermissionService.insertSelective(upmsRolePermission);
             }
         }
-        // 权限
+        // 删除权限
         UpmsRolePermissionExample upmsRolePermissionExample = new UpmsRolePermissionExample();
         upmsRolePermissionExample.createCriteria()
             .andPermissionIdIn(deleteIds)

+ 39 - 4
zheng-upms/zheng-upms-server/src/main/java/com/zheng/upms/server/controller/manage/UpmsUserController.java

@@ -1,5 +1,7 @@
 package com.zheng.upms.server.controller.manage;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baidu.unbiz.fluentvalidator.ComplexResult;
 import com.baidu.unbiz.fluentvalidator.FluentValidator;
 import com.baidu.unbiz.fluentvalidator.ResultCollectors;
@@ -24,10 +26,7 @@ import org.springframework.ui.ModelMap;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 
 /**
  * 用户controller
@@ -149,6 +148,42 @@ public class UpmsUserController extends BaseController {
         return new UpmsResult(UpmsResultConstant.SUCCESS, "");
     }
 
+    @ApiOperation(value = "用户权限")
+    @RequiresPermissions("upms:user:permission")
+    @RequestMapping(value = "/permission/{id}", method = RequestMethod.GET)
+    public String permission(@PathVariable("id") int id, ModelMap modelMap) {
+        UpmsUser user = upmsUserService.selectByPrimaryKey(id);
+        modelMap.put("user", user);
+        return "/manage/user/permission.jsp";
+    }
+
+    @ApiOperation(value = "用户权限")
+    @RequiresPermissions("upms:user:permission")
+    @RequestMapping(value = "/permission/{id}", method = RequestMethod.POST)
+    @ResponseBody
+    public Object permission(@PathVariable("id") int id, HttpServletRequest request) {
+        JSONArray datas = JSONArray.parseArray(request.getParameter("datas"));
+        for (int i = 0; i < datas.size(); i ++) {
+            JSONObject json = datas.getJSONObject(i);
+            if (json.getBoolean("checked")) {
+                // 新增权限
+                UpmsUserPermission upmsUserPermission = new UpmsUserPermission();
+                upmsUserPermission.setUserId(id);
+                upmsUserPermission.setPermissionId(json.getIntValue("id"));
+                upmsUserPermission.setType(json.getByte("type"));
+                upmsUserPermissionService.insertSelective(upmsUserPermission);
+            } else {
+                // 删除权限
+                UpmsUserPermissionExample upmsUserPermissionExample = new UpmsUserPermissionExample();
+                upmsUserPermissionExample.createCriteria()
+                        .andPermissionIdEqualTo(json.getIntValue("id"))
+                        .andTypeEqualTo(json.getByte("type"));
+                upmsUserPermissionService.deleteByExample(upmsUserPermissionExample);
+            }
+        }
+        return new UpmsResult(UpmsResultConstant.SUCCESS, datas.size());
+    }
+
     @ApiOperation(value = "用户列表")
     @RequiresPermissions("upms:user:read")
     @RequestMapping(value = "/list", method = RequestMethod.GET)

+ 2 - 0
zheng-upms/zheng-upms-server/src/main/webapp/WEB-INF/jsp/manage/user/index.jsp

@@ -326,9 +326,11 @@ function permissionAction() {
 		permissionDialog = $.dialog({
 			animationSpeed: 300,
 			title: '用户授权',
+			columnClass: 'large',
 			content: 'url:${basePath}/manage/user/permission/' + permissionUserId,
 			onContentReady: function () {
 				initMaterialInput();
+				initTree();
 			}
 		});
 	}

+ 123 - 59
zheng-upms/zheng-upms-server/src/main/webapp/WEB-INF/jsp/manage/user/permission.jsp

@@ -8,13 +8,23 @@
 <c:set var="basePath" value="${pageContext.request.contextPath}"/>
 <div id="permissionDialog" class="crudDialog">
 	<form id="permissionForm" method="post">
-		<div class="form-group">
-			<select id="systemId" name="systemId">
-				<option value="0">请选择系统</option>
-				<c:forEach var="upmsSystem" items="${upmsSystems}">
-					<option value="${upmsSystem.systemId}">${upmsSystem.title}</option>
-				</c:forEach>
-			</select>
+		<div class="row">
+			<div class="col-sm-6">
+				<label>加权限</label>
+				<div class="form-group">
+					<div class="fg-line">
+						<ul id="ztree1" class="ztree"></ul>
+					</div>
+				</div>
+			</div>
+			<div class="col-sm-6">
+				<label>减权限</label>
+				<div class="form-group">
+					<div class="fg-line">
+						<ul id="ztree2" class="ztree"></ul>
+					</div>
+				</div>
+			</div>
 		</div>
 		<div class="form-group text-right dialog-buttons">
 			<a class="waves-effect waves-button" href="javascript:;" onclick="permissionSubmit();">保存</a>
@@ -23,40 +33,94 @@
 	</form>
 </div>
 <script>
-function permissionSubmit() {
-    $.ajax({
-        type: 'post',
-        url: '${basePath}/manage/user/permission',
-        data: $('#permissionForm').serialize(),
-        beforeSend: function() {
-            if ($('#name').val() == '') {
-                $('#name').focus();
-                return false;
-            }
-			if ($('#title').val() == '') {
-				$('#title').focus();
-				return false;
+	var changeDatas = [];
+	var setting1 = {
+		check: {
+			enable: true,
+			// 勾选关联父,取消关联子
+			chkboxType: { "Y" : "", "N" : "" }
+		},
+		async: {
+			enable: true,
+			url: '${basePath}/manage/permission/user/' + permissionUserId + '?type=1'
+		},
+		data: {
+			simpleData: {
+				enable: true
 			}
-        },
-        success: function(result) {
-			if (result.code != 1) {
-				if (result.data instanceof Array) {
-					$.each(result.data, function(index, value) {
-						$.confirm({
-							theme: 'dark',
-							animation: 'rotateX',
-							closeAnimation: 'rotateX',
-							title: false,
-							content: value.errorMsg,
-							buttons: {
-								confirm: {
-									text: '确认',
-									btnClass: 'waves-effect waves-button waves-light'
+		},
+		callback: {
+			onCheck: function() {
+				var zTree = $.fn.zTree.getZTreeObj("ztree1")
+				var changeNodes = zTree.getChangeCheckedNodes();
+				for (var i = 0; i < changeNodes.length; i ++) {
+					var changeData = {};
+					changeData.id = changeNodes[i].id;
+					changeData.checked = changeNodes[i].checked;
+					changeData.type = 1;
+					changeDatas.push(changeData);
+				}
+			}
+		}
+	};
+	var setting2 = {
+		check: {
+			enable: true,
+			// 勾选关联父,取消关联子
+			chkboxType: { "Y" : "", "N" : "" }
+		},
+		async: {
+			enable: true,
+			url: '${basePath}/manage/permission/user/' + permissionUserId + '?type=-1'
+		},
+		data: {
+			simpleData: {
+				enable: true
+			}
+		},
+		callback: {
+			onCheck: function() {
+				var zTree = $.fn.zTree.getZTreeObj("ztree2")
+				var changeNodes = zTree.getChangeCheckedNodes();
+				for (var i = 0; i < changeNodes.length; i ++) {
+					var changeData = {};
+					changeData.id = changeNodes[i].id;
+					changeData.checked = changeNodes[i].checked;
+					changeData.type = -1;
+					changeDatas.push(changeData);
+				}
+			}
+		}
+	};
+	function initTree() {
+		$.fn.zTree.init($('#ztree1'), setting1);
+		$.fn.zTree.init($('#ztree2'), setting2);
+	}
+
+	function permissionSubmit() {
+		$.ajax({
+			type: 'post',
+			url: '${basePath}/manage/user/permission/' + permissionUserId,
+			data: {datas: JSON.stringify(changeDatas), permissionUserId: permissionUserId},
+			success: function(result) {
+				if (result.code != 1) {
+					if (result.data instanceof Array) {
+						$.each(result.data, function(index, value) {
+							$.confirm({
+								theme: 'dark',
+								animation: 'rotateX',
+								closeAnimation: 'rotateX',
+								title: false,
+								content: value.errorMsg,
+								buttons: {
+									confirm: {
+										text: '确认',
+										btnClass: 'waves-effect waves-button waves-light'
+									}
 								}
-							}
+							});
 						});
-					});
-				} else {
+					} else {
 						$.confirm({
 							theme: 'dark',
 							animation: 'rotateX',
@@ -70,27 +134,27 @@ function permissionSubmit() {
 								}
 							}
 						});
-				}
-			} else {
-				permissionDialog.close();
-				$table.bootstrapTable('refresh');
-			}
-        },
-        error: function(XMLHttpRequest, textStatus, errorThrown) {
-			$.confirm({
-				theme: 'dark',
-				animation: 'rotateX',
-				closeAnimation: 'rotateX',
-				title: false,
-				content: textStatus,
-				buttons: {
-					confirm: {
-						text: '确认',
-						btnClass: 'waves-effect waves-button waves-light'
 					}
+				} else {
+					permissionDialog.close();
+					$table.bootstrapTable('refresh');
 				}
-			});
-        }
-    });
-}
+			},
+			error: function(XMLHttpRequest, textStatus, errorThrown) {
+				$.confirm({
+					theme: 'dark',
+					animation: 'rotateX',
+					closeAnimation: 'rotateX',
+					title: false,
+					content: textStatus,
+					buttons: {
+						confirm: {
+							text: '确认',
+							btnClass: 'waves-effect waves-button waves-light'
+						}
+					}
+				});
+			}
+		});
+	}
 </script>