diff --git a/README.md b/README.md index 16d096be15bcb0463bb2f8f9a0ce3f77d2695a64..4d94f27977e14b4bf4da3a61774d440d14a24521 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,12 @@ --- 变化: -- springmvc 切换为springboot -- 安全框架切换未spring security +- springmvc切换为springboot +- 安全框架切换为spring security - kafka资源采用apache commons pool池化 +- 完成Thymeleaf前端UI改造 --- 期望: -- 前端jsp切换HTML模板引擎 -- 新增Kafka主题消息实时更新 \ No newline at end of file +- 新增Kafka主题消息实时更新 +- AngularJS框架替换JQuery \ No newline at end of file diff --git a/pom.xml b/pom.xml index f8838bae586e17d4309c646aafec2ea6f5a714f8..aae6e2a178bc8fabd26c08c261002d134f25b52e 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.springframework.boot spring-boot-starter-parent - 2.1.4.RELEASE + 2.3.0.RELEASE @@ -37,6 +37,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-thymeleaf + org.springframework.boot spring-boot-starter-actuator @@ -46,15 +50,6 @@ spring-boot-starter-test test - - javax.servlet - jstl - - - org.apache.tomcat.embed - tomcat-embed-jasper - provided - org.springframework.boot spring-boot-starter-quartz @@ -176,13 +171,6 @@ **/*.woff2 false - - - src/main/webapp - - **/*.* - - true diff --git a/src/main/java/org/smartloli/kafka/eagle/web/constant/HttpConstants.java b/src/main/java/org/smartloli/kafka/eagle/web/constant/HttpConstants.java index 61364110aea519120128d2847555f66957fe840f..22ce23cd712553aad8e15aee5349065b1fe01221 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/constant/HttpConstants.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/constant/HttpConstants.java @@ -7,13 +7,15 @@ package org.smartloli.kafka.eagle.web.constant; */ public class HttpConstants { + /** 根路径 **/ + public final static String ROOT_URL = "/"; + /**登陆页**/ - public final static String LOGIN_URL = "/"; + public final static String LOGIN_URL = "/account/signin"; /**登陆逻辑**/ public final static String LOGIN_ACTION_URL = "/account/signin/action"; - /** 退出登陆 **/ public final static String LOGOUT_URL = "/account/signout"; diff --git a/src/main/java/org/smartloli/kafka/eagle/web/constant/KafkaConstants.java b/src/main/java/org/smartloli/kafka/eagle/web/constant/KafkaConstants.java index b4aa6c78c7287ac409f272460a16440f76449e3f..5e6e6228070a6599f8dbcb8c3f1a6c6b2dc6ed2f 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/constant/KafkaConstants.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/constant/KafkaConstants.java @@ -61,9 +61,15 @@ public final class KafkaConstants { //KafkaConstants public static final String TITLE = "Kafka Eagle Alert"; - public static final String LOGIN_USER_SESSION = "LOGIN_USER_SESSION"; + public static final String LOGIN_USER_NAME = "LOGIN_USER_NAME"; + public static final String SYSTEM_VERSION = "version"; public static final String UNKNOW_USER = "__unknow__"; + + //错误提示新体 public static final String ERROR_LOGIN = "error_msg"; + //错误提示信息是否显示 + public static final String ERROR_DISPLAY = "error_display"; + public static final String ADMIN = "admin"; public static final int ADMINISTRATOR = 1; //管理员权限 public static final int ANONYMOUS = 0; //匿名权限 @@ -90,6 +96,13 @@ public final class KafkaConstants { public static final String KAFKA_ZK_MIN_IDLE = "kafka.zk.min.idle"; public static final String KAFKA_ZK_MAX_IDLE = "kafka.zk.max.idle"; public static final String KAFKA_ZK_SESSION_TIMEOUT_MS = "kafka.zk.session.timeout.ms"; + public static final String BROKER_IDS_PATH = "/brokers/ids"; + public static final String BROKER_TOPICS_PATH = "/brokers/topics"; + public static final String DELETE_TOPICS_PATH = "/admin/delete_topics"; + public static final String CONSUMERS_PATH = "/consumers"; + public static final String OWNERS = "/owners"; + public static final String TOPIC_ISR = "/brokers/topics/%s/partitions/%s/state"; + @Value("${" + KAFKA_EAGLE_SQL_TOPIC_RECORDS_MAX + ":5000}") public static Long POSITION; diff --git a/src/main/java/org/smartloli/kafka/eagle/web/constant/TopicConstants.java b/src/main/java/org/smartloli/kafka/eagle/web/constant/TopicConstants.java index 20c0838e0740ea8a43036f27183000ef9957deb2..8617f350a9b07b4d6fc05528a2d3ce5e1efb0f61 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/constant/TopicConstants.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/constant/TopicConstants.java @@ -28,9 +28,9 @@ public final class TopicConstants { public static final long TOPIC_BROKER_SKEW_NORMAL = 30; public static final long TOPIC_BROKER_LEADER_SKEW_ERROR = 80; public static final long TOPIC_BROKER_LEADER_SKEW_NORMAL = 30; - public static final int RUNNING = 0; - public static final int SHUTDOWN = 1; - public static final int PENDING = 2; + public static final Integer RUNNING = 0; + public static final Integer SHUTDOWN = 1; + public static final Integer PENDING = 2; public static final String RUNNING_STRING = "Running"; public static final String SHUTDOWN_STRING = "Shutdown"; public static final String PENDING_STRING = "Pending"; diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/AccountController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/AccountController.java index b15f4dce7b9ea6ba0bef23bd9fc27b66b90c5c48..75472892d1be7323e8fcddee9ddd6996473b7c50 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/AccountController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/AccountController.java @@ -26,7 +26,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -46,13 +45,6 @@ public class AccountController { @Autowired private UserInfoService userInfoService; - /** 跳转登陆页 */ - @GetMapping("/signin") - @ApiOperation("跳转登陆页") - public String signin() { - return "/account/signin"; - } - /** 重置密码 */ @PostMapping(value = "/resetPassword") @ApiOperation("重置密码") diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/AlarmController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/AlarmController.java index 11d5b501195500350417616f98e5098c8617c8e5..cded46fe62170f3178689ecbecc4cb8e5da473ce 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/AlarmController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/AlarmController.java @@ -134,7 +134,7 @@ public class AlarmController { /** * Get alarmer consumer group by ajax. */ - @GetMapping("/alarm/consumer/group/ajax") + @GetMapping("/alarm/consumer/group") @ApiOperation("获取消费组信息") @ResponseBody public String alarmConsumerGroupAjax(HttpServletRequest request) { @@ -148,7 +148,7 @@ public class AlarmController { } /** Get alarmer consumer group by ajax. */ - @RequestMapping(value = "/alarm/consumer/{group}/topic/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/consumer/{group}/topic", method = RequestMethod.GET) @ResponseBody public String alarmConsumerTopicAjax(@PathVariable("group") String group, HttpServletRequest request) { @@ -202,7 +202,7 @@ public class AlarmController { } /** Get alarmer datasets by ajax. */ - @RequestMapping(value = "/alarm/list/table/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/list/table", method = RequestMethod.GET) @ResponseBody public String alarmConsumerListAjax(HttpServletRequest request) { String aoData = request.getParameter("aoData"); @@ -281,7 +281,7 @@ public class AlarmController { } /** Switch cluster alert info. */ - @RequestMapping(value = "/alarm/list/modify/switch/{id}/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/list/modify/switch/{id}", method = RequestMethod.GET) @ResponseBody public String modifyConsumerAlertSwitchByIdAjax(@PathVariable("id") int id) { AlarmConsumerInfo alarmConsumer = alertService.findAlarmConsumerAlertById(id); @@ -307,7 +307,7 @@ public class AlarmController { * Get alarm consumer detail, such consumer group(cgroup) or topic, and * alarm group(agroup). */ - @RequestMapping(value = "/alarm/consumer/detail/{type}/{id}/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/consumer/detail/{type}/{id}", method = RequestMethod.GET) @ResponseBody public String getAlarmConsumerDetailByIdAjax(@PathVariable("id") int id, @PathVariable("type") String type) { JSONObject object = new JSONObject(); @@ -333,7 +333,7 @@ public class AlarmController { } /** Get alert info. */ - @RequestMapping(value = "/alarm/consumer/modify/{id}/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/consumer/modify/{id}", method = RequestMethod.GET) @ResponseBody public String findAlarmConsumerByIdAjax(@PathVariable("id") int id) { return alertService.findAlarmConsumerAlertById(id).toString(); @@ -415,7 +415,7 @@ public class AlarmController { } /** Get alarmer cluster history datasets by ajax. */ - @RequestMapping(value = "/alarm/history/table/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/history/table", method = RequestMethod.GET) @ResponseBody public String alarmClusterHistoryAjax(HttpServletRequest request) { String aoData = request.getParameter("aoData"); @@ -492,7 +492,7 @@ public class AlarmController { } /** Get alarm cluster detail, such server or alarm group. */ - @RequestMapping(value = "/alarm/cluster/detail/{type}/{id}/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/cluster/detail/{type}/{id}", method = RequestMethod.GET) @ResponseBody public String getAlarmClusterDetailByIdAjax(@PathVariable("id") int id, @PathVariable("type") String type) { JSONObject object = new JSONObject(); @@ -516,14 +516,14 @@ public class AlarmController { } /** Get alert info. */ - @RequestMapping(value = "/alarm/history/modify/{id}/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/history/modify/{id}", method = RequestMethod.GET) @ResponseBody public String findClusterAlertByIdAjax(@PathVariable("id") int id) { return alertService.findAlarmClusterAlertById(id).toString(); } /** Switch cluster alert info. */ - @RequestMapping(value = "/alarm/history/modify/switch/{id}/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/history/modify/switch/{id}", method = RequestMethod.GET) @ResponseBody public String modifyClusterAlertSwitchByIdAjax(@PathVariable("id") int id) { AlarmClusterInfo alarmCluster = alertService.findAlarmClusterAlertById(id); @@ -569,7 +569,7 @@ public class AlarmController { } /** Get alarm type list, such as email, dingding, wechat and so on. */ - @RequestMapping(value = "/alarm/type/list/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/type/list", method = RequestMethod.GET) @ResponseBody public String alarmTypeListAjax() { JSONObject object = new JSONObject(); @@ -578,7 +578,7 @@ public class AlarmController { } /** Get alarm cluster type list, such as kafka, zookeeper and so on. */ - @RequestMapping(value = "/alarm/cluster/{type}/list/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/cluster/{type}/list", method = RequestMethod.GET) @ResponseBody public String alarmClusterTypeListAjax(@PathVariable("type") String type, HttpServletRequest request) { JSONObject object = new JSONObject(); @@ -601,7 +601,7 @@ public class AlarmController { } /** Check alarm group name. */ - @RequestMapping(value = "/alarm/check/{group}/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/check/{group}", method = RequestMethod.GET) @ResponseBody public String alarmGroupCheckAjax(@PathVariable("group") String group, HttpServletRequest request) { HttpSession session = request.getSession(); @@ -661,7 +661,7 @@ public class AlarmController { } /** Get alarm config list. */ - @RequestMapping(value = "/alarm/config/table/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/config/table", method = RequestMethod.GET) @ResponseBody public String getAlarmConfigTableAjax(HttpServletRequest request) { String aoData = request.getParameter("aoData"); @@ -739,7 +739,7 @@ public class AlarmController { } /** Get alarm config by group name. */ - @RequestMapping(value = "/alarm/config/get/{type}/{group}/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/config/get/{type}/{group}", method = RequestMethod.GET) @ResponseBody public String getAlarmConfigDetailByGroupAjax(@PathVariable("type") String type, @PathVariable("group") String group, HttpServletRequest request) { HttpSession session = request.getSession(); @@ -788,7 +788,7 @@ public class AlarmController { } /** Send test message by alarm config . */ - @RequestMapping(value = "/alarm/config/test/send/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/alarm/config/test/send", method = RequestMethod.GET) @ResponseBody public String sendTestMsgAlarmConfig(HttpServletRequest request) { String type = request.getParameter("type"); diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/BigScreenController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/BigScreenController.java index 9a21e188f5410411955b6a3a035d2e62e2c3d0e1..8fd6eee21201bf08ab76058463742e054aacefb3 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/BigScreenController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/BigScreenController.java @@ -51,7 +51,7 @@ public class BigScreenController { return "/bscreen/bscreen"; } - @GetMapping("/bs/brokers/ins/outs/realrate/ajax") + @GetMapping("/bs/brokers/ins/outs/realrate") @ResponseBody @ApiOperation("获取实时消费数据") public String getProducerAndConsumerRealRateAjax(HttpServletRequest request) { @@ -61,7 +61,7 @@ public class BigScreenController { } /** Get producer and consumer real rate data by ajax. */ - @GetMapping(value = "/bs/topic/total/logsize/ajax") + @GetMapping(value = "/bs/topic/total/logsize") @ResponseBody @ApiOperation("获取消费/生产者实时消费数据") public String getTopicTotalLogSizeAjax(HttpServletRequest request) { @@ -70,7 +70,7 @@ public class BigScreenController { return bscreen.getTopicTotalLogSize(clusterAlias); } - @GetMapping("/bs/{type}/history/ajax") + @GetMapping("/bs/{type}/history") @ResponseBody @ApiOperation("获取生产/消费历史") public String getProducerOrConsumerHistoryAjax(@PathVariable("type") String type, HttpServletRequest request) { @@ -79,7 +79,7 @@ public class BigScreenController { return bscreen.getProducerOrConsumerHistory(clusterAlias, type); } - @GetMapping("/bs/{dtype}/day/ajax") + @GetMapping("/bs/{dtype}/day") @ResponseBody @ApiOperation("获取当天消费/生产数据") public String getTodayOrHistoryConsumerProducerAjax(@PathVariable("dtype") String dtype, HttpServletRequest request) { @@ -88,7 +88,7 @@ public class BigScreenController { return bscreen.getTodayOrHistoryConsumerProducer(clusterAlias, dtype); } - @GetMapping("/bs/topic/total/capacity/ajax") + @GetMapping("/bs/topic/total/capacity") @ResponseBody @ApiOperation("获取当天Kafak容量") public String getTopicTotalCapacityAjax(HttpServletRequest request) { diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/ClusterController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/ClusterController.java index 1823b294f8518e1297a2c5f2dcf6f9b7dc221726..b19cfa45e08a5122e33c689ebefe47b15931f8a3 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/ClusterController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/ClusterController.java @@ -71,7 +71,7 @@ public class ClusterController { } /** Get cluster data by ajax. */ - @GetMapping("/cluster/info/{type}/ajax") + @GetMapping("/cluster/info/{type}") @ResponseBody @ApiOperation("获取集群数据") public String clusterAjax(@PathVariable("type") String type, HttpServletRequest request) { @@ -198,7 +198,7 @@ public class ClusterController { } } - @GetMapping("/cluster/info/multicluster/ajax") + @GetMapping("/cluster/info/multicluster") @ResponseBody @ApiOperation("获取多集群信息") public String multiClusterAjax(HttpServletRequest request) { @@ -252,7 +252,7 @@ public class ClusterController { return target.toJSONString(); } - @GetMapping("/cluster/zk/islive/ajax") + @GetMapping("/cluster/zk/islive") @ResponseBody @ApiOperation("获取集群Zookeeper信息") public String zkCliLiveAjax(HttpServletRequest request) { @@ -261,7 +261,7 @@ public class ClusterController { return clusterService.status(clusterAlias).toJSONString(); } - @GetMapping("/cluster/zk/cmd/ajax") + @GetMapping("/cluster/zk/cmd") @ResponseBody @ApiOperation("指定Zookeeper命令") public String zkCliCmdAjax(HttpServletRequest request) { diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/ConsumersController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/ConsumersController.java index 8e2e6897ec930cafe3d7db272b407527571b8dd1..8a9ad067e492f66643fd4d6ab6e43085f907661b 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/ConsumersController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/ConsumersController.java @@ -24,6 +24,7 @@ import org.smartloli.kafka.eagle.web.config.KafkaClustersConfig; import org.smartloli.kafka.eagle.web.constant.KafkaConstants; import org.smartloli.kafka.eagle.web.constant.TopicConstants; import org.smartloli.kafka.eagle.web.protocol.DisplayInfo; +import org.smartloli.kafka.eagle.web.protocol.TopicConsumerInfo; import org.smartloli.kafka.eagle.web.service.ConsumerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -38,6 +39,7 @@ import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.net.URLDecoder; import java.net.URLEncoder; +import java.util.List; /** * Kafka 消费者控制器 @@ -70,7 +72,7 @@ public class ConsumersController { /** * Get consumer data by ajax. */ - @GetMapping("/consumers/info/ajax") + @GetMapping("/consumers/info") @ResponseBody public String consumersGraphAjax(HttpServletRequest request) { HttpSession session = request.getSession(); @@ -81,7 +83,7 @@ public class ConsumersController { } /** Get consumer datasets by ajax. */ - @RequestMapping(value = "/consumer/list/table/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/consumer/list/table", method = RequestMethod.GET) @ResponseBody public String consumerTableAjax(HttpServletResponse response, HttpServletRequest request) { String aoData = request.getParameter("aoData"); @@ -150,7 +152,7 @@ public class ConsumersController { } /** Get consumer data through group by ajax. */ - @RequestMapping(value = "/consumer/group/table/ajax", method = RequestMethod.GET) + @RequestMapping(value = "/consumer/group/table", method = RequestMethod.GET) @ResponseBody public String consumerTableListAjax(HttpServletRequest request) { String aoData = request.getParameter("aoData"); @@ -176,17 +178,15 @@ public class ConsumersController { HttpSession session = request.getSession(); String clusterAlias = session.getAttribute(KafkaConstants.CLUSTER_ALIAS).toString(); String formatter = kafkaClustersConfig.getClusterConfigByName(clusterAlias).getOffsetStorage(); - JSONArray consumerDetails = JSON.parseArray(consumerService.getConsumerDetail(clusterAlias, formatter, group)); + List topicConsumerInfos = consumerService.getConsumerDetail(clusterAlias, formatter, group); int offset = 0; JSONArray aaDatas = new JSONArray(); - for (Object object : consumerDetails) { - JSONObject consumerDetail = (JSONObject) object; + for (TopicConsumerInfo topicConsumerInfo : topicConsumerInfos) { if (offset < (iDisplayLength + iDisplayStart) && offset >= iDisplayStart) { JSONObject obj = new JSONObject(); - String topic = consumerDetail.getString("topic"); - obj.put("id", consumerDetail.getInteger("id")); + String topic = topicConsumerInfo.getTopic(); + obj.put("id", topicConsumerInfo.getId()); obj.put("topic", topic); - try { group = URLEncoder.encode(group, "UTF-8"); topic = URLEncoder.encode(topic, "UTF-8"); @@ -194,9 +194,9 @@ public class ConsumersController { e.printStackTrace(); } - if (consumerDetail.getInteger("isConsumering") == TopicConstants.RUNNING) { + if (TopicConstants.RUNNING.equals(topicConsumerInfo.getConsuming())) { obj.put("isConsumering", "Running"); - } else if (consumerDetail.getInteger("isConsumering") == TopicConstants.SHUTDOWN) { + } else if (TopicConstants.SHUTDOWN.equals(topicConsumerInfo.getConsuming())) { obj.put("isConsumering", "Shutdown"); } else { obj.put("isConsumering", "Pending"); @@ -208,8 +208,8 @@ public class ConsumersController { JSONObject target = new JSONObject(); target.put("sEcho", sEcho); - target.put("iTotalRecords", consumerDetails.size()); - target.put("iTotalDisplayRecords", consumerDetails.size()); + target.put("iTotalRecords", topicConsumerInfos.size()); + target.put("iTotalDisplayRecords", topicConsumerInfos.size()); target.put("aaData", aaDatas); return target.toJSONString(); } diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/DashboardController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/DashboardController.java index 9be8ecae126be06dcfd96b13d35427e3dd90946c..ffb0d3d77e1e3397f16ab9dda35d036404c9f964 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/DashboardController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/DashboardController.java @@ -45,7 +45,7 @@ public class DashboardController { @Autowired private DashboardService dashboradService; - @GetMapping(value = "/dash/kafka/ajax") + @GetMapping(value = "/dash/kafka") @ResponseBody @ApiOperation("获取面板数据") public String dashboardAjax(HttpSession httpSession) { @@ -58,7 +58,7 @@ public class DashboardController { * @param tkey 数据维度:logsize/capacity * @param request 请求体 */ - @GetMapping(value = "/dash/{tkey}/table/ajax") + @GetMapping(value = "/dash/{tkey}/table") @ResponseBody @ApiOperation("获取主题数据量和容量") public String dashTopicRankAjax(@PathVariable("tkey") String tkey, HttpServletRequest request) { @@ -74,7 +74,7 @@ public class DashboardController { * 获取系统内存数据 * @param request */ - @GetMapping(value = "/dash/os/mem/ajax") + @GetMapping(value = "/dash/os/mem") @ResponseBody @ApiOperation("获取系统内存数据") public String dashOSMemAjax(HttpServletRequest request) { diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/MetricsController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/MetricsController.java index 47f68469090d959c62c7684148dd2a59f78e6cd2..26b1c61db0e9fafd66db45d750c27f03b96e9574 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/MetricsController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/MetricsController.java @@ -23,10 +23,7 @@ import org.smartloli.kafka.eagle.web.service.MetricsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -49,31 +46,25 @@ public class MetricsController { private MetricsService metricsService; /** Brokers viewer. */ - @RequestMapping(value = "/metrics/brokers", method = RequestMethod.GET) - public ModelAndView clusterView() { - ModelAndView mav = new ModelAndView(); - mav.setViewName("/metrics/brokers"); - return mav; + @GetMapping("/metrics/brokers") + public String clusterView() { + return "/metrics/brokers"; } /** Trend viewer. */ - @RequestMapping(value = "/metrics/kafka", method = RequestMethod.GET) - public ModelAndView trendView() { - ModelAndView mav = new ModelAndView(); - mav.setViewName("/metrics/kafka"); - return mav; + @GetMapping("/metrics/kafka") + public String trendView() { + return "/metrics/kafka"; } /** Trend viewer. */ - @RequestMapping(value = "/metrics/zk", method = RequestMethod.GET) - public ModelAndView zkView() { - ModelAndView mav = new ModelAndView(); - mav.setViewName("/metrics/zk"); - return mav; + @GetMapping("/metrics/zk") + public String zkView() { + return "/metrics/zk"; } /** Get cluster data by ajax. */ - @GetMapping("/metrics/brokers/mbean/ajax") + @GetMapping("/metrics/brokers/mbean") @ResponseBody public String clusterAjax(HttpSession session) { String clusterAlias = session.getAttribute(KafkaConstants.CLUSTER_ALIAS).toString(); @@ -81,7 +72,7 @@ public class MetricsController { } /** Get trend data by ajax. */ - @GetMapping("/metrics/trend/mbean/ajax") + @GetMapping("/metrics/trend/mbean") @ResponseBody public String trendAjax(HttpServletRequest request, HttpSession session) throws ParseException { String clusterAlias = session.getAttribute(KafkaConstants.CLUSTER_ALIAS).toString(); diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/OffsetController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/OffsetController.java index 805f317dec590528171e941fcee6b95f7058abef..08197d2f8076fb8b5737a7894468dd29f6b5f6cd 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/OffsetController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/OffsetController.java @@ -32,8 +32,6 @@ import org.smartloli.kafka.eagle.web.util.StrUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; @@ -55,15 +53,9 @@ import java.util.Map; @Api("Kafka偏移控制器") public class OffsetController { - /** - * Offsets consumer data interface. - */ @Autowired private OffsetService offsetService; - /** - * Kafka topic service interface. - */ @Autowired private TopicService topicService; @@ -73,11 +65,9 @@ public class OffsetController { /** * Consumer viewer. */ - @RequestMapping(value = "/consumers/offset/", method = RequestMethod.GET) - public ModelAndView consumersActiveView(HttpServletRequest request) { - ModelAndView mav = new ModelAndView(); - HttpSession session = request.getSession(); - String clusterAlias = session.getAttribute(KafkaConstants.CLUSTER_ALIAS).toString(); + @GetMapping("/consumers/offset") + public String consumersActiveView(HttpServletRequest request, HttpSession httpSession) { + String clusterAlias = httpSession.getAttribute(KafkaConstants.CLUSTER_ALIAS).toString(); String formatter = kafkaClustersConfig.getClusterConfigByName(clusterAlias).getOffsetStorage(); String group = StrUtils.convertNull(request.getParameter("group")); String topic = StrUtils.convertNull(request.getParameter("topic")); @@ -88,18 +78,12 @@ public class OffsetController { } catch (Exception e) { e.printStackTrace(); } - - if (offsetService.hasGroupTopic(clusterAlias, formatter, group, topic)) { - mav.setViewName("/consumers/offset_consumers"); - } else { - mav.setViewName("/error/404"); - } - return mav; + return offsetService.hasGroupTopic(clusterAlias, formatter, group, topic) ? "/consumers/offset_consumers" : "/error/404"; } /** Get real-time offset data from Kafka by ajax. */ - @RequestMapping(value = "/consumers/offset/realtime/", method = RequestMethod.GET) - public ModelAndView offsetRealtimeView(HttpServletRequest request) { + @GetMapping("/consumers/offset/realtime") + public String offsetRealtimeView(HttpServletRequest request) { ModelAndView mav = new ModelAndView(); HttpSession session = request.getSession(); String clusterAlias = session.getAttribute(KafkaConstants.CLUSTER_ALIAS).toString(); @@ -113,17 +97,11 @@ public class OffsetController { } catch (Exception e) { e.printStackTrace(); } - - if (offsetService.hasGroupTopic(clusterAlias, formatter, group, topic)) { - mav.setViewName("/consumers/offset_realtime"); - } else { - mav.setViewName("/error/404"); - } - return mav; + return offsetService.hasGroupTopic(clusterAlias, formatter, group, topic) ? "/consumers/offset_realtime" : "/error/404"; } /** Get detail offset from Kafka by ajax. */ - @GetMapping("/consumer/offset/group/topic/ajax") + @GetMapping("/consumer/offset/group/topic") @ResponseBody @ApiOperation("kafka偏移详情") public String offsetDetailAjax(HttpServletRequest request) { @@ -193,7 +171,7 @@ public class OffsetController { } /** Get real-time offset graph data from Kafka by ajax. */ - @GetMapping("/consumer/offset/group/topic/realtime/ajax") + @GetMapping("/consumer/offset/group/topic/realtime") @ResponseBody @ApiOperation("kafka偏移图") public String offsetGraphAjax(HttpServletRequest request) { @@ -218,7 +196,7 @@ public class OffsetController { } /** Get real-time offset graph data from Kafka by ajax. */ - @GetMapping("/consumer/offset/rate/group/topic/realtime/ajax") + @GetMapping("/consumer/offset/rate/group/topic/realtime") @ResponseBody @ApiOperation("kafka偏移比例") public String offsetRateGraphAjax(HttpServletRequest request) { diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/PageController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/PageController.java index b7fe29b1156058ecd7b0e32701b2655e3118e803..bcd19db62d61f8a0ae13c83ac669e9415bda01b8 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/PageController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/PageController.java @@ -18,10 +18,14 @@ package org.smartloli.kafka.eagle.web.controller; import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; import org.smartloli.kafka.eagle.web.constant.HttpConstants; +import org.smartloli.kafka.eagle.web.constant.KafkaConstants; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; +import javax.servlet.http.HttpSession; + /** * 页面跳转控制器 * @author smartloli. @@ -32,7 +36,12 @@ public class PageController { @GetMapping(HttpConstants.LOGIN_URL) @ApiOperation("登陆页") - public String login() { + public String login(HttpSession httpSession) { + //预防登陆认证失败页面错误信息无法显示问题 + if(null == httpSession.getAttribute(KafkaConstants.ERROR_DISPLAY)) { + httpSession.setAttribute(KafkaConstants.ERROR_DISPLAY, false); + httpSession.setAttribute(KafkaConstants.ERROR_LOGIN, StringUtils.EMPTY); + } return "/account/signin"; } @@ -40,7 +49,7 @@ public class PageController { * 跳转面板主页 * @return */ - @GetMapping(HttpConstants.INDEX_URL) + @GetMapping({HttpConstants.INDEX_URL, HttpConstants.ROOT_URL}) @ApiOperation("跳转主页") public String toIndex() { return "/main/index"; diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/ResourcesController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/ResourcesController.java index c960099076b3ef737a4c73c9e01dee6a8a8ae394..2179449c7a66ebe3666e1a4e074919ea4546b46e 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/ResourcesController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/ResourcesController.java @@ -54,7 +54,7 @@ public class ResourcesController { } /** Resource graph. */ - @GetMapping("/resource/graph/ajax") + @GetMapping("/resource/graph") @ResponseBody @ApiOperation("资源视图") public String resGraphAjax() { @@ -118,7 +118,7 @@ public class ResourcesController { } /** Get parent resource. */ - @GetMapping("/resource/parent/ajax") + @GetMapping("/resource/parent") @ResponseBody @ApiOperation("获取父类资源") public String resParentAjax() { @@ -126,7 +126,7 @@ public class ResourcesController { } /** Get children resource by parent id. */ - @GetMapping("/resource/child/{parentId}/ajax") + @GetMapping("/resource/child/{parentId}") @ResponseBody @ApiOperation("获取子类资源") public String resChildAjax(@PathVariable("parentId") int parentId) { diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/SystemController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/SystemController.java index 46f9bc2825d37d1609fa78d69c76801d77433e51..386cb09103593aa69843dc9205e930402db61341 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/SystemController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/SystemController.java @@ -22,6 +22,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.smartloli.kafka.eagle.web.constant.KafkaConstants; import org.smartloli.kafka.eagle.web.pojo.RoleAuthorityInfo; import org.smartloli.kafka.eagle.web.pojo.UserInfo; @@ -29,6 +30,7 @@ import org.smartloli.kafka.eagle.web.pojo.UserRoleInfo; import org.smartloli.kafka.eagle.web.service.RoleService; import org.smartloli.kafka.eagle.web.service.UserInfoService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; @@ -36,7 +38,6 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; -import java.util.UUID; /** * 管理员系统功能接口 @@ -46,22 +47,25 @@ import java.util.UUID; @Controller @RequestMapping("/system") @Api("系統服务") +@Slf4j public class SystemController { - @Autowired - private RoleService roleService; - @Autowired - private UserInfoService userInfoService; + @Autowired + private RoleService roleService; + @Autowired + private UserInfoService userInfoService; + @Autowired + private PasswordEncoder passwordEncoder; - @GetMapping("/role") + @GetMapping("/role") @ApiOperation("跳转角色界面") - public String roleView() { + public String roleView() { return "/system/role"; - } + } - @GetMapping("/user") + @GetMapping("/user") @ApiOperation("跳转用户视图") - public String userView() { + public String userView() { return "/system/user"; } @@ -75,24 +79,24 @@ public class SystemController { @PostMapping("/user/add") @ApiOperation("添加用户") public String addUser(HttpServletRequest request) { - String rtxno = request.getParameter("ke_rtxno_name"); - String username = request.getParameter("ke_user_name"); - String realname = request.getParameter("ke_real_name"); - String email = request.getParameter("ke_user_email"); + String rtxno = request.getParameter("ke_rtxno_name"); + String username = request.getParameter("ke_user_name"); + String realname = request.getParameter("ke_real_name"); + String email = request.getParameter("ke_user_email"); - UserInfo signin = new UserInfo(); - signin.setEmail(email); - signin.setPassword(UUID.randomUUID().toString().substring(0, 8)); - signin.setRealname(realname); - signin.setRtxno(Integer.parseInt(rtxno)); - signin.setUsername(username); - try { - return userInfoService.insertUser(signin) > 0 ? "redirect:/system/user" : "redirect:/500"; - } catch (Exception ex) { - ex.printStackTrace(); - return "redirect:/500"; - } - } + UserInfo signin = new UserInfo(); + signin.setEmail(email); + signin.setPassword(passwordEncoder.encode(username)); + signin.setRealname(realname); + signin.setRtxno(Integer.parseInt(rtxno)); + signin.setUsername(username); + try { + return userInfoService.insertUser(signin) > 0 ? "redirect:/system/user" : "redirect:/500"; + } catch (Exception ex) { + log.error("用户【{}】添加失败", username, ex); + return "redirect:/500"; + } + } @PostMapping("/user/modify") @ApiOperation("修改用户信息") @@ -110,23 +114,18 @@ public class SystemController { return userInfoService.modify(signin) > 0 ? "redirect:/system/user" : "redirect:/500"; } - @PostMapping("/user/reset") - @ApiOperation("重置用户信息") + @PostMapping("/user/reset") + @ApiOperation("重置用户密码") public String resetUser(HttpServletRequest request) { - String password = request.getParameter("ke_user_new_pwd_reset"); - String rtxnode = request.getParameter("ke_user_rtxno_reset"); - - UserInfo signin = new UserInfo(); - signin.setRtxno(Integer.parseInt(rtxnode)); - signin.setPassword(password); - if (userInfoService.resetPassword(signin) > 0) { - return "redirect:/system/user"; - } else { - return "redirect:/500"; - } - } + String password = request.getParameter("ke_user_new_pwd_reset"); + String rtxnode = request.getParameter("ke_user_rtxno_reset"); + UserInfo userInfo = new UserInfo(); + userInfo.setRtxno(Integer.parseInt(rtxnode)); + userInfo.setPassword(passwordEncoder.encode(password)); + return userInfoService.resetPassword(userInfo) > 0 ? "redirect:/system/user" : "redirect:/500"; + } - @GetMapping("/user/signin/rtxno/ajax") + @GetMapping("/user/signin/rtxno") @ResponseBody @ApiOperation("获取自动生成的用户账号") public String getUserRtxNo() { @@ -144,9 +143,9 @@ public class SystemController { } /** Get the roles that the user owns. */ - @GetMapping(value = "/user/role/table/ajax") + @GetMapping(value = "/user/role/table") @ResponseBody - @ApiOperation("差和讯用户角色信息") + @ApiOperation("查询用户角色信息") public String getUserRoleAjax(HttpServletRequest request) { String aoData = request.getParameter("aoData"); JSONArray params = JSON.parseArray(aoData); @@ -186,10 +185,14 @@ public class SystemController { if (KafkaConstants.ADMIN.equals(role.getString("username"))) { obj.put("operate", ""); } else { - obj.put("operate", - ""); + obj.put("operate", + "
" + + "
"); } aaDatas.add(obj); } @@ -204,8 +207,7 @@ public class SystemController { } /** Get all the roles of the system. */ - @SuppressWarnings("unused") - @GetMapping("/role/table/ajax") + @GetMapping("/role/table") @ResponseBody @ApiOperation("获取所有角色信息") public String getRolesAjax(HttpServletResponse response, HttpServletRequest request) { @@ -247,7 +249,7 @@ public class SystemController { } /** Obtain the resources it owns through the role id. */ - @GetMapping("/role/resource/{roleId}/ajax") + @GetMapping("/role/resource/{roleId}") @ResponseBody @ApiOperation("获取角色拥有权限") public String roleResourceAjax(@PathVariable("roleId") int roleId) { @@ -255,7 +257,7 @@ public class SystemController { } /** Find siginer through the user id. */ - @GetMapping(value = "/user/signin/{id}/ajax") + @GetMapping(value = "/user/signin/{id}") @ResponseBody @ApiOperation("查询用户信息") public String findUserByIdAjax(@PathVariable("id") int id) { @@ -263,7 +265,7 @@ public class SystemController { } /** Change the user's role. */ - @GetMapping("/user/role/{action}/{userId}/{roleId}/ajax") + @GetMapping("/user/role/{action}/{userId}/{roleId}") @ResponseBody @ApiOperation("修改用户角色") public String changeUserRoleAjax(@PathVariable("action") String action, @PathVariable("userId") int userId, @PathVariable("roleId") int roleId, HttpServletResponse response, HttpServletRequest request) { @@ -292,7 +294,7 @@ public class SystemController { } /** Get the corresponding roles through the user id. */ - @GetMapping("/user/role/{userId}/ajax") + @GetMapping("/user/role/{userId}") @ResponseBody @ApiOperation("查询用户角色") public String userRoleAjax(@PathVariable("userId") int userId) { diff --git a/src/main/java/org/smartloli/kafka/eagle/web/controller/TopicController.java b/src/main/java/org/smartloli/kafka/eagle/web/controller/TopicController.java index 36c25cb138194e10c80551fffecc971af3d76546..0f8fb996b160e0bbd83ba0a6d3afc6fa0818469a 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/controller/TopicController.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/controller/TopicController.java @@ -137,7 +137,7 @@ public class TopicController { } /** Get topic metadata by ajax. */ - @GetMapping("/topic/meta/{tname}/ajax") + @GetMapping("/topic/meta/{tname}") @ResponseBody @ApiOperation("获取主题元数据") public String topicMetaAjax(@PathVariable("tname") String tname, HttpServletRequest request) { @@ -194,7 +194,7 @@ public class TopicController { } /** Get cluster data by ajax. */ - @GetMapping("/topic/meta/mbean/{tname}/ajax") + @GetMapping("/topic/meta/mbean/{tname}") @ResponseBody @ApiOperation("获取集群数据") public String topicMetaMetricsAjax(@PathVariable("tname") String tname, HttpSession session) { @@ -203,7 +203,7 @@ public class TopicController { } /** Get cluster data by ajax. */ - @GetMapping("/topic/meta/jmx/{tname}/ajax") + @GetMapping("/topic/meta/jmx/{tname}") @ResponseBody @ApiOperation("获取集群数据") public String topicMsgByJmxAjax(@PathVariable("tname") String tname, HttpSession session) { @@ -212,7 +212,7 @@ public class TopicController { } /** Get topic datasets by ajax. */ - @GetMapping("/topic/mock/list/ajax") + @GetMapping("/topic/mock/list") @ResponseBody @ApiOperation("获取模拟主题数据") public String topicMockAjax(HttpServletRequest request) { @@ -225,7 +225,7 @@ public class TopicController { } /** Get topic datasets by ajax. */ - @GetMapping("/topic/manager/keys/ajax") + @GetMapping("/topic/manager/keys") @ResponseBody @ApiOperation("获取主题数据") public String getTopicProperties(HttpServletRequest request) { @@ -238,7 +238,7 @@ public class TopicController { } /** Get topic datasets by ajax. */ - @GetMapping("/topic/manager/{type}/ajax") + @GetMapping("/topic/manager/{type}") @ResponseBody @ApiOperation("修改主题配置") public String alterTopicConfigAjax(@PathVariable("type") String type, HttpServletRequest request) { @@ -275,7 +275,7 @@ public class TopicController { } /** Get topic datasets by ajax. */ - @GetMapping("/topic/list/table/ajax") + @GetMapping("/topic/list/table") @ResponseBody @ApiOperation("主题列表") public String topicListAjax(HttpServletRequest request, @AuthenticationPrincipal UserDetails userDetails) { @@ -383,7 +383,6 @@ public class TopicController { object.put("operate", ""); } } - aaDatas.add(object); } @@ -396,7 +395,7 @@ public class TopicController { } /** Get select topic datasets by ajax. */ - @PostMapping("/topic/list/select/ajax") + @PostMapping("/topic/list/select") @ResponseBody @ApiOperation("选择列表主题") public String topicSelectListAjax(HttpServletRequest request) { @@ -407,7 +406,7 @@ public class TopicController { } /** Get select filter topic datasets by ajax. */ - @GetMapping("/topic/list/filter/select/ajax") + @GetMapping("/topic/list/filter/select") @ResponseBody @ApiOperation("过滤主题数据集") public String topicSelectFilterListAjax(HttpServletRequest request) { @@ -464,7 +463,7 @@ public class TopicController { String ke_topic_partition = request.getParameter("ke_topic_partition"); String ke_topic_repli = request.getParameter("ke_topic_repli"); String clusterAlias = session.getAttribute(KafkaConstants.CLUSTER_ALIAS).toString(); - Map respons = kafkaService.create(clusterAlias, ke_topic_name, ke_topic_partition, ke_topic_repli); + Map respons = topicService.createTopic(clusterAlias, ke_topic_name, ke_topic_partition, ke_topic_repli); if ("success".equals(respons.get("status"))) { session.removeAttribute("Submit_Status"); session.setAttribute("Submit_Status", respons.get("info")); @@ -482,8 +481,8 @@ public class TopicController { public String topicDelete(@PathVariable("topicName") String topicName, @PathVariable("token") String token, HttpSession session) { if (kafkaEagleTopicToken.equals(token) && !KafkaConstants.CONSUMER_OFFSET_TOPIC.equals(topicName)) { String clusterAlias = session.getAttribute(KafkaConstants.CLUSTER_ALIAS).toString(); - Map respons = kafkaService.delete(clusterAlias, topicName); - if ("success".equals(respons.get("status"))) { + Map response = topicService.deleteTopic(clusterAlias, topicName); + if ("success".equals(response.get("status"))) { return "redirect:/topic/list"; } else { return "redirect:/500"; @@ -587,7 +586,7 @@ public class TopicController { } /** Get topic sql history. */ - @GetMapping("/topic/sql/history/ajax") + @GetMapping("/topic/sql/history") @ResponseBody @ApiOperation("kafka sql查询历史") public String topicSqlHistoryAjax(HttpServletRequest request, @AuthenticationPrincipal UserDetails userDetails) { @@ -656,7 +655,7 @@ public class TopicController { } /** Get ksql host or sql detail. */ - @GetMapping("/topic/ksql/detail/{type}/{id}/ajax") + @GetMapping("/topic/ksql/detail/{type}/{id}") @ResponseBody @ApiOperation("获取KafkaSql详情") public String getKSqlDetailByIdAjax(@PathVariable("id") int id, @PathVariable("type") String type) { @@ -672,7 +671,7 @@ public class TopicController { } /** Get producer chart data by ajax. */ - @GetMapping("/topic/producer/chart/ajax") + @GetMapping("/topic/producer/chart") @ResponseBody @ApiOperation("生产主题数据") public String topicProducerChartAjax(HttpServletRequest request, HttpSession session) { diff --git a/src/main/java/org/smartloli/kafka/eagle/web/dao/AlertDao.xml b/src/main/java/org/smartloli/kafka/eagle/web/dao/AlertDao.xml index fda5b2e12ed013cac39d354df633370f0b643512..6d6e829a7a25ef8b30f5b3b05f2c4fbf2b6588f1 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/dao/AlertDao.xml +++ b/src/main/java/org/smartloli/kafka/eagle/web/dao/AlertDao.xml @@ -46,8 +46,8 @@ - replace into - ke_alarm_config(`cluster`,`alarm_group`,`alarm_type`,`alarm_url`,`http_method`,`alarm_address`,`created`,`modify`) + insert into ke_alarm_config(cluster, alarm_group, alarm_type, alarm_url, http_method, alarm_address, created, + modify) values (#{cluster}, #{alarmGroup}, #{alarmType}, #{alarmUrl}, #{httpMethod}, #{alarmAddress}, #{created}, #{modify}) @@ -62,9 +62,9 @@ select * from ke_alarm_config - `cluster`=#{cluster} - andalarm_group`=#{alarmGroup} + cluster=#{cluster} + and alarm_group=#{alarmGroup} @@ -102,9 +102,9 @@ select * from ke_alarm_clusters - cluster`=#{cluster} + cluster=#{cluster} - and (`id`=#{search} ortype`=#{search}) + and (id=#{search} or type=#{search}) - order byidasc limit #{start},#{size} + order by id asc limit #{start},#{size} diff --git a/src/main/java/org/smartloli/kafka/eagle/web/dao/UserDao.java b/src/main/java/org/smartloli/kafka/eagle/web/dao/UserDao.java index c42b3459fed8a7c139c9742500e01ffca45bc196..4a03fb99525c09cebb8e3064050b5b5a3d8cb573 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/dao/UserDao.java +++ b/src/main/java/org/smartloli/kafka/eagle/web/dao/UserDao.java @@ -25,18 +25,23 @@ import java.util.Map; /** * User interface definition - * - * @author smartloli. * - * Created by May 16, 2017 + * @author smartloli. + *

+ * Created by May 16, 2017 */ public interface UserDao { - - int resetPassword(UserInfo signin); - List findUserBySearch(Map params); + /** + * 重置密码 + * @param userInfo + * @return + */ + int resetPassword(UserInfo userInfo); + + List findUserBySearch(Map params); - int userCounts(); + int userCounts(); /** * 新增用户 diff --git a/src/main/java/org/smartloli/kafka/eagle/web/dao/UserDao.xml b/src/main/java/org/smartloli/kafka/eagle/web/dao/UserDao.xml index b7a6b97455055f119a65ebf2b17bc07938b0da81..e4bce93dba1238632895ecb1fe31871791541444 100644 --- a/src/main/java/org/smartloli/kafka/eagle/web/dao/UserDao.xml +++ b/src/main/java/org/smartloli/kafka/eagle/web/dao/UserDao.xml @@ -21,8 +21,10 @@ - update ke_users set password=#{password} where username=#{username} - + update ke_users + set password=#{password} + where rtxno = #{rtxno} + ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){ return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("