Browse Source

synchronizers

MaxKey 4 years ago
parent
commit
7567c195a5
27 changed files with 240 additions and 607 deletions
  1. 4 0
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/ISynchronizerService.java
  2. 7 0
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/activedirectory/ActiveDirectoryOrganizationService.java
  3. 8 0
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/activedirectory/ActiveDirectorySynchronizerService.java
  4. 7 0
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/activedirectory/ActiveDirectoryUsersService.java
  5. 3 1
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/dingding/DingdingAccessTokenService.java
  6. 7 1
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/dingding/DingdingOrganizationService.java
  7. 11 1
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/dingding/DingdingSynchronizerService.java
  8. 7 0
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/dingding/DingdingUsersService.java
  9. 7 0
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/ldap/LdapOrganizationService.java
  10. 9 0
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/ldap/LdapSynchronizerService.java
  11. 7 0
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/ldap/LdapUsersService.java
  12. 3 1
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinAccessTokenService.java
  13. 7 0
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinOrganizationService.java
  14. 11 4
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinSynchronizerService.java
  15. 7 0
      maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinUsersService.java
  16. 2 1
      maxkey-web-manage/src/main/java/org/maxkey/MaxKeyMgtApplication.java
  17. 39 1
      maxkey-web-manage/src/main/java/org/maxkey/web/contorller/SynchronizersController.java
  18. 13 21
      maxkey-web-manage/src/main/resources/messages/message.properties
  19. 1 0
      maxkey-web-manage/src/main/resources/messages/message_en.properties
  20. 1 0
      maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties
  21. 0 147
      maxkey-web-manage/src/main/resources/static/jquery/json2form/json2form.js
  22. 0 149
      maxkey-web-manage/src/main/resources/static/jquery/json2form/json2formDemo.htm
  23. 0 168
      maxkey-web-manage/src/main/resources/static/jquery/json2form/readme.txt
  24. 71 85
      maxkey-web-manage/src/main/resources/static/jquery/platform.common.js
  25. 0 1
      maxkey-web-manage/src/main/resources/templates/views/layout/common.cssjs.ftl
  26. 3 0
      maxkey-web-manage/src/main/resources/templates/views/synchronizers/synchronizersList.ftl
  27. 5 26
      maxkey-web-manage/src/main/resources/templates/views/userinfo/usersList.ftl

+ 4 - 0
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/ISynchronizerService.java

@@ -17,7 +17,11 @@
 
 package org.maxkey.synchronizer;
 
+import org.maxkey.entity.Synchronizers;
+
 public interface ISynchronizerService {
 
 	public void sync() throws Exception ;
+	
+	public void setSynchronizer(Synchronizers synchronizer);
 }

+ 7 - 0
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/activedirectory/ActiveDirectoryOrganizationService.java

@@ -25,6 +25,7 @@ import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
 import org.maxkey.constants.ldap.OrganizationalUnit;
 import org.maxkey.entity.Organizations;
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.persistence.ldap.ActiveDirectoryUtils;
 import org.maxkey.persistence.ldap.LdapUtils;
 import org.maxkey.persistence.service.OrganizationsService;
@@ -119,4 +120,10 @@ public class ActiveDirectoryOrganizationService   implements ISynchronizerServic
 		this.organizationsService = organizationsService;
 	}
 
+	@Override
+	public void setSynchronizer(Synchronizers Synchronizer) {
+		// TODO Auto-generated method stub
+		
+	}
+
 }

+ 8 - 0
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/activedirectory/ActiveDirectorySynchronizerService.java

@@ -17,6 +17,7 @@
 
 package org.maxkey.synchronizer.activedirectory;
 
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.synchronizer.ISynchronizerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -27,6 +28,8 @@ import org.springframework.stereotype.Service;
 public class ActiveDirectorySynchronizerService   implements ISynchronizerService{
 	final static Logger _logger = LoggerFactory.getLogger(ActiveDirectorySynchronizerService.class);
 	
+	Synchronizers synchronizer;
+	
 	@Autowired
 	ActiveDirectoryUsersService activeDirectoryUsersService;
 	
@@ -63,6 +66,11 @@ public class ActiveDirectorySynchronizerService   implements ISynchronizerServic
 		this.activeDirectoryOrganizationService = activeDirectoryOrganizationService;
 	}
 
+	@Override
+	public void setSynchronizer(Synchronizers synchronizer) {
+		this.synchronizer = synchronizer;
+	}
+
 
 	
 }

+ 7 - 0
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/activedirectory/ActiveDirectoryUsersService.java

@@ -24,6 +24,7 @@ import javax.naming.directory.Attribute;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
 import org.maxkey.constants.ldap.ActiveDirectoryUser;
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.entity.UserInfo;
 import org.maxkey.persistence.ldap.ActiveDirectoryUtils;
 import org.maxkey.persistence.ldap.LdapUtils;
@@ -147,6 +148,12 @@ public class ActiveDirectoryUsersService   implements ISynchronizerService{
 	public void setUserInfoService(UserInfoService userInfoService) {
 		this.userInfoService = userInfoService;
 	}
+
+	@Override
+	public void setSynchronizer(Synchronizers Synchronizer) {
+		// TODO Auto-generated method stub
+		
+	}
 	
 	
 }

+ 3 - 1
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/dingding/DingdingAccessTokenService.java

@@ -33,7 +33,9 @@ public class DingdingAccessTokenService {
 	
 	String appsecret;
 	
-	
+	public DingdingAccessTokenService() {
+		
+	}
 	public DingdingAccessTokenService(String appkey, String appsecret) {
 		super();
 		this.appkey = appkey;

+ 7 - 1
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/dingding/DingdingOrganizationService.java

@@ -18,7 +18,7 @@
 package org.maxkey.synchronizer.dingding;
 
 import org.maxkey.entity.Organizations;
-import org.maxkey.persistence.ldap.ActiveDirectoryUtils;
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.persistence.service.OrganizationsService;
 import org.maxkey.synchronizer.ISynchronizerService;
 import org.slf4j.Logger;
@@ -104,6 +104,12 @@ public class DingdingOrganizationService   implements ISynchronizerService{
 	public void setOrganizationsService(OrganizationsService organizationsService) {
 		this.organizationsService = organizationsService;
 	}
+
+	@Override
+	public void setSynchronizer(Synchronizers Synchronizer) {
+		// TODO Auto-generated method stub
+		
+	}
 	
 	
 }

+ 11 - 1
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/dingding/DingdingSynchronizerService.java

@@ -17,6 +17,7 @@
 
 package org.maxkey.synchronizer.dingding;
 
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.synchronizer.ISynchronizerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,6 +29,7 @@ import com.taobao.api.ApiException;
 @Service
 public class DingdingSynchronizerService  implements ISynchronizerService{
 	final static Logger _logger = LoggerFactory.getLogger(DingdingSynchronizerService.class);
+	Synchronizers synchronizer;
 	
 	@Autowired
 	DingdingUsersService dingdingUsersService;
@@ -36,7 +38,7 @@ public class DingdingSynchronizerService  implements ISynchronizerService{
 	DingdingOrganizationService dingdingOrganizationService;
 	
 
-	DingdingAccessTokenService dingdingAccessTokenService;
+	DingdingAccessTokenService dingdingAccessTokenService = new DingdingAccessTokenService();
 	
 	public DingdingSynchronizerService() {
 		super();
@@ -44,6 +46,8 @@ public class DingdingSynchronizerService  implements ISynchronizerService{
 
 	public void sync() throws ApiException {
 		_logger.info("Sync ...");
+		dingdingAccessTokenService.setAppkey(synchronizer.getPrincipal());
+		dingdingAccessTokenService.setAppsecret(synchronizer.getCredentials());
 		
 		String access_token=dingdingAccessTokenService.requestToken();
 		
@@ -78,4 +82,10 @@ public class DingdingSynchronizerService  implements ISynchronizerService{
 		this.dingdingAccessTokenService = dingdingAccessTokenService;
 	}
 
+	@Override
+	public void setSynchronizer(Synchronizers synchronizer) {
+		this.synchronizer = synchronizer;
+		
+	}
+
 }

+ 7 - 0
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/dingding/DingdingUsersService.java

@@ -19,6 +19,7 @@ package org.maxkey.synchronizer.dingding;
 
 import org.joda.time.DateTime;
 import org.joda.time.format.DateTimeFormat;
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.entity.UserInfo;
 import org.maxkey.persistence.service.UserInfoService;
 import org.maxkey.synchronizer.ISynchronizerService;
@@ -124,6 +125,12 @@ public class DingdingUsersService   implements ISynchronizerService{
 		return organizationService;
 	}
 
+	@Override
+	public void setSynchronizer(Synchronizers Synchronizer) {
+		// TODO Auto-generated method stub
+		
+	}
+
 
 	
 }

+ 7 - 0
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/ldap/LdapOrganizationService.java

@@ -26,6 +26,7 @@ import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
 import org.maxkey.constants.ldap.OrganizationalUnit;
 import org.maxkey.entity.Organizations;
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.persistence.ldap.LdapUtils;
 import org.maxkey.persistence.service.OrganizationsService;
 import org.maxkey.synchronizer.ISynchronizerService;
@@ -122,6 +123,12 @@ public class LdapOrganizationService  implements ISynchronizerService{
 	public void setOrganizationsService(OrganizationsService organizationsService) {
 		this.organizationsService = organizationsService;
 	}
+
+	@Override
+	public void setSynchronizer(Synchronizers Synchronizer) {
+		// TODO Auto-generated method stub
+		
+	}
 	
 	
 }

+ 9 - 0
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/ldap/LdapSynchronizerService.java

@@ -17,6 +17,7 @@
 
 package org.maxkey.synchronizer.ldap;
 
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.synchronizer.ISynchronizerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -27,6 +28,8 @@ import org.springframework.stereotype.Service;
 public class LdapSynchronizerService  implements ISynchronizerService{
 	final static Logger _logger = LoggerFactory.getLogger(LdapSynchronizerService.class);
 	
+	Synchronizers synchronizer;
+	
 	@Autowired
 	LdapUsersService ldapUsersService;
 	
@@ -59,5 +62,11 @@ public class LdapSynchronizerService  implements ISynchronizerService{
 		this.ldapOrganizationService = ldapOrganizationService;
 	}
 
+	@Override
+	public void setSynchronizer(Synchronizers synchronizer) {
+		this.synchronizer = synchronizer;
+		
+	}
+
 	
 }

+ 7 - 0
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/ldap/LdapUsersService.java

@@ -24,6 +24,7 @@ import javax.naming.directory.Attribute;
 import javax.naming.directory.SearchControls;
 import javax.naming.directory.SearchResult;
 import org.maxkey.constants.ldap.InetOrgPerson;
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.entity.UserInfo;
 import org.maxkey.persistence.ldap.LdapUtils;
 import org.maxkey.persistence.service.UserInfoService;
@@ -139,6 +140,12 @@ public class LdapUsersService  implements ISynchronizerService{
 	public void setUserInfoService(UserInfoService userInfoService) {
 		this.userInfoService = userInfoService;
 	}
+
+	@Override
+	public void setSynchronizer(Synchronizers Synchronizer) {
+		// TODO Auto-generated method stub
+		
+	}
 	
 	
 }

+ 3 - 1
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinAccessTokenService.java

@@ -33,7 +33,9 @@ public class WorkweixinAccessTokenService {
 	public static String TOKEN_URL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s";
 
 
-
+	public WorkweixinAccessTokenService() {}
+	
+	
 	public WorkweixinAccessTokenService(String corpid, String corpsecret) {
 		super();
 		this.corpid = corpid;

+ 7 - 0
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinOrganizationService.java

@@ -18,6 +18,7 @@
 package org.maxkey.synchronizer.workweixin;
 
 import org.maxkey.entity.Organizations;
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.persistence.service.OrganizationsService;
 import org.maxkey.synchronizer.ISynchronizerService;
 import org.maxkey.synchronizer.workweixin.entity.WorkWeixinDepts;
@@ -103,4 +104,10 @@ public class WorkweixinOrganizationService implements ISynchronizerService{
 		this.organizationsService = organizationsService;
 	}
 
+	@Override
+	public void setSynchronizer(Synchronizers synchronizer) {
+		
+		
+	}
+
 }

+ 11 - 4
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinSynchronizerService.java

@@ -17,17 +17,17 @@
 
 package org.maxkey.synchronizer.workweixin;
 
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.synchronizer.ISynchronizerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import com.taobao.api.ApiException;
-
 @Service
 public class WorkweixinSynchronizerService  implements ISynchronizerService{
 	final static Logger _logger = LoggerFactory.getLogger(WorkweixinSynchronizerService.class);
+	Synchronizers synchronizer;
 	
 	@Autowired
 	WorkweixinUsersService workweixinUsersService;
@@ -36,7 +36,7 @@ public class WorkweixinSynchronizerService  implements ISynchronizerService{
 	WorkweixinOrganizationService workweixinOrganizationService;
 	
 
-	WorkweixinAccessTokenService workweixinAccessTokenService;
+	WorkweixinAccessTokenService workweixinAccessTokenService = new WorkweixinAccessTokenService();
 	
 	public WorkweixinSynchronizerService() {
 		super();
@@ -44,7 +44,8 @@ public class WorkweixinSynchronizerService  implements ISynchronizerService{
 
 	public void sync() throws Exception {
 		_logger.info("Sync ...");
-		
+		workweixinAccessTokenService.setCorpid(synchronizer.getPrincipal());
+		workweixinAccessTokenService.setCorpsecret(synchronizer.getCredentials());
 		String access_token=workweixinAccessTokenService.requestToken();
 		
 		workweixinOrganizationService.setAccess_token(access_token);
@@ -78,4 +79,10 @@ public class WorkweixinSynchronizerService  implements ISynchronizerService{
 		this.workweixinAccessTokenService = workweixinAccessTokenService;
 	}
 
+	@Override
+	public void setSynchronizer(Synchronizers synchronizer) {
+		this.synchronizer = synchronizer;
+		
+	}
+
 }

+ 7 - 0
maxkey-identitys/maxkey-synchronizers/src/main/java/org/maxkey/synchronizer/workweixin/WorkweixinUsersService.java

@@ -17,6 +17,7 @@
 
 package org.maxkey.synchronizer.workweixin;
 
+import org.maxkey.entity.Synchronizers;
 import org.maxkey.entity.UserInfo;
 import org.maxkey.persistence.service.UserInfoService;
 import org.maxkey.synchronizer.ISynchronizerService;
@@ -111,6 +112,12 @@ public class WorkweixinUsersService  implements ISynchronizerService{
 		return organizationService;
 	}
 
+	@Override
+	public void setSynchronizer(Synchronizers Synchronizer) {
+		// TODO Auto-generated method stub
+		
+	}
+
 
 	
 }

+ 2 - 1
maxkey-web-manage/src/main/java/org/maxkey/MaxKeyMgtApplication.java

@@ -50,7 +50,8 @@ import org.springframework.context.annotation.ComponentScan;
     "org.maxkey.web.tag",
     "org.maxkey.identity.kafka",
     "org.maxkey.identity.scim.controller",
-    "org.maxkey.identity.rest"
+    "org.maxkey.identity.rest",
+    "org.maxkey.synchronizer"
 })
 @MapperScan("org.maxkey.persistence.mapper,")
 @SpringBootApplication

+ 39 - 1
maxkey-web-manage/src/main/java/org/maxkey/web/contorller/SynchronizersController.java

@@ -17,10 +17,14 @@
 
 package org.maxkey.web.contorller;
 
+import java.util.HashMap;
+import java.util.List;
 import org.apache.mybatis.jpa.persistence.JpaPageResults;
 import org.maxkey.constants.ConstantsOperateMessage;
 import org.maxkey.entity.Synchronizers;
 import org.maxkey.persistence.service.SynchronizersService;
+import org.maxkey.synchronizer.ISynchronizerService;
+import org.maxkey.util.StringUtils;
 import org.maxkey.web.WebContext;
 import org.maxkey.web.message.Message;
 import org.maxkey.web.message.MessageType;
@@ -32,6 +36,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.ModelAttribute;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
@@ -44,8 +49,15 @@ public class SynchronizersController {
 	@Autowired
 	@Qualifier("synchronizersService")
 	SynchronizersService synchronizerssService;
-
 	
+	private static HashMap<String,String> synchronizerMap =new HashMap<String,String>();
+
+	static {
+		synchronizerMap.put("1", "ldapSynchronizerService");
+		synchronizerMap.put("2", "activeDirectorySynchronizerService");
+		synchronizerMap.put("3", "dingdingSynchronizerService");
+		synchronizerMap.put("4", "workweixinSynchronizerService");
+	}
 	
 	@RequestMapping(value={"/list"})
 	public ModelAndView groupsList(){
@@ -92,5 +104,31 @@ public class SynchronizersController {
 		}
 		
 	}
+	
+	/**
+	 * 修改
+	 * @param group
+	 * @return
+	 */
+	@ResponseBody
+	@RequestMapping(value={"/sync"})  
+	public Message sync(@RequestParam("id") String id) {
+		_logger.debug("-update  synchronizers ids :" + id);
+		
+		List<String> ids = StringUtils.string2List(id, ",");
+		try {
+			for(String sysId : ids) {
+				Synchronizers  synchronizer  = synchronizerssService.get(sysId);
+				_logger.debug("synchronizer " + synchronizer);
+				ISynchronizerService synchronizerService = (ISynchronizerService)WebContext.getBean(synchronizerMap.get(sysId));
+				synchronizerService.setSynchronizer(synchronizer);
+				synchronizerService.sync();
+			}
+		}catch(Exception e) {
+			_logger.error("synchronizer Exception " , e);
+			return  new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_ERROR),MessageType.error);
+		}
+		return new Message(WebContext.getI18nValue(ConstantsOperateMessage.UPDATE_SUCCESS),MessageType.success);
+	}
 
 }

+ 13 - 21
maxkey-web-manage/src/main/resources/messages/message.properties

@@ -92,7 +92,7 @@ login.password.confirmPassword=\u786e\u8ba4\u65b0\u5bc6\u7801
 login.password.initial.change.tip=\u9996\u6b21\u767b\u5f55\uff0c\u8bf7\u4fee\u6539\u521d\u59cb\u5316\u5bc6\u7801
 login.password.changepassword=\u5bc6\u7801\u4fee\u6539
 login.password.applogin.changepassword=\u5e94\u7528\u767b\u5f55\u5bc6\u7801\u8bbe\u7f6e
-
+#passwordpolicy
 login.passwordpolicy=\u5bc6\u7801\u7b56\u7565
 login.passwordpolicy.minlength=\u6700\u5c0f\u957f\u5ea6
 login.passwordpolicy.maxlength=\u6700\u5927\u957f\u5ea6
@@ -111,13 +111,12 @@ login.passwordpolicy.numerical=\u6570\u5b57\u5e8f\u5217\u7b56\u7565
 login.passwordpolicy.qwerty=\u952e\u76d8\u7b56\u7565
 login.passwordpolicy.occurances=\u5b57\u7b26\u91cd\u590d\u6b21\u6570
 
-
+#social
 login.social.link=\u7ed1\u5b9a
 login.social.unlink=\u89e3\u9664
 login.social.icon=\u56fe\u6807
 login.social.provider=\u4f9b\u5e94\u5546
-
-#
+#userinfo
 userinfo.id=\u7528\u6237\u7f16\u53f7
 userinfo.tab.basic=\u57fa\u672c\u4fe1\u606f
 userinfo.tab.business=\u673a\u6784\u4fe1\u606f
@@ -218,7 +217,7 @@ userinfo.authnType.authnType.7=HOTP\u4ee4\u724c
 userinfo.authnType.authnType.8=RSA\u4ee4\u724c
 userinfo.authnType.authnType.9=\u6570\u5b57\u8bc1\u4e66
 userinfo.authnType.authnType.10=USB Key
-
+#org
 org.tab.basic=\u57fa\u672c\u4fe1\u606f
 org.tab.extra=\u6269\u5c55\u4fe1\u606f
 org.id=\u673a\u6784\u7f16\u53f7
@@ -242,7 +241,6 @@ org.address=\u5730\u5740
 org.postalcode=\u90ae\u7f16
 org.sortorder=\u6392\u5e8f
 org.description=\u63cf\u8ff0
-
 #opt totp
 login.totp.sharedSecret=\u5171\u4eab\u5bc6\u7801
 login.totp.period=\u5468\u671f
@@ -313,12 +311,10 @@ apps.extendAttr.parameter.type=\u7c7b\u578b
 apps.extendAttr.parameter.value=\u503c
 apps.principal=\u51ed\u8bc1
 apps.credentials=\u79d8\u94a5
-
 #adapter
 apps.adapter.name=\u540D\u79F0
 apps.adapter.adapter=\u9002\u914D\u5668
 apps.adapter.protocol=\u534F\u8BAE
-
 #formbased
 apps.formbased.info=\u8868\u5355\u8ba4\u8bc1
 apps.formbased.redirectUri=\u8ba4\u8bc1\u5730\u5740
@@ -410,7 +406,6 @@ apps.oauth.connect.idTokenEncryptedAlgorithm=idToken\u52a0\u5bc6\u7b97\u6cd5
 apps.oauth.connect.userInfoEncryptedAlgorithm=\u7528\u6237\u52a0\u5bc6\u7b97\u6cd5
 apps.oauth.connect.idTokenEncryptionMethod=idToken\u52a0\u5bc6\u65b9\u6cd5
 apps.oauth.connect.userInfoEncryptionMethod=\u7528\u6237\u52a0\u5bc6\u65b9\u6cd5
-
 #group
 group.id=\u7ec4\u7f16\u7801
 group.name=\u7528\u6237\u7ec4
@@ -419,14 +414,13 @@ group.filters=\u8fc7\u6ee4\u5668
 group.orgidslist=\u673a\u6784\u5217\u8868
 group.resumeTime=\u52a8\u6001\u65f6\u95f4
 group.suspendTime=\u6302\u8d77\u65f6\u95f4
-
 #role
 role.id=\u89d2\u8272\u7f16\u7801
 role.name=\u89d2\u8272
 role.dynamic=\u52a8\u6001\u7ec4
 role.filters=\u8fc7\u6ee4\u5668
 role.orgidslist=\u673a\u6784\u5217\u8868
-
+#resource
 resource.id=\u8d44\u6e90\u7f16\u7801
 resource.name=\u8d44\u6e90\u540d\u79f0
 resource.parentId=\u7236\u7ea7\u7f16\u7801
@@ -443,7 +437,6 @@ resource.resourceIcon=\u56fe\u6807
 resource.resourceUrl=\u8d44\u6e90\u5730\u5740
 resource.resourceAction=\u52a8\u4f5c
 resource.resourceStyle=\u6837\u5f0f
-
 #account
 account.username=\u7528\u6237\u540d
 account.displayName=\u7528\u6237\u59d3\u540d
@@ -451,7 +444,6 @@ account.appId=\u5e94\u7528\u7f16\u53f7
 account.appName=\u5e94\u7528\u540d\u79f0
 account.relatedUsername=\u7528\u6237\u8d26\u53f7
 account.relatedPassword=\u8d26\u53f7\u5bc6\u7801
-
 #synchronizers
 synchronizers.id=\u7F16\u53F7
 synchronizers.name=\u540C\u6B65\u5668\u540D\u79F0
@@ -469,7 +461,7 @@ synchronizers.trustStore=\u8BC1\u4E66\u8DEF\u5F84
 synchronizers.trustStorePassword=\u8BC1\u4E66\u5BC6\u94A5
 synchronizers.resumeTime=\u6062\u590D\u65F6\u95F4
 synchronizers.suspendTime=\u6302\u8D77\u65F6\u95F4
- 
+#button
 button.text.action=\u8bbf\u95ee
 button.text.visit=\u8bbf\u95ee
 button.text.save=\u4fdd\u5b58
@@ -489,7 +481,8 @@ button.text.view=\u67e5\u770b
 button.text.hidden=\u9690\u85cf
 button.text.import=\u5bfc\u5165
 button.text.adjunct=\u517c\u4efb\u673a\u6784
-
+button.text.sync=\u540C\u6B65
+#loginhistory
 log.loginhistory.id=\u7f16\u53f7
 log.loginhistory.sessionId=\u4f1a\u8bdd
 log.loginhistory.username=\u767b\u5f55\u540d
@@ -506,7 +499,7 @@ log.loginhistory.application=\u5e94\u7528
 log.loginhistory.loginUrl=\u767b\u5f55\u5730\u5740
 log.loginhistory.code=\u4ee3\u7801
 log.loginhistory.rpUserInfo=\u7b2c\u4e09\u65b9
-
+#loginappshistory
 log.loginappshistory.id=\u7f16\u53f7
 log.loginappshistory.sessionId=\u4f1a\u8bdd
 log.loginappshistory.uid=\u7528\u6237\u7f16\u53f7
@@ -515,14 +508,14 @@ log.loginappshistory.displayName=\u7528\u6237\u540d
 log.loginappshistory.appId=\u5e94\u7528\u7f16\u53f7
 log.loginappshistory.appName=\u5e94\u7528\u540d\u79f0
 log.loginappshistory.loginTime=\u767b\u5f55\u65f6\u95f4
-
+#operate
 log.operate.servicename=\u670d\u52a1
 log.operate.message=\u6d88\u606f
 log.operate.content=\u5185\u5bb9
 log.operate.messageType=\u6d88\u606f\u7c7b\u578b
 log.operate.operateType=\u64cd\u4f5c\u7c7b\u578b
 log.operate.username=\u64cd\u4f5c\u4eba
-
+#message
 message.action.insert.success=\u65b0\u589e\u64cd\u4f5c\u6210\u529f
 message.action.insert.error=\u65b0\u589e\u64cd\u4f5c\u5931\u8d25
 message.action.update.success=\u66f4\u65b0\u64cd\u4f5c\u6210\u529f
@@ -531,17 +524,16 @@ message.action.delete.success=\u5220\u9664\u64cd\u4f5c\u6210\u529f
 message.action.delete.error=\u5220\u9664\u64cd\u4f5c\u5931\u8d25
 message.action.import.success=\u6279\u91cf\u5bfc\u5165\u6210\u529f
 message.action.import.error=\u6279\u91cf\u5bfc\u5165\u5931\u8d25
-
+#import
 import.title=\u6279\u91cf\u5bfc\u5165\u6570\u636e
 import.file.select=\u9009\u62e9\u5bfc\u5165\u6587\u4ef6
 import.template.download=\u4e0b\u8f7d\u6a21\u677f
 import.update.exist=\u66f4\u65b0\u5b58\u5728\u6570\u636e
 import.tip=\u63d0\u793a\uff1a\u4ec5\u5141\u8bb8\u5bfc\u5165\u201cxls\u201d\u6216\u8005\u201cxlsx\u201d\u683c\u5f0f\u7684\u6587\u4ef6 
-
 #Notices
 notices.title=\u6807\u9898
 notices.content=\u5185\u5BB9
-
+#navs
 navs.system=\u7cfb\u7edf
 navs.home=\u9996\u9875
 navs.orgs=\u673a\u6784\u7ba1\u7406

+ 1 - 0
maxkey-web-manage/src/main/resources/messages/message_en.properties

@@ -491,6 +491,7 @@ button.text.view=View
 button.text.hidden=Hidden
 button.text.import=Import
 button.text.adjunct=Adjoint Depts
+button.text.sync=Sync
 
 log.loginhistory.id=id
 log.loginhistory.sessionId=sessionId

+ 1 - 0
maxkey-web-manage/src/main/resources/messages/message_zh_CN.properties

@@ -489,6 +489,7 @@ button.text.view=\u67e5\u770b
 button.text.hidden=\u9690\u85cf
 button.text.import=\u5bfc\u5165
 button.text.adjunct=\u517c\u4efb\u673a\u6784
+button.text.sync=\u540C\u6B65
 
 log.loginhistory.id=\u7f16\u53f7
 log.loginhistory.sessionId=\u4f1a\u8bdd

+ 0 - 147
maxkey-web-manage/src/main/resources/static/jquery/json2form/json2form.js

@@ -1,147 +0,0 @@
-/*	jQuery json2form Plugin 
- *	version: 1.0 (2011-03-01)
- *
- * 	Copyright (c) 2011, Crystal, shimingxy@163.com
- * 	Dual licensed under the MIT and GPL licenses:
- * 	http://www.opensource.org/licenses/mit-license.php
- * 	http://www.gnu.org/licenses/gpl.html
- * 	Date: 2011-03-01 rev 1
- */
- ;(function ($) {
-$.json2form = $.json2form||{};
-$.fn.json2form = function(config ) { 
-	var config=$.extend({
-			url		:null,
-			elem	:this.attr("id"),
-			type	:'POST'
-		}, config || {});
-
-	if(config.url){
-		$.ajax({type: config.type,url: config.url,data:$.extend({json2form:config.elem},config.data||{}),dataType: "json",async: false,
-			success: function(data){
-				config.data=data;
-			}
-		});
-	}
-	
-	if(!$("#"+config.elem).attr("loadedInit")){//init checkbox radio and select element ,label
-		if(config.data.init){
-			for (var elem in config.data.init){
-				var arrayData=config.data.init[elem];
-				if($("#"+config.elem+" input[name='"+elem+"']")){
-					var elemType=$("#"+config.elem+" input[name='"+elem+"']").attr("type");
-					var elemName=$("#"+config.elem+" input[name='"+elem+"']").attr("name");
-					var initElem=$("#"+config.elem+" input[name='"+elem+"']");
-					switch(elemType){
-						case "checkbox":
-						case "radio":
-							for (var initelem in arrayData){
-								initElem.after('<input type="'+elemType+'"  name="'+elemName+'" value="'+arrayData[initelem].value+'" />'+arrayData[initelem].display);
-							}
-							initElem.remove();
-							break;
-					}
-				} 
-				if($("#"+config.elem+" select[name='"+elem+"']")){
-					for (var initelem in arrayData){
-						$("#"+config.elem+" select[name='"+elem+"']").append("<option value='"+arrayData[initelem].value+"'>"+arrayData[initelem].display+"</option>");
-					}
-				}
-			}
-		}
-		if(config.data.label){//label
-			$("#"+config.elem+" label").each(function(){
-				var labelFor=$(this).attr("for");
-				if(config.data.label[labelFor]){
-					$(this).html(config.data.label[labelFor]);
-				}
-			});
-		}
-	}
-	
-	if(config.data){//input text password hidden button reset submit checkbox radio select textarea
-		$("#"+config.elem+" input,select,textarea").each(function(){
-			var elemType=$(this).attr("type")==undefined?this.type:$(this).attr("type");
-			var elemName=$(this).attr("name");
-			var elemData=config.data[elemName];
-			if(!$("#"+config.elem).attr("loadedInit")&&$(this).attr("loadurl")){
-				switch(elemType){
-					case "checkbox":
-					case "radio":
-					case "select":
-					case "select-one":
-					case "select-multiple":{
-						var _this =this;
-						$.ajax({type: config.type,url: $(this).attr("loadurl"),dataType: "json",async: false,success: function(data){	
-							if(elemType=="select"||elemType=="select-one"||elemType=="select-multiple"){
-								$(_this).empty();
-							}
-							for (var elem in data){
-									if(elemType=="select"||elemType=="select-one"||elemType=="select-multiple"){
-										$(_this).append("<option value='"+data[elem].value+"'>"+data[elem].display+"</option>");
-									}else{
-										$(_this).after('<input type="'+elemType+'"  name="'+elemName+'" value="'+data[elem].value+'" />'+data[elem].display);
-									}
-								}
-								if(elemType=="checkbox"||elemType=="radio")$(_this).remove();
-							}
-						});
-						break;
-					}
-				}
-			}
-			
-			if(elemData){
-				switch(elemType){
-					case undefined:
-					case "text":
-					case "password":
-					case "hidden":
-					case "button":
-					case "reset":
-					case "textarea":
-					case "submit":{
-						if(typeof(elemData)=="string"){
-							$(this).val(elemData.toUpperCase()=="NULL"?"":elemData);
-						}else{
-							$(this).val(elemData+"");
-						}
-						break;
-					}
-					case "checkbox":
-					case "radio":{
-						$(this).attr("checked",false);
-						if(elemData.constructor==Array){//checkbox multiple value is Array
-							for (var elem in elemData){
-								if(elemData[elem]==$(this).val()){
-									$(this).attr("checked",true);
-								}
-							}
-						}else{//radio or checkbox is a string single value
-							if(elemData==$(this).val()){
-								$(this).attr("checked",true);
-							}
-						}
-						break;
-					}
-					case "select":
-					case "select-one":
-					case "select-multiple":{
-						$(this).find("option:selected").attr("selected",false);
-						if(elemData.constructor==Array){
-							for (var elem in elemData){
-								$(this).find("option[value='"+elemData[elem]+"']").attr("selected",true);
-							}
-						}else{
-							$(this).find("option[value='"+elemData+"']").attr("selected",true);
-						}
-						break;
-					}
-				}
-			}
-		});
-	}
-
-	$("#"+config.elem).attr("loadedInit","true");//loadedInit is true,next invoke not need init checkbox radio and select element ,label
-};
-})(jQuery);

+ 0 - 149
maxkey-web-manage/src/main/resources/static/jquery/json2form/json2formDemo.htm

@@ -1,149 +0,0 @@
-<html>
-	<head>
-		<title>Json2form Demo</title>
-		<script src="jquery-1.4.4.min.js" type="text/javascript"></script>
-		<script src="json2form.js" type="text/javascript"></script>
-		<script type="text/javascript">
-			jQuery(document).ready(function(){ 
-				var objdata ={
-					txt:'文字输入',
-					pwd:'密码输入',
-					hd:'隐藏',
-					are:'多行文字json2form',
-					btn:'按钮',
-					rt:'重置按钮',
-					sb:'提交按钮',
-					rad:'男',
-					chk:'chk1',
-					chk:['美国','中国'],
-					sl:['法国','日本'],
-					label:{
-						txt:'自定义文本框标签',
-						sl :'自定义下拉列表标签'
-					},
-					init:{
-						chk444:[{"value":"comm","display":"一般资源"},{"value":"system","display":"系统"},{"value":"page","display":"页面"},{"value":"url","display":"链接"},{"value":"model","display":"模块"},{"value":"data","display":"数据"}],
-						chk555:[{"value":"comm","display":"一般资源"},{"value":"system","display":"系统"},{"value":"page","display":"页面"},{"value":"url","display":"链接"},{"value":"model","display":"模块"},{"value":"data","display":"数据"}],
-						slinit:[{"value":"comm","display":"一般资源"},{"value":"system","display":"系统"},{"value":"page","display":"页面"},{"value":"url","display":"链接"},{"value":"model","display":"模块"},{"value":"data","display":"数据"}]
-					}
-				};
-				
-				$("#json2form").json2form({data:objdata});
-				$("#json2form").json2form({data:objdata});
-			});
-		</script>
-		<style type="text/css">   
-			table, td {   
-				border:1px solid #cccccc;   
-				border-collapse:collapse;  
-			}   
-		</style>
-	</head>
-	<body>
-		<div align="center">
-			<form id="json2form" name="json2form">
-				<table>
-					<tr>
-						<td colspan="2"  bgcolor="#FFFFFF"><div align="center"><strong>Aduby json2formDemo</strong></div></td>
-					</tr>
-					<tr>
-						<td>1. text(文本框)</td>
-						<td>
-							<label for="txt">1 text(文本框)</label>
-							<input type="text" id="txt" name="txt" value="输入内容" />
-						</td>
-					</tr>
-					<tr>
-						<td>2. password(密码框)</td>
-						<td>
-							<input type="password" id="pwd" name="pwd" value="值" />
-						</td>
-					</tr>
-					<tr>
-						<td>3. hidden(隐藏域)</td>
-						<td>
-							<input type="hidden" id="hd" name="hd" value="值"/>
-				 
-						</td>
-					</tr>
-					<tr>
-						<td>4. checkbox(复选框)</td>
-						<td>
-							<input type="checkbox" id="chk1" name="chk" value="中国"  checked="checked" />中国<label for="chk1"></label>
-							<input type="checkbox" id="chk2" name="chk" value="美国" />美国<label for="chk2"></label>
-						</td>
-					</tr>
-					<tr>
-						<td>5. checkbox(动态复选框)</td>
-						<td>
-							<input type="checkbox" id="chk444" name="chk444" value="动态复选框" />
-						</td>
-					</tr>
-					<tr>
-						<td>6. radion(单选按钮)</td>
-						<td>
-							<input type="radio" id="rd1" name="rad" value="男" checked="checked" />男
-							<input type="radio" id="rd2" name="rad" value="女" />女
-						</td>
-					</tr>
-					<tr>
-						<td>7. radion(动态单选按钮)</td>
-						<td>
-							<input type="radio" id="chk555" name="chk555" value="动态单选按钮" />
-						</td>
-					</tr>
-					<tr>
-						<td>8. file(文件)</td>
-						<td>
-							<input  type="file" id="fl" name="file" value="呵呵" size="20" />
-						</td>
-					</tr>
-					<tr>
-						<td>9. textare(文本域)</td>
-						<td>
-							多行文本输入框。<br>
-							<textarea id="are" name="are" cols="10" rows="10" ></textarea>
-						</td>
-					</tr>
-					<tr>
-						<td>10. select(下拉列表框)</td>
-						<td>
-							用户选择的下拉列表。<br>
-							<label for="sl">下拉列表</label><br>
-						   <select id="sl" name="sl" multiple="multiple" >
-								<option id="op1" value="美国" selected="selected">美国</option>
-								<option id="op2" value="中国">中国</option>
-								<option id="op3" value="日本">日本</option>
-								<option id="op4" value="法国">法国</option>
-							</select>
-						</td>
-					</tr>
-					<tr>
-						<td>11. select(动态下拉列表框)</td>
-						<td>
-							<select id="slinit" name="slinit"  ><option  value="null">动态下拉列表框</option> </select>
-						</td>
-					</tr>
-					<tr>
-						<td>12.  button(普通按钮)</td>
-						<td>
-							<input  type="button" id="btn" name="btn" value="普通按钮">
-						</td>
-					</tr>
-					<tr>
-						<td>13. reset(重置按钮)</td>
-						<td>
-							<input  type="reset" id="rt" name="rt" value="重置按钮" />
-						</td>
-					</tr>
-					<tr>
-						<td>14. submit(提交按钮)</td>
-						<td>
-							<input type="submit" id="sb" name="sb"  value="提交按钮" />
-						</td>
-					</tr>
-				</table>
-			</form>
-		</div>
-	</body>
-</html>

+ 0 - 168
maxkey-web-manage/src/main/resources/static/jquery/json2form/readme.txt

@@ -1,168 +0,0 @@
-/*	jQuery json2form Plugin 
- *	version: 1.0 (2011-3-01)
- *
- * 	Copyright (c) 2011, Crystal, shimingxy@163.com
- * 	Dual licensed under the MIT and GPL licenses:
- * 	http://www.opensource.org/licenses/mit-license.php
- * 	http://www.gnu.org/licenses/gpl.html
- * 	Date: 2011-3-01 rev 1
- */
- ;(function ($) {
-$.json2form = $.json2form||{};
-$.fn.json2form = function(config ) { 
-
-	var config=$.extend({
-			url	    : null,//remote url for ajax data
-			elem    : this.attr("id"),//id
-			type    : "POST",//remote data method type ,GET or POST default is POST
-		}, config || {});
-	if(config.url){
-		$.ajax({type: config.type,url: config.url,dataType: "json",async: false,
-			success: function(data){
-				config.data=data;
-			}
-		});
-	}
-	alert();
-	if(config.init){
-		//init
-		for (var elem in config.init){
-		   if(typeof(elem) != 'function'){
-				var arrayObject=config.init[elem];
-				if($("#"+config.elem+" input[name='"+elem+"']")){
-					var elemtype=$("#"+config.elem+" input[name='"+elem+"']").attr("type");
-					var elemName=$("#"+config.elem+" input[name='"+elem+"']").attr("name");
-					var initElem=$("#"+config.elem+" input[name='"+elem+"']");
-					switch(elemtype){
-						case "checkbox":
-							for (var initelem in arrayObject){
-								initElem.after('<input type="checkbox"  name="'+elemName+'" value="'+arrayObject[initelem].value+'" />'+arrayObject[initelem].display);
-							}
-							initElem.remove();
-							break;
-						case "radio":
-							for (var initelem in arrayObject){
-								initElem.after('<input type="radio"  name="'+elemName+'" value="'+arrayObject[initelem].value+'" />'+arrayObject[initelem].display);
-							}
-							initElem.remove();
-							break;
-					}
-				} 
-				if($("#"+config.elem+" select[name='"+elem+"']")){
-					for (var initelem in arrayObject){
-						$("#"+config.elem+" select[name='"+elem+"']").append("<option value='"+arrayObject[initelem].value+"'>"+arrayObject[initelem].display+"</option>");
-					}
-				}
-			}
-		}
-	}
-	
-	if(config.data){
-		//input text password hidden button reset submit checkbox radio
-		$("#"+config.elem+" input").each(function(){
-			
-			var elemtype=$(this).attr("type");
-			
-			if($(this).attr("action")){
-				var elemName=$(this).attr("name");
-				switch(elemtype){
-					case "checkbox":
-						var checkbox =this;
-						$.ajax({type: "POST",url: $(this).attr("action"),dataType: "json",async: false,success: function(data){
-							for (var elem in data){
-		  						$(checkbox).after('<input type="checkbox"  name="'+elemName+'" value="'+data[elem].value+'" />'+data[elem].display);
-		  					}
-							$(checkbox).remove();
-							}
-						});
-						break;
-					case "radio":
-						var radio =this;
-						$.ajax({type: "POST",url: $(this).attr("action"),dataType: "json",async: false,success: function(data){
-							for (var elem in data){
-		  						$(radio).after('<input type="radio"  name="'+elemName+'" value="'+data[elem].value+'" />'+data[elem].display);
-		  					}
-							$(radio).remove();
-							}
-						});
-						break;
-				}
-			}
-			
-			switch(elemtype){
-				case "text":
-				case "password":
-				case "hidden":
-				case "button":
-				case "reset":
-				case "submit":{
-					for (var elem in config.data){
-					   if(typeof(elem) != 'function'){
-					   		if(($(this).attr("name"))==elem){
-					   			$(this).val(config.data[elem]);
-					   		}
-						}
-					}
-					break;
-				}
-				case "checkbox":
-				case "radio":{
-					for (var elem in config.data){
-					   if(typeof(elem) != 'function'){
-					   		if(($(this).attr("name"))==elem&&($(this).val())==$(this).val()){
-					   			$(this).attr("checked",true);
-					   		}
-						}
-					}
-					break;
-				}
-			}
-		});
-		//select
-		$("#"+config.elem+" select").each(function(){
-			var select =this;
-			if($(this).attr("action")){
-				$.ajax({type: "POST",url: $(this).attr("action"),dataType: "json",async: false,success: function(data){
-					for (var elem in data){
-  						$(select).append("<option value='"+data[elem].value+"'>"+data[elem].display+"</option>");
-  					}
-					}
-				});
-			}
-			
-			for (var elem in config.data){
-			   if(typeof(elem) != 'function'){
-			   		if(($(this).attr("name"))==elem){
-			   			$(this).val(config.data[elem]);
-			   		}
-				}
-			}
-			
-		});
-		
-		//textarea
-		$("#"+config.elem+" textarea").each(function(){
-			for (var elem in config.data){
-			   if(typeof(elem) != 'function'){
-			   		if(($(this).attr("name"))==elem){
-			   			$(this).val(config.data[elem]);
-			   		}
-				}
-			}
-		});
-	}
-	
-	if(config.label){
-		//label
-		$("#"+config.elem+" label").each(function(){
-			for (var elem in config.label){
-			   if(typeof(elem) != 'function'){
-			   		if(($(this).attr("for"))==elem){
-			   			$(this).html(config.label[elem]);
-			   		}
-				}
-			}
-		});
-	}
-};
-})(jQuery);

+ 71 - 85
maxkey-web-manage/src/main/resources/static/jquery/platform.common.js

@@ -224,6 +224,29 @@ $(function(){
 	 	$(".d-footer").show();
 	};
 	
+	//get Selections Rows Data
+	$.dataGridSelRowsData=function(dataGridElement){
+		return $(dataGridElement).bootstrapTable('getSelections');
+	};
+	
+	//get Selections Rows Data
+	$.gridSelectedData=function(dataGridElement){
+		return $(dataGridElement).bootstrapTable('getSelections');
+	};
+	
+	//get Selections Rows Ids
+	$.gridSelectedIds=function(dataGridElement){
+		var selectIds="";
+		if($(dataGridElement).length>0){//get grid list selected ids
+			var selRows =  $(dataGridElement).bootstrapTable('getSelections');
+			for (var i=0;i<selRows.length; i++){
+				selectIds=selectIds+","+selRows[i].id;
+			}
+			selectIds=selectIds.substring(1);
+		}
+		return selectIds;
+	};
+	
     // Fetch all the forms we want to apply custom Bootstrap validation styles to
 	// For actionForm use ajax submit
     var forms = $(".needs-validation");
@@ -305,28 +328,61 @@ $(function(){
     
 	//window open by element is window style
 	$(".window").on("click",function(){
+		//before open action
 		if (typeof(beforeWindow) == "function"){
-			beforeWindow();///before open action
+			beforeWindow();
 		}
-		
 		var url=$(this).attr("wurl");
+		var refObject = $(this).attr("ref");
+		var refData = "";
+		if(refObject){
+			if(refObject=="datagrid" && $.gridSelectedData("#datagrid").length>0){
+				refData= $.gridSelectedData("#datagrid")[0].id;
+			}else if($("#"+refObject).val()!=""){
+				refData = $("#"+refObject).val();
+			}
+			if( refData == null || refData == ""){
+				$.alert({content:$.platform.messages.select.alertText});
+				return;
+			}
+			url = url + "/"+ refData;
+		}
+		$.window({
+					url		:	url,//window url
+					title	:	$(this).attr("wtitle"),//title
+					width	:	$(this).attr("wwidth"),//width
+					height	:	$(this).attr("wheight")//height
+		});//open window
+	});
+	
+	//click Btn Submit data to server 
+	$(".sendBtn").on("click",function(){
+		var url=$(this).attr("wurl");
+		var refObject = $(this).attr("ref");
 		
-		
-		if($(this).attr("ref")){
-			if($("#"+$(this).attr("ref")).val()==""){
+		if(refObject){
+			if(refObject=="datagrid"){
+				var selectIds= $.gridSelectedIds("#datagrid");
+				if(selectIds == null || selectIds == "") {
+					return;
+				}
+				url = url+"?id="+selectIds;
+			}else if($("#"+refObject).val()!=""){
+				url=url+"/"+$("#"+refObject).val();
+			}else{
 				$.alert({content:$.platform.messages.select.alertText});
 				return;
 			}
-			url=url+"/"+$("#"+$(this).attr("ref")).val();
 		}
 		
-		var settings={
-				url		:	url,//window url
-				title	:	$(this).attr("wtitle"),//title
-				width	:	$(this).attr("wwidth"),//width
-				height	:	$(this).attr("wheight")//height
-			};
-		$.window(settings);//open window
+		$.post(url, {currTime:(new Date()).getTime()}, function(data) {
+			//alert result
+			$.alert({content:data.message,type:$.platform.messages.messageType[data.messageType]});
+			//refresh grid list
+			if($("#datagrid")[0]){
+				$("#datagrid").bootstrapTable("refresh");
+			}
+	 	}); 
 	});
 	
 	//forward to url, by forward style
@@ -420,23 +476,12 @@ $(function(){
 			if (typeof(beforeUpdate) == "function"){
 				beforeUpdate(this);
 			}
-			
-			var selectId="";
-			if($("#datagrid").length>0){//get grid list selected ids
-				var selRows = $('#datagrid').bootstrapTable('getSelections');
-				for (var i=0;i<selRows.length; i++){
-					selectId=selectId+","+selRows[i].id;
-					break;
-				}
-				selectId=selectId.substring(1);
-			}
-			
+			var selectId= $.gridSelectedIds("#datagrid");
 			if(selectId == null || selectId == "") {
 				$.alert({content:$.platform.messages.select.alertText});
 				return;
 			}
 			
-			
 			if($(this).attr("target")&&$(this).attr("target")=="forward"){
 				$.forward($(this).attr("wurl")+"/"+selectId);	
 			}if($(this).attr("target")&&$(this).attr("target")=="_blank"){
@@ -454,59 +499,12 @@ $(function(){
 		
 	});
 
-	//view button
-	$("#viewBtn").click(function(){
-		if (typeof(viewAction) == "function"){
-			document.location.href=viewAction(this);//自定义跳转
-		}else {
-			if (typeof(beforeView) == "function"){
-				beforeView(this);//自定义跳转
-			}
-			var selectId="";
-			if($("#list2").length>0){//get grid list selected ids
-				selectId=$("#list2").jqGrid("getGridParam", "selrow");
-				if(selectId ==	null ||	selectId	==	""){
-					$.alert({content:$.platform.messages.select.alertText});
-					return;
-				}
-				var rowData = $("#list2").jqGrid("getRowData", selectId);
-				selectId=rowData.id;
-			}else if($("#list").length>0){//get grid list selected ids
-				selectId=$("#list").jqGrid("getGridParam", "selrow");
-				if(selectId ==	null ||	selectId	==	""){
-					$.alert({content:$.platform.messages.select.alertText});
-					return;
-				}
-				var rowData = $("#list").jqGrid("getRowData", selectId);
-				selectId=rowData.id;
-			}
-			if($(this).attr("target")&&$(this).attr("target")=="forward"){
-				$.forward($(this).attr("wurl")+"/"+selectId);	
-			}else{
-				var settings={
-						url		:	$(this).attr("wurl")+"/"+selectId,//window url
-						title	:	$(this).attr("wtitle"),//title
-						width	:	$(this).attr("wwidth"),//width
-						height	:	$(this).attr("wheight")//height
-					};
-				$.window(settings);//open window
-			}
-		}
-	});
-
 	//delete and batch delete button
 	$("#deleteBtn").click(function(){
 		if (typeof(beforeDelete) == "function"){
 			beforeDelete(this);//before function
 		}
-		var selectIds="";
-		if($("#datagrid").length>0){//get grid list selected ids
-			var selRows = $('#datagrid').bootstrapTable('getSelections');
-			for (var i=0;i<selRows.length; i++){
-				selectIds=selectIds+","+selRows[i].id;
-			}
-			selectIds=selectIds.substring(1);
-		}
+		var selectIds=$.gridSelectedIds("#datagrid");
 		if(selectIds == null || selectIds == "") {
 			$.alert({content:$.platform.messages.select.alertText});
 			return;
@@ -563,18 +561,6 @@ $(function(){
 		
 	});
 	
-	//form json url init all ways not used
-	if($("#actionForm")){//actionForm exist
-		if($("#actionForm").attr("loadaction")){//init form
-	    	$("#actionForm").json2form({url	:	$("#actionForm").attr("loadaction")});//init #actionForm with loadaction url
-	    	$("#actionForm").removeAttr('loadaction'); //is need init
-		}
-	};
-	
-	$.dataGridSelRowsData=function(dataGridElement){
-		return $(dataGridElement).bootstrapTable('getSelections');
-	};
-	
 	var curExpandNode = null;
 	$.tree=function (treeSettings){
 		

+ 0 - 1
maxkey-web-manage/src/main/resources/templates/views/layout/common.cssjs.ftl

@@ -27,7 +27,6 @@
 	<script src ="<@base />/static/jquery/jquery.cookie.js" type="text/javascript" ></script>
 	<#-- form -->
 	<script src ="<@base />/static/jquery/jquery.form.js" type="text/javascript" ></script>
-	<script src ="<@base />/static/jquery/json2form/json2form.js" type="text/javascript" ></script>
 	<#-- blockUI -->
 	<script src ="<@base />/static/jquery/jquery.blockUI.js" type="text/javascript" ></script>
 	<#-- serializeObject -->

+ 3 - 0
maxkey-web-manage/src/main/resources/templates/views/synchronizers/synchronizersList.ftl

@@ -55,6 +55,9 @@
 		 			</td>
 		 			<td colspan="2">
 		 				<div id="tool_box_right">
+		 				 <input class="button btn btn-success mr-3 sendBtn" id="syncBtn" type="button" value="<@locale code="button.text.sync"/>" 
+						 		    wurl="<@base/>/synchronizers/sync" ref="datagrid"
+						 		    />
 					 	<input class="button btn btn-info mr-3 " id="modifyBtn" type="button" value="<@locale code="button.text.edit"/>" 
 					 				wurl="<@base/>/synchronizers/forwardUpdate"
 					 				wwidth="550"

+ 5 - 26
maxkey-web-manage/src/main/resources/templates/views/userinfo/usersList.ftl

@@ -11,6 +11,7 @@
    			return '<@locale code="userinfo.gender.male" />';
    		}
 	};
+	
 	function statusFormatter(value, row, index){
    		if(value==1){
    			return '<@locale code="userinfo.status.active" />';
@@ -24,8 +25,6 @@
    			return '<@locale code="userinfo.status.inactive" />';
    		}
 	};
-	
-	
 		
 function onClick (event, treeId, treeNode) {
 	$("#departmentId").val(treeNode.data.id)
@@ -34,15 +33,6 @@ function onClick (event, treeId, treeNode) {
 	$("#searchBtn").click();
 	 
 }
-
-//adjunctUserIdRef
-function beforeWindow( ){
-	var selData = $('#datagrid').bootstrapTable('getSelections');
-	if(selData && selData[0] != null){
-		$("#adjunctUserIdRef").val(selData[0].id);
-	}
-}
-
 	
 $(function () {
 		
@@ -158,17 +148,7 @@ $(function () {
 						}
 					}
 	    		}
-	    	);//end tree
-	    	
-	$("#changepwdBtn").on("click",function(){
-	 	if($.dataGridSelRowsData("#datagrid")[0]==null){
-			$.alert({content:$.platform.messages.select.alertText});
-			return;
-		}	
-		$("#changepwdBtnHidden").attr("wurl","<@base/>/userinfo/forwardChangePassword/"+$.dataGridSelRowsData("#datagrid")[0].id);
-		$("#changepwdBtnHidden").click();	
-	});
-	
+	    	);//end tree	
 	
 	$("#moreBtn").on("click",function(){
 		var node=$("#tool_box_right_more");
@@ -250,13 +230,12 @@ $(function () {
 					 	<input  class="button btn btn-secondary"  id="moreBtn" type="button" size="50"  value="<@locale code="button.text.expandsearch"/>" expandValue="<@locale code="button.text.expandsearch"/>"  collapseValue="<@locale code="button.text.collapsesearch"/>">	    	
 					 </div>
 					 <div id="tool_box_right_more" style="display:none;">
-					 	<input class="button btn btn-warning mr-3" id="changepwdBtn" type="button" value="<@locale code="login.password.changepassword"/>" />
-						<input class="button btn btn-warning mr-3 window" id="changepwdBtnHidden" type="hidden"
+					 	<input class="button btn btn-warning mr-3 window" id="changepwdBtn" type="button"
 						 value="<@locale code="login.password.changepassword"/>" 
-						 		    wurl="<@base/>/userinfo/forwardChangePassword" wwidth="600px" wheight="250px" />
+						 		    wurl="<@base/>/userinfo/forwardChangePassword/" wwidth="600px" wheight="250px" ref="datagrid"/>
 						
 						 <input class="button btn btn-info mr-3 window" id="userAdjointBtn" type="button" 
-						 		value="<@locale code="button.text.adjunct"/>"  ref="adjunctUserIdRef"
+						 		value="<@locale code="button.text.adjunct"/>"  ref="datagrid"
 						 		    wurl="<@base/>/useradjoint/list" wwidth="900px" wheight="600px" />
 						 <input  id="adjunctUserIdRef" 		type="hidden" />     		    
 						 <input class="button btn btn-success mr-3 window" id="usersImportBtn" type="button"