diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/framework/interceptor/AuthUserInterceptor.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/framework/interceptor/AuthUserInterceptor.java
index 811250c1526d9de89b1617e275fbe13055977e74..6ed5588b2f99437d2b1bf9a51b720f0f6be57b72 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/framework/interceptor/AuthUserInterceptor.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/framework/interceptor/AuthUserInterceptor.java
@@ -2,14 +2,13 @@ package com.mortals.xhx.base.framework.interceptor;
 
 import com.alibaba.fastjson.JSONObject;
 import com.mortals.framework.annotation.UnAuth;
-import com.mortals.framework.common.Rest;
 import com.mortals.framework.service.IAuthTokenService;
 import com.mortals.framework.service.IUser;
 import com.mortals.framework.util.AESUtil;
 import com.mortals.framework.utils.ServletUtils;
 import com.mortals.framework.web.interceptor.BaseInterceptor;
 import com.mortals.xhx.base.framework.config.InterceptorConfig;
-import com.mortals.xhx.common.code.ApiRespCodeEnum;
+import com.mortals.xhx.common.key.Constant;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.util.ObjectUtils;
@@ -20,9 +19,6 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.lang.reflect.Method;
 
-import static com.mortals.xhx.common.key.ErrorCode.*;
-import static com.mortals.xhx.common.key.ErrorCode.ERROR_USER_OPERATION_CONTENT;
-
 /**
  * 鐢ㄦ埛鏉冮檺楠岃瘉锛屽熀浜巘oken
  *
@@ -44,8 +40,7 @@ public class AuthUserInterceptor extends BaseInterceptor {
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
             throws Exception {
-        JSONObject ret = new JSONObject();
-        if(handler instanceof HandlerMethod){
+        if (handler instanceof HandlerMethod) {
             HandlerMethod handlerMethod = (HandlerMethod) handler;
             Method method = handlerMethod.getMethod();
             UnAuth annotation = method.getAnnotation(UnAuth.class);
@@ -53,9 +48,10 @@ public class AuthUserInterceptor extends BaseInterceptor {
                 //鍙栨秷鏍¢獙
                 return true;
             }
-        }else if(handler instanceof ResourceHttpRequestHandler){
+        } else if (handler instanceof ResourceHttpRequestHandler) {
             return true;
         }
+        JSONObject ret = new JSONObject();
         try {
             String uri = request.getServletPath();
             //鏍¢獙閰嶇疆鐨勮姹傝矾寰勬槸鍚﹂渶瑕佹鏌ユ潈闄�
@@ -63,23 +59,23 @@ public class AuthUserInterceptor extends BaseInterceptor {
                 //闇€瑕佹牎楠屾潈闄�
                 boolean auth = this.checkAuth(request, uri, config.getSecurityKey());
                 if (!auth) {
-                    //鏍¢獙token涓嶆甯�
-                    String token = authTokenService.getToken(request);
-                    if(ObjectUtils.isEmpty(token)){
-                        ServletUtils.renderString(response, JSONObject.toJSONString(Rest.fail(ERROR_TOKEN_UNAUTHORIZED, ERROR_TOKEN_UNAUTHORIZED_CONTENT)));
-                        return false;
-                    }
                     //涓嶅瓨鍦ㄦ椂鍊� 濡傛灉鏄鐞嗗憳涔熶笉鍋氭嫤鎴�
                     IUser loginUser = authTokenService.getLoginUser(request);
-                    if (ObjectUtils.isEmpty(loginUser)) {
-                        ServletUtils.renderString(response, JSONObject.toJSONString(Rest.fail(ERROR_TOKEN_EXPIRED, ERROR_TOKEN_EXPIRED_CONTENT)));
+                    //loginUser.isManager()
+                    if(ObjectUtils.isEmpty(loginUser)){
+                        ret.put("code", 401);
+                        ret.put("msg", "鐢ㄦ埛鏈櫥褰曟垨鐧诲綍澶辨晥锛岃閲嶆柊鐧诲綍");
+                        ServletUtils.renderString(response, JSONObject.toJSONString(ret));
                         return false;
-                    } else if (loginUser.isAdmin() || loginUser.getUserType() == 1) {
+                    }else if(loginUser.isAdmin()||loginUser.getUserType()==1){
                         return super.preHandle(request, response, handler);
                     } else {
-                        ServletUtils.renderString(response, JSONObject.toJSONString(Rest.fail(ERROR_USER_OPERATION, ERROR_USER_OPERATION_CONTENT)));
+                        ret.put("code", -1);
+                        ret.put("msg", "鐢ㄦ埛鏃犺鎿嶄綔鏉冮檺!");
+                        ServletUtils.renderString(response, JSONObject.toJSONString(ret));
                         return false;
                     }
+
                 }
             }
         } catch (Exception e) {
@@ -106,4 +102,6 @@ public class AuthUserInterceptor extends BaseInterceptor {
         return false;
     }
 
+
+
 }
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/service/impl/ResourceServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/service/impl/ResourceServiceImpl.java
index eb1615990dac4d3267236c76c5a95d4325d6e953..15c6d9e7fdc76b8a84a84fc97f124de5c5d04687 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/service/impl/ResourceServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/service/impl/ResourceServiceImpl.java
@@ -15,7 +15,6 @@ import com.mortals.xhx.base.system.resource.dao.ResourceDao;
 import com.mortals.xhx.base.system.resource.model.ResourceEntity;
 import com.mortals.xhx.base.system.resource.model.ResourceQuery;
 import com.mortals.xhx.base.system.resource.service.ResourceService;
-
 import org.springframework.stereotype.Service;
 
 import java.util.HashSet;
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/web/ResourceController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/web/ResourceController.java
index bb8abbb3687c67481ddc69856cc313742a34e71d..c75ef9606437b03ee9b3073d14f3c660256e48ff 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/web/ResourceController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/web/ResourceController.java
@@ -1,28 +1,22 @@
 package com.mortals.xhx.base.system.resource.web;
 
 
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import com.alibaba.fastjson.JSONObject;
 import com.mortals.framework.common.IBaseEnum;
 import com.mortals.framework.common.code.UserType;
+import com.mortals.framework.model.Context;
 import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
+import com.mortals.xhx.base.system.resource.model.ResourceEntity;
+import com.mortals.xhx.base.system.resource.service.ResourceService;
+import com.mortals.xhx.common.code.AuthType;
+import com.mortals.xhx.common.code.SourceType;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.alibaba.fastjson.JSONObject;
-import com.mortals.framework.model.Context;
-import com.mortals.framework.web.BaseCRUDJsonMappingController;
-import com.mortals.xhx.base.system.resource.model.ResourceEntity;
-import com.mortals.xhx.base.system.resource.service.ResourceService;
-import com.mortals.xhx.common.code.AuthType;
-import com.mortals.xhx.common.code.SourceType;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 璧勬簮淇℃伅
@@ -36,7 +30,6 @@ import com.mortals.xhx.common.code.SourceType;
 public class ResourceController extends BaseCRUDJsonBodyMappingController<ResourceService,ResourceEntity,Long> {
 
 	public ResourceController(){
-		super.setFormClass(ResourceForm.class);
 		super.setModuleDesc("璧勬簮淇℃伅");
 	}
 
@@ -45,14 +38,11 @@ public class ResourceController extends BaseCRUDJsonBodyMappingController<Resour
 		Map<String, Object> statsus = new HashMap<String, Object>();
 		statsus.put("authType", AuthType.getEnumMap());
 		statsus.put("sourceType", SourceType.getEnumMap());
-		if(!ObjectUtils.isEmpty(context.getUser())){
-			if (context.getUser().isAdmin()) {
-				statsus.put("userType",  IBaseEnum.getEnumMap(UserType.class));
-			} else {
-				statsus.put("userType", UserType.findByValue(getCurUser().getUserType()));
-			}
+		if (getCurUser().isAdmin()) {
+			statsus.put("userType",  IBaseEnum.getEnumMap(UserType.class));
+		} else {
+			statsus.put("userType", UserType.findByValue(getCurUser().getUserType()));
 		}
-
 		model.put(KEY_RESULT_DICT, statsus);
 	}
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/web/ResourceForm.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/web/ResourceForm.java
deleted file mode 100644
index a03f1e3b9dae56d9a9fd30854ba09ee1721f77c4..0000000000000000000000000000000000000000
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/resource/web/ResourceForm.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
-* 鏂囦欢锛歊esourceForm.java
-* 鐗堟湰锛�1.0.0
-* 鏃ユ湡锛�
-* Copyright &reg; 
-* All right reserved.
-*/
-package com.mortals.xhx.base.system.resource.web;
-
-
-import com.mortals.framework.web.BaseCRUDFormLong;
-import com.mortals.xhx.base.system.resource.model.ResourceEntity;
-import com.mortals.xhx.base.system.resource.model.ResourceQuery;
-
-/**
- * <p>Title: 璧勬簮淇℃伅</p>
- * <p>Description: ResourceForm  </p>
- * <p>Copyright: Copyright &reg;  </p>
- * <p>Company: </p>
- * @author 
- * @version 1.0.0
- */
-public class ResourceForm extends BaseCRUDFormLong<ResourceEntity> {
-	private ResourceEntity entity = new ResourceEntity();
-	private ResourceQuery query = new ResourceQuery();
-	public ResourceForm(){
-		
-	}
-	
-    @Override
-	public ResourceEntity getEntity() {
-		return entity;
-	}
-
-	public void setEntity(ResourceEntity entity) {
-		this.entity = entity;
-	}
-
-	@Override
-	public ResourceQuery getQuery() {
-		return query;
-	}
-
-	public void setQuery(ResourceQuery query) {
-		this.query = query;
-	}
-}
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleAuthServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleAuthServiceImpl.java
index 8beaea0d99a98569f8d23fd78fddf465e8f41863..55cc76f1728d385cdf3e5d0971d7c3ed6a9590a8 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleAuthServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleAuthServiceImpl.java
@@ -1,37 +1,44 @@
 /**
-* 鏂囦欢锛歊oleAuthServiceImpl.java
-* 鐗堟湰锛�1.0.0
-* 鏃ユ湡锛�
-* Copyright &reg; 
-* All right reserved.
-*/
+ * 鏂囦欢锛歊oleAuthServiceImpl.java
+ * 鐗堟湰锛�1.0.0
+ * 鏃ユ湡锛�
+ * Copyright &reg;
+ * All right reserved.
+ */
 
 package com.mortals.xhx.base.system.role.service.impl;
 
+import com.mortals.framework.service.ICacheService;
 import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
+import com.mortals.framework.util.DataUtil;
+import com.mortals.xhx.base.system.resource.service.ResourceService;
 import com.mortals.xhx.base.system.role.dao.RoleAuthDao;
 import com.mortals.xhx.base.system.role.model.RoleAuthEntity;
 import com.mortals.xhx.base.system.role.model.RoleAuthQuery;
 import com.mortals.xhx.base.system.role.service.RoleAuthService;
-
+import com.mortals.xhx.common.key.RedisKey;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+
+import static com.mortals.xhx.common.utils.MenuEncodeUtil.generateMenuUrlCode;
 
 /**
  * <p>Title: 瑙掕壊璧勬簮鏉冮檺</p>
  * <p>Description: RoleAuthServiceImpl service鎺ュ彛 </p>
  * <p>Copyright: Copyright &reg;  </p>
  * <p>Company: </p>
- * @author 
+ * @author
  * @version 1.0.0
  */
 @Service("roleAuthService")
-public class RoleAuthServiceImpl extends AbstractCRUDServiceImpl<RoleAuthDao,RoleAuthEntity,Long> implements RoleAuthService {
+public class RoleAuthServiceImpl extends AbstractCRUDServiceImpl<RoleAuthDao, RoleAuthEntity, Long> implements RoleAuthService {
 
+    @Autowired
+    private ICacheService cacheService;
+    @Autowired
+    private ResourceService resourceService;
 
     @Override
     public void doDistributionSource(RoleAuthQuery query) {
@@ -49,6 +56,18 @@ public class RoleAuthServiceImpl extends AbstractCRUDServiceImpl<RoleAuthDao,Rol
             list.add(entity);
         }
         this.dao.insertBatch(list);
+
+        this.updateUserMenuUrlCache();
     }
-	
+
+    private void updateUserMenuUrlCache() {
+        //鏇存柊鐢ㄦ埛鑿滃崟
+        Set<String> hkeys = cacheService.hkeys(RedisKey.KEY_USER_MENU_CACHE);
+        for (String userId : hkeys) {
+            Set<String> urls = resourceService.findUrlSetByUserId(DataUtil.converStr2Long(userId, 0L));
+            String menuUrlCode = generateMenuUrlCode(urls);
+            cacheService.hset(RedisKey.KEY_USER_MENU_CACHE, userId, menuUrlCode);
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleServiceImpl.java
index 36c6c9a088f149ec4c1602005f132fb050531342..29028b8a1cc707939b570cac5cd6f7dd6179b8ba 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleServiceImpl.java
@@ -1,10 +1,10 @@
 /**
-* 鏂囦欢锛歊oleServiceImpl.java
-* 鐗堟湰锛�1.0.0
-* 鏃ユ湡锛�
-* Copyright &reg; 
-* All right reserved.
-*/
+ * 鏂囦欢锛歊oleServiceImpl.java
+ * 鐗堟湰锛�1.0.0
+ * 鏃ユ湡锛�
+ * Copyright &reg;
+ * All right reserved.
+ */
 
 package com.mortals.xhx.base.system.role.service.impl;
 
@@ -15,7 +15,6 @@ import com.mortals.xhx.base.system.role.dao.RoleDao;
 import com.mortals.xhx.base.system.role.model.*;
 import com.mortals.xhx.base.system.role.service.RoleAuthService;
 import com.mortals.xhx.base.system.role.service.RoleService;
-
 import com.mortals.xhx.base.system.role.service.RoleUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -27,7 +26,7 @@ import java.util.Arrays;
  * <p>Description: RoleServiceImpl service鎺ュ彛 </p>
  * <p>Copyright: Copyright &reg;  </p>
  * <p>Company: </p>
- * @author 
+ * @author
  * @version 1.0.0
  */
 @Service("roleService")
@@ -56,5 +55,5 @@ public class RoleServiceImpl extends AbstractCRUDServiceImpl<RoleDao,RoleEntity,
         }).count();
         super.removeAfter(ids, context, result);
     }
-	
+
 }
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleUserServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleUserServiceImpl.java
index 68035ac62f2437d20eadd5fe1469fd6444df5149..f3a343d055846bd61eb0c6ebeed9c8844aed48ad 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleUserServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/service/impl/RoleUserServiceImpl.java
@@ -8,18 +8,24 @@
 
 package com.mortals.xhx.base.system.role.service.impl;
 
+import com.mortals.framework.exception.AppException;
+import com.mortals.framework.model.Context;
+import com.mortals.framework.service.ICacheService;
 import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
+import com.mortals.framework.util.DataUtil;
+import com.mortals.xhx.base.system.resource.service.ResourceService;
 import com.mortals.xhx.base.system.role.dao.RoleUserDao;
 import com.mortals.xhx.base.system.role.model.RoleUserEntity;
 import com.mortals.xhx.base.system.role.model.RoleUserQuery;
 import com.mortals.xhx.base.system.role.service.RoleUserService;
 
+import com.mortals.xhx.common.key.RedisKey;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+
+import static com.mortals.xhx.common.utils.MenuEncodeUtil.generateMenuUrlCode;
 
 /**
  * <p>Title: 瑙掕壊鐢ㄦ埛</p>
@@ -33,6 +39,12 @@ import java.util.Map;
 public class RoleUserServiceImpl extends AbstractCRUDServiceImpl<RoleUserDao,RoleUserEntity,Long> implements RoleUserService {
 
 
+    @Autowired
+    private ICacheService cacheService;
+
+    @Autowired
+    private ResourceService resourceService;
+
     @Override
     public void doDistributionUser(RoleUserQuery query) {
         Long roleId = query.getRoleId();
@@ -50,6 +62,14 @@ public class RoleUserServiceImpl extends AbstractCRUDServiceImpl<RoleUserDao,Rol
             list.add(rolseUser);
         }
         this.dao.insertBatch(list);
+
+        updateUserMenuUrlCache();
+    }
+
+
+    @Override
+    protected void removeAfter(Long[] ids, Context context, int result) throws AppException {
+        updateUserMenuUrlCache();
     }
 
     @Override
@@ -68,6 +88,19 @@ public class RoleUserServiceImpl extends AbstractCRUDServiceImpl<RoleUserDao,Rol
             list.add(rolseUser);
         }
         this.dao.insertBatch(list);
+
+        updateUserMenuUrlCache();
+    }
+
+
+    private void updateUserMenuUrlCache() {
+        //鏇存柊鐢ㄦ埛鑿滃崟
+        Set<String> hkeys = cacheService.hkeys(RedisKey.KEY_USER_MENU_CACHE);
+        for (String userId : hkeys) {
+            Set<String> urls = resourceService.findUrlSetByUserId(DataUtil.converStr2Long(userId, 0L));
+            String menuUrlCode = generateMenuUrlCode(urls);
+            cacheService.hset(RedisKey.KEY_USER_MENU_CACHE, userId, menuUrlCode);
+        }
     }
 
     @Override
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleAuthController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleAuthController.java
index 6eab8dd48cdcce7c3e39eb888da1f06b1a1462e0..a983f7c2fbc480f7a6304e591dcbe2081059a443 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleAuthController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleAuthController.java
@@ -3,20 +3,15 @@ package com.mortals.xhx.base.system.role.web;
 
 import com.alibaba.fastjson.JSONObject;
 import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
+import com.mortals.xhx.base.system.role.model.RoleAuthEntity;
 import com.mortals.xhx.base.system.role.model.RoleAuthQuery;
+import com.mortals.xhx.base.system.role.service.RoleAuthService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.mortals.framework.web.BaseCRUDJsonMappingController;
-import com.mortals.xhx.base.system.role.model.RoleAuthEntity;
-import com.mortals.xhx.base.system.role.service.RoleAuthService;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /**
  * 瑙掕壊璧勬簮鏉冮檺
  *
@@ -29,7 +24,6 @@ import javax.servlet.http.HttpServletResponse;
 public class RoleAuthController extends BaseCRUDJsonBodyMappingController<RoleAuthService, RoleAuthEntity, Long> {
 
     public RoleAuthController() {
-        super.setFormClass(RoleAuthForm.class);
         super.setModuleDesc("瑙掕壊璧勬簮鏉冮檺");
     }
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleAuthForm.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleAuthForm.java
deleted file mode 100644
index 59730f336e9f7fbb43eb19e4b4d9faa0d2596d93..0000000000000000000000000000000000000000
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleAuthForm.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
-* 鏂囦欢锛歊oleAuthForm.java
-* 鐗堟湰锛�1.0.0
-* 鏃ユ湡锛�
-* Copyright &reg; 
-* All right reserved.
-*/
-package com.mortals.xhx.base.system.role.web;
-
-
-import com.mortals.framework.web.BaseCRUDFormLong;
-import com.mortals.xhx.base.system.role.model.RoleAuthEntity;
-import com.mortals.xhx.base.system.role.model.RoleAuthQuery;
-
-/**
- * <p>Title: 瑙掕壊璧勬簮鏉冮檺</p>
- * <p>Description: RoleAuthForm  </p>
- * <p>Copyright: Copyright &reg;  </p>
- * <p>Company: </p>
- * @author 
- * @version 1.0.0
- */
-public class RoleAuthForm extends BaseCRUDFormLong<RoleAuthEntity> {
-	private RoleAuthEntity entity = new RoleAuthEntity();
-	private RoleAuthQuery query = new RoleAuthQuery();
-	public RoleAuthForm(){
-		
-	}
-	
-    @Override
-	public RoleAuthEntity getEntity() {
-		return entity;
-	}
-
-	public void setEntity(RoleAuthEntity entity) {
-		this.entity = entity;
-	}
-
-	@Override
-	public RoleAuthQuery getQuery() {
-		return query;
-	}
-
-	public void setQuery(RoleAuthQuery query) {
-		this.query = query;
-	}
-}
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleController.java
index a8f342b57713ded8ef4c29e97ea0171b3bb591f8..f491e678b00e3a11efe463778aa9b443167619fc 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleController.java
@@ -5,21 +5,18 @@ import com.alibaba.fastjson.JSONObject;
 import com.mortals.framework.common.IBaseEnum;
 import com.mortals.framework.common.code.UserType;
 import com.mortals.framework.model.Context;
-
 import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
-import com.mortals.framework.web.BasePhpCRUDJsonMappingController;
-import com.mortals.xhx.base.system.role.model.RoleQuery;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-import com.mortals.framework.web.BaseCRUDJsonMappingController;
 import com.mortals.xhx.base.system.role.model.RoleEntity;
 import com.mortals.xhx.base.system.role.model.RoleUserEntity;
 import com.mortals.xhx.base.system.role.service.RoleService;
 import com.mortals.xhx.base.system.role.service.RoleUserService;
 import com.mortals.xhx.common.code.RoleType;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -39,7 +36,6 @@ public class RoleController extends BaseCRUDJsonBodyMappingController<RoleServic
 	private RoleUserService roleUserService;
 	
 	public RoleController(){
-		super.setFormClass(RoleForm.class);
 		super.setModuleDesc("瑙掕壊淇℃伅");
 	}
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleForm.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleForm.java
deleted file mode 100644
index 81e0645909b591359e0eaf29cbcd17bee523b0f7..0000000000000000000000000000000000000000
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleForm.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/**
-* 鏂囦欢锛歊oleForm.java
-* 鐗堟湰锛�1.0.0
-* 鏃ユ湡锛�
-* Copyright &reg; 
-* All right reserved.
-*/
-package com.mortals.xhx.base.system.role.web;
-
-
-import com.mortals.framework.web.BaseCRUDFormLong;
-import com.mortals.xhx.base.system.role.model.RoleEntity;
-import com.mortals.xhx.base.system.role.model.RoleQuery;
-
-/**
- * <p>Title: 瑙掕壊淇℃伅</p>
- * <p>Description: RoleForm  </p>
- * <p>Copyright: Copyright &reg;  </p>
- * <p>Company: </p>
- * @author 
- * @version 1.0.0
- */
-public class RoleForm extends BaseCRUDFormLong<RoleEntity> {
-	private RoleEntity entity = new RoleEntity();
-	private RoleQuery query = new RoleQuery();
-	/** 鐢ㄦ埛ID */
-	private Long userId;
-	public RoleForm(){
-		
-	}
-	
-    @Override
-	public RoleEntity getEntity() {
-		return entity;
-	}
-
-	public void setEntity(RoleEntity entity) {
-		this.entity = entity;
-	}
-
-	@Override
-	public RoleQuery getQuery() {
-		return query;
-	}
-
-	public void setQuery(RoleQuery query) {
-		this.query = query;
-	}
-
-	public Long getUserId() {
-		return userId;
-	}
-
-	public void setUserId(Long userId) {
-		this.userId = userId;
-	}
-	
-}
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleUserController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleUserController.java
index b182860a4460fb5ebe608937962fc024f5fb03ae..63feafc8d7134265b39c87306f3e78a461002f73 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleUserController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleUserController.java
@@ -7,26 +7,22 @@ import com.mortals.framework.ap.SysConstains;
 import com.mortals.framework.exception.AppException;
 import com.mortals.framework.model.BaseEntityLong;
 import com.mortals.framework.model.Context;
-
 import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
-import com.mortals.xhx.base.system.role.model.RoleUserQuery;
-import org.apache.commons.beanutils.MethodUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.mortals.framework.web.BaseCRUDJsonMappingController;
 import com.mortals.xhx.base.system.role.model.RoleEntity;
 import com.mortals.xhx.base.system.role.model.RoleUserEntity;
+import com.mortals.xhx.base.system.role.model.RoleUserQuery;
 import com.mortals.xhx.base.system.role.service.RoleService;
 import com.mortals.xhx.base.system.role.service.RoleUserService;
 import com.mortals.xhx.base.system.user.model.UserEntity;
 import com.mortals.xhx.base.system.user.model.UserQuery;
 import com.mortals.xhx.base.system.user.service.UserService;
+import org.apache.commons.beanutils.MethodUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -49,7 +45,6 @@ public class RoleUserController extends BaseCRUDJsonBodyMappingController<RoleUs
     private UserService userService;
 
     public RoleUserController() {
-        super.setFormClass(RoleUserForm.class);
         super.setModuleDesc("瑙掕壊鐢ㄦ埛");
     }
 
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleUserForm.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleUserForm.java
deleted file mode 100644
index be4e4ee9bd57dbb2fed05b285ddd3057b54157c7..0000000000000000000000000000000000000000
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/role/web/RoleUserForm.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
-* 鏂囦欢锛歊oleUserForm.java
-* 鐗堟湰锛�1.0.0
-* 鏃ユ湡锛�
-* Copyright &reg; 
-* All right reserved.
-*/
-package com.mortals.xhx.base.system.role.web;
-
-
-import com.mortals.framework.web.BaseCRUDFormLong;
-import com.mortals.xhx.base.system.role.model.RoleUserEntity;
-import com.mortals.xhx.base.system.role.model.RoleUserQuery;
-
-/**
- * <p>Title: 瑙掕壊鐢ㄦ埛</p>
- * <p>Description: RoleUserForm  </p>
- * <p>Copyright: Copyright &reg;  </p>
- * <p>Company: </p>
- * @author 
- * @version 1.0.0
- */
-public class RoleUserForm extends BaseCRUDFormLong<RoleUserEntity> {
-	private RoleUserEntity entity = new RoleUserEntity();
-	private RoleUserQuery query = new RoleUserQuery();
-	public RoleUserForm(){
-		
-	}
-	
-    @Override
-	public RoleUserEntity getEntity() {
-		return entity;
-	}
-
-	public void setEntity(RoleUserEntity entity) {
-		this.entity = entity;
-	}
-
-	@Override
-	public RoleUserQuery getQuery() {
-		return query;
-	}
-
-	public void setQuery(RoleUserQuery query) {
-		this.query = query;
-	}
-}
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/model/vo/UserVo.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/model/vo/UserVo.java
index aae3f6758b2fca1af21230de5f16dd0c495fdf8b..334069f484cfa69bb6f39c908f1bd3b4cfc696be 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/model/vo/UserVo.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/model/vo/UserVo.java
@@ -20,7 +20,7 @@ public class UserVo extends BaseEntityLong {
      */
     private String siteName;
 
-    private String roleIds;
+    private List<Long> roleIds;
     /**
      * 鍞竴鏍囪瘑
      */
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/service/UserService.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/service/UserService.java
index 593b5f8c23e09d32e0e1ca1da7c8f4fe6f3abd28..6ccc59927f31e603590889d29bd5f70f69427fdb 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/service/UserService.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/service/UserService.java
@@ -10,7 +10,7 @@ package com.mortals.xhx.base.system.user.service;
 
 import com.mortals.framework.exception.AppException;
 import com.mortals.framework.model.Result;
-import com.mortals.framework.service.ICRUDService;
+import com.mortals.framework.service.ICRUDCacheService;
 import com.mortals.framework.service.IUser;
 import com.mortals.xhx.base.system.menu.model.MenuEntity;
 import com.mortals.xhx.base.system.user.dao.UserDao;
@@ -28,7 +28,7 @@ import java.util.Set;
  * @version 1.0.0
  */
 
-public interface UserService extends ICRUDService<UserEntity,Long> {
+public interface UserService extends ICRUDCacheService<UserEntity,Long> {
     /**
      * 鐢ㄦ埛鐧诲綍
      *
@@ -38,7 +38,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
      * @return
      * @throws AppException
      */
-     UserEntity doLogin(String loginName, String password, String loginIp) throws AppException;
+    public UserEntity doLogin(String loginName, String password, String loginIp) throws AppException;
 
     /**
      * 鏍¢獙鐢ㄦ埛鍚嶄笌瀵嗙爜鏄惁姝g‘
@@ -48,7 +48,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
      * @return
      * @throws AppException
      */
-     UserEntity doCheckUser(String loginName, String password) throws AppException;
+    public UserEntity doCheckUser(String loginName, String password) throws AppException;
 
     /**
      * 妫€鏌ョ敤鎴锋槸鍚﹀瓨鍦�
@@ -57,7 +57,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
      * @param userId    瀵嗙爜
      * @return
      */
-     boolean existUser(String loginName, Long userId) throws AppException;
+    public boolean existUser(String loginName, Long userId) throws AppException;
 
     /**
      * 閫氳繃鐧诲綍鐢ㄦ埛鑾峰彇鑿滃崟鍔熻兘鏉冮檺
@@ -65,7 +65,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
      * @param user
      * @return
      */
-     List<MenuEntity> findOutlookBarList(IUser user);
+    public List<MenuEntity> findOutlookBarList(IUser user);
 
     /**
      * 鏌ヨ鐢ㄦ埛鎵€鏈夋湁鏉冮檺鐨勮彍鍗旾D
@@ -73,7 +73,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
      * @param userEntity
      * @return
      */
-     Set<Long> findAllAuthIds(UserEntity userEntity) throws AppException;
+    public Set<Long> findAllAuthIds(UserEntity userEntity) throws AppException;
 
     /**
      * 鏌ヨ鐢ㄦ埛璁板綍
@@ -85,7 +85,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
      * @return
      * @throws AppException
      */
-     Result<UserEntity> find(Long platformId, UserEntity params, int currPage, int prePageResult) throws AppException;
+    public Result<UserEntity> find(Long platformId, UserEntity params, int currPage, int prePageResult) throws AppException;
 
     /**
      * 涓哄鎴峰垱寤虹敤鎴�
@@ -100,7 +100,7 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
      * @return
      * @throws AppException
      */
-     UserEntity createUser(IUser currUser, Long customerId, String customerName, String loginName, String password,
+    public UserEntity createUser(IUser currUser, Long customerId, String customerName, String loginName, String password,
                                  String userName, String mobile) throws AppException;
 
     /**
@@ -112,12 +112,9 @@ public interface UserService extends ICRUDService<UserEntity,Long> {
      * @return
      * @throws AppException
      */
-     boolean updateUserPwd(String loginName, String oldPwd, String newPwd) throws AppException;
+    public boolean updateUserPwd(String loginName, String oldPwd, String newPwd) throws AppException;
 
 
-
-      UserDao getUserDao();
-
-    void doHandlerUser(UserEntity entity);
+    UserDao getUserDao();
 
 }
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/service/impl/UserServiceImpl.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/service/impl/UserServiceImpl.java
index aca40ac3e18ab8ee026312a412ba419a47094e7a..b6ece9781403409df7ab8021d46717210c31154e 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/service/impl/UserServiceImpl.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/service/impl/UserServiceImpl.java
@@ -14,54 +14,53 @@ import com.mortals.framework.exception.AppException;
 import com.mortals.framework.model.Context;
 import com.mortals.framework.model.PageInfo;
 import com.mortals.framework.model.Result;
-import com.mortals.framework.service.ICacheService;
 import com.mortals.framework.service.IUser;
-import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
+import com.mortals.framework.service.impl.AbstractCRUDCacheServiceImpl;
 import com.mortals.framework.util.SecurityUtil;
 import com.mortals.framework.util.StringUtils;
 import com.mortals.xhx.base.system.menu.model.MenuEntity;
 import com.mortals.xhx.base.system.menu.service.MenuService;
 import com.mortals.xhx.base.system.resource.model.ResourceEntity;
 import com.mortals.xhx.base.system.resource.service.ResourceService;
+import com.mortals.xhx.base.system.role.dao.RoleUserDao;
 import com.mortals.xhx.base.system.role.model.RoleUserEntity;
-import com.mortals.xhx.base.system.role.model.RoleUserQuery;
-import com.mortals.xhx.base.system.role.service.RoleService;
-import com.mortals.xhx.base.system.role.service.RoleUserService;
 import com.mortals.xhx.base.system.user.dao.UserDao;
 import com.mortals.xhx.base.system.user.model.UserEntity;
 import com.mortals.xhx.base.system.user.model.UserQuery;
 import com.mortals.xhx.base.system.user.service.UserService;
-
-
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.util.ObjectUtils;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 /**
  * <p>Title: 鐢ㄦ埛淇℃伅</p>
  * <p>Description: UserServiceImpl service鎺ュ彛 </p>
  * <p>Copyright: Copyright &reg;  </p>
  * <p>Company: </p>
- *
  * @author
  * @version 1.0.0
  */
 @Service("userService")
-public class UserServiceImpl extends AbstractCRUDServiceImpl<UserDao, UserEntity, Long> implements UserService {
+public class UserServiceImpl extends AbstractCRUDCacheServiceImpl<UserDao, UserEntity, Long> implements UserService {
+
+
     @Autowired
     private MenuService menuService;
     @Autowired
     private ResourceService resourceService;
     @Autowired
-    private RoleUserService roleUserService;
-    @Autowired
-    private ICacheService cacheService;
+    private RoleUserDao roleUserDao;
 
     @Override
-    public void doHandlerUser(UserEntity entity) throws AppException {
+    protected String getExtKey(UserEntity data) {
+        return data.getLoginName();
+    }
+
+
+
+    private void doHandlerUser(UserEntity entity) throws AppException {
         if (StringUtils.isNotEmpty(entity.getLoginPwd())) {
             try {
                 entity.setLoginPwd(SecurityUtil.md5DoubleEncoding(entity.getLoginPwd()));
@@ -71,69 +70,55 @@ public class UserServiceImpl extends AbstractCRUDServiceImpl<UserDao, UserEntity
         } else {
             entity.setLoginPwd(null);
         }
+//        if (entity.isSystemUser()) {
+//            entity.setUserType(UserType.SYSTEM.getValue());
+//        } else {
+//            entity.setUserType(UserType.CUSTOMER.getValue());
+//        }
     }
 
     @Override
     protected void saveBefore(UserEntity entity, Context context) throws AppException {
-        if (!ObjectUtils.isEmpty(entity.getLoginName()) && existUser(entity.getLoginName(), entity.getId())) {
-            throw new AppException("鐧诲綍鍚嶅凡瀛樺湪锛�");
-        }
         this.doHandlerUser(entity);
-
     }
 
     @Override
-    protected void updateBefore(UserEntity entity, Context context) throws AppException {
-//        if (entity.getId().longValue() == SysConstains.ADMIN_ID && !context.getUser().isAdmin()) {
-//            throw new AppException("浣犳病鏈夋潈闄愭墽琛岃鎿嶄綔");
-//        }
-
-        //鏇存柊涓嶆洿鏂板瘑鐮佸瓧娈�
-        entity.setLoginPwd(null);
-        this.doHandlerUser(entity);
-        //鏇存柊瑙掕壊
-        if(entity.getId().longValue() != SysConstains.ADMIN_ID &&!ObjectUtils.isEmpty(entity.getRoleIds())){
-            RoleUserQuery roleUserQuery = new RoleUserQuery();
-            roleUserQuery.setUserId(entity.getId());
-            List<Long> idList = Arrays.asList(entity.getRoleIds().split(",")).stream().map(Long::parseLong).collect(Collectors.toList());
-            roleUserQuery.setRoleIdList(idList);
-            roleUserService.doDistributionRole(roleUserQuery);
+    protected void saveAfter(UserEntity entity, Context context) throws AppException {
+        if(CollectionUtils.isNotEmpty(entity.getRoleIds())){
+            List<RoleUserEntity> roleUserEntityList = new ArrayList<>();
+            entity.getRoleIds().stream().forEach(item->{
+                RoleUserEntity roleUserEntity = new RoleUserEntity();
+                roleUserEntity.setUserId(entity.getId());
+                roleUserEntity.setRoleId(item);
+                roleUserEntityList.add(roleUserEntity);
+            });
+            roleUserDao.insertBatch(roleUserEntityList);
         }
     }
 
     @Override
-    protected void updateAfter(UserEntity entity, Context context) throws AppException {
-        //鏇存柊鐢ㄦ埛鍚� 鍒犻櫎褰撳墠鐢ㄦ埛鐨則oken
-        Set<String> keys = cacheService.scan(SysConstains.LOGIN_TOKEN_KEY + entity.getId());
-        if (!ObjectUtils.isEmpty(keys)) {
-            for (String key : keys) {
-                cacheService.del(key);
-            }
+    protected void updateBefore(UserEntity entity, Context context) throws AppException {
+        if (entity.getId().longValue() == SysConstains.ADMIN_ID && !context.getUser().isAdmin()) {
+            throw new AppException("浣犳病鏈夋潈闄愭墽琛岃鎿嶄綔");
         }
+        this.doHandlerUser(entity);
     }
 
     @Override
-    protected void saveAfter(UserEntity entity, Context context) throws AppException {
-        //鏇存柊瑙掕壊
-        if(!ObjectUtils.isEmpty(entity.getId())&&entity.getId().longValue() != SysConstains.ADMIN_ID &&!ObjectUtils.isEmpty(entity.getRoleIds())){
-            RoleUserQuery roleUserQuery = new RoleUserQuery();
-            roleUserQuery.setUserId(entity.getId());
-            List<Long> idList = Arrays.asList(entity.getRoleIds().split(",")).stream().map(Long::parseLong).collect(Collectors.toList());
-            roleUserQuery.setRoleIdList(idList);
-            roleUserService.doDistributionRole(roleUserQuery);
+    protected void updateAfter(UserEntity entity, Context context) throws AppException {
+        if(CollectionUtils.isNotEmpty(entity.getRoleIds())){
+            List<RoleUserEntity> roleUserEntityList = new ArrayList<>();
+            entity.getRoleIds().stream().forEach(item->{
+                RoleUserEntity roleUserEntity = new RoleUserEntity();
+                roleUserEntity.setUserId(entity.getId());
+                roleUserEntity.setRoleId(item);
+                roleUserEntityList.add(roleUserEntity);
+            });
+            RoleUserEntity condition = new RoleUserEntity();
+            condition.setUserId(entity.getId());
+            roleUserDao.delete(condition);
+            roleUserDao.insertBatch(roleUserEntityList);
         }
-        super.saveAfter(entity, context);
-    }
-
-    @Override
-    protected void findAfter(UserEntity params, PageInfo pageInfo, Context context, List<UserEntity> list) throws AppException {
-        list.stream().peek(item -> {
-            RoleUserQuery roleUserQuery = new RoleUserQuery();
-            roleUserQuery.setUserId(item.getId());
-            String roleIds = roleUserService.find(roleUserQuery).stream().map(RoleUserEntity::getRoleId).map(String::valueOf).collect(Collectors.joining(","));
-            item.setRoleIds(roleIds);
-        }).count();
-        super.findAfter(params, pageInfo, context, list);
     }
 
     @Override
@@ -152,6 +137,22 @@ public class UserServiceImpl extends AbstractCRUDServiceImpl<UserDao, UserEntity
         return super.findBefore(params, pageInfo, context);
     }
 
+    @Override
+    protected void findAfter(UserEntity params, PageInfo pageInfo, Context context, List<UserEntity> list) throws AppException {
+        if(CollectionUtils.isNotEmpty(list)) {
+            list.stream().forEach(item->{
+                RoleUserEntity query = new RoleUserEntity();
+                query.setUserId(item.getId());
+                List<RoleUserEntity> roleUserEntityList = roleUserDao.getList(query);
+                List<Long> roleIds = new ArrayList<>();
+                roleUserEntityList.stream().forEach(role->{
+                    roleIds.add(role.getRoleId());
+                });
+                item.setRoleIds(roleIds);
+            });
+        }
+    }
+
     public UserEntity findByLoginName(String loginName) {
         UserQuery params = new UserQuery();
         params.setLoginName(loginName);
@@ -175,6 +176,11 @@ public class UserServiceImpl extends AbstractCRUDServiceImpl<UserDao, UserEntity
         } catch (Exception e) {
             throw new AppException("瀵嗙爜楠岃鍑洪敊锛�", e);
         }
+        UserEntity update = new UserEntity();
+        update.setId(sysUser.getId());
+        update.setLastLoginAddress(loginIp);
+        update.setLastLoginTime(new Date());
+        this.dao.update(update);
         return sysUser;
     }
 
@@ -218,7 +224,7 @@ public class UserServiceImpl extends AbstractCRUDServiceImpl<UserDao, UserEntity
                 urls.addAll(StringUtils.converStr2Set(url));
             }
         }
-        Set<Long> authIds = new HashSet<>();
+        Set<Long> authIds = new HashSet<Long>();
         Map<Long, MenuEntity> menuMap = new HashMap<Long, MenuEntity>();
         List<MenuEntity> userModuleList = this.menuService.findAllEnable();
         for (MenuEntity sysModule : userModuleList) {
@@ -226,7 +232,6 @@ public class UserServiceImpl extends AbstractCRUDServiceImpl<UserDao, UserEntity
                 continue;
             }
             menuMap.put(sysModule.getId(), sysModule);
-
             if (!user.isAdmin() && urls.contains(StringUtils.trim(sysModule.getUrl()))) {
                 authIds.add(sysModule.getId());
             }
@@ -275,6 +280,7 @@ public class UserServiceImpl extends AbstractCRUDServiceImpl<UserDao, UserEntity
             entity.initAttrValue();
             entity.setLoginName(loginName);
             entity.setRealName(userName);
+            entity.setCustomerId(customerId);
             entity.setLoginPwd(password);
             entity.setMobile(mobile);
             entity.setUserType(UserType.CUSTOMER.getValue());
@@ -320,6 +326,7 @@ public class UserServiceImpl extends AbstractCRUDServiceImpl<UserDao, UserEntity
         }
         try {
             sysUser.setLoginPwd(SecurityUtil.md5DoubleEncoding(newPwd));
+
         } catch (Exception e) {
             throw new AppException("瀵嗙爜杞崲寮傚父锛�", e);
         }
@@ -329,18 +336,6 @@ public class UserServiceImpl extends AbstractCRUDServiceImpl<UserDao, UserEntity
 
     @Override
     public UserDao getUserDao() {
-        return getDao();
-    }
-
-    @Override
-    protected void removeAfter(Long[] ids, Context context, int result) throws AppException {
-        Arrays.asList(ids).stream().peek(userId->{
-            RoleUserQuery roleUserQuery = new RoleUserQuery();
-            roleUserQuery.setUserId(userId);
-            Long[] userIds = roleUserService.find(roleUserQuery).stream().map(RoleUserEntity::getId).toArray(Long[]::new);
-            roleUserService.remove(userIds,context);
-        }).count();
-
-        super.removeAfter(ids, context, result);
+        return this.getDao();
     }
 }
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/web/UserController.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/web/UserController.java
index 4494527b5279453a9db703491afd67a3f1768be1..01c704c1ed9b244ba26e0a1ac354cdaacaff550f 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/web/UserController.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/web/UserController.java
@@ -33,6 +33,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.util.Base64;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
@@ -54,7 +55,6 @@ public class UserController extends BaseCRUDJsonBodyMappingController<UserServic
     private DeptService deptService;
 
     public UserController() {
-        super.setFormClass(UserForm.class);
         super.setModuleDesc("鐢ㄦ埛淇℃伅");
     }
 
@@ -82,7 +82,7 @@ public class UserController extends BaseCRUDJsonBodyMappingController<UserServic
     protected int editAfter(Long id, Map<String, Object> model, UserEntity entity, Context context) throws AppException {
         RoleUserQuery roleUserQuery = new RoleUserQuery();
         roleUserQuery.setUserId(entity.getId());
-        String roleIds = roleUserService.find(roleUserQuery).stream().map(RoleUserEntity::getRoleId).map(String::valueOf).collect(Collectors.joining(","));
+        List<Long> roleIds = roleUserService.find(roleUserQuery).stream().map(RoleUserEntity::getRoleId).collect(Collectors.toList());
         entity.setRoleIds(roleIds);
         return super.editAfter(id, model, entity, context);
     }
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/web/UserForm.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/web/UserForm.java
deleted file mode 100644
index 48a5354ad30a75b1872b0ee666686f5df3c5e168..0000000000000000000000000000000000000000
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/base/system/user/web/UserForm.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
-* 鏂囦欢锛歎serForm.java
-* 鐗堟湰锛�1.0.0
-* 鏃ユ湡锛�
-* Copyright &reg; 
-* All right reserved.
-*/
-package com.mortals.xhx.base.system.user.web;
-
-import com.mortals.framework.web.BaseCRUDFormLong;
-import com.mortals.xhx.base.system.user.model.UserEntity;
-import com.mortals.xhx.base.system.user.model.UserQuery;
-
-/**
- * <p>Title: 鐢ㄦ埛淇℃伅</p>
- * <p>Description: UserForm  </p>
- * <p>Copyright: Copyright &reg;  </p>
- * <p>Company: </p>
- * @author 
- * @version 1.0.0
- */
-public class UserForm extends BaseCRUDFormLong<UserEntity> {
-	private UserEntity entity = new UserEntity();
-	private UserQuery query = new UserQuery();
-	public UserForm(){
-		
-	}
-	
-    @Override
-	public UserEntity getEntity() {
-		return entity;
-	}
-
-	public void setEntity(UserEntity entity) {
-		this.entity = entity;
-	}
-
-	@Override
-	public UserQuery getQuery() {
-		return query;
-	}
-
-	public void setQuery(UserQuery query) {
-		this.query = query;
-	}
-}
\ No newline at end of file
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/common/key/RedisKey.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/common/key/RedisKey.java
index d2d9f65ed8d79f3a101e61b677e3e070f3223616..afa6b7822f9c46b89b6103450689964c3534101b 100644
--- a/attendance-performance-manager/src/main/java/com/mortals/xhx/common/key/RedisKey.java
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/common/key/RedisKey.java
@@ -21,4 +21,7 @@ public class RedisKey {
      */
     public static final String KEY_ATTENC_TOTOAL_CACHE = "attend:total";
 
+    public static final String KEY_USER_MENU_CACHE = "user:menu";
+
+
 }
diff --git a/attendance-performance-manager/src/main/java/com/mortals/xhx/common/utils/MenuEncodeUtil.java b/attendance-performance-manager/src/main/java/com/mortals/xhx/common/utils/MenuEncodeUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..9de4fc113650d8e44ba74848042ff3b59db7f4f8
--- /dev/null
+++ b/attendance-performance-manager/src/main/java/com/mortals/xhx/common/utils/MenuEncodeUtil.java
@@ -0,0 +1,30 @@
+package com.mortals.xhx.common.utils;
+
+import com.mortals.framework.ap.GlobalSysInfo;
+import com.mortals.framework.ap.SysConstains;
+import com.mortals.framework.util.AESUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Set;
+
+@Slf4j
+public class MenuEncodeUtil {
+
+    public static String generateMenuUrlCode(Set<String> urls) {
+        try {
+            String securityKey = GlobalSysInfo.getPropertyValue(SysConstains.PROP_COOKIE_SECURITY_KEY);
+            StringBuilder sb = new StringBuilder();
+            if (urls != null && urls.size() > 0) {
+                for (String url : urls) {
+                    int index = url.hashCode() & (Integer.MAX_VALUE - 1);
+                    sb.append(index).append(",");
+                }
+            }
+            String menuUrl = sb.toString();
+            return AESUtil.encrypt(menuUrl, securityKey);
+        } catch (Throwable e) {
+            log.error("缂栫爜寮傚父",e);
+            return null;
+        }
+    }
+}