Forráskód Böngészése

SessionManager and UI Fix

MaxKey 3 éve
szülő
commit
853f45a315
52 módosított fájl, 1160 hozzáadás és 1448 törlés
  1. 0 3
      build.gradle
  2. 1 4
      config/build_docker.gradle
  3. 1 4
      config/build_jar.gradle
  4. 1 4
      config/build_standard.gradle
  5. 4 4
      gradle.properties
  6. 21 12
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/InMemorySessionManager.java
  7. 12 13
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/RedisSessionManager.java
  8. 23 13
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/Session.java
  9. 4 2
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/SessionManager.java
  10. 21 4
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/SessionManagerFactory.java
  11. 2 2
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/web/LoginTokenRefreshPoint.java
  12. 0 18
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/web/package-info.java
  13. 1 1
      maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/autoconfigure/AuthenticationAutoConfiguration.java
  14. 25 0
      maxkey-core/src/main/java/org/maxkey/entity/GroupPrivileges.java
  15. 1 1
      maxkey-core/src/main/java/org/maxkey/persistence/repository/PasswordPolicyValidator.java
  16. 46 46
      maxkey-core/src/main/resources/messages/passwordpolicy_message.properties
  17. 2 2
      maxkey-core/src/main/resources/messages/passwordpolicy_message_en.properties
  18. 46 46
      maxkey-core/src/main/resources/messages/passwordpolicy_message_zh_CN.properties
  19. 1 0
      maxkey-persistence/src/main/java/org/maxkey/persistence/service/AccountsService.java
  20. 11 3
      maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/GroupPrivilegesMapper.xml
  21. 33 8
      maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/ReportMapper.xml
  22. 25 41
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/group-members-editer/group-members-editer.component.html
  23. 37 68
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/group-members.component.html
  24. 28 41
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/groups/groups.component.html
  25. 17 28
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/groups/select-groups/select-groups.component.html
  26. 61 48
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/privileges/privileges.component.html
  27. 37 54
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/accounts.component.html
  28. 2 2
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/accounts.component.ts
  29. 63 43
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/apps.component.html
  30. 47 30
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/select-apps/select-apps.component.html
  31. 32 43
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/accounts-strategy/accounts-strategy.component.html
  32. 27 40
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/adapters/adapters.component.html
  33. 50 57
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/ldap-context/ldap-context.component.html
  34. 69 154
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/password-policy/password-policy.component.html
  35. 32 51
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/socials-provider/socials-provider.component.html
  36. 34 45
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/synchronizers/synchronizers.component.html
  37. 11 42
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/dashboard/home/home.component.html
  38. 35 51
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/organizations/organizations.component.html
  39. 46 69
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/privileges/privileges.component.html
  40. 39 61
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/resources/resources.component.html
  41. 25 41
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members-editer/role-members-editer.component.html
  42. 37 68
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members.component.html
  43. 28 41
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/roles/roles.component.html
  44. 27 54
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/select-user/select-user.component.html
  45. 45 64
      maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/users.component.html
  46. 2 2
      maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json
  47. 7 7
      maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json
  48. 7 4
      maxkey-web-frontend/maxkey-web-mgt-app/src/style-icons-auto.ts
  49. 4 0
      maxkey-web-frontend/maxkey-web-mgt-app/src/styles/theme.less
  50. 1 1
      maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtListenerConfig.java
  51. 26 5
      maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/listener/SessionListenerAdapter.java
  52. 3 3
      maxkey-webs/maxkey-web-mgt/src/main/resources/application-http.properties

+ 0 - 3
build.gradle

@@ -275,9 +275,6 @@ subprojects {
          implementation group: 'org.springframework.data', name: 'spring-data-commons', version: "${springDataVersion}"
          implementation group: 'org.springframework.data', name: 'spring-data-keyvalue', version: "${springDataVersion}"
          implementation group: 'org.springframework.data', name: 'spring-data-redis', version: "${springDataVersion}"
-         //spring-session
-         implementation group: 'org.springframework.session', name: 'spring-session-core', version: "${springSessionVersion}"
-         implementation group: 'org.springframework.session', name: 'spring-session-data-redis', version: "${springSessionVersion}"
          
          //implementation group: 'org.springframework.plugin', name: 'spring-plugin-core', version: "${springplugincoreVersion}"
          //implementation group: 'org.springframework.plugin', name: 'spring-plugin-metadata', version: "${springpluginmetadataVersion}"

+ 1 - 4
config/build_docker.gradle

@@ -240,10 +240,7 @@ subprojects {
          implementation group: 'org.springframework.data', name: 'spring-data-commons', version: "${springDataVersion}"
          implementation group: 'org.springframework.data', name: 'spring-data-keyvalue', version: "${springDataVersion}"
          implementation group: 'org.springframework.data', name: 'spring-data-redis', version: "${springDataVersion}"
-         //spring-session
-         implementation group: 'org.springframework.session', name: 'spring-session-core', version: "${springSessionVersion}"
-         implementation group: 'org.springframework.session', name: 'spring-session-data-redis', version: "${springSessionVersion}"
-         
+
          //implementation group: 'org.springframework.plugin', name: 'spring-plugin-core', version: "${springplugincoreVersion}"
          //implementation group: 'org.springframework.plugin', name: 'spring-plugin-metadata', version: "${springpluginmetadataVersion}"
          //spring cloud

+ 1 - 4
config/build_jar.gradle

@@ -240,10 +240,7 @@ subprojects {
          implementation group: 'org.springframework.data', name: 'spring-data-commons', version: "${springDataVersion}"
          implementation group: 'org.springframework.data', name: 'spring-data-keyvalue', version: "${springDataVersion}"
          implementation group: 'org.springframework.data', name: 'spring-data-redis', version: "${springDataVersion}"
-         //spring-session
-         implementation group: 'org.springframework.session', name: 'spring-session-core', version: "${springSessionVersion}"
-         implementation group: 'org.springframework.session', name: 'spring-session-data-redis', version: "${springSessionVersion}"
-         
+
          //implementation group: 'org.springframework.plugin', name: 'spring-plugin-core', version: "${springplugincoreVersion}"
          //implementation group: 'org.springframework.plugin', name: 'spring-plugin-metadata', version: "${springpluginmetadataVersion}"
          //spring cloud

+ 1 - 4
config/build_standard.gradle

@@ -275,10 +275,7 @@ subprojects {
          implementation group: 'org.springframework.data', name: 'spring-data-commons', version: "${springDataVersion}"
          implementation group: 'org.springframework.data', name: 'spring-data-keyvalue', version: "${springDataVersion}"
          implementation group: 'org.springframework.data', name: 'spring-data-redis', version: "${springDataVersion}"
-         //spring-session
-         implementation group: 'org.springframework.session', name: 'spring-session-core', version: "${springSessionVersion}"
-         implementation group: 'org.springframework.session', name: 'spring-session-data-redis', version: "${springSessionVersion}"
-         
+ 
          //implementation group: 'org.springframework.plugin', name: 'spring-plugin-core', version: "${springplugincoreVersion}"
          //implementation group: 'org.springframework.plugin', name: 'spring-plugin-metadata', version: "${springpluginmetadataVersion}"
          //spring cloud

+ 4 - 4
gradle.properties

@@ -63,8 +63,8 @@ tomcatVersion                   =9.0.62
 tomcatembedloggingjuliVersion   =8.5.2
 #spring 
 springVersion                   =5.3.20
-springBootVersion               =2.6.7
-springSecurityVersion           =5.6.4
+springBootVersion               =2.6.8
+springSecurityVersion           =5.6.5
 springDataVersion               =2.6.4
 springSessionVersion            =2.6.3
 springkafkaVersion              =2.8.2
@@ -95,8 +95,8 @@ knife4jVersion                  =3.0.3
 #database
 postgresqlVersion               =42.3.3
 mysqlconnectorjavaVersion       =8.0.26
-druidVersion                    =1.2.8
-druidspringbootstarterVersion   =1.2.8
+druidVersion                    =1.2.9
+druidspringbootstarterVersion   =1.2.9
 jedisVersion                    =3.8.0
 ehcacheVersion                  =3.9.6
 caffeineVersion                 =2.9.2

+ 21 - 12
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/InMemorySessionManager.java

@@ -17,8 +17,7 @@
 
 package org.maxkey.authn.session;
 
-import java.time.Duration;
-import java.time.LocalTime;
+import java.time.LocalDateTime;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
@@ -43,6 +42,7 @@ public class InMemorySessionManager implements SessionManager{
 	
 	public InMemorySessionManager(int validitySeconds) {
         super();
+        this.validitySeconds = validitySeconds;
         sessionStore = 
                 Caffeine.newBuilder()
                     .expireAfterWrite(validitySeconds, TimeUnit.SECONDS)
@@ -53,6 +53,7 @@ public class InMemorySessionManager implements SessionManager{
 
     @Override
 	public void create(String sessionId, Session session) {
+    	session.setExpiredTime(session.getLastAccessTime().plusSeconds(validitySeconds));
     	sessionStore.put(sessionId, session);
 	}
 
@@ -70,10 +71,15 @@ public class InMemorySessionManager implements SessionManager{
     }
 
     @Override
-    public Session refresh(String sessionId,LocalTime refreshTime) {
+    public Session refresh(String sessionId,LocalDateTime refreshTime) {
         Session session = get(sessionId);
-        session.setLastAccessTime(refreshTime);
-        create(sessionId , session);
+        if(session != null) {
+        	_logger.debug("refresh session Id {} at refreshTime {}",sessionId,refreshTime);
+	        session.setLastAccessTime(refreshTime);
+	        //invalidate sessionId then renew one
+	        sessionStore.invalidate(sessionId);
+	        create(sessionId , session);
+        }
         return session;
     }
 
@@ -81,18 +87,21 @@ public class InMemorySessionManager implements SessionManager{
     public Session refresh(String sessionId) {
         Session session = get(sessionId);
         
-        LocalTime currentTime = LocalTime.now();
-        Duration duration = Duration.between(currentTime, session.getLastAccessTime());
-        
-        _logger.trace("Session duration " + duration.getSeconds());
-        
-        if(duration.getSeconds() > Session.MAX_EXPIRY_DURATION) {
+        if(session != null) {
+        	LocalDateTime currentTime = LocalDateTime.now();
+        	_logger.debug("refresh session Id {} at time {}",sessionId,currentTime);
         	session.setLastAccessTime(currentTime);
-            return refresh(sessionId,currentTime);
+        	//invalidate sessionId then renew one
+	        sessionStore.invalidate(sessionId);
+	        create(sessionId , session);
         }
         return session;
     }
 
+	public int getValiditySeconds() {
+		return validitySeconds;
+	}
+
 	@Override
 	public List<HistoryLogin> querySessions() {
 		// TODO Auto-generated method stub

+ 12 - 13
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/RedisSessionManager.java

@@ -17,8 +17,7 @@
 
 package org.maxkey.authn.session;
 
-import java.time.Duration;
-import java.time.LocalTime;
+import java.time.LocalDateTime;
 import java.util.List;
 
 import org.maxkey.entity.HistoryLogin;
@@ -65,6 +64,7 @@ public class RedisSessionManager implements SessionManager {
 
 	@Override
 	public void create(String sessionId, Session session) {
+		session.setExpiredTime(session.getLastAccessTime().plusSeconds(validitySeconds));
 		RedisConnection conn = connectionFactory.getConnection();
 		conn.setexObject( getKey(sessionId), validitySeconds, session);
 		conn.close();
@@ -97,25 +97,24 @@ public class RedisSessionManager implements SessionManager {
 	}
 
 	@Override
-    public Session refresh(String sessionId,LocalTime refreshTime) {
+    public Session refresh(String sessionId,LocalDateTime refreshTime) {
         Session session = get(sessionId);
-        session.setLastAccessTime(refreshTime);
-        create(sessionId , session);
+        if(session != null) {
+        	_logger.debug("refresh session Id {} at {}",sessionId,refreshTime);
+	        session.setLastAccessTime(refreshTime);
+	        create(sessionId , session);
+        }
         return session;
     }
     
     @Override
     public Session refresh(String sessionId) {
         Session session = get(sessionId);
-        
-        LocalTime currentTime = LocalTime.now();
-        Duration duration = Duration.between(currentTime, session.getLastAccessTime());
-        
-        _logger.trace("Session duration " + duration.getSeconds());
-        
-        if(duration.getSeconds() > Session.MAX_EXPIRY_DURATION) {
+        if(session != null) {
+        	LocalDateTime currentTime = LocalDateTime.now();
+        	_logger.debug("refresh session Id {} at time {}",sessionId,currentTime);
         	session.setLastAccessTime(currentTime);
-           return  refresh(sessionId,currentTime);
+        	create(sessionId , session);
         }
         return session;
     }

+ 23 - 13
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/Session.java

@@ -18,7 +18,7 @@
 package org.maxkey.authn.session;
 
 import java.io.Serializable;
-import java.time.LocalTime;
+import java.time.LocalDateTime;
 import java.util.HashMap;
 
 import org.maxkey.entity.apps.Apps;
@@ -34,9 +34,11 @@ public class Session implements Serializable{
     
     public String id;
     
-    public LocalTime startTimestamp;
+    public LocalDateTime startTimestamp;
     
-    public LocalTime lastAccessTime;
+    public LocalDateTime lastAccessTime;
+    
+    public LocalDateTime expiredTime;
     
     public Authentication authentication;
     
@@ -45,23 +47,23 @@ public class Session implements Serializable{
     public Session() {
         super();
         this.id = WebContext.genId();;
-        this.startTimestamp = LocalTime.now();
-        this.lastAccessTime = LocalTime.now();
+        this.startTimestamp = LocalDateTime.now();
+        this.lastAccessTime = LocalDateTime.now();
     }
 
     public Session(String sessionId) {
         super();
         this.id = sessionId;
-        this.startTimestamp = LocalTime.now();
-        this.lastAccessTime = LocalTime.now();
+        this.startTimestamp = LocalDateTime.now();
+        this.lastAccessTime = LocalDateTime.now();
     }
     
     public Session(String sessionId,Authentication authentication) {
         super();
         this.id = sessionId;
         this.authentication = authentication;
-        this.startTimestamp = LocalTime.now();
-        this.lastAccessTime = LocalTime.now();
+        this.startTimestamp = LocalDateTime.now();
+        this.lastAccessTime = LocalDateTime.now();
     }
     
     public String getId() {
@@ -77,22 +79,30 @@ public class Session implements Serializable{
     }
     
 
-    public LocalTime getStartTimestamp() {
+    public LocalDateTime getStartTimestamp() {
 		return startTimestamp;
 	}
 
-	public void setStartTimestamp(LocalTime startTimestamp) {
+	public void setStartTimestamp(LocalDateTime startTimestamp) {
 		this.startTimestamp = startTimestamp;
 	}
 
-	public LocalTime getLastAccessTime() {
+	public LocalDateTime getLastAccessTime() {
 		return lastAccessTime;
 	}
 
-	public void setLastAccessTime(LocalTime lastAccessTime) {
+	public void setLastAccessTime(LocalDateTime lastAccessTime) {
 		this.lastAccessTime = lastAccessTime;
 	}
 
+	public LocalDateTime getExpiredTime() {
+		return expiredTime;
+	}
+
+	public void setExpiredTime(LocalDateTime expiredTime) {
+		this.expiredTime = expiredTime;
+	}
+
 	public Authentication getAuthentication() {
         return authentication;
     }

+ 4 - 2
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/SessionManager.java

@@ -17,7 +17,7 @@
 
 package org.maxkey.authn.session;
 
-import java.time.LocalTime;
+import java.time.LocalDateTime;
 import java.util.List;
 
 import org.maxkey.entity.HistoryLogin;
@@ -30,11 +30,13 @@ public interface SessionManager {
     
     public  Session get(String sessionId);
     
-    public Session refresh(String sessionId ,LocalTime refreshTime);
+    public Session refresh(String sessionId ,LocalDateTime refreshTime);
     
     public Session refresh(String sessionId);
     
     public List<HistoryLogin> querySessions();
     
+    public int getValiditySeconds();
+    
     public void terminate(String sessionId,String userId,String username);
 }

+ 21 - 4
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/session/SessionManagerFactory.java

@@ -20,7 +20,7 @@ package org.maxkey.authn.session;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Types;
-import java.time.LocalTime;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 
@@ -34,6 +34,14 @@ import org.slf4j.LoggerFactory;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 
+/**
+ * SessionManager
+ * Level 1 in memory,store in Caffeine
+ * Level 2 in Redis 
+ * user session status in database
+ * @author shimh
+ *
+ */
 public class SessionManagerFactory implements SessionManager{
 	private static final  Logger _logger = 
             LoggerFactory.getLogger(SessionManagerFactory.class);
@@ -53,12 +61,15 @@ public class SessionManagerFactory implements SessionManager{
 	
 	private RedisSessionManager 	redisSessionManager;
 	
-	private boolean isRedis = false;					
+	private boolean isRedis = false;	
+	
+	private int validitySeconds ;
 	
 	public SessionManagerFactory(int persistence,
 			 	JdbcTemplate jdbcTemplate,
 	            RedisConnectionFactory redisConnFactory,
 	            int validitySeconds) {
+		this.validitySeconds = validitySeconds;
 		 this.jdbcTemplate = jdbcTemplate;
 		 this.inMemorySessionManager = 
 				new InMemorySessionManager(validitySeconds);
@@ -94,11 +105,12 @@ public class SessionManagerFactory implements SessionManager{
 		return session;
 	}
 
-	public Session refresh(String sessionId, LocalTime refreshTime) {
+	public Session refresh(String sessionId, LocalDateTime refreshTime) {
 		Session session = null;
 		if(isRedis) {
 			session = redisSessionManager.refresh(sessionId,refreshTime);
 			//renew one
+			inMemorySessionManager.remove(sessionId);
 			inMemorySessionManager.create(sessionId, session);
 		}else {
 			session = inMemorySessionManager.refresh(sessionId,refreshTime);
@@ -111,6 +123,7 @@ public class SessionManagerFactory implements SessionManager{
 		if(isRedis) {
 			session = redisSessionManager.refresh(sessionId);
 			//renew one
+			inMemorySessionManager.remove(sessionId);
 			inMemorySessionManager.create(sessionId, session);
 		}else {
 			session = inMemorySessionManager.refresh(sessionId);
@@ -142,12 +155,16 @@ public class SessionManagerFactory implements SessionManager{
     
 	public void terminate(String sessionId, String userId, String username) {
 		String lastLogoffTime = DateUtils.formatDateTime(new Date());
-	   	 _logger.trace("{} user {} terminate Ticket {} ." ,lastLogoffTime,username, sessionId);
+	   	 _logger.trace("{} user {} terminate session {} ." ,lastLogoffTime,username, sessionId);
 	   	this.profileLastLogoffTime(userId, lastLogoffTime);
 	   	this.sessionLogoff(sessionId, lastLogoffTime);
 	   	this.remove(sessionId);
 	}
 	
+	public int getValiditySeconds() {
+		return validitySeconds;
+	}
+	
 	private final class OnlineTicketRowMapper  implements RowMapper<HistoryLogin> {
 		@Override
 		public HistoryLogin mapRow(ResultSet rs, int rowNum)

+ 2 - 2
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/web/LoginRefreshPoint.java → maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/web/LoginTokenRefreshPoint.java

@@ -35,8 +35,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 
 @Controller
 @RequestMapping(value = "/auth")
-public class LoginRefreshPoint {
-	private static final  Logger _logger = LoggerFactory.getLogger(LoginRefreshPoint.class);
+public class LoginTokenRefreshPoint {
+	private static final  Logger _logger = LoggerFactory.getLogger(LoginTokenRefreshPoint.class);
 	
 	@Autowired
 	AuthTokenService authTokenService;

+ 0 - 18
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/web/package-info.java

@@ -1,18 +0,0 @@
-/*
- * Copyright [2022] [MaxKey of copyright http://www.maxkey.top]
- * 
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *     http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- 
-
-package org.maxkey.authn.web;

+ 1 - 1
maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/autoconfigure/AuthenticationAutoConfiguration.java

@@ -202,7 +202,7 @@ public class AuthenticationAutoConfiguration  implements InitializingBean {
             RedisConnectionFactory redisConnFactory,
             @Value("${maxkey.session.timeout:1800}") int timeout
             ) {
-    	_logger.trace("session timeout " + timeout);
+    	_logger.debug("session timeout " + timeout);
         SessionManager  sessionManager  = 
                 new SessionManagerFactory(
                 		persistence, jdbcTemplate, redisConnFactory,timeout);

+ 25 - 0
maxkey-core/src/main/java/org/maxkey/entity/GroupPrivileges.java

@@ -49,9 +49,14 @@ public class GroupPrivileges extends Apps implements Serializable{
 	String id;
 	@Column
 	private String groupId;
+	
+	private String groupName;
+	
 	@Column
 	private String appId;
 	
+	private String appName;
+	
 	@Column
 	private String instId;
 
@@ -130,6 +135,26 @@ public class GroupPrivileges extends Apps implements Serializable{
 	}
 
 
+	public String getGroupName() {
+		return groupName;
+	}
+
+
+	public void setGroupName(String groupName) {
+		this.groupName = groupName;
+	}
+
+
+	public String getAppName() {
+		return appName;
+	}
+
+
+	public void setAppName(String appName) {
+		this.appName = appName;
+	}
+
+
 	@Override
     public String toString() {
         StringBuilder builder = new StringBuilder();

+ 1 - 1
maxkey-core/src/main/java/org/maxkey/persistence/repository/PasswordPolicyValidator.java

@@ -128,7 +128,7 @@ public class PasswordPolicyValidator {
             DateTime badPasswordTime = DateTime.parse(badPasswordTimeString,
                     DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss"));
             Duration duration = new Duration(badPasswordTime, currentdateTime);
-            int intDuration = Integer.parseInt(duration.getStandardHours() + "");
+            int intDuration = Integer.parseInt(duration.getStandardMinutes() + "");
             _logger.debug("bad Password duration {} , " + 
                           "password policy Duration {} , "+
                           "validate result {}" ,

+ 46 - 46
maxkey-core/src/main/resources/messages/passwordpolicy_message.properties

@@ -1,48 +1,48 @@
 #password
-PasswordPolicy.HISTORY_VIOLATION=\u5bc6\u7801\u5339\u914d\u4e86{0}\u5386\u53f2\u5bc6\u7801.
-PasswordPolicy.ILLEGAL_WORD=\u5bc6\u7801\u5305\u542b\u5728\u5bc6\u7801\u5b57\u5178{0}.
-PasswordPolicy.ILLEGAL_WORD_REVERSED=\u5bc6\u7801\u5305\u542b\u5728\u5bc6\u7801\u5b57\u5178\u5012\u5e8f{0}.
-PasswordPolicy.ILLEGAL_DIGEST_WORD=\u5bc6\u7801\u5305\u542b\u5728\u5b57\u5178\u4e2d.
-PasswordPolicy.ILLEGAL_DIGEST_WORD_REVERSED=\u5bc6\u7801\u5305\u542b\u5728\u5b57\u5178\u5012\u5e8f\u4e2d.
-PasswordPolicy.ILLEGAL_MATCH=\u5bc6\u7801\u5339\u914d\u975e\u6cd5\u89c4\u5219{0}.
-PasswordPolicy.ALLOWED_MATCH=\u5bc6\u7801\u5fc5\u987b\u5339\u914d\u89c4\u5219{0}.
-PasswordPolicy.ILLEGAL_CHAR=\u5bc6\u7801{1}\u5305\u542b\u975e\u6cd5\u5b57\u7b26{0}.
-PasswordPolicy.ALLOWED_CHAR=\u5bc6\u7801{1}\u975e\u6cd5\u5b57\u7b26{0}.
-PasswordPolicy.ILLEGAL_QWERTY_SEQUENCE=\u5bc6\u7801\u5305\u542b\u952e\u76d8\u5e8f\u5217{0}.
-PasswordPolicy.ILLEGAL_ALPHABETICAL_SEQUENCE=\u5bc6\u7801\u5305\u542b\u5b57\u7b26\u5e8f\u5217{0}.
-PasswordPolicy.ILLEGAL_NUMERICAL_SEQUENCE=\u5bc6\u7801\u5305\u542b\u6570\u5b57\u5e8f\u5217{0}.
-PasswordPolicy.ILLEGAL_USERNAME=\u5bc6\u7801\u4e0d\u80fd\u5305\u542b\u767b\u5f55\u540d{0}.
-PasswordPolicy.ILLEGAL_USERNAME_REVERSED=\u5bc6\u7801{1} \u5305\u542b\u767b\u5f55\u540d{0}\u5012\u5e8f.
-PasswordPolicy.ILLEGAL_WHITESPACE=\u5bc6\u7801{1}\u5305\u542b\u7a7a\u683c.
-PasswordPolicy.ILLEGAL_NUMBER_RANGE=\u5bc6\u7801{1}\u6570\u5b57 {0}.
-PasswordPolicy.ILLEGAL_REPEATED_CHARS=\u5bc6\u7801{2}\u5e8f\u5217{0}\u6216\u8005\u591a\u4e2a\u5b57\u7b26, \u4f46{1}\u5141\u8bb8:{3}\u6b21.
-PasswordPolicy.INSUFFICIENT_UPPERCASE=\u5bc6\u7801\u81f3\u5c11\u5305\u542b{0}\u4f4d\u5927\u5199\u5b57\u6bcd.
-PasswordPolicy.INSUFFICIENT_LOWERCASE=\u5bc6\u7801\u81f3\u5c11\u5305\u542b{0}\u4f4d\u5c0f\u5199\u5b57\u6bcd.
-PasswordPolicy.INSUFFICIENT_ALPHABETICAL=\u5bc6\u7801\u5305\u542b\u5b57\u7b26\u5e8f\u5217{0}.
-PasswordPolicy.INSUFFICIENT_DIGIT=\u5bc6\u7801\u81f3\u5c11\u5305\u542b{0}\u4f4d\u6570\u5b57\u5b57\u6bcd.
-PasswordPolicy.INSUFFICIENT_SPECIAL=\u5bc6\u7801\u81f3\u5c11\u5305\u542b{0}\u4f4d\u7279\u6b8a\u5b57\u7b26.
-PasswordPolicy.INSUFFICIENT_CHARACTERISTICS=\u5bc6\u7801\u5339\u914d {0} of{2}\u5b57\u7b26\u89c4\u5219, \u4f46{1} \u5fc5\u987b.
-PasswordPolicy.INSUFFICIENT_COMPLEXITY=\u5bc6\u7801\u9047\u5230{1}\u590d\u6742\u89c4\u5219, \u4f46{2}\u5fc5\u987b.
-PasswordPolicy.INSUFFICIENT_COMPLEXITY_RULES=\u6ca1\u6709\u914d\u7f6e\u5bc6\u7801\u957f\u5ea6\u89c4\u5219 {0}.
-PasswordPolicy.SOURCE_VIOLATION=\u5bc6\u7801\u4e0d\u80fd\u5305\u542b{0}\u5bc6\u7801.
-PasswordPolicy.TOO_LONG=\u5bc6\u7801\u6700\u591a{1}\u4f4d\u5b57\u7b26.
-PasswordPolicy.TOO_SHORT=\u5bc6\u7801\u81f3\u5c11{0}\u4f4d\u5b57\u7b26.
-PasswordPolicy.TOO_MANY_OCCURRENCES=\u5bc6\u7801\u5305\u542b{0}\u51fa\u73b0{1}, \u6700\u591a{2} \u6b21.
-PasswordPolicy.OLD_PASSWORD_NOT_MATCH=\u539f\u5bc6\u7801\u4e0d\u5339\u914d.
-PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH=\u65b0\u5bc6\u7801\u4e0e\u786e\u8ba4\u5bc6\u7801\u4e0d\u4e00\u81f4.
-PasswordPolicy.OLD_PASSWORD_MATCH=\u65b0\u5bc6\u7801\u4e0d\u80fd\u4e0e\u65e7\u5bc6\u7801\u4e00\u81f4.
+PasswordPolicy.HISTORY_VIOLATION=\u5BC6\u7801\u5339\u914D\u4E86{0}\u5386\u53F2\u5BC6\u7801.
+PasswordPolicy.ILLEGAL_WORD=\u5BC6\u7801\u5305\u542B\u5728\u5BC6\u7801\u5B57\u5178{0}.
+PasswordPolicy.ILLEGAL_WORD_REVERSED=\u5BC6\u7801\u5305\u542B\u5728\u5BC6\u7801\u5B57\u5178\u5012\u5E8F{0}.
+PasswordPolicy.ILLEGAL_DIGEST_WORD=\u5BC6\u7801\u5305\u542B\u5728\u5B57\u5178\u4E2D.
+PasswordPolicy.ILLEGAL_DIGEST_WORD_REVERSED=\u5BC6\u7801\u5305\u542B\u5728\u5B57\u5178\u5012\u5E8F\u4E2D.
+PasswordPolicy.ILLEGAL_MATCH=\u5BC6\u7801\u5339\u914D\u975E\u6CD5\u89C4\u5219{0}.
+PasswordPolicy.ALLOWED_MATCH=\u5BC6\u7801\u5FC5\u987B\u5339\u914D\u89C4\u5219{0}.
+PasswordPolicy.ILLEGAL_CHAR=\u5BC6\u7801{1}\u5305\u542B\u975E\u6CD5\u5B57\u7B26{0}.
+PasswordPolicy.ALLOWED_CHAR=\u5BC6\u7801{1}\u975E\u6CD5\u5B57\u7B26{0}.
+PasswordPolicy.ILLEGAL_QWERTY_SEQUENCE=\u5BC6\u7801\u5305\u542B\u952E\u76D8\u5E8F\u5217{0}.
+PasswordPolicy.ILLEGAL_ALPHABETICAL_SEQUENCE=\u5BC6\u7801\u5305\u542B\u5B57\u7B26\u5E8F\u5217{0}.
+PasswordPolicy.ILLEGAL_NUMERICAL_SEQUENCE=\u5BC6\u7801\u5305\u542B\u6570\u5B57\u5E8F\u5217{0}.
+PasswordPolicy.ILLEGAL_USERNAME=\u5BC6\u7801\u4E0D\u80FD\u5305\u542B\u767B\u5F55\u540D{0}.
+PasswordPolicy.ILLEGAL_USERNAME_REVERSED=\u5BC6\u7801{1} \u5305\u542B\u767B\u5F55\u540D{0}\u5012\u5E8F.
+PasswordPolicy.ILLEGAL_WHITESPACE=\u5BC6\u7801{1}\u5305\u542B\u7A7A\u683C.
+PasswordPolicy.ILLEGAL_NUMBER_RANGE=\u5BC6\u7801{1}\u6570\u5B57 {0}.
+PasswordPolicy.ILLEGAL_REPEATED_CHARS=\u5BC6\u7801{2}\u5E8F\u5217{0}\u6216\u8005\u591A\u4E2A\u5B57\u7B26, \u4F46{1}\u5141\u8BB8:{3}\u6B21.
+PasswordPolicy.INSUFFICIENT_UPPERCASE=\u5BC6\u7801\u81F3\u5C11\u5305\u542B{0}\u4F4D\u5927\u5199\u5B57\u6BCD.
+PasswordPolicy.INSUFFICIENT_LOWERCASE=\u5BC6\u7801\u81F3\u5C11\u5305\u542B{0}\u4F4D\u5C0F\u5199\u5B57\u6BCD.
+PasswordPolicy.INSUFFICIENT_ALPHABETICAL=\u5BC6\u7801\u5305\u542B\u5B57\u7B26\u5E8F\u5217{0}.
+PasswordPolicy.INSUFFICIENT_DIGIT=\u5BC6\u7801\u81F3\u5C11\u5305\u542B{0}\u4F4D\u6570\u5B57\u5B57\u6BCD.
+PasswordPolicy.INSUFFICIENT_SPECIAL=\u5BC6\u7801\u81F3\u5C11\u5305\u542B{0}\u4F4D\u7279\u6B8A\u5B57\u7B26.
+PasswordPolicy.INSUFFICIENT_CHARACTERISTICS=\u5BC6\u7801\u5339\u914D {0} of{2}\u5B57\u7B26\u89C4\u5219, \u4F46{1} \u5FC5\u987B.
+PasswordPolicy.INSUFFICIENT_COMPLEXITY=\u5BC6\u7801\u9047\u5230{1}\u590D\u6742\u89C4\u5219, \u4F46{2}\u5FC5\u987B.
+PasswordPolicy.INSUFFICIENT_COMPLEXITY_RULES=\u6CA1\u6709\u914D\u7F6E\u5BC6\u7801\u957F\u5EA6\u89C4\u5219 {0}.
+PasswordPolicy.SOURCE_VIOLATION=\u5BC6\u7801\u4E0D\u80FD\u5305\u542B{0}\u5BC6\u7801.
+PasswordPolicy.TOO_LONG=\u5BC6\u7801\u6700\u591A{1}\u4F4D\u5B57\u7B26.
+PasswordPolicy.TOO_SHORT=\u5BC6\u7801\u81F3\u5C11{0}\u4F4D\u5B57\u7B26.
+PasswordPolicy.TOO_MANY_OCCURRENCES=\u5BC6\u7801\u5305\u542B{0}\u51FA\u73B0{1}, \u6700\u591A{2} \u6B21.
+PasswordPolicy.OLD_PASSWORD_NOT_MATCH=\u539F\u5BC6\u7801\u4E0D\u5339\u914D.
+PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH=\u65B0\u5BC6\u7801\u4E0E\u786E\u8BA4\u5BC6\u7801\u4E0D\u4E00\u81F4.
+PasswordPolicy.OLD_PASSWORD_MATCH=\u65B0\u5BC6\u7801\u4E0D\u80FD\u4E0E\u65E7\u5BC6\u7801\u4E00\u81F4.
 
-#\u7528\u6237\u767b\u5f55\u9519\u8bef\u63d0\u9192
-login.error.attempts=\u767B\u5F55\u9519\u8BEF\u8fbe\u6700\u5927\u9650\u5236{0}\u6b21,\u8bf7{1}\u5C0F\u65F6\u540e\u91CD\u8BD5.
-login.error.locked=\u7528\u6237\u88ab\u9501\u5b9a.
-login.error.inactive=\u7528\u6237\u975e\u6d3b\u52a8\u72b6\u6001.
-login.error.password=\u7528\u6237\u540D\u6216\u5bc6\u7801\u65e0\u6548.
-login.error.password.attempts=\u767B\u5F55\u5931\u8D25{0}\u6B21, \u5931\u8D25{1}\u6B21\u5C06\u9501\u5B9A{2}\u5C0F\u65F6.
-login.error.username=\u7528\u6237\u540D\u6216\u5bc6\u7801\u65e0\u6548.
-login.error.username.null=\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a.
-login.error.email.null=\u767b\u5f55\u90ae\u7bb1\u4e0d\u80fd\u4e3a\u7a7a.
-login.error.password.null=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a.
-login.error.captcha=\u9a8c\u8bc1\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u767B\u5F55.
-login.error.authtype=\u767b\u5f55\u8ba4\u8bc1\u7c7b\u578b\u9519\u8bef.
-login.error.session=\u767b\u5f55\u4f1a\u8bdd\u5931\u6548\uff0c\u8bf7\u91cd\u65b0\u767b\u9646.
-login.error.social=\u793e\u4ea4\u8d26\u53f7\u6388\u6743\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5.
+#\u7528\u6237\u767B\u5F55\u9519\u8BEF\u63D0\u9192
+login.error.attempts=\u767B\u5F55\u9519\u8BEF\u8FBE\u6700\u5927\u9650\u5236{0}\u6B21,\u8BF7{1}\u5206\u949F\u540E\u91CD\u8BD5.
+login.error.locked=\u7528\u6237\u88AB\u9501\u5B9A.
+login.error.inactive=\u7528\u6237\u975E\u6D3B\u52A8\u72B6\u6001.
+login.error.password=\u7528\u6237\u540D\u6216\u5BC6\u7801\u65E0\u6548.
+login.error.password.attempts=\u767B\u5F55\u5931\u8D25{0}\u6B21, \u5931\u8D25{1}\u6B21\u5C06\u9501\u5B9A{2}\u5206\u949F.
+login.error.username=\u7528\u6237\u540D\u6216\u5BC6\u7801\u65E0\u6548.
+login.error.username.null=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A.
+login.error.email.null=\u767B\u5F55\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7A.
+login.error.password.null=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A.
+login.error.captcha=\u9A8C\u8BC1\u7801\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55.
+login.error.authtype=\u767B\u5F55\u8BA4\u8BC1\u7C7B\u578B\u9519\u8BEF.
+login.error.session=\u767B\u5F55\u4F1A\u8BDD\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u9646.
+login.error.social=\u793E\u4EA4\u8D26\u53F7\u6388\u6743\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5.

+ 2 - 2
maxkey-core/src/main/resources/messages/passwordpolicy_message_en.properties

@@ -33,11 +33,11 @@ PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH=new password not match confirm password
 PasswordPolicy.OLD_PASSWORD_MATCH=new password  match old password.
 
 #for user login
-login.error.attempts=login attempts the maximum {0} times, please login {1} hours later.
+login.error.attempts=login attempts the maximum {0} times, please login {1} minutes later.
 login.error.locked=The user is locked.
 login.error.inactive=User inactive state.
 login.error.password=Invalid username or password.
-login.error.password.attempts=login fail {0} times, fail {1} times will lock {2} hours.
+login.error.password.attempts=login fail {0} times, fail {1} times will lock {2} minutes.
 login.error.username=Invalid username or password.
 login.error.username.null=username cannot be empty.
 login.error.email.null=email cannot be empty.

+ 46 - 46
maxkey-core/src/main/resources/messages/passwordpolicy_message_zh_CN.properties

@@ -1,48 +1,48 @@
 #password
-PasswordPolicy.HISTORY_VIOLATION=\u5bc6\u7801\u5339\u914d\u4e86{0}\u5386\u53f2\u5bc6\u7801.
-PasswordPolicy.ILLEGAL_WORD=\u5bc6\u7801\u5305\u542b\u5728\u5bc6\u7801\u5b57\u5178{0}.
-PasswordPolicy.ILLEGAL_WORD_REVERSED=\u5bc6\u7801\u5305\u542b\u5728\u5bc6\u7801\u5b57\u5178\u5012\u5e8f{0}.
-PasswordPolicy.ILLEGAL_DIGEST_WORD=\u5bc6\u7801\u5305\u542b\u5728\u5b57\u5178\u4e2d.
-PasswordPolicy.ILLEGAL_DIGEST_WORD_REVERSED=\u5bc6\u7801\u5305\u542b\u5728\u5b57\u5178\u5012\u5e8f\u4e2d.
-PasswordPolicy.ILLEGAL_MATCH=\u5bc6\u7801\u5339\u914d\u975e\u6cd5\u89c4\u5219{0}.
-PasswordPolicy.ALLOWED_MATCH=\u5bc6\u7801\u5fc5\u987b\u5339\u914d\u89c4\u5219{0}.
-PasswordPolicy.ILLEGAL_CHAR=\u5bc6\u7801{1}\u5305\u542b\u975e\u6cd5\u5b57\u7b26{0}.
-PasswordPolicy.ALLOWED_CHAR=\u5bc6\u7801{1}\u975e\u6cd5\u5b57\u7b26{0}.
-PasswordPolicy.ILLEGAL_QWERTY_SEQUENCE=\u5bc6\u7801\u5305\u542b\u952e\u76d8\u5e8f\u5217{0}.
-PasswordPolicy.ILLEGAL_ALPHABETICAL_SEQUENCE=\u5bc6\u7801\u5305\u542b\u5b57\u7b26\u5e8f\u5217{0}.
-PasswordPolicy.ILLEGAL_NUMERICAL_SEQUENCE=\u5bc6\u7801\u5305\u542b\u6570\u5b57\u5e8f\u5217{0}.
-PasswordPolicy.ILLEGAL_USERNAME=\u5bc6\u7801\u4e0d\u80fd\u5305\u542b\u767b\u5f55\u540d{0}.
-PasswordPolicy.ILLEGAL_USERNAME_REVERSED=\u5bc6\u7801{1} \u5305\u542b\u767b\u5f55\u540d{0}\u5012\u5e8f.
-PasswordPolicy.ILLEGAL_WHITESPACE=\u5bc6\u7801{1}\u5305\u542b\u7a7a\u683c.
-PasswordPolicy.ILLEGAL_NUMBER_RANGE=\u5bc6\u7801{1}\u6570\u5b57 {0}.
-PasswordPolicy.ILLEGAL_REPEATED_CHARS=\u5bc6\u7801{2}\u5e8f\u5217{0}\u6216\u8005\u591a\u4e2a\u5b57\u7b26, \u4f46{1}\u5141\u8bb8:{3}\u6b21.
-PasswordPolicy.INSUFFICIENT_UPPERCASE=\u5bc6\u7801\u81f3\u5c11\u5305\u542b{0}\u4f4d\u5927\u5199\u5b57\u6bcd.
-PasswordPolicy.INSUFFICIENT_LOWERCASE=\u5bc6\u7801\u81f3\u5c11\u5305\u542b{0}\u4f4d\u5c0f\u5199\u5b57\u6bcd.
-PasswordPolicy.INSUFFICIENT_ALPHABETICAL=\u5bc6\u7801\u5305\u542b\u5b57\u7b26\u5e8f\u5217{0}.
-PasswordPolicy.INSUFFICIENT_DIGIT=\u5bc6\u7801\u81f3\u5c11\u5305\u542b{0}\u4f4d\u6570\u5b57\u5b57\u6bcd.
-PasswordPolicy.INSUFFICIENT_SPECIAL=\u5bc6\u7801\u81f3\u5c11\u5305\u542b{0}\u4f4d\u7279\u6b8a\u5b57\u7b26.
-PasswordPolicy.INSUFFICIENT_CHARACTERISTICS=\u5bc6\u7801\u5339\u914d {0} of{2}\u5b57\u7b26\u89c4\u5219, \u4f46{1} \u5fc5\u987b.
-PasswordPolicy.INSUFFICIENT_COMPLEXITY=\u5bc6\u7801\u9047\u5230{1}\u590d\u6742\u89c4\u5219, \u4f46{2}\u5fc5\u987b.
-PasswordPolicy.INSUFFICIENT_COMPLEXITY_RULES=\u6ca1\u6709\u914d\u7f6e\u5bc6\u7801\u957f\u5ea6\u89c4\u5219 {0}.
-PasswordPolicy.SOURCE_VIOLATION=\u5bc6\u7801\u4e0d\u80fd\u5305\u542b{0}\u5bc6\u7801.
-PasswordPolicy.TOO_LONG=\u5bc6\u7801\u6700\u591a{1}\u4f4d\u5b57\u7b26.
-PasswordPolicy.TOO_SHORT=\u5bc6\u7801\u81f3\u5c11{0}\u4f4d\u5b57\u7b26.
-PasswordPolicy.TOO_MANY_OCCURRENCES=\u5bc6\u7801\u5305\u542b{0}\u51fa\u73b0{1}, \u6700\u591a{2} \u6b21.
-PasswordPolicy.OLD_PASSWORD_NOT_MATCH=\u539f\u5bc6\u7801\u4e0d\u5339\u914d.
-PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH=\u65b0\u5bc6\u7801\u4e0e\u786e\u8ba4\u5bc6\u7801\u4e0d\u4e00\u81f4.
-PasswordPolicy.OLD_PASSWORD_MATCH=\u65b0\u5bc6\u7801\u4e0d\u80fd\u4e0e\u65e7\u5bc6\u7801\u4e00\u81f4.
+PasswordPolicy.HISTORY_VIOLATION=\u5BC6\u7801\u5339\u914D\u4E86{0}\u5386\u53F2\u5BC6\u7801.
+PasswordPolicy.ILLEGAL_WORD=\u5BC6\u7801\u5305\u542B\u5728\u5BC6\u7801\u5B57\u5178{0}.
+PasswordPolicy.ILLEGAL_WORD_REVERSED=\u5BC6\u7801\u5305\u542B\u5728\u5BC6\u7801\u5B57\u5178\u5012\u5E8F{0}.
+PasswordPolicy.ILLEGAL_DIGEST_WORD=\u5BC6\u7801\u5305\u542B\u5728\u5B57\u5178\u4E2D.
+PasswordPolicy.ILLEGAL_DIGEST_WORD_REVERSED=\u5BC6\u7801\u5305\u542B\u5728\u5B57\u5178\u5012\u5E8F\u4E2D.
+PasswordPolicy.ILLEGAL_MATCH=\u5BC6\u7801\u5339\u914D\u975E\u6CD5\u89C4\u5219{0}.
+PasswordPolicy.ALLOWED_MATCH=\u5BC6\u7801\u5FC5\u987B\u5339\u914D\u89C4\u5219{0}.
+PasswordPolicy.ILLEGAL_CHAR=\u5BC6\u7801{1}\u5305\u542B\u975E\u6CD5\u5B57\u7B26{0}.
+PasswordPolicy.ALLOWED_CHAR=\u5BC6\u7801{1}\u975E\u6CD5\u5B57\u7B26{0}.
+PasswordPolicy.ILLEGAL_QWERTY_SEQUENCE=\u5BC6\u7801\u5305\u542B\u952E\u76D8\u5E8F\u5217{0}.
+PasswordPolicy.ILLEGAL_ALPHABETICAL_SEQUENCE=\u5BC6\u7801\u5305\u542B\u5B57\u7B26\u5E8F\u5217{0}.
+PasswordPolicy.ILLEGAL_NUMERICAL_SEQUENCE=\u5BC6\u7801\u5305\u542B\u6570\u5B57\u5E8F\u5217{0}.
+PasswordPolicy.ILLEGAL_USERNAME=\u5BC6\u7801\u4E0D\u80FD\u5305\u542B\u767B\u5F55\u540D{0}.
+PasswordPolicy.ILLEGAL_USERNAME_REVERSED=\u5BC6\u7801{1} \u5305\u542B\u767B\u5F55\u540D{0}\u5012\u5E8F.
+PasswordPolicy.ILLEGAL_WHITESPACE=\u5BC6\u7801{1}\u5305\u542B\u7A7A\u683C.
+PasswordPolicy.ILLEGAL_NUMBER_RANGE=\u5BC6\u7801{1}\u6570\u5B57 {0}.
+PasswordPolicy.ILLEGAL_REPEATED_CHARS=\u5BC6\u7801{2}\u5E8F\u5217{0}\u6216\u8005\u591A\u4E2A\u5B57\u7B26, \u4F46{1}\u5141\u8BB8:{3}\u6B21.
+PasswordPolicy.INSUFFICIENT_UPPERCASE=\u5BC6\u7801\u81F3\u5C11\u5305\u542B{0}\u4F4D\u5927\u5199\u5B57\u6BCD.
+PasswordPolicy.INSUFFICIENT_LOWERCASE=\u5BC6\u7801\u81F3\u5C11\u5305\u542B{0}\u4F4D\u5C0F\u5199\u5B57\u6BCD.
+PasswordPolicy.INSUFFICIENT_ALPHABETICAL=\u5BC6\u7801\u5305\u542B\u5B57\u7B26\u5E8F\u5217{0}.
+PasswordPolicy.INSUFFICIENT_DIGIT=\u5BC6\u7801\u81F3\u5C11\u5305\u542B{0}\u4F4D\u6570\u5B57\u5B57\u6BCD.
+PasswordPolicy.INSUFFICIENT_SPECIAL=\u5BC6\u7801\u81F3\u5C11\u5305\u542B{0}\u4F4D\u7279\u6B8A\u5B57\u7B26.
+PasswordPolicy.INSUFFICIENT_CHARACTERISTICS=\u5BC6\u7801\u5339\u914D {0} of{2}\u5B57\u7B26\u89C4\u5219, \u4F46{1} \u5FC5\u987B.
+PasswordPolicy.INSUFFICIENT_COMPLEXITY=\u5BC6\u7801\u9047\u5230{1}\u590D\u6742\u89C4\u5219, \u4F46{2}\u5FC5\u987B.
+PasswordPolicy.INSUFFICIENT_COMPLEXITY_RULES=\u6CA1\u6709\u914D\u7F6E\u5BC6\u7801\u957F\u5EA6\u89C4\u5219 {0}.
+PasswordPolicy.SOURCE_VIOLATION=\u5BC6\u7801\u4E0D\u80FD\u5305\u542B{0}\u5BC6\u7801.
+PasswordPolicy.TOO_LONG=\u5BC6\u7801\u6700\u591A{1}\u4F4D\u5B57\u7B26.
+PasswordPolicy.TOO_SHORT=\u5BC6\u7801\u81F3\u5C11{0}\u4F4D\u5B57\u7B26.
+PasswordPolicy.TOO_MANY_OCCURRENCES=\u5BC6\u7801\u5305\u542B{0}\u51FA\u73B0{1}, \u6700\u591A{2} \u6B21.
+PasswordPolicy.OLD_PASSWORD_NOT_MATCH=\u539F\u5BC6\u7801\u4E0D\u5339\u914D.
+PasswordPolicy.CONFIRMPASSWORD_NOT_MATCH=\u65B0\u5BC6\u7801\u4E0E\u786E\u8BA4\u5BC6\u7801\u4E0D\u4E00\u81F4.
+PasswordPolicy.OLD_PASSWORD_MATCH=\u65B0\u5BC6\u7801\u4E0D\u80FD\u4E0E\u65E7\u5BC6\u7801\u4E00\u81F4.
 
-#\u7528\u6237\u767b\u5f55\u9519\u8bef\u63d0\u9192
-login.error.attempts=\u767B\u5F55\u9519\u8BEF\u8fbe\u6700\u5927\u9650\u5236{0}\u6b21,\u8bf7{1}\u5C0F\u65F6\u540e\u91CD\u8BD5.
-login.error.locked=\u7528\u6237\u88ab\u9501\u5b9a.
-login.error.inactive=\u7528\u6237\u975e\u6d3b\u52a8\u72b6\u6001.
-login.error.password=\u7528\u6237\u540D\u6216\u5bc6\u7801\u65e0\u6548.
-login.error.password.attempts=\u767B\u5F55\u5931\u8D25{0}\u6B21, \u5931\u8D25{1}\u6B21\u5C06\u9501\u5B9A{2}\u5C0F\u65F6.
-login.error.username=\u7528\u6237\u540D\u6216\u5bc6\u7801\u65e0\u6548.
-login.error.username.null=\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a.
-login.error.email.null=\u767b\u5f55\u90ae\u7bb1\u4e0d\u80fd\u4e3a\u7a7a.
-login.error.password.null=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a.
-login.error.captcha=\u9a8c\u8bc1\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u767B\u5F55.
-login.error.authtype=\u767b\u5f55\u8ba4\u8bc1\u7c7b\u578b\u9519\u8bef.
-login.error.session=\u767b\u5f55\u4f1a\u8bdd\u5931\u6548\uff0c\u8bf7\u91cd\u65b0\u767b\u9646.
-login.error.social=\u793e\u4ea4\u8d26\u53f7\u6388\u6743\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5.
+#\u7528\u6237\u767B\u5F55\u9519\u8BEF\u63D0\u9192
+login.error.attempts=\u767B\u5F55\u9519\u8BEF\u8FBE\u6700\u5927\u9650\u5236{0}\u6B21,\u8BF7{1}\u5206\u949F\u540E\u91CD\u8BD5.
+login.error.locked=\u7528\u6237\u88AB\u9501\u5B9A.
+login.error.inactive=\u7528\u6237\u975E\u6D3B\u52A8\u72B6\u6001.
+login.error.password=\u7528\u6237\u540D\u6216\u5BC6\u7801\u65E0\u6548.
+login.error.password.attempts=\u767B\u5F55\u5931\u8D25{0}\u6B21, \u5931\u8D25{1}\u6B21\u5C06\u9501\u5B9A{2}\u5206\u949F.
+login.error.username=\u7528\u6237\u540D\u6216\u5BC6\u7801\u65E0\u6548.
+login.error.username.null=\u7528\u6237\u540D\u4E0D\u80FD\u4E3A\u7A7A.
+login.error.email.null=\u767B\u5F55\u90AE\u7BB1\u4E0D\u80FD\u4E3A\u7A7A.
+login.error.password.null=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A.
+login.error.captcha=\u9A8C\u8BC1\u7801\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55.
+login.error.authtype=\u767B\u5F55\u8BA4\u8BC1\u7C7B\u578B\u9519\u8BEF.
+login.error.session=\u767B\u5F55\u4F1A\u8BDD\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u767B\u9646.
+login.error.social=\u793E\u4EA4\u8D26\u53F7\u6388\u6743\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5.

+ 1 - 0
maxkey-persistence/src/main/java/org/maxkey/persistence/service/AccountsService.java

@@ -143,6 +143,7 @@ public class AccountsService  extends JpaBaseService<Accounts>{
            account.setRelatedUsername(generateAccount(user,strategy));
            account.setRelatedPassword(PasswordReciprocal.getInstance().encode(userInfoService.randomPassword()));
            
+           account.setInstId(strategy.getInstId());
            account.setCreateType("automatic");
            account.setStatus(ConstsStatus.ACTIVE);
            account.setStrategyId(strategy.getId());

+ 11 - 3
maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/GroupPrivilegesMapper.xml

@@ -22,8 +22,10 @@
 		select
 			gp.id,
 			gp.groupid,
+			g.name groupname,
 			gp.appid,
 			apps.name,
+			apps.name appname,
             apps.icon,
             apps.loginurl,
             apps.protocol,
@@ -33,12 +35,18 @@
             apps.vendorurl
 		from
 			mxk_apps apps,
-			mxk_group_privileges    gp
+			mxk_group_privileges    gp,
+			mxk_groups  g
 		where
 		    apps.instid     =   #{instId} 
 		    and gp.instid   =   #{instId} 
-			and gp.appid    =    apps.id
-			and gp.groupid	=	#{groupId}
+		    and g.instid    =   #{instId} 
+			and gp.appid    =   apps.id
+			and gp.groupid  =   g.id
+			<if test="groupId != null and groupId != ''">
+                and gp.groupid    =   #{groupId}
+                and g.id          =   #{groupId}
+            </if>
 		<include refid="where_statement"/>
 	</select>
 	

+ 33 - 8
maxkey-persistence/src/main/resources/org/maxkey/persistence/mapper/xml/mysql/ReportMapper.xml

@@ -37,15 +37,40 @@
     
     <!-- DAY HOUR COUNT 当天每小时 -->
 	<select id="analysisDayHour" parameterType="java.util.HashMap" resultType="Map">
-    	select 
-    		count(id) reportcount, 
-			hour(logintime) reportstring 
-    	from mxk_history_login 
-    	where   instid   =   #{instId} 
-    		and date(logintime) =curdate()
-    	group by reportstring
-    	order by reportstring
+        select h.reportstring reportstring, ifnull(c.reportcount, 0) reportcount from (
+            select 0  reportstring union all 
+            select 1  reportstring union all 
+            select 2  reportstring union all 
+            select 3  reportstring union all 
+            select 4  reportstring union all 
+            select 5  reportstring union all 
+            select 6  reportstring union all 
+            select 7  reportstring union all 
+            select 8  reportstring union all 
+            select 9  reportstring union all 
+            select 10 reportstring union all 
+            select 11 reportstring union all 
+            select 12 reportstring union all 
+            select 13 reportstring union all 
+            select 14 reportstring union all 
+            select 15 reportstring union all 
+            select 16 reportstring union all 
+            select 17 reportstring union all 
+            select 18 reportstring union all 
+            select 19 reportstring union all 
+            select 20 reportstring union all 
+            select 21 reportstring union all 
+            select 22 reportstring union all 
+            select 23 reportstring
+        ) h left join(
+            select count(id) reportcount, hour(logintime) reportstring 
+            from mxk_history_login 
+            where instid = #{instId} and date(logintime) =curdate() 
+            group by reportstring
+        )c  on h.reportstring=c.reportstring
+    	order by h.reportstring
     </select>
+    
     <!-- 30 DAY COUNT 最近30天每天访问量-->   
     <select id="analysisMonth" parameterType="java.util.HashMap" resultType="Map">
     	select 

+ 25 - 41
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/group-members-editer/group-members-editer.component.html

@@ -6,47 +6,32 @@
         <nz-form-item>
           <nz-form-label nzFor="username">{{ 'mxk.users.username' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input
-              nz-input
-              [(ngModel)]="query.params.username"
-              [ngModelOptions]="{ standalone: true }"
-              name="username"
-              placeholder=""
-              id="username"
-            />
+            <input nz-input [(ngModel)]="query.params.username" [ngModelOptions]="{ standalone: true }" name="username"
+              placeholder="" id="username" />
           </nz-form-control>
         </nz-form-item>
       </div>
 
       <div nz-col [nzSpan]="query.expandForm ? 24 : 10" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
         <button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.confirm' | i18n }}</button>
       </div>
     </div>
   </form>
 
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
-        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+          (nzCheckedChange)="onTableAllChecked($event)"></th>
         <th nzAlign="center" style="display: none">Id</th>
         <th nzAlign="center">{{ 'mxk.users.username' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.users.displayName' | i18n }}</th>
@@ -58,18 +43,17 @@
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
-        <td nzAlign="center"> {{ data.username }}</td>
-        <td nzAlign="center"> {{ data.displayName }}</td>
-        <td nzAlign="center"> {{ data.employeeNumber }}</td>
-        <td nzAlign="center"> {{ data.department }}</td>
-        <td nzAlign="center"> {{ data.jobTitle }}</td>
-        <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' | i18n) }}</td>
-        <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill" style="color: green"></i></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
+        <td nzAlign="left"> {{ data.username }}</td>
+        <td nzAlign="left"> {{ data.displayName }}</td>
+        <td nzAlign="left"> {{ data.employeeNumber }}</td>
+        <td nzAlign="left"> {{ data.department }}</td>
+        <td nzAlign="left"> {{ data.jobTitle }}</td>
+        <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' |
+          i18n) }}</td>
+        <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill"
+            style="color: green"></i></td>
       </tr>
     </tbody>
   </nz-table>
@@ -77,4 +61,4 @@
 <div *nzModalFooter style="display: none">
   <button nz-button nzType="default" (click)="onClose($event)">{{ 'mxk.text.close' | i18n }}</button>
   <button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.submit' | i18n }}</button>
-</div>
+</div>

+ 37 - 68
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/group-members/group-members.component.html

@@ -8,18 +8,12 @@
           <nz-form-label nzFor="name">{{ 'mxk.groups.name' | i18n }}</nz-form-label>
           <nz-form-control>
             <nz-input-group nzSearch [nzAddOnAfter]="suffixButton">
-              <input
-                nz-input
-                [(ngModel)]="query.params.name"
-                [ngModelOptions]="{ standalone: true }"
-                name="name"
-                readonly
-                placeholder=""
-                id="name"
-              />
+              <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+                readonly placeholder="" id="name" />
             </nz-input-group>
             <ng-template #suffixButton>
-              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n }}</button>
+              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n
+                }}</button>
             </ng-template>
           </nz-form-control>
         </nz-form-item>
@@ -28,23 +22,18 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.users.username' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input
-              nz-input
-              [(ngModel)]="query.params.username"
-              [ngModelOptions]="{ standalone: true }"
-              name="username"
-              placeholder=""
-              id="username"
-            />
+            <input nz-input [(ngModel)]="query.params.username" [ngModelOptions]="{ standalone: true }" name="username"
+              placeholder="" id="username" />
           </nz-form-control>
         </nz-form-item>
       </div>
       <div nz-col [nzSpan]="query.expandForm ? 24 : 4" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -55,69 +44,49 @@
       <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
       <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
         'mxk.text.delete' | i18n
-      }}</button>
+        }}</button>
     </div>
 
     <div nz-col nzMd="24" nzSm="24">
-      <nz-table
-        #dynamicTable
-        nzTableLayout="auto"
-        nzBordered
-        nzShowSizeChanger
-        [nzData]="query.results.rows"
-        [nzFrontPagination]="false"
-        [nzTotal]="query.results.records"
-        [nzPageSizeOptions]="query.params.pageSizeOptions"
-        [nzPageSize]="query.params.pageSize"
-        [nzPageIndex]="query.params.pageNumber"
-        [nzLoading]="this.query.tableLoading"
-        (nzQueryParams)="onQueryParamsChange($event)"
-      >
+      <nz-table #dynamicTable nzTableLayout="auto" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+        [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+        [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber"
+        [nzLoading]="this.query.tableLoading" (nzQueryParams)="onQueryParamsChange($event)">
         <thead>
           <tr>
-            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+              (nzCheckedChange)="onTableAllChecked($event)"></th>
             <th nzAlign="center">{{ 'mxk.groups.name' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.username' | i18n }}</th>
-            <th nzAlign="center">{{ 'mxk.users.displayName' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.employeeNumber' | i18n }}</th>
+            <th nzAlign="center">{{ 'mxk.users.displayName' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.department' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.jobTitle' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.gender' | i18n }}</th>
-            <th nzAlign="center"
-              ><a>{{ 'mxk.text.action' | i18n }}</a></th
-            >
+            <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
           </tr>
         </thead>
         <tbody>
           <tr *ngFor="let data of query.results.rows">
-            <td
-              [nzChecked]="query.tableCheckedId.has(data.id)"
-              [nzDisabled]="data.disabled"
-              (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-            ></td>
-            <td nzAlign="center"> {{ data.groupName }}</td>
-            <td nzAlign="center"> {{ data.username }}</td>
-            <td nzAlign="center"> {{ data.displayName }}</td>
-            <td nzAlign="center"> {{ data.employeeNumber }}</td>
-            <td nzAlign="center"> {{ data.department }}</td>
-            <td nzAlign="center"> {{ data.jobTitle }}</td>
-            <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' | i18n) }}</td>
-            <td nzAlign="left" nzBreakWord="false"
-              ><div nz-col>
-                <button
-                  *ngIf="data.dynamic == '0'"
-                  nz-button
-                  type="button"
-                  (click)="onDelete($event, data.id)"
-                  [nzType]="'primary'"
-                  nzDanger
-                  >{{ 'mxk.text.delete' | i18n }}</button
-                ></div
-              ></td
-            >
+            <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+              (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
+            <td nzAlign="left"> {{ data.groupName }}</td>
+            <td nzAlign="left"> {{ data.username }}</td>
+            <td nzAlign="left"> {{ data.employeeNumber }}</td>
+            <td nzAlign="left"> {{ data.displayName }}</td>
+            <td nzAlign="left"> {{ data.department }}</td>
+            <td nzAlign="left"> {{ data.jobTitle }}</td>
+            <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' |
+              i18n) }}</td>
+            <td nzAlign="left" nzBreakWord="false">
+              <div nz-col>
+                <button *ngIf="data.dynamic == '0'" nz-button type="button" (click)="onDelete($event, data.id)"
+                  [nzType]="'primary'" nzDanger>{{ 'mxk.text.delete' | i18n }}</button>
+              </div>
+            </td>
           </tr>
         </tbody>
       </nz-table>
     </div>
   </div>
-</nz-card>
+</nz-card>

+ 28 - 41
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/groups/groups.component.html

@@ -7,17 +7,19 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.groups.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
 
       <div nz-col [nzSpan]="query.expandForm ? 24 : 8" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -27,61 +29,46 @@
     <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
     <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
       'mxk.text.delete' | i18n
-    }}</button>
+      }}</button>
   </div>
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzSize="small"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    [nzScroll]="{ x: '100%', y: '100%' }"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
-        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+          (nzCheckedChange)="onTableAllChecked($event)"></th>
         <th nzAlign="center" style="display: none">Id</th>
         <th nzAlign="center">{{ 'mxk.groups.name' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.groups.dynamic' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.text.description' | i18n }}</th>
-        <th nzAlign="center"
-          ><a>{{ 'mxk.text.action' | i18n }}</a></th
-        >
+        <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
       </tr>
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
         <td nzAlign="left" style="display: none">
           <span>{{ data.id }}</span>
         </td>
         <td nzAlign="left" nzBreakWord="false">{{ data.name }}</td>
-        <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill" style="color: green"></i></td>
+        <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill"
+            style="color: green"></i></td>
         <td nzAlign="left">{{ data.description }}</td>
-        <td nzAlign="left" nzBreakWord="false"
-          ><div nz-col>
-            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'" style="float: left">{{
+        <td nzAlign="left" nzBreakWord="false">
+          <div nz-col>
+            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'"
+              style="float: left">{{
               'mxk.text.edit' | i18n
-            }}</button>
+              }}</button>
             <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
               'mxk.text.delete' | i18n
-            }}</button></div
-          ></td
-        >
+              }}</button>
+          </div>
+        </td>
       </tr>
     </tbody>
   </nz-table>
-</nz-card>
+</nz-card>

+ 17 - 28
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/groups/select-groups/select-groups.component.html

@@ -6,37 +6,28 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.groups.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
 
       <div nz-col [nzSpan]="query.expandForm ? 24 : 10" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
         <button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.confirm' | i18n }}</button>
       </div>
     </div>
   </form>
 
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
         <th></th>
@@ -47,16 +38,14 @@
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
         <td nzAlign="left" style="display: none">
           <span>{{ data.id }}</span>
         </td>
-        <td nzAlign="center"> {{ data.name }}</td>
-        <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill" style="color: green"></i></td>
+        <td nzAlign="left"> {{ data.name }}</td>
+        <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill"
+            style="color: green"></i></td>
       </tr>
     </tbody>
   </nz-table>
@@ -64,4 +53,4 @@
 <div *nzModalFooter style="display: none">
   <button nz-button nzType="default" (click)="onClose($event)">{{ 'mxk.text.close' | i18n }}</button>
   <button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.submit' | i18n }}</button>
-</div>
+</div>

+ 61 - 48
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/access/privileges/privileges.component.html

@@ -8,18 +8,12 @@
           <nz-form-label nzFor="groupName">{{ 'mxk.groups.name' | i18n }}</nz-form-label>
           <nz-form-control>
             <nz-input-group nzSearch [nzAddOnAfter]="suffixButton">
-              <input
-                nz-input
-                [(ngModel)]="query.params.groupName"
-                [ngModelOptions]="{ standalone: true }"
-                name="groupName"
-                readonly
-                placeholder=""
-                id="groupName"
-              />
+              <input nz-input [(ngModel)]="query.params.groupName" [ngModelOptions]="{ standalone: true }"
+                name="groupName" readonly placeholder="" id="groupName" />
             </nz-input-group>
             <ng-template #suffixButton>
-              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n }}</button>
+              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n
+                }}</button>
             </ng-template>
           </nz-form-control>
         </nz-form-item>
@@ -28,16 +22,18 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.apps.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
       <div nz-col [nzSpan]="query.expandForm ? 24 : 4" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -48,58 +44,75 @@
       <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
       <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
         'mxk.text.delete' | i18n
-      }}</button>
+        }}</button>
     </div>
 
     <div nz-col nzMd="24" nzSm="24">
-      <nz-table
-        #dynamicTable
-        nzTableLayout="auto"
-        nzBordered
-        nzShowSizeChanger
-        [nzData]="query.results.rows"
-        [nzFrontPagination]="false"
-        [nzTotal]="query.results.records"
-        [nzPageSizeOptions]="query.params.pageSizeOptions"
-        [nzPageSize]="query.params.pageSize"
-        [nzPageIndex]="query.params.pageNumber"
-        [nzLoading]="this.query.tableLoading"
-        (nzQueryParams)="onQueryParamsChange($event)"
-      >
+      <nz-table #dynamicTable nzTableLayout="auto" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+        [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+        [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber"
+        [nzLoading]="this.query.tableLoading" (nzQueryParams)="onQueryParamsChange($event)">
         <thead>
           <tr>
-            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+              (nzCheckedChange)="onTableAllChecked($event)"></th>
             <th nzAlign="center" style="display: none">Id</th>
+            <th nzAlign="center">{{ 'mxk.groups.name' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.apps.icon' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.apps.name' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.apps.protocol' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.apps.category' | i18n }}</th>
-            <th nzAlign="center"
-              ><a>{{ 'mxk.text.action' | i18n }}</a></th
-            >
+            <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
           </tr>
         </thead>
         <tbody>
           <tr *ngFor="let data of query.results.rows">
-            <td
-              [nzChecked]="query.tableCheckedId.has(data.id)"
-              [nzDisabled]="data.disabled"
-              (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-            ></td>
+            <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+              (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
+            <td nzAlign="left"> {{ data.groupName }}</td>
             <td nzAlign="center"><img height="30" border="0px" src="{{ data.iconBase64 }}" /></td>
-            <td nzAlign="center"> {{ data.name }}</td>
-            <td nzAlign="center"> {{ data.protocol }}</td>
-            <td nzAlign="left">{{ data.category }}</td>
-            <td nzAlign="left" nzBreakWord="false"
-              ><div nz-col>
+            <td nzAlign="left"> {{ data.name }}</td>
+            <td nzAlign="left"> {{ data.protocol }}</td>
+            <td nzAlign="left">
+              <div *ngIf="data.category == 'none'">{{ 'mxk.apps.category.none' | i18n }}</div>
+              <div *ngIf="data.category == '1011'">{{ 'mxk.apps.category.1011' | i18n }}</div>
+              <div *ngIf="data.category == '1012'">{{ 'mxk.apps.category.1012' | i18n }}</div>
+              <div *ngIf="data.category == '1013'">{{ 'mxk.apps.category.1013' | i18n }}</div>
+              <div *ngIf="data.category == '1014'">{{ 'mxk.apps.category.1014' | i18n }}</div>
+              <div *ngIf="data.category == '1015'">{{ 'mxk.apps.category.1015' | i18n }}</div>
+              <div *ngIf="data.category == '1016'">{{ 'mxk.apps.category.1016' | i18n }}</div>
+              <div *ngIf="data.category == '1017'">{{ 'mxk.apps.category.1017' | i18n }}</div>
+              <div *ngIf="data.category == '1111'">{{ 'mxk.apps.category.1111' | i18n }}</div>
+              <div *ngIf="data.category == '1112'">{{ 'mxk.apps.category.1112' | i18n }}</div>
+              <div *ngIf="data.category == '1113'">{{ 'mxk.apps.category.1113' | i18n }}</div>
+              <div *ngIf="data.category == '1114'">{{ 'mxk.apps.category.1114' | i18n }}</div>
+              <div *ngIf="data.category == '1211'">{{ 'mxk.apps.category.1211' | i18n }}</div>
+              <div *ngIf="data.category == '1212'">{{ 'mxk.apps.category.1212' | i18n }}</div>
+              <div *ngIf="data.category == '1213'">{{ 'mxk.apps.category.1213' | i18n }}</div>
+              <div *ngIf="data.category == '1214'">{{ 'mxk.apps.category.1214' | i18n }}</div>
+              <div *ngIf="data.category == '1215'">{{ 'mxk.apps.category.1215' | i18n }}</div>
+              <div *ngIf="data.category == '1311'">{{ 'mxk.apps.category.1311' | i18n }}</div>
+              <div *ngIf="data.category == '1411'">{{ 'mxk.apps.category.1411' | i18n }}</div>
+              <div *ngIf="data.category == '1511'">{{ 'mxk.apps.category.1511' | i18n }}</div>
+              <div *ngIf="data.category == '1512'">{{ 'mxk.apps.category.1512' | i18n }}</div>
+              <div *ngIf="data.category == '1611'">{{ 'mxk.apps.category.1611' | i18n }}</div>
+              <div *ngIf="data.category == '1711'">{{ 'mxk.apps.category.1711' | i18n }}</div>
+              <div *ngIf="data.category == '1712'">{{ 'mxk.apps.category.1712' | i18n }}</div>
+              <div *ngIf="data.category == '1811'">{{ 'mxk.apps.category.1811' | i18n }}</div>
+              <div *ngIf="data.category == '1812'">{{ 'mxk.apps.category.1812' | i18n }}</div>
+              <div *ngIf="data.category == '1911'">{{ 'mxk.apps.category.1911' | i18n }}</div>
+              <div *ngIf="data.category == '1912'">{{ 'mxk.apps.category.1912' | i18n }}</div>
+            </td>
+            <td nzAlign="left" nzBreakWord="false">
+              <div nz-col>
                 <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
                   'mxk.text.delete' | i18n
-                }}</button></div
-              ></td
-            >
+                  }}</button>
+              </div>
+            </td>
           </tr>
         </tbody>
       </nz-table>
     </div>
   </div>
-</nz-card>
+</nz-card>

+ 37 - 54
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/accounts.component.html

@@ -5,39 +5,35 @@
     <div nz-row [nzGutter]="{ xs: 8, sm: 8, md: 8, lg: 24, xl: 48, xxl: 48 }">
       <div nz-col nzMd="8" nzSm="24">
         <nz-form-item>
-          <nz-form-label nzFor="name">{{ 'mxk.accounts.username' | i18n }}</nz-form-label>
+          <nz-form-label nzFor="appName">{{ 'mxk.accounts.appName' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <nz-input-group nzSearch [nzAddOnAfter]="suffixButton">
+              <input nz-input [(ngModel)]="query.params.appName" [ngModelOptions]="{ standalone: true }" name="appName"
+                readonly placeholder="" id="appName" />
+            </nz-input-group>
+            <ng-template #suffixButton>
+              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n
+                }}</button>
+            </ng-template>
           </nz-form-control>
         </nz-form-item>
       </div>
       <div nz-col nzMd="8" nzSm="24">
         <nz-form-item>
-          <nz-form-label nzFor="appName">{{ 'mxk.accounts.appName' | i18n }}</nz-form-label>
+          <nz-form-label nzFor="name">{{ 'mxk.accounts.username' | i18n }}</nz-form-label>
           <nz-form-control>
-            <nz-input-group nzSearch [nzAddOnAfter]="suffixButton">
-              <input
-                nz-input
-                [(ngModel)]="query.params.appName"
-                [ngModelOptions]="{ standalone: true }"
-                name="appName"
-                readonly
-                placeholder=""
-                id="appName"
-              />
-            </nz-input-group>
-            <ng-template #suffixButton>
-              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n }}</button>
-            </ng-template>
+            <input nz-input [(ngModel)]="query.params.username" [ngModelOptions]="{ standalone: true }" name="username"
+              placeholder="" id="username" />
           </nz-form-control>
         </nz-form-item>
       </div>
+
       <div nz-col [nzSpan]="query.expandForm ? 24 : 8" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
         <button nz-button type="reset" (click)="onReset()" class="mx-sm">{{ 'mxk.text.reset' | i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -47,44 +43,29 @@
     <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
     <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
       'mxk.text.delete' | i18n
-    }}</button>
+      }}</button>
   </div>
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzSize="small"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)">
     <thead>
       <tr>
-        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+          (nzCheckedChange)="onTableAllChecked($event)"></th>
         <th nzAlign="center" style="display: none">Id</th>
         <th nzAlign="center">{{ 'mxk.accounts.username' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.accounts.displayName' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.accounts.appName' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.accounts.relatedUsername' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.text.status' | i18n }}</th>
-        <th nzAlign="center"
-          ><a>{{ 'mxk.text.action' | i18n }}</a></th
-        >
+        <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
       </tr>
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
         <td nzAlign="left" style="display: none">
           <span>{{ data.id }}</span>
         </td>
@@ -92,18 +73,20 @@
         <td nzAlign="left" nzBreakWord="false">{{ data.displayName }}</td>
         <td nzAlign="left" nzBreakWord="false">{{ data.appName }}</td>
         <td nzAlign="left" nzBreakWord="false">{{ data.relatedUsername }}</td>
-        <td nzAlign="center"> <i *ngIf="data.status == 1" nz-icon nzType="check-circle" nzTheme="fill" style="color: green"></i></td>
-        <td nzAlign="left" nzBreakWord="false"
-          ><div nz-col>
-            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'" style="float: left">{{
+        <td nzAlign="center"> <i *ngIf="data.status == 1" nz-icon nzType="check-circle" nzTheme="fill"
+            style="color: green"></i></td>
+        <td nzAlign="left" nzBreakWord="false">
+          <div nz-col>
+            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'"
+              style="float: left">{{
               'mxk.text.edit' | i18n
-            }}</button>
+              }}</button>
             <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
               'mxk.text.delete' | i18n
-            }}</button></div
-          ></td
-        >
+              }}</button>
+          </div>
+        </td>
       </tr>
     </tbody>
   </nz-table>
-</nz-card>
+</nz-card>

+ 2 - 2
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/accounts/accounts.component.ts

@@ -36,7 +36,7 @@ import { AccountEditerComponent } from './account-editer/account-editer.componen
 export class AccountsComponent implements OnInit {
   query: {
     params: {
-      name: String;
+      username: String;
       displayName: String;
       employeeNumber: String;
       appName: String;
@@ -60,7 +60,7 @@ export class AccountsComponent implements OnInit {
     checked: boolean;
   } = {
       params: {
-        name: '',
+        username: '',
         displayName: '',
         employeeNumber: '',
         appName: '',

+ 63 - 43
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/apps.component.html

@@ -7,7 +7,8 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.apps.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
@@ -16,6 +17,7 @@
           <nz-form-label nzFor="protocol">{{ 'mxk.apps.protocol' | i18n }}</nz-form-label>
           <nz-form-control>
             <nz-select [(ngModel)]="query.params.protocol" [ngModelOptions]="{ standalone: true }">
+              <nz-option nzValue="" nzLabel="ALL"></nz-option>
               <nz-option nzValue="OAuth_v2.0" nzLabel="OAuth v2.0"></nz-option>
               <nz-option nzValue="OAuth_v2.1" nzLabel="OAuth v2.1"></nz-option>
               <nz-option nzValue="OpenID_Connect_v1.0" nzLabel="OpenID Connect v1.0"></nz-option>
@@ -32,12 +34,13 @@
       </div>
       <div nz-col [nzSpan]="query.expandForm ? 24 : 4" [class.text-right]="query.expandForm">
         <nz-form-item>
-          <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-          <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+          <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+            i18n }}</button>
+          <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+            i18n }}</button>
           <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-            {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-          ></nz-form-item
-        >
+            {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
+        </nz-form-item>
       </div>
     </div>
   </form>
@@ -63,63 +66,80 @@
 
     <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
       'mxk.text.delete' | i18n
-    }}</button>
+      }}</button>
   </div>
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzSize="small"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
-        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+          (nzCheckedChange)="onTableAllChecked($event)"></th>
         <th nzAlign="center" style="display: none">Id</th>
         <th nzAlign="center">{{ 'mxk.apps.icon' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.apps.name' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.apps.protocol' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.apps.category' | i18n }}</th>
-        <th nzAlign="center"
-          ><a>{{ 'mxk.text.action' | i18n }}</a></th
-        >
+        <th nzAlign="center">{{ 'mxk.text.status' | i18n }}</th>
+        <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
       </tr>
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
         <td nzAlign="left" style="display: none">
           <span>{{ data.id }}</span>
         </td>
 
         <td nzAlign="center"><img height="30" border="0px" src="{{ data.iconBase64 }}" /></td>
-        <td nzAlign="center"> {{ data.name }}</td>
-        <td nzAlign="center"> {{ data.protocol }}</td>
-        <td nzAlign="left">{{ data.category }}</td>
-        <td nzAlign="left" nzBreakWord="false"
-          ><div nz-col>
-            <button nz-button type="button" (click)="onEdit($event, data.id, data.protocol)" [nzType]="'primary'" style="float: left">{{
+        <td nzAlign="left"> {{ data.name }}</td>
+        <td nzAlign="left"> {{ data.protocol }}</td>
+        <td nzAlign="left">
+          <div *ngIf="data.category == 'none'">{{ 'mxk.apps.category.none' | i18n }}</div>
+          <div *ngIf="data.category == '1011'">{{ 'mxk.apps.category.1011' | i18n }}</div>
+          <div *ngIf="data.category == '1012'">{{ 'mxk.apps.category.1012' | i18n }}</div>
+          <div *ngIf="data.category == '1013'">{{ 'mxk.apps.category.1013' | i18n }}</div>
+          <div *ngIf="data.category == '1014'">{{ 'mxk.apps.category.1014' | i18n }}</div>
+          <div *ngIf="data.category == '1015'">{{ 'mxk.apps.category.1015' | i18n }}</div>
+          <div *ngIf="data.category == '1016'">{{ 'mxk.apps.category.1016' | i18n }}</div>
+          <div *ngIf="data.category == '1017'">{{ 'mxk.apps.category.1017' | i18n }}</div>
+          <div *ngIf="data.category == '1111'">{{ 'mxk.apps.category.1111' | i18n }}</div>
+          <div *ngIf="data.category == '1112'">{{ 'mxk.apps.category.1112' | i18n }}</div>
+          <div *ngIf="data.category == '1113'">{{ 'mxk.apps.category.1113' | i18n }}</div>
+          <div *ngIf="data.category == '1114'">{{ 'mxk.apps.category.1114' | i18n }}</div>
+          <div *ngIf="data.category == '1211'">{{ 'mxk.apps.category.1211' | i18n }}</div>
+          <div *ngIf="data.category == '1212'">{{ 'mxk.apps.category.1212' | i18n }}</div>
+          <div *ngIf="data.category == '1213'">{{ 'mxk.apps.category.1213' | i18n }}</div>
+          <div *ngIf="data.category == '1214'">{{ 'mxk.apps.category.1214' | i18n }}</div>
+          <div *ngIf="data.category == '1215'">{{ 'mxk.apps.category.1215' | i18n }}</div>
+          <div *ngIf="data.category == '1311'">{{ 'mxk.apps.category.1311' | i18n }}</div>
+          <div *ngIf="data.category == '1411'">{{ 'mxk.apps.category.1411' | i18n }}</div>
+          <div *ngIf="data.category == '1511'">{{ 'mxk.apps.category.1511' | i18n }}</div>
+          <div *ngIf="data.category == '1512'">{{ 'mxk.apps.category.1512' | i18n }}</div>
+          <div *ngIf="data.category == '1611'">{{ 'mxk.apps.category.1611' | i18n }}</div>
+          <div *ngIf="data.category == '1711'">{{ 'mxk.apps.category.1711' | i18n }}</div>
+          <div *ngIf="data.category == '1712'">{{ 'mxk.apps.category.1712' | i18n }}</div>
+          <div *ngIf="data.category == '1811'">{{ 'mxk.apps.category.1811' | i18n }}</div>
+          <div *ngIf="data.category == '1812'">{{ 'mxk.apps.category.1812' | i18n }}</div>
+          <div *ngIf="data.category == '1911'">{{ 'mxk.apps.category.1911' | i18n }}</div>
+          <div *ngIf="data.category == '1912'">{{ 'mxk.apps.category.1912' | i18n }}</div>
+        </td>
+        <td nzAlign="center"> <i *ngIf="data.status == 1" nz-icon nzType="check-circle" nzTheme="fill"
+            style="color: green"></i></td>
+        <td nzAlign="left" nzBreakWord="false">
+          <div nz-col>
+            <button nz-button type="button" (click)="onEdit($event, data.id, data.protocol)" [nzType]="'primary'"
+              style="float: left">{{
               'mxk.text.edit' | i18n
-            }}</button>
+              }}</button>
             <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
               'mxk.text.delete' | i18n
-            }}</button></div
-          ></td
-        >
+              }}</button>
+          </div>
+        </td>
       </tr>
     </tbody>
   </nz-table>
-</nz-card>
+</nz-card>

+ 47 - 30
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/apps/select-apps/select-apps.component.html

@@ -6,37 +6,28 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.apps.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
 
       <div nz-col [nzSpan]="query.expandForm ? 24 : 10" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
         <button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.confirm' | i18n }}</button>
       </div>
     </div>
   </form>
 
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
         <th></th>
@@ -49,19 +40,45 @@
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
         <td nzAlign="left" style="display: none">
           <span>{{ data.id }}</span>
         </td>
 
-        <td nzAlign="center"><img height="30" border="0px" src="{{ data.iconBase64 }}" /></td>
-        <td nzAlign="center"> {{ data.name }}</td>
-        <td nzAlign="center"> {{ data.protocol }}</td>
-        <td nzAlign="left">{{ data.category }}</td>
+        <td nzAlign="left"><img height="30" border="0px" src="{{ data.iconBase64 }}" /></td>
+        <td nzAlign="left"> {{ data.name }}</td>
+        <td nzAlign="left"> {{ data.protocol }}</td>
+        <td nzAlign="left">
+          <div *ngIf="data.category == 'none'">{{ 'mxk.apps.category.none' | i18n }}</div>
+          <div *ngIf="data.category == '1011'">{{ 'mxk.apps.category.1011' | i18n }}</div>
+          <div *ngIf="data.category == '1012'">{{ 'mxk.apps.category.1012' | i18n }}</div>
+          <div *ngIf="data.category == '1013'">{{ 'mxk.apps.category.1013' | i18n }}</div>
+          <div *ngIf="data.category == '1014'">{{ 'mxk.apps.category.1014' | i18n }}</div>
+          <div *ngIf="data.category == '1015'">{{ 'mxk.apps.category.1015' | i18n }}</div>
+          <div *ngIf="data.category == '1016'">{{ 'mxk.apps.category.1016' | i18n }}</div>
+          <div *ngIf="data.category == '1017'">{{ 'mxk.apps.category.1017' | i18n }}</div>
+          <div *ngIf="data.category == '1111'">{{ 'mxk.apps.category.1111' | i18n }}</div>
+          <div *ngIf="data.category == '1112'">{{ 'mxk.apps.category.1112' | i18n }}</div>
+          <div *ngIf="data.category == '1113'">{{ 'mxk.apps.category.1113' | i18n }}</div>
+          <div *ngIf="data.category == '1114'">{{ 'mxk.apps.category.1114' | i18n }}</div>
+          <div *ngIf="data.category == '1211'">{{ 'mxk.apps.category.1211' | i18n }}</div>
+          <div *ngIf="data.category == '1212'">{{ 'mxk.apps.category.1212' | i18n }}</div>
+          <div *ngIf="data.category == '1213'">{{ 'mxk.apps.category.1213' | i18n }}</div>
+          <div *ngIf="data.category == '1214'">{{ 'mxk.apps.category.1214' | i18n }}</div>
+          <div *ngIf="data.category == '1215'">{{ 'mxk.apps.category.1215' | i18n }}</div>
+          <div *ngIf="data.category == '1311'">{{ 'mxk.apps.category.1311' | i18n }}</div>
+          <div *ngIf="data.category == '1411'">{{ 'mxk.apps.category.1411' | i18n }}</div>
+          <div *ngIf="data.category == '1511'">{{ 'mxk.apps.category.1511' | i18n }}</div>
+          <div *ngIf="data.category == '1512'">{{ 'mxk.apps.category.1512' | i18n }}</div>
+          <div *ngIf="data.category == '1611'">{{ 'mxk.apps.category.1611' | i18n }}</div>
+          <div *ngIf="data.category == '1711'">{{ 'mxk.apps.category.1711' | i18n }}</div>
+          <div *ngIf="data.category == '1712'">{{ 'mxk.apps.category.1712' | i18n }}</div>
+          <div *ngIf="data.category == '1811'">{{ 'mxk.apps.category.1811' | i18n }}</div>
+          <div *ngIf="data.category == '1812'">{{ 'mxk.apps.category.1812' | i18n }}</div>
+          <div *ngIf="data.category == '1911'">{{ 'mxk.apps.category.1911' | i18n }}</div>
+          <div *ngIf="data.category == '1912'">{{ 'mxk.apps.category.1912' | i18n }}</div>
+        </td>
       </tr>
     </tbody>
   </nz-table>
@@ -69,4 +86,4 @@
 <div *nzModalFooter style="display: none">
   <button nz-button nzType="default" (click)="onClose($event)">{{ 'mxk.text.close' | i18n }}</button>
   <button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.submit' | i18n }}</button>
-</div>
+</div>

+ 32 - 43
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/accounts-strategy/accounts-strategy.component.html

@@ -7,17 +7,19 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.accountsstrategy.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
 
       <div nz-col [nzSpan]="query.expandForm ? 24 : 8" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -27,64 +29,51 @@
     <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
     <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
       'mxk.text.delete' | i18n
-    }}</button>
+      }}</button>
   </div>
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzSize="small"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
-        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+          (nzCheckedChange)="onTableAllChecked($event)"></th>
         <th nzAlign="center" style="display: none">Id</th>
         <th nzAlign="center">{{ 'mxk.accountsstrategy.name' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.accountsstrategy.appIcon' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.accountsstrategy.appName' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.accountsstrategy.createType' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.text.status' | i18n }}</th>
-        <th nzAlign="center"
-          ><a>{{ 'mxk.text.action' | i18n }}</a></th
-        >
+        <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
       </tr>
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
         <td nzAlign="left" style="display: none">
           <span>{{ data.id }}</span>
         </td>
-        <td nzAlign="center"> {{ data.name }}</td>
+        <td nzAlign="left"> {{ data.name }}</td>
         <td nzAlign="center"><img height="30" border="0px" src="{{ data.appIconBase64 }}" /></td>
-        <td nzAlign="center"> {{ data.appName }}</td>
-        <td nzAlign="left">{{ data.createType == 'manual' ? ('mxk.text.manual' | i18n) : ('mxk.text.manual' | i18n) }}</td>
-        <td nzAlign="left">{{ data.status == '1' ? ('mxk.text.status.active' | i18n) : ('mxk.text.inactive' | i18n) }}</td>
-        <td nzAlign="left" nzBreakWord="false"
-          ><div nz-col>
-            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'" style="float: left">{{
+        <td nzAlign="left"> {{ data.appName }}</td>
+        <td nzAlign="center">{{ data.createType == 'manual' ? ('mxk.text.manual' | i18n) : ('mxk.text.manual' | i18n) }}
+        </td>
+        <td nzAlign="center"> <i *ngIf="data.status == 1" nz-icon nzType="check-circle" nzTheme="fill"
+            style="color: green"></i></td>
+        <td nzAlign="left" nzBreakWord="false">
+          <div nz-col>
+            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'"
+              style="float: left">{{
               'mxk.text.edit' | i18n
-            }}</button>
+              }}</button>
             <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
               'mxk.text.delete' | i18n
-            }}</button></div
-          ></td
-        >
+              }}</button>
+          </div>
+        </td>
       </tr>
     </tbody>
   </nz-table>
-</nz-card>
+</nz-card>

+ 27 - 40
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/adapters/adapters.component.html

@@ -7,17 +7,19 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.adapters.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
 
       <div nz-col [nzSpan]="query.expandForm ? 24 : 8" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -27,62 +29,47 @@
     <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
     <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
       'mxk.text.delete' | i18n
-    }}</button>
+      }}</button>
   </div>
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzSize="small"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
-        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+          (nzCheckedChange)="onTableAllChecked($event)"></th>
         <th nzAlign="center" style="display: none">Id</th>
         <th nzAlign="center">{{ 'mxk.adapters.name' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.adapters.protocol' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.text.sortIndex' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.text.description' | i18n }}</th>
-        <th nzAlign="center"
-          ><a>{{ 'mxk.text.action' | i18n }}</a></th
-        >
+        <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
       </tr>
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
         <td nzAlign="left" style="display: none">
           <span>{{ data.id }}</span>
         </td>
         <td nzAlign="left" nzBreakWord="false">{{ data.name }}</td>
-        <td nzAlign="center"> {{ data.protocol }}</td>
+        <td nzAlign="left"> {{ data.protocol }}</td>
         <td nzAlign="center"> {{ data.sortIndex }}</td>
         <td nzAlign="left">{{ data.description }}</td>
-        <td nzAlign="left" nzBreakWord="false"
-          ><div nz-col>
-            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'" style="float: left">{{
+        <td nzAlign="left" nzBreakWord="false">
+          <div nz-col>
+            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'"
+              style="float: left">{{
               'mxk.text.edit' | i18n
-            }}</button>
+              }}</button>
             <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
               'mxk.text.delete' | i18n
-            }}</button></div
-          ></td
-        >
+              }}</button>
+          </div>
+        </td>
       </tr>
     </tbody>
   </nz-table>
-</nz-card>
+</nz-card>

+ 50 - 57
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/ldap-context/ldap-context.component.html

@@ -4,11 +4,13 @@
     <nz-form-item style="display: none">
       <nz-form-label [nzMd]="6" nzRequired nzFor="id">{{ 'mxk.text.id' | i18n }}</nz-form-label>
       <nz-form-control [nzMd]="18" nzErrorTip="The input is not valid id!">
-        <input [(ngModel)]="form.model.id" [disabled]="true" [ngModelOptions]="{ standalone: true }" nz-input name="id" id="id" />
+        <input [(ngModel)]="form.model.id" [disabled]="true" [ngModelOptions]="{ standalone: true }" nz-input name="id"
+          id="id" />
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="product">{{ 'mxk.ldapcontext.product' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="product">{{ 'mxk.ldapcontext.product' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="18" [nzMd]="18" [nzXs]="36" [nzXl]="48" nzErrorTip="The input is not valid product !">
         <nz-select [(ngModel)]="form.model.product" [ngModelOptions]="{ standalone: true }">
           <nz-option nzValue="ActiveDirectory" nzLabel="ActiveDirectory"></nz-option>
@@ -20,87 +22,81 @@
     <nz-form-item>
       <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="status">{{ 'mxk.text.status' | i18n }}</nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid status!">
-        <nz-switch
-          [(ngModel)]="form.model.switch_status"
-          [ngModelOptions]="{ standalone: true }"
-          name="status"
-          [nzCheckedChildren]="checkedTemplate"
-          [nzUnCheckedChildren]="unCheckedTemplate"
-        ></nz-switch>
+        <nz-switch [(ngModel)]="form.model.switch_status" [ngModelOptions]="{ standalone: true }" name="status"
+          [nzCheckedChildren]="checkedTemplate" [nzUnCheckedChildren]="unCheckedTemplate"></nz-switch>
         <ng-template #checkedTemplate><i nz-icon nzType="check"></i></ng-template>
         <ng-template #unCheckedTemplate><i nz-icon nzType="close"></i></ng-template>
       </nz-form-control>
     </nz-form-item>
 
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="providerUrl">{{ 'mxk.ldapcontext.providerUrl' | i18n }}</nz-form-label>
-      <nz-form-control [nzSm]="18" [nzMd]="18" [nzXs]="36" [nzXl]="48" nzErrorTip="The input is not valid providerUrl !">
-        <input [(ngModel)]="form.model.providerUrl" [ngModelOptions]="{ standalone: true }" nz-input name="providerUrl" id="providerUrl" />
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="providerUrl">{{ 'mxk.ldapcontext.providerUrl' | i18n }}
+      </nz-form-label>
+      <nz-form-control [nzSm]="18" [nzMd]="18" [nzXs]="36" [nzXl]="48"
+        nzErrorTip="The input is not valid providerUrl !">
+        <input [(ngModel)]="form.model.providerUrl" [ngModelOptions]="{ standalone: true }" nz-input name="providerUrl"
+          id="providerUrl" />
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="accountMapping">{{ 'mxk.ldapcontext.accountMapping' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="accountMapping">{{ 'mxk.ldapcontext.accountMapping' | i18n
+        }}</nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid accountMapping!">
-        <nz-switch
-          [(ngModel)]="form.model.switch_accountMapping"
-          [ngModelOptions]="{ standalone: true }"
-          name="accountMapping"
-          [nzCheckedChildren]="checkedTemplate"
-          [nzUnCheckedChildren]="unCheckedTemplate"
-        ></nz-switch>
+        <nz-switch [(ngModel)]="form.model.switch_accountMapping" [ngModelOptions]="{ standalone: true }"
+          name="accountMapping" [nzCheckedChildren]="checkedTemplate" [nzUnCheckedChildren]="unCheckedTemplate">
+        </nz-switch>
         <ng-template #checkedTemplate><i nz-icon nzType="check"></i></ng-template>
         <ng-template #unCheckedTemplate><i nz-icon nzType="close"></i></ng-template>
       </nz-form-control>
     </nz-form-item>
 
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="principal">{{ 'mxk.ldapcontext.principal' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="principal">{{ 'mxk.ldapcontext.principal' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="18" [nzXs]="24" nzErrorTip="The input is not valid principal!">
-        <input [(ngModel)]="form.model.principal" [ngModelOptions]="{ standalone: true }" nz-input name="principal" id="principal" />
+        <input [(ngModel)]="form.model.principal" [ngModelOptions]="{ standalone: true }" nz-input name="principal"
+          id="principal" />
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="credentials">{{ 'mxk.ldapcontext.credentials' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="credentials">{{ 'mxk.ldapcontext.credentials' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="18" [nzXs]="24" nzErrorTip="The input is not valid upperCase!">
-        <input
-          [(ngModel)]="form.model.credentials"
-          [ngModelOptions]="{ standalone: true }"
-          nz-input
-          type="password"
-          name="credentials"
-          id="credentials"
-        />
+        <input [(ngModel)]="form.model.credentials" [ngModelOptions]="{ standalone: true }" nz-input type="password"
+          name="credentials" id="credentials" />
       </nz-form-control>
     </nz-form-item>
-    <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="filters">{{ 'mxk.ldapcontext.filters' | i18n }}</nz-form-label>
-      <nz-form-control [nzSm]="18" [nzXs]="24" nzErrorTip="The input is not valid filters!">
-        <input [(ngModel)]="form.model.filters" [ngModelOptions]="{ standalone: true }" nz-input name="filters" id="filters" />
+    <nz-form-item *ngIf="form.model.product == 'ActiveDirectory'">
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="basedn">{{ 'mxk.ldapcontext.basedn' | i18n }}
+      </nz-form-label>
+      <nz-form-control [nzSm]="18" [nzXs]="24" nzErrorTip="The input is not valid basedn!">
+        <input [(ngModel)]="form.model.basedn" [ngModelOptions]="{ standalone: true }" nz-input name="basedn"
+          id="basedn" />
       </nz-form-control>
     </nz-form-item>
-    <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="basedn">{{ 'mxk.ldapcontext.basedn' | i18n }}</nz-form-label>
-      <nz-form-control [nzSm]="18" [nzXs]="24" nzErrorTip="The input is not valid basedn!">
-        <input [(ngModel)]="form.model.basedn" [ngModelOptions]="{ standalone: true }" nz-input name="basedn" id="basedn" />
+    <nz-form-item *ngIf="form.model.product == 'ActiveDirectory'">
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="filters">
+        {{ 'mxk.ldapcontext.filters' | i18n }}
+      </nz-form-label>
+      <nz-form-control [nzSm]="18" [nzXs]="24" nzErrorTip="The input is not valid filters!">
+        <input [(ngModel)]="form.model.filters" [ngModelOptions]="{ standalone: true }" nz-input name="filters"
+          id="filters" />
       </nz-form-control>
     </nz-form-item>
+
     <nz-form-item>
       <nz-form-label [nzSm]="6" [nzXs]="24" nzFor="msadDomain">{{ 'mxk.ldapcontext.msadDomain' | i18n }}</nz-form-label>
       <nz-form-control [nzSm]="18" [nzXs]="24" nzErrorTip="The input is not valid msadDomain!">
-        <input [(ngModel)]="form.model.msadDomain" [ngModelOptions]="{ standalone: true }" nz-input name="msadDomain" id="msadDomain" />
+        <input [(ngModel)]="form.model.msadDomain" [ngModelOptions]="{ standalone: true }" nz-input name="msadDomain"
+          id="msadDomain" />
       </nz-form-control>
     </nz-form-item>
 
     <nz-form-item>
       <nz-form-label [nzSm]="6" [nzXs]="24" nzFor="sslSwitch">{{ 'mxk.ldapcontext.sslSwitch' | i18n }}</nz-form-label>
       <nz-form-control [nzSm]="18" [nzXs]="24" nzErrorTip="The input is not valid qwerty!">
-        <nz-switch
-          [(ngModel)]="form.model.switch_sslSwitch"
-          [ngModelOptions]="{ standalone: true }"
-          name="sslSwitch"
-          [nzCheckedChildren]="checkedTemplate"
-          [nzUnCheckedChildren]="unCheckedTemplate"
-        ></nz-switch>
+        <nz-switch [(ngModel)]="form.model.switch_sslSwitch" [ngModelOptions]="{ standalone: true }" name="sslSwitch"
+          [nzCheckedChildren]="checkedTemplate" [nzUnCheckedChildren]="unCheckedTemplate"></nz-switch>
         <ng-template #checkedTemplate><i nz-icon nzType="check"></i></ng-template>
         <ng-template #unCheckedTemplate><i nz-icon nzType="close"></i></ng-template>
       </nz-form-control>
@@ -108,19 +104,16 @@
     <nz-form-item>
       <nz-form-label [nzSm]="6" [nzXs]="24" nzFor="trustStore">{{ 'mxk.ldapcontext.trustStore' | i18n }}</nz-form-label>
       <nz-form-control [nzSm]="18" [nzXs]="24" nzErrorTip="The input is not valid trustStore!">
-        <input [(ngModel)]="form.model.trustStore" [ngModelOptions]="{ standalone: true }" nz-input name="trustStore" id="trustStore" />
+        <input [(ngModel)]="form.model.trustStore" [ngModelOptions]="{ standalone: true }" nz-input name="trustStore"
+          id="trustStore" />
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzFor="trustStorePassword">{{ 'mxk.ldapcontext.trustStorePassword' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzFor="trustStorePassword">{{ 'mxk.ldapcontext.trustStorePassword' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="18" [nzXs]="24" nzErrorTip="The input is not valid trustStorePassword!">
-        <input
-          [(ngModel)]="form.model.trustStorePassword"
-          [ngModelOptions]="{ standalone: true }"
-          nz-input
-          name="trustStorePassword"
-          id="trustStorePassword"
-        />
+        <input [(ngModel)]="form.model.trustStorePassword" [ngModelOptions]="{ standalone: true }" nz-input
+          name="trustStorePassword" id="trustStorePassword" />
       </nz-form-control>
     </nz-form-item>
     <nz-form-item style="width: 100%">
@@ -129,4 +122,4 @@
       </nz-form-control>
     </nz-form-item>
   </form>
-</nz-card>
+</nz-card>

+ 69 - 154
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/password-policy/password-policy.component.html

@@ -4,237 +4,152 @@
     <nz-form-item style="display: none">
       <nz-form-label [nzMd]="6" nzRequired nzFor="id">id</nz-form-label>
       <nz-form-control [nzMd]="18" nzErrorTip="The input is not valid id!">
-        <input [(ngModel)]="form.model.id" [ngModelOptions]="{ standalone: true }" nz-input name="id" id="id" value="id" />
+        <input [(ngModel)]="form.model.id" [ngModelOptions]="{ standalone: true }" nz-input name="id" id="id"
+          value="id" />
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="minLength">{{ 'mxk.passwordpolicy.minLength' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="minLength">{{ 'mxk.passwordpolicy.minLength' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="18" [nzMd]="18" [nzXs]="36" [nzXl]="48" nzErrorTip="The input is not validminLength!">
-        <nz-input-number
-          [(ngModel)]="form.model.minLength"
-          [ngModelOptions]="{ standalone: true }"
-          [nzMin]="0"
-          [nzMax]="10"
-          [nzStep]="1"
-          name="minLength"
-          id="minLength"
-          value="0"
-        ></nz-input-number>
+        <nz-input-number [(ngModel)]="form.model.minLength" [ngModelOptions]="{ standalone: true }" [nzMin]="0"
+          [nzMax]="10" [nzStep]="1" name="minLength" id="minLength" value="0"></nz-input-number>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="maxLength">{{ 'mxk.passwordpolicy.maxLength' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="maxLength">{{ 'mxk.passwordpolicy.maxLength' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid maxLength!">
-        <nz-input-number
-          [(ngModel)]="form.model.maxLength"
-          [ngModelOptions]="{ standalone: true }"
-          [nzMin]="0"
-          [nzMax]="10"
-          [nzStep]="1"
-          name="maxLength"
-          id="maxLength"
-        ></nz-input-number>
+        <nz-input-number [(ngModel)]="form.model.maxLength" [ngModelOptions]="{ standalone: true }" [nzMin]="0"
+          [nzMax]="10" [nzStep]="1" name="maxLength" id="maxLength"></nz-input-number>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="lowerCase">{{ 'mxk.passwordpolicy.lowerCase' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="lowerCase">{{ 'mxk.passwordpolicy.lowerCase' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid lowerCase!">
-        <nz-input-number
-          [(ngModel)]="form.model.lowerCase"
-          [ngModelOptions]="{ standalone: true }"
-          [nzMin]="0"
-          [nzMax]="10"
-          [nzStep]="1"
-          name="lowerCase"
-          id="lowerCase"
-        ></nz-input-number>
+        <nz-input-number [(ngModel)]="form.model.lowerCase" [ngModelOptions]="{ standalone: true }" [nzMin]="0"
+          [nzMax]="10" [nzStep]="1" name="lowerCase" id="lowerCase"></nz-input-number>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="upperCase">{{ 'mxk.passwordpolicy.upperCase' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="upperCase">{{ 'mxk.passwordpolicy.upperCase' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid upperCase!">
-        <nz-input-number
-          [(ngModel)]="form.model.upperCase"
-          [ngModelOptions]="{ standalone: true }"
-          [nzMin]="0"
-          [nzMax]="10"
-          [nzStep]="1"
-          name="upperCase"
-          id="upperCase"
-        ></nz-input-number>
+        <nz-input-number [(ngModel)]="form.model.upperCase" [ngModelOptions]="{ standalone: true }" [nzMin]="0"
+          [nzMax]="10" [nzStep]="1" name="upperCase" id="upperCase"></nz-input-number>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="digits">{{ 'mxk.passwordpolicy.digits' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="digits">{{ 'mxk.passwordpolicy.digits' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid digits!">
-        <nz-input-number
-          [(ngModel)]="form.model.digits"
-          [ngModelOptions]="{ standalone: true }"
-          [nzMin]="0"
-          [nzMax]="10"
-          [nzStep]="1"
-          name="digits"
-          id="digits"
-        ></nz-input-number>
+        <nz-input-number [(ngModel)]="form.model.digits" [ngModelOptions]="{ standalone: true }" [nzMin]="0"
+          [nzMax]="10" [nzStep]="1" name="digits" id="digits"></nz-input-number>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="specialChar">{{ 'mxk.passwordpolicy.specialChar' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="specialChar">{{ 'mxk.passwordpolicy.specialChar' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid specialChar!">
-        <nz-input-number
-          [(ngModel)]="form.model.specialChar"
-          [ngModelOptions]="{ standalone: true }"
-          [nzMin]="0"
-          [nzMax]="10"
-          [nzStep]="1"
-          name="specialChar"
-          id="specialChar"
-        ></nz-input-number>
+        <nz-input-number [(ngModel)]="form.model.specialChar" [ngModelOptions]="{ standalone: true }" [nzMin]="0"
+          [nzMax]="10" [nzStep]="1" name="specialChar" id="specialChar"></nz-input-number>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="attempts">{{ 'mxk.passwordpolicy.attempts' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="attempts">{{ 'mxk.passwordpolicy.attempts' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid attempts!">
-        <nz-input-number
-          [(ngModel)]="form.model.attempts"
-          [ngModelOptions]="{ standalone: true }"
-          [nzMin]="0"
-          [nzMax]="10"
-          [nzStep]="1"
-          name="attempts"
-          id="attempts"
-        ></nz-input-number>
+        <nz-input-number [(ngModel)]="form.model.attempts" [ngModelOptions]="{ standalone: true }" [nzMin]="0"
+          [nzMax]="10" [nzStep]="1" name="attempts" id="attempts"></nz-input-number>
       </nz-form-control>
     </nz-form-item>
 
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="duration">{{ 'mxk.passwordpolicy.duration' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="duration">{{ 'mxk.passwordpolicy.duration' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid duration!">
-        <nz-input-group nzAddOnAfter="{{ 'mxk.text.hour' | i18n }}">
-          <nz-input-number
-            [(ngModel)]="form.model.duration"
-            [ngModelOptions]="{ standalone: true }"
-            [nzMin]="0"
-            [nzMax]="24"
-            [nzStep]="1"
-            name="duration"
-            id="duration"
-          ></nz-input-number>
+        <nz-input-group nzAddOnAfter="{{ 'mxk.text.minute' | i18n }}">
+          <nz-input-number [(ngModel)]="form.model.duration" [ngModelOptions]="{ standalone: true }" [nzMin]="0"
+            [nzMax]="720" [nzStep]="1" name="duration" id="duration"></nz-input-number>
         </nz-input-group>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="occurances">{{ 'mxk.passwordpolicy.occurances' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="occurances">{{ 'mxk.passwordpolicy.occurances' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid occurances!">
-        <nz-input-number
-          [(ngModel)]="form.model.occurances"
-          [ngModelOptions]="{ standalone: true }"
-          [nzMin]="0"
-          [nzMax]="10"
-          [nzStep]="1"
-          name="occurances"
-          id="occurances"
-        ></nz-input-number>
+        <nz-input-number [(ngModel)]="form.model.occurances" [ngModelOptions]="{ standalone: true }" [nzMin]="0"
+          [nzMax]="10" [nzStep]="1" name="occurances" id="occurances"></nz-input-number>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="expiration">{{ 'mxk.passwordpolicy.expiration' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="expiration">{{ 'mxk.passwordpolicy.expiration' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid expiration!">
         <nz-input-group nzAddOnAfter="{{ 'mxk.text.day' | i18n }}">
-          <nz-input-number
-            [(ngModel)]="form.model.expiration"
-            [ngModelOptions]="{ standalone: true }"
-            [nzMin]="30"
-            [nzMax]="365"
-            [nzStep]="1"
-            name="expiration"
-            id="expiration"
-          ></nz-input-number>
+          <nz-input-number [(ngModel)]="form.model.expiration" [ngModelOptions]="{ standalone: true }" [nzMin]="30"
+            [nzMax]="365" [nzStep]="1" name="expiration" id="expiration"></nz-input-number>
         </nz-input-group>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="history">{{ 'mxk.passwordpolicy.history' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="history">{{ 'mxk.passwordpolicy.history' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid history!">
-        <nz-input-number
-          [(ngModel)]="form.model.history"
-          [ngModelOptions]="{ standalone: true }"
-          [nzMin]="0"
-          [nzMax]="10"
-          [nzStep]="1"
-          name="history"
-          id="history"
-        ></nz-input-number>
+        <nz-input-number [(ngModel)]="form.model.history" [ngModelOptions]="{ standalone: true }" [nzMin]="0"
+          [nzMax]="10" [nzStep]="1" name="history" id="history"></nz-input-number>
       </nz-form-control>
     </nz-form-item>
 
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="username">{{ 'mxk.passwordpolicy.username' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="username">{{ 'mxk.passwordpolicy.username' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid username!">
-        <nz-switch
-          [(ngModel)]="form.model.switch_username"
-          [ngModelOptions]="{ standalone: true }"
-          name="username"
-          [nzCheckedChildren]="checkedTemplate"
-          [nzUnCheckedChildren]="unCheckedTemplate"
-        ></nz-switch>
+        <nz-switch [(ngModel)]="form.model.switch_username" [ngModelOptions]="{ standalone: true }" name="username"
+          [nzCheckedChildren]="checkedTemplate" [nzUnCheckedChildren]="unCheckedTemplate"></nz-switch>
         <ng-template #checkedTemplate><i nz-icon nzType="check"></i></ng-template>
         <ng-template #unCheckedTemplate><i nz-icon nzType="close"></i></ng-template>
       </nz-form-control>
     </nz-form-item>
 
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="dictionary">{{ 'mxk.passwordpolicy.dictionary' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="dictionary">{{ 'mxk.passwordpolicy.dictionary' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid dictionary!">
-        <nz-switch
-          [(ngModel)]="form.model.switch_dictionary"
-          [ngModelOptions]="{ standalone: true }"
-          name="dictionary"
-          [nzCheckedChildren]="checkedTemplate"
-          [nzUnCheckedChildren]="unCheckedTemplate"
-        ></nz-switch>
+        <nz-switch [(ngModel)]="form.model.switch_dictionary" [ngModelOptions]="{ standalone: true }" name="dictionary"
+          [nzCheckedChildren]="checkedTemplate" [nzUnCheckedChildren]="unCheckedTemplate"></nz-switch>
         <ng-template #checkedTemplate><i nz-icon nzType="check"></i></ng-template>
         <ng-template #unCheckedTemplate><i nz-icon nzType="close"></i></ng-template>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="alphabetical">{{ 'mxk.passwordpolicy.alphabetical' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="alphabetical">{{ 'mxk.passwordpolicy.alphabetical' | i18n
+        }}</nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid alphabetical!">
-        <nz-switch
-          [(ngModel)]="form.model.switch_alphabetical"
-          [ngModelOptions]="{ standalone: true }"
-          name="alphabetical"
-          [nzCheckedChildren]="checkedTemplate"
-          [nzUnCheckedChildren]="unCheckedTemplate"
-        ></nz-switch>
+        <nz-switch [(ngModel)]="form.model.switch_alphabetical" [ngModelOptions]="{ standalone: true }"
+          name="alphabetical" [nzCheckedChildren]="checkedTemplate" [nzUnCheckedChildren]="unCheckedTemplate">
+        </nz-switch>
         <ng-template #checkedTemplate><i nz-icon nzType="check"></i></ng-template>
         <ng-template #unCheckedTemplate><i nz-icon nzType="close"></i></ng-template>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="numerical">{{ 'mxk.passwordpolicy.numerical' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="numerical">{{ 'mxk.passwordpolicy.numerical' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid numerical!">
-        <nz-switch
-          [(ngModel)]="form.model.switch_numerical"
-          [ngModelOptions]="{ standalone: true }"
-          name="numerical"
-          [nzCheckedChildren]="checkedTemplate"
-          [nzUnCheckedChildren]="unCheckedTemplate"
-        ></nz-switch>
+        <nz-switch [(ngModel)]="form.model.switch_numerical" [ngModelOptions]="{ standalone: true }" name="numerical"
+          [nzCheckedChildren]="checkedTemplate" [nzUnCheckedChildren]="unCheckedTemplate"></nz-switch>
         <ng-template #checkedTemplate><i nz-icon nzType="check"></i></ng-template>
         <ng-template #unCheckedTemplate><i nz-icon nzType="close"></i></ng-template>
       </nz-form-control>
     </nz-form-item>
     <nz-form-item>
-      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="qwerty">{{ 'mxk.passwordpolicy.qwerty' | i18n }}</nz-form-label>
+      <nz-form-label [nzSm]="6" [nzXs]="24" nzRequired nzFor="qwerty">{{ 'mxk.passwordpolicy.qwerty' | i18n }}
+      </nz-form-label>
       <nz-form-control [nzSm]="14" [nzXs]="24" nzErrorTip="The input is not valid qwerty!">
-        <nz-switch
-          [(ngModel)]="form.model.switch_qwerty"
-          [ngModelOptions]="{ standalone: true }"
-          name="qwerty"
-          [nzCheckedChildren]="checkedTemplate"
-          [nzUnCheckedChildren]="unCheckedTemplate"
-        ></nz-switch>
+        <nz-switch [(ngModel)]="form.model.switch_qwerty" [ngModelOptions]="{ standalone: true }" name="qwerty"
+          [nzCheckedChildren]="checkedTemplate" [nzUnCheckedChildren]="unCheckedTemplate"></nz-switch>
         <ng-template #checkedTemplate><i nz-icon nzType="check"></i></ng-template>
         <ng-template #unCheckedTemplate><i nz-icon nzType="close"></i></ng-template>
       </nz-form-control>
@@ -246,4 +161,4 @@
       </nz-form-control>
     </nz-form-item>
   </form>
-</nz-card>
+</nz-card>

+ 32 - 51
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/socials-provider/socials-provider.component.html

@@ -7,24 +7,19 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.socialsproviders.providerName' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input
-              nz-input
-              [(ngModel)]="query.params.providerName"
-              [ngModelOptions]="{ standalone: true }"
-              name="providerName"
-              placeholder=""
-              id="providerName"
-            />
+            <input nz-input [(ngModel)]="query.params.providerName" [ngModelOptions]="{ standalone: true }"
+              name="providerName" placeholder="" id="providerName" />
           </nz-form-control>
         </nz-form-item>
       </div>
 
       <div nz-col [nzSpan]="query.expandForm ? 24 : 8" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -34,64 +29,50 @@
     <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
     <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
       'mxk.text.delete' | i18n
-    }}</button>
+      }}</button>
   </div>
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzSize="small"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
-        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+          (nzCheckedChange)="onTableAllChecked($event)"></th>
         <th nzAlign="center" style="display: none">Id</th>
         <th nzAlign="center">{{ 'mxk.socialsproviders.icon' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.socialsproviders.provider' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.socialsproviders.providerName' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.text.sortIndex' | i18n }}</th>
-        <th nzAlign="center">{{ 'mxk.text.description' | i18n }}</th>
-        <th nzAlign="center"
-          ><a>{{ 'mxk.text.action' | i18n }}</a></th
-        >
+        <th nzAlign="center">{{ 'mxk.text.status' | i18n }}</th>
+        <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
       </tr>
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
         <td nzAlign="left" style="display: none">
           <span>{{ data.id }}</span>
         </td>
-        <td nzAlign="left" nzBreakWord="false"><img src="{{ data.icon }}" /></td>
-        <td nzAlign="center"> {{ data.provider }}</td>
-        <td nzAlign="center"> {{ data.providerName }}</td>
+        <td nzAlign="center" nzBreakWord="false"><img src="{{ data.icon }}" /></td>
+        <td nzAlign="left"> {{ data.provider }}</td>
+        <td nzAlign="left"> {{ data.providerName }}</td>
         <td nzAlign="center"> {{ data.sortIndex }}</td>
-        <td nzAlign="left">{{ data.description }}</td>
-        <td nzAlign="left" nzBreakWord="false"
-          ><div nz-col>
-            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'" style="float: left">{{
+        <td nzAlign="center"> <i *ngIf="data.status == 1" nz-icon nzType="check-circle" nzTheme="fill"
+            style="color: green"></i></td>
+        <td nzAlign="left" nzBreakWord="false">
+          <div nz-col>
+            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'"
+              style="float: left">{{
               'mxk.text.edit' | i18n
-            }}</button>
+              }}</button>
             <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
               'mxk.text.delete' | i18n
-            }}</button></div
-          ></td
-        >
+              }}</button>
+          </div>
+        </td>
       </tr>
     </tbody>
   </nz-table>
-</nz-card>
+</nz-card>

+ 34 - 45
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/config/synchronizers/synchronizers.component.html

@@ -7,17 +7,19 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.synchronizers.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
 
       <div nz-col [nzSpan]="query.expandForm ? 24 : 8" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -27,64 +29,51 @@
     <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
     <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
       'mxk.text.delete' | i18n
-    }}</button>
+      }}</button>
   </div>
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzSize="small"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
-        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+          (nzCheckedChange)="onTableAllChecked($event)"></th>
         <th nzAlign="center" style="display: none">Id</th>
         <th nzAlign="center">{{ 'mxk.synchronizers.name' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.synchronizers.scheduler' | i18n }}</th>
-        <th nzAlign="center">{{ 'mxk.text.description' | i18n }}</th>
-        <th nzAlign="center"
-          ><a>{{ 'mxk.text.action' | i18n }}</a></th
-        >
+        <th nzAlign="center">{{ 'mxk.text.status' | i18n }}</th>
+        <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
       </tr>
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
         <td nzAlign="left" style="display: none">
           <span>{{ data.id }}</span>
         </td>
 
-        <td nzAlign="center"> {{ data.name }}</td>
-        <td nzAlign="center"> {{ data.scheduler }}</td>
-        <td nzAlign="left">{{ data.description }}</td>
-        <td nzAlign="left" nzBreakWord="false"
-          ><div nz-col>
-            <button nz-button type="button" (click)="onSynchr($event, data.id)" [nzType]="'primary'" style="float: left">{{
+        <td nzAlign="left"> {{ data.name }}</td>
+        <td nzAlign="left"> {{ data.scheduler }}</td>
+        <td nzAlign="center"> <i *ngIf="data.status == 1" nz-icon nzType="check-circle" nzTheme="fill"
+            style="color: green"></i></td>
+        <td nzAlign="left" nzBreakWord="false">
+          <div nz-col>
+            <button nz-button type="button" (click)="onSynchr($event, data.id)" [nzType]="'primary'"
+              style="float: left">{{
               'mxk.text.synchr' | i18n
-            }}</button>
-            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'" style="float: left">{{
+              }}</button>
+            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'"
+              style="float: left">{{
               'mxk.text.edit' | i18n
-            }}</button>
+              }}</button>
             <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
               'mxk.text.delete' | i18n
-            }}</button></div
-          ></td
-        >
+              }}</button>
+          </div>
+        </td>
       </tr>
     </tbody>
   </nz-table>
-</nz-card>
+</nz-card>

+ 11 - 42
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/dashboard/home/home.component.html

@@ -17,16 +17,8 @@
         <p class="text-nowrap mb0">{{ 'mxk.home.onlineUsers' | i18n }}</p>
       </div>
       <div nz-col nzSpan="12">
-        <g2-mini-bar
-          *ngIf="simulateData"
-          height="35"
-          color="#fff"
-          borderWidth="3"
-          [padding]="[5, 30]"
-          [data]="simulateData"
-          tooltipType="mini"
-          (ready)="fixDark($event)"
-        ></g2-mini-bar>
+        <g2-mini-bar *ngIf="simulateData" height="35" color="#fff" borderWidth="3" [padding]="[5, 30]"
+          [data]="simulateData" tooltipType="mini" (ready)="fixDark($event)"></g2-mini-bar>
       </div>
     </div>
   </div>
@@ -37,16 +29,8 @@
         <p class="text-nowrap mb0">{{ 'mxk.home.dayCount' | i18n }}</p>
       </div>
       <div nz-col nzSpan="12">
-        <g2-mini-bar
-          *ngIf="simulateData"
-          height="35"
-          color="#fff"
-          borderWidth="3"
-          [padding]="[5, 30]"
-          [data]="simulateData"
-          tooltipType="mini"
-          (ready)="fixDark($event)"
-        ></g2-mini-bar>
+        <g2-mini-bar *ngIf="simulateData" height="35" color="#fff" borderWidth="3" [padding]="[5, 30]"
+          [data]="simulateData" tooltipType="mini" (ready)="fixDark($event)"></g2-mini-bar>
       </div>
     </div>
   </div>
@@ -57,16 +41,8 @@
         <p class="text-nowrap mb0">{{ 'mxk.home.newUsers' | i18n }}</p>
       </div>
       <div nz-col nzSpan="12">
-        <g2-mini-bar
-          *ngIf="simulateData"
-          height="35"
-          color="#fff"
-          borderWidth="3"
-          [padding]="[5, 30]"
-          [data]="simulateData"
-          tooltipType="mini"
-          (ready)="fixDark($event)"
-        ></g2-mini-bar>
+        <g2-mini-bar *ngIf="simulateData" height="35" color="#fff" borderWidth="3" [padding]="[5, 30]"
+          [data]="simulateData" tooltipType="mini" (ready)="fixDark($event)"></g2-mini-bar>
       </div>
     </div>
   </div>
@@ -77,16 +53,8 @@
         <p class="text-nowrap mb0">{{ 'mxk.home.activeUsers' | i18n }}</p>
       </div>
       <div nz-col nzSpan="12">
-        <g2-mini-bar
-          *ngIf="simulateData"
-          height="35"
-          color="#fff"
-          borderWidth="3"
-          [padding]="[5, 30]"
-          [data]="simulateData"
-          tooltipType="mini"
-          (ready)="fixDark($event)"
-        ></g2-mini-bar>
+        <g2-mini-bar *ngIf="simulateData" height="35" color="#fff" borderWidth="3" [padding]="[5, 30]"
+          [data]="simulateData" tooltipType="mini" (ready)="fixDark($event)"></g2-mini-bar>
       </div>
     </div>
   </div>
@@ -97,7 +65,8 @@
       <ng-template #dayAccessTitle>
         {{ 'mxk.home.dayAccessCount' | i18n }}
       </ng-template>
-      <g2-bar *ngIf="dayData" height="275" [data]="dayData" color="#fa8c16"></g2-bar>
+      <!--<g2-bar *ngIf="dayData" height="275" [data]="dayData" color="#fa8c16"></g2-bar>-->
+      <g2-bar *ngIf="dayData" height="275" [data]="dayData"></g2-bar>
     </nz-card>
   </div>
   <div nz-col nzXs="24" nzMd="24">
@@ -146,4 +115,4 @@
       </nz-table>
     </nz-card>
   </div>
-</div>
+</div>

+ 35 - 51
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/organizations/organizations.component.html

@@ -7,16 +7,18 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.organizations.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
       <div nz-col [nzSpan]="query.expandForm ? 24 : 8" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -27,18 +29,11 @@
       <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
       <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
         'mxk.text.delete' | i18n
-      }}</button>
+        }}</button>
     </div>
-    <div nz-col nzMd="8" nzSm="24">
-      <nz-tree
-        nzShowLine="false"
-        [nzCheckable]="treeNodes.checkable"
-        nzBlockNode
-        [nzData]="treeNodes.nodes"
-        (nzClick)="activeNode($event)"
-        (nzDblClick)="openFolder($event)"
-        [nzTreeTemplate]="nzTreeTemplate"
-      ></nz-tree>
+    <div nz-col nzMd="6" nzSm="24" class="grid-border">
+      <nz-tree nzShowLine="false" [nzCheckable]="treeNodes.checkable" nzBlockNode [nzData]="treeNodes.nodes"
+        (nzClick)="activeNode($event)" (nzDblClick)="openFolder($event)" [nzTreeTemplate]="nzTreeTemplate"></nz-tree>
       <ng-template #nzTreeTemplate let-node let-origin="origin">
         <span class="custom-node">
           <span *ngIf="!node.isLeaf" (contextmenu)="contextMenu($event, menu)">
@@ -58,58 +53,47 @@
         </ul>
       </nz-dropdown-menu>
     </div>
-    <div nz-col nzMd="16" nzSm="24">
-      <nz-table
-        #dynamicTable
-        nzTableLayout="auto"
-        nzBordered
-        nzShowSizeChanger
-        [nzData]="query.results.rows"
-        [nzFrontPagination]="false"
-        [nzTotal]="query.results.records"
-        [nzPageSizeOptions]="query.params.pageSizeOptions"
-        [nzPageSize]="query.params.pageSize"
-        [nzPageIndex]="query.params.pageNumber"
-        [nzLoading]="this.query.tableLoading"
-        (nzQueryParams)="onQueryParamsChange($event)"
-        nzWidth="100%"
-      >
+    <div nz-col nzMd="18" nzSm="24" class="grid-border">
+      <nz-table #dynamicTable nzBordered nzShowSizeChanger [nzData]="query.results.rows" [nzFrontPagination]="false"
+        [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+        [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber"
+        [nzLoading]="this.query.tableLoading" (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
         <thead>
           <tr>
-            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+              (nzCheckedChange)="onTableAllChecked($event)"></th>
             <th nzAlign="center">{{ 'mxk.organizations.code' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.organizations.name' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.text.sortIndex' | i18n }}</th>
-            <th nzAlign="center"
-              ><a>{{ 'mxk.text.action' | i18n }}</a></th
-            >
+            <th nzAlign="center">{{ 'mxk.text.status' | i18n }}</th>
+            <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
           </tr>
         </thead>
         <tbody>
           <tr *ngFor="let data of query.results.rows">
-            <td
-              [nzChecked]="query.tableCheckedId.has(data.id)"
-              [nzDisabled]="data.disabled"
-              (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-            ></td>
+            <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+              (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
             <td nzAlign="left">
               <span>{{ data.id }}</span>
             </td>
-            <td nzAlign="center"> {{ data.name }}</td>
+            <td nzAlign="left"> {{ data.name }}</td>
             <td nzAlign="center"> {{ data.sortIndex }}</td>
-            <td nzAlign="left" nzBreakWord="false"
-              ><div nz-col>
-                <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'" style="float: left">{{
-                  'mxk.text.edit' | i18n
-                }}</button>
+            <td nzAlign="center"> <i *ngIf="data.status == 1" nz-icon nzType="check-circle" nzTheme="fill"
+                style="color: green"></i></td>
+            <td nzAlign="left" nzBreakWord="false">
+              <div nz-col>
+                <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'"
+                  style="float: left">
+                  {{ 'mxk.text.edit' | i18n }}
+                </button>
                 <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
                   'mxk.text.delete' | i18n
-                }}</button></div
-              ></td
-            >
+                  }}</button>
+              </div>
+            </td>
           </tr>
         </tbody>
       </nz-table>
     </div>
   </div>
-</nz-card>
+</nz-card>

+ 46 - 69
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/privileges/privileges.component.html

@@ -3,41 +3,37 @@
 <nz-card [nzBordered]="false">
   <form nz-form [nzLayout]="'inline'" (ngSubmit)="onSearch()" class="search__form">
     <div nz-row [nzGutter]="{ xs: 8, sm: 8, md: 8, lg: 24, xl: 48, xxl: 48 }">
-      <div nz-col nzMd="8" nzSm="24">
-        <nz-form-item>
-          <nz-form-label nzFor="name">{{ 'mxk.roles.name' | i18n }}</nz-form-label>
-          <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
-          </nz-form-control>
-        </nz-form-item>
-      </div>
       <div nz-col nzMd="10" nzSm="24">
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.resources.appName' | i18n }}</nz-form-label>
           <nz-form-control>
             <nz-input-group nzSearch [nzAddOnAfter]="suffixButton">
-              <input
-                nz-input
-                [(ngModel)]="query.params.appName"
-                [ngModelOptions]="{ standalone: true }"
-                name="appName"
-                readonly
-                placeholder=""
-                id="appName"
-              />
+              <input nz-input [(ngModel)]="query.params.appName" [ngModelOptions]="{ standalone: true }" name="appName"
+                readonly placeholder="" id="appName" />
             </nz-input-group>
             <ng-template #suffixButton>
-              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n }}</button>
+              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n
+                }}</button>
             </ng-template>
           </nz-form-control>
         </nz-form-item>
       </div>
+      <div nz-col nzMd="8" nzSm="24">
+        <nz-form-item>
+          <nz-form-label nzFor="name">{{ 'mxk.roles.name' | i18n }}</nz-form-label>
+          <nz-form-control>
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
+          </nz-form-control>
+        </nz-form-item>
+      </div>
       <div nz-col [nzSpan]="query.expandForm ? 24 : 6" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -47,22 +43,29 @@
     <button nz-button type="button" [nzType]="'primary'" (click)="onSave($event)">{{ 'mxk.text.save' | i18n }}</button>
   </div>
   <div nz-row [nzGutter]="{ xs: 8, sm: 8, md: 8, lg: 24, xl: 48, xxl: 48 }">
-    <div nz-col [nzSpan]="12">
-      <nz-table
-        #dynamicTable
-        nzTableLayout="auto"
-        nzSize="small"
-        nzBordered
-        nzShowSizeChanger
-        [nzData]="query.results.rows"
-        [nzFrontPagination]="false"
-        [nzTotal]="query.results.records"
-        [nzPageSizeOptions]="query.params.pageSizeOptions"
-        [nzPageSize]="query.params.pageSize"
-        [nzPageIndex]="query.params.pageNumber"
-        [nzLoading]="this.query.tableLoading"
-        (nzQueryParams)="onQueryParamsChange($event)"
-      >
+    <div nz-col [nzSpan]="10" class="grid-border">
+      <nz-tree #nzTreeComponent nzShowLine="false" [nzCheckable]="treeNodes.checkable"
+        [nzCheckedKeys]="treeNodes.checkedKeys" nzBlockNode [nzData]="treeNodes.nodes" (nzDblClick)="openFolder($event)"
+        [nzTreeTemplate]="nzTreeTemplate"></nz-tree>
+      <ng-template #nzTreeTemplate let-node let-origin="origin">
+        <span class="custom-node">
+          <span *ngIf="!node.isLeaf">
+            <i nz-icon [nzType]="node.isExpanded ? 'folder-open' : 'folder'" (click)="openFolder(node)"></i>
+            <span class="folder-name">{{ node.title }}</span>
+          </span>
+          <span *ngIf="node.isLeaf">
+            <i nz-icon nzType="file"></i>
+            <span class="file-name">{{ node.title }}</span>
+          </span>
+        </span>
+      </ng-template>
+    </div>
+    <div nz-col [nzSpan]="14" class="grid-border">
+      <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered nzShowSizeChanger
+        [nzData]="query.results.rows" [nzFrontPagination]="false" [nzTotal]="query.results.records"
+        [nzPageSizeOptions]="query.params.pageSizeOptions" [nzPageSize]="query.params.pageSize"
+        [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+        (nzQueryParams)="onQueryParamsChange($event)">
         <thead>
           <tr>
             <!--<th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
@@ -75,43 +78,17 @@
         </thead>
         <tbody>
           <tr *ngFor="let data of query.results.rows">
-            <td
-              [nzChecked]="query.tableCheckedId.has(data.id)"
-              [nzDisabled]="data.disabled"
-              (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-            ></td>
+            <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+              (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
             <td nzAlign="left" style="display: none">
               <span>{{ data.id }}</span>
             </td>
             <td nzAlign="left" nzBreakWord="false">{{ data.name }}</td>
-            <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill" style="color: green"></i></td>
+            <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill"
+                style="color: green"></i></td>
           </tr>
         </tbody>
       </nz-table>
     </div>
-    <div nz-col [nzSpan]="12">
-      <nz-tree
-        #nzTreeComponent
-        nzShowLine="false"
-        [nzCheckable]="treeNodes.checkable"
-        [nzCheckedKeys]="treeNodes.checkedKeys"
-        nzBlockNode
-        [nzData]="treeNodes.nodes"
-        (nzDblClick)="openFolder($event)"
-        [nzTreeTemplate]="nzTreeTemplate"
-      ></nz-tree>
-      <ng-template #nzTreeTemplate let-node let-origin="origin">
-        <span class="custom-node">
-          <span *ngIf="!node.isLeaf">
-            <i nz-icon [nzType]="node.isExpanded ? 'folder-open' : 'folder'" (click)="openFolder(node)"></i>
-            <span class="folder-name">{{ node.title }}</span>
-          </span>
-          <span *ngIf="node.isLeaf">
-            <i nz-icon nzType="file"></i>
-            <span class="file-name">{{ node.title }}</span>
-          </span>
-        </span>
-      </ng-template>
-    </div>
   </div>
-</nz-card>
+</nz-card>

+ 39 - 61
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/resources/resources.component.html

@@ -8,18 +8,12 @@
           <nz-form-label nzFor="name">{{ 'mxk.resources.appName' | i18n }}</nz-form-label>
           <nz-form-control>
             <nz-input-group nzSearch [nzAddOnAfter]="suffixButton">
-              <input
-                nz-input
-                [(ngModel)]="query.params.appName"
-                [ngModelOptions]="{ standalone: true }"
-                name="appName"
-                readonly
-                placeholder=""
-                id="appName"
-              />
+              <input nz-input [(ngModel)]="query.params.appName" [ngModelOptions]="{ standalone: true }" name="appName"
+                readonly placeholder="" id="appName" />
             </nz-input-group>
             <ng-template #suffixButton>
-              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n }}</button>
+              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n
+                }}</button>
             </ng-template>
           </nz-form-control>
         </nz-form-item>
@@ -28,16 +22,18 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.resources.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
       <div nz-col [nzSpan]="query.expandForm ? 24 : 4" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -48,18 +44,11 @@
       <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
       <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
         'mxk.text.delete' | i18n
-      }}</button>
+        }}</button>
     </div>
-    <div nz-col nzMd="8" nzSm="24">
-      <nz-tree
-        nzShowLine="false"
-        [nzCheckable]="treeNodes.checkable"
-        nzBlockNode
-        [nzData]="treeNodes.nodes"
-        (nzClick)="activeNode($event)"
-        (nzDblClick)="openFolder($event)"
-        [nzTreeTemplate]="nzTreeTemplate"
-      ></nz-tree>
+    <div nz-col nzMd="6" nzSm="24" class="grid-border">
+      <nz-tree nzShowLine="false" [nzCheckable]="treeNodes.checkable" nzBlockNode [nzData]="treeNodes.nodes"
+        (nzClick)="activeNode($event)" (nzDblClick)="openFolder($event)" [nzTreeTemplate]="nzTreeTemplate"></nz-tree>
       <ng-template #nzTreeTemplate let-node let-origin="origin">
         <span class="custom-node">
           <span *ngIf="!node.isLeaf" (contextmenu)="contextMenu($event, menu)">
@@ -79,60 +68,49 @@
         </ul>
       </nz-dropdown-menu>
     </div>
-    <div nz-col nzMd="16" nzSm="24">
-      <nz-table
-        #dynamicTable
-        nzTableLayout="auto"
-        nzBordered
-        nzShowSizeChanger
-        [nzData]="query.results.rows"
-        [nzFrontPagination]="false"
-        [nzTotal]="query.results.records"
-        [nzPageSizeOptions]="query.params.pageSizeOptions"
-        [nzPageSize]="query.params.pageSize"
-        [nzPageIndex]="query.params.pageNumber"
-        [nzLoading]="this.query.tableLoading"
-        (nzQueryParams)="onQueryParamsChange($event)"
-        nzWidth="100%"
-      >
+    <div nz-col nzMd="18" nzSm="24" class="grid-border">
+      <nz-table #dynamicTable nzTableLayout="auto" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+        [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+        [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber"
+        [nzLoading]="this.query.tableLoading" (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
         <thead>
           <tr>
-            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+              (nzCheckedChange)="onTableAllChecked($event)"></th>
             <th nzAlign="center">{{ 'mxk.resources.appName' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.resources.name' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.resources.resourceType' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.text.sortIndex' | i18n }}</th>
-            <th nzAlign="center"
-              ><a>{{ 'mxk.text.action' | i18n }}</a></th
-            >
+            <th nzAlign="center">{{ 'mxk.text.status' | i18n }}</th>
+            <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
           </tr>
         </thead>
         <tbody>
           <tr *ngFor="let data of query.results.rows">
-            <td
-              [nzChecked]="query.tableCheckedId.has(data.id)"
-              [nzDisabled]="data.disabled"
-              (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-            ></td>
+            <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+              (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
             <td nzAlign="left">
               <span>{{ data.appName }}</span>
             </td>
-            <td nzAlign="center"> {{ data.name }}</td>
-            <td nzAlign="center"> {{ data.resourceType }}</td>
+            <td nzAlign="left"> {{ data.name }}</td>
+            <td nzAlign="left"> {{ data.resourceType }}</td>
             <td nzAlign="center"> {{ data.sortIndex }}</td>
-            <td nzAlign="left" nzBreakWord="false"
-              ><div nz-col>
-                <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'" style="float: left">{{
+            <td nzAlign="center"> <i *ngIf="data.status == 1" nz-icon nzType="check-circle" nzTheme="fill"
+                style="color: green"></i></td>
+            <td nzAlign="left" nzBreakWord="false">
+              <div nz-col>
+                <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'"
+                  style="float: left">{{
                   'mxk.text.edit' | i18n
-                }}</button>
+                  }}</button>
                 <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
                   'mxk.text.delete' | i18n
-                }}</button></div
-              ></td
-            >
+                  }}</button>
+              </div>
+            </td>
           </tr>
         </tbody>
       </nz-table>
     </div>
   </div>
-</nz-card>
+</nz-card>

+ 25 - 41
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members-editer/role-members-editer.component.html

@@ -6,47 +6,32 @@
         <nz-form-item>
           <nz-form-label nzFor="username">{{ 'mxk.users.username' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input
-              nz-input
-              [(ngModel)]="query.params.username"
-              [ngModelOptions]="{ standalone: true }"
-              name="username"
-              placeholder=""
-              id="username"
-            />
+            <input nz-input [(ngModel)]="query.params.username" [ngModelOptions]="{ standalone: true }" name="username"
+              placeholder="" id="username" />
           </nz-form-control>
         </nz-form-item>
       </div>
 
       <div nz-col [nzSpan]="query.expandForm ? 24 : 10" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
         <button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.confirm' | i18n }}</button>
       </div>
     </div>
   </form>
 
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
-        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+          (nzCheckedChange)="onTableAllChecked($event)"></th>
         <th nzAlign="center" style="display: none">Id</th>
         <th nzAlign="center">{{ 'mxk.users.username' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.users.displayName' | i18n }}</th>
@@ -58,18 +43,17 @@
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
-        <td nzAlign="center"> {{ data.username }}</td>
-        <td nzAlign="center"> {{ data.displayName }}</td>
-        <td nzAlign="center"> {{ data.employeeNumber }}</td>
-        <td nzAlign="center"> {{ data.department }}</td>
-        <td nzAlign="center"> {{ data.jobTitle }}</td>
-        <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' | i18n) }}</td>
-        <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill" style="color: green"></i></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
+        <td nzAlign="left"> {{ data.username }}</td>
+        <td nzAlign="left"> {{ data.displayName }}</td>
+        <td nzAlign="left"> {{ data.employeeNumber }}</td>
+        <td nzAlign="left"> {{ data.department }}</td>
+        <td nzAlign="left"> {{ data.jobTitle }}</td>
+        <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' |
+          i18n) }}</td>
+        <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill"
+            style="color: green"></i></td>
       </tr>
     </tbody>
   </nz-table>
@@ -77,4 +61,4 @@
 <div *nzModalFooter style="display: none">
   <button nz-button nzType="default" (click)="onClose($event)">{{ 'mxk.text.close' | i18n }}</button>
   <button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.submit' | i18n }}</button>
-</div>
+</div>

+ 37 - 68
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/role-members/role-members.component.html

@@ -8,18 +8,12 @@
           <nz-form-label nzFor="name">{{ 'mxk.roles.name' | i18n }}</nz-form-label>
           <nz-form-control>
             <nz-input-group nzSearch [nzAddOnAfter]="suffixButton">
-              <input
-                nz-input
-                [(ngModel)]="query.params.roleName"
-                [ngModelOptions]="{ standalone: true }"
-                name="roleName"
-                readonly
-                placeholder=""
-                id="roleName"
-              />
+              <input nz-input [(ngModel)]="query.params.roleName" [ngModelOptions]="{ standalone: true }"
+                name="roleName" readonly placeholder="" id="roleName" />
             </nz-input-group>
             <ng-template #suffixButton>
-              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n }}</button>
+              <button nz-button nzType="primary" (click)="onSelect($event)" nzSearch>{{ 'mxk.text.select' | i18n
+                }}</button>
             </ng-template>
           </nz-form-control>
         </nz-form-item>
@@ -28,23 +22,18 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.users.username' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input
-              nz-input
-              [(ngModel)]="query.params.username"
-              [ngModelOptions]="{ standalone: true }"
-              name="username"
-              placeholder=""
-              id="username"
-            />
+            <input nz-input [(ngModel)]="query.params.username" [ngModelOptions]="{ standalone: true }" name="username"
+              placeholder="" id="username" />
           </nz-form-control>
         </nz-form-item>
       </div>
       <div nz-col [nzSpan]="query.expandForm ? 24 : 4" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -55,69 +44,49 @@
       <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
       <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
         'mxk.text.delete' | i18n
-      }}</button>
+        }}</button>
     </div>
 
     <div nz-col nzMd="24" nzSm="24">
-      <nz-table
-        #dynamicTable
-        nzTableLayout="auto"
-        nzBordered
-        nzShowSizeChanger
-        [nzData]="query.results.rows"
-        [nzFrontPagination]="false"
-        [nzTotal]="query.results.records"
-        [nzPageSizeOptions]="query.params.pageSizeOptions"
-        [nzPageSize]="query.params.pageSize"
-        [nzPageIndex]="query.params.pageNumber"
-        [nzLoading]="this.query.tableLoading"
-        (nzQueryParams)="onQueryParamsChange($event)"
-      >
+      <nz-table #dynamicTable nzTableLayout="auto" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+        [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+        [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber"
+        [nzLoading]="this.query.tableLoading" (nzQueryParams)="onQueryParamsChange($event)">
         <thead>
           <tr>
-            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+              (nzCheckedChange)="onTableAllChecked($event)"></th>
             <th nzAlign="center">{{ 'mxk.roles.name' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.username' | i18n }}</th>
-            <th nzAlign="center">{{ 'mxk.users.displayName' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.employeeNumber' | i18n }}</th>
+            <th nzAlign="center">{{ 'mxk.users.displayName' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.department' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.jobTitle' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.gender' | i18n }}</th>
-            <th nzAlign="center"
-              ><a>{{ 'mxk.text.action' | i18n }}</a></th
-            >
+            <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
           </tr>
         </thead>
         <tbody>
           <tr *ngFor="let data of query.results.rows">
-            <td
-              [nzChecked]="query.tableCheckedId.has(data.id)"
-              [nzDisabled]="data.disabled"
-              (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-            ></td>
-            <td nzAlign="center"> {{ data.roleName }}</td>
-            <td nzAlign="center"> {{ data.username }}</td>
-            <td nzAlign="center"> {{ data.displayName }}</td>
-            <td nzAlign="center"> {{ data.employeeNumber }}</td>
-            <td nzAlign="center"> {{ data.department }}</td>
-            <td nzAlign="center"> {{ data.jobTitle }}</td>
-            <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' | i18n) }}</td>
-            <td nzAlign="left" nzBreakWord="false"
-              ><div nz-col>
-                <button
-                  *ngIf="data.dynamic == '0'"
-                  nz-button
-                  type="button"
-                  (click)="onDelete($event, data.id)"
-                  [nzType]="'primary'"
-                  nzDanger
-                  >{{ 'mxk.text.delete' | i18n }}</button
-                ></div
-              ></td
-            >
+            <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+              (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
+            <td nzAlign="left"> {{ data.roleName }}</td>
+            <td nzAlign="left"> {{ data.username }}</td>
+            <td nzAlign="left"> {{ data.employeeNumber }}</td>
+            <td nzAlign="left"> {{ data.displayName }}</td>
+            <td nzAlign="left"> {{ data.department }}</td>
+            <td nzAlign="left"> {{ data.jobTitle }}</td>
+            <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' |
+              i18n) }}</td>
+            <td nzAlign="left" nzBreakWord="false">
+              <div nz-col>
+                <button *ngIf="data.dynamic == '0'" nz-button type="button" (click)="onDelete($event, data.id)"
+                  [nzType]="'primary'" nzDanger>{{ 'mxk.text.delete' | i18n }}</button>
+              </div>
+            </td>
           </tr>
         </tbody>
       </nz-table>
     </div>
   </div>
-</nz-card>
+</nz-card>

+ 28 - 41
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/permissions/roles/roles.component.html

@@ -7,17 +7,19 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.roles.name' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name" placeholder="" id="name" />
+            <input nz-input [(ngModel)]="query.params.name" [ngModelOptions]="{ standalone: true }" name="name"
+              placeholder="" id="name" />
           </nz-form-control>
         </nz-form-item>
       </div>
 
       <div nz-col [nzSpan]="query.expandForm ? 24 : 8" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -27,61 +29,46 @@
     <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
     <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
       'mxk.text.delete' | i18n
-    }}</button>
+      }}</button>
   </div>
-  <nz-table
-    #dynamicTable
-    nzTableLayout="auto"
-    nzSize="small"
-    nzBordered
-    nzShowSizeChanger
-    [nzData]="query.results.rows"
-    [nzFrontPagination]="false"
-    [nzTotal]="query.results.records"
-    [nzPageSizeOptions]="query.params.pageSizeOptions"
-    [nzPageSize]="query.params.pageSize"
-    [nzPageIndex]="query.params.pageNumber"
-    [nzLoading]="this.query.tableLoading"
-    (nzQueryParams)="onQueryParamsChange($event)"
-    [nzScroll]="{ x: '100%', y: '100%' }"
-    nzWidth="100%"
-  >
+  <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered nzShowSizeChanger [nzData]="query.results.rows"
+    [nzFrontPagination]="false" [nzTotal]="query.results.records" [nzPageSizeOptions]="query.params.pageSizeOptions"
+    [nzPageSize]="query.params.pageSize" [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+    (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
     <thead>
       <tr>
-        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+        <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+          (nzCheckedChange)="onTableAllChecked($event)"></th>
         <th nzAlign="center" style="display: none">Id</th>
         <th nzAlign="center">{{ 'mxk.roles.name' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.roles.dynamic' | i18n }}</th>
         <th nzAlign="center">{{ 'mxk.text.description' | i18n }}</th>
-        <th nzAlign="center"
-          ><a>{{ 'mxk.text.action' | i18n }}</a></th
-        >
+        <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
       </tr>
     </thead>
     <tbody>
       <tr *ngFor="let data of query.results.rows">
-        <td
-          [nzChecked]="query.tableCheckedId.has(data.id)"
-          [nzDisabled]="data.disabled"
-          (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-        ></td>
+        <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+          (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
         <td nzAlign="left" style="display: none">
           <span>{{ data.id }}</span>
         </td>
         <td nzAlign="left" nzBreakWord="false">{{ data.name }}</td>
-        <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill" style="color: green"></i></td>
+        <td nzAlign="center"> <i *ngIf="data.dynamic == 1" nz-icon nzType="check-circle" nzTheme="fill"
+            style="color: green"></i></td>
         <td nzAlign="left">{{ data.description }}</td>
-        <td nzAlign="left" nzBreakWord="false"
-          ><div nz-col>
-            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'" style="float: left">{{
+        <td nzAlign="left" nzBreakWord="false">
+          <div nz-col>
+            <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'"
+              style="float: left">{{
               'mxk.text.edit' | i18n
-            }}</button>
+              }}</button>
             <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
               'mxk.text.delete' | i18n
-            }}</button></div
-          ></td
-        >
+              }}</button>
+          </div>
+        </td>
       </tr>
     </tbody>
   </nz-table>
-</nz-card>
+</nz-card>

+ 27 - 54
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/select-user/select-user.component.html

@@ -7,23 +7,18 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.users.username' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input
-              nz-input
-              [(ngModel)]="query.params.username"
-              [ngModelOptions]="{ standalone: true }"
-              name="username"
-              placeholder=""
-              id="username"
-            />
+            <input nz-input [(ngModel)]="query.params.username" [ngModelOptions]="{ standalone: true }" name="username"
+              placeholder="" id="username" />
           </nz-form-control>
         </nz-form-item>
       </div>
       <div nz-col [nzSpan]="query.expandForm ? 24 : 10" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
         <button nz-button nzType="primary" (click)="onSubmit($event)">{{ 'mxk.text.confirm' | i18n }}</button>
       </div>
     </div>
@@ -32,15 +27,8 @@
 <nz-card [nzBordered]="false">
   <div nz-row [nzGutter]="{ xs: 8, sm: 8, md: 8, lg: 24, xl: 48, xxl: 48 }">
     <div nz-col nzMd="6" nzSm="24">
-      <nz-tree
-        nzShowLine="false"
-        [nzCheckable]="treeNodes.checkable"
-        nzBlockNode
-        [nzData]="treeNodes.nodes"
-        (nzClick)="activeNode($event)"
-        (nzDblClick)="openFolder($event)"
-        [nzTreeTemplate]="nzTreeTemplate"
-      ></nz-tree>
+      <nz-tree nzShowLine="false" [nzCheckable]="treeNodes.checkable" nzBlockNode [nzData]="treeNodes.nodes"
+        (nzClick)="activeNode($event)" (nzDblClick)="openFolder($event)" [nzTreeTemplate]="nzTreeTemplate"></nz-tree>
       <ng-template #nzTreeTemplate let-node let-origin="origin">
         <span class="custom-node">
           <span *ngIf="!node.isLeaf">
@@ -55,26 +43,15 @@
       </ng-template>
     </div>
     <div nz-col nzMd="18" nzSm="24">
-      <nz-table
-        #dynamicTable
-        nzTableLayout="auto"
-        nzSize="small"
-        nzBordered
-        sizeChanger="true"
-        nzShowSizeChanger
-        [nzData]="query.results.rows"
-        [nzFrontPagination]="false"
-        [nzTotal]="query.results.records"
-        [nzPageSizeOptions]="query.params.pageSizeOptions"
-        [nzPageSize]="query.params.pageSize"
-        [nzPageIndex]="query.params.pageNumber"
-        [nzLoading]="this.query.tableLoading"
-        (nzQueryParams)="onQueryParamsChange($event)"
-        nzWidth="100%"
-      >
+      <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered sizeChanger="true" nzShowSizeChanger
+        [nzData]="query.results.rows" [nzFrontPagination]="false" [nzTotal]="query.results.records"
+        [nzPageSizeOptions]="query.params.pageSizeOptions" [nzPageSize]="query.params.pageSize"
+        [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+        (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
         <thead>
           <tr>
-            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+              (nzCheckedChange)="onTableAllChecked($event)"></th>
             <th nzAlign="center" style="display: none">{{ 'mxk.text.id' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.username' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.displayName' | i18n }}</th>
@@ -82,30 +59,26 @@
             <th nzAlign="center">{{ 'mxk.users.department' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.jobTitle' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.gender' | i18n }}</th>
-            <th nzAlign="center"
-              ><a>{{ 'mxk.text.action' | i18n }}</a></th
-            >
+            <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
           </tr>
         </thead>
         <tbody>
           <tr *ngFor="let data of query.results.rows">
-            <td
-              [nzChecked]="query.tableCheckedId.has(data.id)"
-              [nzDisabled]="data.disabled"
-              (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-            ></td>
+            <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+              (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
             <td nzAlign="left" style="display: none">
               <span>{{ data.id }}</span>
             </td>
-            <td nzAlign="center"> {{ data.username }}</td>
-            <td nzAlign="center"> {{ data.displayName }}</td>
-            <td nzAlign="center"> {{ data.employeeNumber }}</td>
-            <td nzAlign="center"> {{ data.department }}</td>
-            <td nzAlign="center"> {{ data.jobTitle }}</td>
-            <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' | i18n) }}</td>
+            <td nzAlign="left"> {{ data.username }}</td>
+            <td nzAlign="left"> {{ data.displayName }}</td>
+            <td nzAlign="left"> {{ data.employeeNumber }}</td>
+            <td nzAlign="left"> {{ data.department }}</td>
+            <td nzAlign="left"> {{ data.jobTitle }}</td>
+            <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' |
+              i18n) }}</td>
           </tr>
         </tbody>
       </nz-table>
     </div>
   </div>
-</nz-card>
+</nz-card>

+ 45 - 64
maxkey-web-frontend/maxkey-web-mgt-app/src/app/routes/users/users.component.html

@@ -7,23 +7,18 @@
         <nz-form-item>
           <nz-form-label nzFor="name">{{ 'mxk.users.username' | i18n }}</nz-form-label>
           <nz-form-control>
-            <input
-              nz-input
-              [(ngModel)]="query.params.username"
-              [ngModelOptions]="{ standalone: true }"
-              name="username"
-              placeholder=""
-              id="username"
-            />
+            <input nz-input [(ngModel)]="query.params.username" [ngModelOptions]="{ standalone: true }" name="username"
+              placeholder="" id="username" />
           </nz-form-control>
         </nz-form-item>
       </div>
       <div nz-col [nzSpan]="query.expandForm ? 24 : 8" [class.text-right]="query.expandForm">
-        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' | i18n }}</button>
-        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' | i18n }}</button>
+        <button nz-button type="submit" [nzType]="'primary'" [nzLoading]="query.submitLoading">{{ 'mxk.text.query' |
+          i18n }}</button>
+        <button nz-button type="reset" (click)="onReset()" class="mx-sm" style="display: none">{{ 'mxk.text.reset' |
+          i18n }}</button>
         <button nz-button (click)="query.expandForm = !query.expandForm" class="mx-sm" style="display: none">
-          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button
-        >
+          {{ query.expandForm ? ('mxk.text.collapse' | i18n) : ('mxk.text.expand' | i18n) }}</button>
       </div>
     </div>
   </form>
@@ -34,18 +29,11 @@
       <button nz-button type="button" [nzType]="'primary'" (click)="onAdd($event)">{{ 'mxk.text.add' | i18n }}</button>
       <button nz-button type="button" (click)="onBatchDelete($event)" [nzType]="'primary'" nzDanger class="mx-sm">{{
         'mxk.text.delete' | i18n
-      }}</button>
+        }}</button>
     </div>
-    <div nz-col nzMd="6" nzSm="24">
-      <nz-tree
-        nzShowLine="false"
-        [nzCheckable]="treeNodes.checkable"
-        nzBlockNode
-        [nzData]="treeNodes.nodes"
-        (nzClick)="activeNode($event)"
-        (nzDblClick)="openFolder($event)"
-        [nzTreeTemplate]="nzTreeTemplate"
-      ></nz-tree>
+    <div nz-col nzMd="6" nzSm="24" class="grid-border">
+      <nz-tree nzShowLine="false" [nzCheckable]="treeNodes.checkable" nzBlockNode [nzData]="treeNodes.nodes"
+        (nzClick)="activeNode($event)" (nzDblClick)="openFolder($event)" [nzTreeTemplate]="nzTreeTemplate"></nz-tree>
       <ng-template #nzTreeTemplate let-node let-origin="origin">
         <span class="custom-node">
           <span *ngIf="!node.isLeaf" (contextmenu)="contextMenu($event, menu)">
@@ -65,27 +53,16 @@
         </ul>
       </nz-dropdown-menu>
     </div>
-    <div nz-col nzMd="18" nzSm="24">
-      <nz-table
-        #dynamicTable
-        nzTableLayout="auto"
-        nzSize="small"
-        nzBordered
-        sizeChanger="true"
-        nzShowSizeChanger
-        [nzData]="query.results.rows"
-        [nzFrontPagination]="false"
-        [nzTotal]="query.results.records"
-        [nzPageSizeOptions]="query.params.pageSizeOptions"
-        [nzPageSize]="query.params.pageSize"
-        [nzPageIndex]="query.params.pageNumber"
-        [nzLoading]="this.query.tableLoading"
-        (nzQueryParams)="onQueryParamsChange($event)"
-        nzWidth="100%"
-      >
+    <div nz-col nzMd="18" nzSm="24" class="grid-border">
+      <nz-table #dynamicTable nzTableLayout="auto" nzSize="small" nzBordered sizeChanger="true" nzShowSizeChanger
+        [nzData]="query.results.rows" [nzFrontPagination]="false" [nzTotal]="query.results.records"
+        [nzPageSizeOptions]="query.params.pageSizeOptions" [nzPageSize]="query.params.pageSize"
+        [nzPageIndex]="query.params.pageNumber" [nzLoading]="this.query.tableLoading"
+        (nzQueryParams)="onQueryParamsChange($event)" nzWidth="100%">
         <thead>
           <tr>
-            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate" (nzCheckedChange)="onTableAllChecked($event)"></th>
+            <th [nzChecked]="query.checked" [nzIndeterminate]="query.indeterminate"
+              (nzCheckedChange)="onTableAllChecked($event)"></th>
             <th nzAlign="center" style="display: none">{{ 'mxk.text.id' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.username' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.displayName' | i18n }}</th>
@@ -93,40 +70,44 @@
             <th nzAlign="center">{{ 'mxk.users.department' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.jobTitle' | i18n }}</th>
             <th nzAlign="center">{{ 'mxk.users.gender' | i18n }}</th>
-            <th nzAlign="center"
-              ><a>{{ 'mxk.text.action' | i18n }}</a></th
-            >
+            <th nzAlign="center">{{ 'mxk.text.status' | i18n }}</th>
+            <th nzAlign="center"><a>{{ 'mxk.text.action' | i18n }}</a></th>
           </tr>
         </thead>
         <tbody>
           <tr *ngFor="let data of query.results.rows">
-            <td
-              [nzChecked]="query.tableCheckedId.has(data.id)"
-              [nzDisabled]="data.disabled"
-              (nzCheckedChange)="onTableItemChecked(data.id, $event)"
-            ></td>
+            <td [nzChecked]="query.tableCheckedId.has(data.id)" [nzDisabled]="data.disabled"
+              (nzCheckedChange)="onTableItemChecked(data.id, $event)"></td>
             <td nzAlign="left" style="display: none">
               <span>{{ data.id }}</span>
             </td>
-            <td nzAlign="center"> {{ data.username }}</td>
-            <td nzAlign="center"> {{ data.displayName }}</td>
-            <td nzAlign="center"> {{ data.employeeNumber }}</td>
-            <td nzAlign="center"> {{ data.department }}</td>
-            <td nzAlign="center"> {{ data.jobTitle }}</td>
-            <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' | i18n) }}</td>
-            <td nzAlign="left" nzBreakWord="false"
-              ><div nz-col>
-                <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'" style="float: left">{{
+            <td nzAlign="left"> {{ data.username }}</td>
+            <td nzAlign="left"> {{ data.displayName }}</td>
+            <td nzAlign="left"> {{ data.employeeNumber }}</td>
+            <td nzAlign="left"> {{ data.department }}</td>
+            <td nzAlign="left"> {{ data.jobTitle }}</td>
+            <td nzAlign="center"> {{ data.gender == 1 ? ('mxk.users.gender.female' | i18n) : ('mxk.users.gender.male' |
+              i18n) }}</td>
+            <td nzAlign="center">
+              <i *ngIf="data.status == 1" nz-icon nzType="check-circle" nzTheme="fill" style="color: green"> </i>
+              <i *ngIf="data.status == 2" nz-icon nzType="stop" nzTheme="fill" style="color: gray"></i>
+              <i *ngIf="data.status == 5" nz-icon nzType="lock" nzTheme="fill" style="color: orange"></i>
+              <i *ngIf="data.status == 9" nz-icon nzType="close-circle" nzTheme="fill" style="color: red"></i>
+            </td>
+            <td nzAlign="left" nzBreakWord="false">
+              <div nz-col>
+                <button nz-button type="button" (click)="onEdit($event, data.id)" [nzType]="'primary'"
+                  style="float: left">{{
                   'mxk.text.edit' | i18n
-                }}</button>
+                  }}</button>
                 <button nz-button type="button" (click)="onDelete($event, data.id)" [nzType]="'primary'" nzDanger>{{
                   'mxk.text.delete' | i18n
-                }}</button></div
-              ></td
-            >
+                  }}</button>
+              </div>
+            </td>
           </tr>
         </tbody>
       </nz-table>
     </div>
   </div>
-</nz-card>
+</nz-card>

+ 2 - 2
maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/en-US.json

@@ -252,7 +252,7 @@
       "sslSwitch": "SSL",
       "filters": "Filters",
       "basedn": "Base DN",
-      "msadDomain": "Active Directory Domain",
+      "msadDomain": "MSAD Domain",
       "accountMapping": "Account Mapping",
       "trustStore": "TrustStore",
       "trustStorePassword": "TrustStore Password"
@@ -267,7 +267,7 @@
       "isdefault":"Is Default"
     },
     "accountsstrategy" :{
-      "name":"Strategy",
+      "name":"Strategy Name",
       "appIcon":"App Icon",
       "appId":"App Id",
       "appName":"App Name",

+ 7 - 7
maxkey-web-frontend/maxkey-web-mgt-app/src/assets/i18n/zh-CN.json

@@ -57,11 +57,11 @@
       },
       "audit" : {
         "": "日志审计",
-        "logins": "登录日志",
+        "logins": "系统登录日志",
         "loginapps": "应用登录日志",
         "synchronizer": "同步器日志",
         "connector": "连接器日志",
-        "operate": "管理日志"
+        "operate": "系统管理日志"
       }
     },
     "home":{
@@ -211,7 +211,7 @@
     "accounts":{
       "userId":"用户编号",
       "username":"登录账号",
-      "displayName":"用户名",
+      "displayName":"名",
       "appName":"应用名称",
       "appId":"应用编号",
       "relatedUsername":"应用账号",
@@ -253,7 +253,7 @@
       "sslSwitch": "SSL",
       "filters": "过滤器",
       "basedn": "基本DN",
-      "msadDomain": "Active Directory域",
+      "msadDomain": "AD域",
       "accountMapping": "账号映射",
       "trustStore": "证书",
       "trustStorePassword": "证书密钥"
@@ -269,7 +269,7 @@
     },
     "accountsstrategy" :{
       "id":"策略编码",
-      "name":"策略",
+      "name":"策略名称",
       "appIcon":"应用图标",
       "appId":"应用编码",
       "appName":"应用名称",
@@ -568,7 +568,7 @@
       "login.id":"编号",
       "login.sessionId":"会话",
       "login.username":"登录名",
-      "login.displayName":"用户名称",
+      "login.displayName":"姓名",
       "login.provider":"提供商",
       "login.message":"状态",
       "login.loginType":"登录方式",
@@ -586,7 +586,7 @@
       "loginapps.sessionId":"会话",
       "loginapps.userId":"用户编号",
       "loginapps.username":"登录名",
-      "loginapps.displayName":"用户名",
+      "loginapps.displayName":"名",
       "loginapps.appId":"应用编号",
       "loginapps.appName":"应用名称",
       "loginapps.loginTime":"登录时间",

+ 7 - 4
maxkey-web-frontend/maxkey-web-mgt-app/src/style-icons-auto.ts

@@ -1,19 +1,18 @@
 /*
  * Copyright [2022] [MaxKey of copyright http://www.maxkey.top]
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *     http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
- 
 
 /*
  * Automatically generated by 'ng g ng-alain:plugin icon'
@@ -50,6 +49,7 @@ import {
   LaptopOutline,
   LikeOutline,
   LockOutline,
+  LockFill,
   LogoutOutline,
   MailOutline,
   MenuFoldOutline,
@@ -65,6 +65,7 @@ import {
   ShoppingCartOutline,
   SoundOutline,
   StarOutline,
+  StopFill,
   TaobaoCircleOutline,
   TaobaoOutline,
   TeamOutline,
@@ -137,6 +138,7 @@ export const ICONS_AUTO = [
   LaptopOutline,
   LikeOutline,
   LockOutline,
+  LockFill,
   LogoutOutline,
   MailOutline,
   MenuFoldOutline,
@@ -156,6 +158,7 @@ export const ICONS_AUTO = [
   ShoppingCartOutline,
   SoundOutline,
   StarOutline,
+  StopFill,
   TaobaoCircleOutline,
   TaobaoOutline,
   TeamOutline,

+ 4 - 0
maxkey-web-frontend/maxkey-web-mgt-app/src/styles/theme.less

@@ -58,4 +58,8 @@
     color: white;
 
     /**  background-color: aliceblue */
+}
+
+.grid-border{
+  border: 1px solid #f0f0f0;
 }

+ 1 - 1
maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtListenerConfig.java

@@ -46,7 +46,7 @@ public class MaxKeyMgtListenerConfig  implements InitializingBean {
     			SessionListenerAdapter.class,
     			scheduler,
     			new ListenerParameter().add("sessionManager",sessionManager).build(),
-    			"0 0/10 * * * ?",//10 minutes
+    			"0 0/1 * * * ?",//10 minutes
     			SessionListenerAdapter.class.getSimpleName()
     		);
         _logger.debug("Session ListenerAdapter inited .");

+ 26 - 5
maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/listener/SessionListenerAdapter.java

@@ -16,9 +16,12 @@
 package org.maxkey.listener;
 
 import java.io.Serializable;
+import java.util.Date;
 
+import org.maxkey.authn.session.Session;
 import org.maxkey.authn.session.SessionManager;
 import org.maxkey.entity.HistoryLogin;
+import org.maxkey.util.DateUtils;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
@@ -41,14 +44,32 @@ public class SessionListenerAdapter extends ListenerAdapter   implements Job , S
         jobStatus = JOBSTATUS.RUNNING;
         try {
             if(sessionManager != null) { 
-            	for (HistoryLogin onlineSession : sessionManager.querySessions()) {
-            		if(sessionManager.get(onlineSession.getSessionId()) == null) {
+            	int sessionCount = 0;
+            	for (HistoryLogin login : sessionManager.querySessions()) {
+            		Session session = sessionManager.get(login.getSessionId());
+            		if(session == null) {
+            			_logger.debug("user {} session {}  Login at {} and TimeOut at {} ." ,
+            					login.getUsername(), 
+            					login.getId(),
+            					login.getLoginTime(),
+            					DateUtils.formatDateTime(new Date())
+            			);
             			sessionManager.terminate(
-            					onlineSession.getSessionId(), 
-            					onlineSession.getUserId(), 
-            					onlineSession.getUsername());
+            					login.getSessionId(), 
+            					login.getUserId(), 
+            					login.getUsername());
+            		}else {
+            			_logger.debug("user {} session {} Login at {} , Last Access at {} will Expired at {}." ,
+            					login.getUsername(), 
+            					login.getId(),
+            					session.getStartTimestamp(),
+            					session.getLastAccessTime(),
+            					session.getExpiredTime()
+            			);
+            			sessionCount ++ ;
             		}
             	}
+            	_logger.debug("current session count {} ." ,sessionCount);
             }
             _logger.debug("finished  " );
             jobStatus = JOBSTATUS.FINISHED;

+ 3 - 3
maxkey-webs/maxkey-web-mgt/src/main/resources/application-http.properties

@@ -40,11 +40,11 @@ maxkey.server.persistence                       =0
 #identity none, Kafka ,RocketMQ
 maxkey.server.message.queue                     =${SERVER_MESSAGE_QUEUE:none}
 
-maxkey.session.timeout                          =${SERVER_SESSION_TIMEOUT:1800}
+maxkey.session.timeout                          =${SERVER_SESSION_TIMEOUT:600}
 
 maxkey.auth.jwt.issuer                          =${maxkey.server.uri}
-
-maxkey.auth.jwt.expires                         =900
+#default 900
+maxkey.auth.jwt.expires                         =300
 maxkey.auth.jwt.secret                          =7heM-14BtxjyKPuH3ITIm7q2-ps5MuBirWCsrrdbzzSAOuSPrbQYiaJ54AeA0uH2XdkYy3hHAkTFIsieGkyqxOJZ_dQzrCbaYISH9rhUZAKYx8tUY0wkE4ArOC6LqHDJarR6UIcMsARakK9U4dhoOPO1cj74XytemI-w6ACYfzRUn_Rn4e-CQMcnD1C56oNEukwalf06xVgXl41h6K8IBEzLVod58y_VfvFn-NGWpNG0fy_Qxng6dg8Dgva2DobvzMN2eejHGLGB-x809MvC4zbG7CKNVlcrzMYDt2Gt2sOVDrt2l9YqJNfgaLFjrOEVw5cuXemGkX1MvHj6TAsbLg
 maxkey.auth.jwt.refresh.secret                  =7heM-14BtxjyKPuH3ITIm7q2-ps5MuBirWCsrrdbzzSAOuSPrbQYiaJ54AeA0uH2XdkYy3hHAkTFIsieGkyqxOJZ_dQzrCbaYISH9rhUZAKYx8tUY0wkE4ArOC6LqHDJarR6UIcMsARakK9U4dhoOPO1cj74XytemI-w6ACYfzRUn_Rn4e-CQMcnD1C56oNEukwalf06xVgXl41h6K8IBEzLVod58y_VfvFn-NGWpNG0fy_Qxng6dg8Dgva2DobvzMN2eejHGLGB-x809MvC4zbG7CKNVlcrzMYDt2Gt2sOVDrt2l9YqJNfgaLFjrOEVw5cuXemGkX1MvHj6TAsbLg
 ############################################################################