From 96fa1eedb9d76b9a92f79c0d9cee0641e54ded37 Mon Sep 17 00:00:00 2001 From: duandongmei Date: Fri, 10 Aug 2018 16:24:07 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A6=96=E9=A1=B5=E6=9D=A5=E5=87=BD=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1=E7=B1=BB=E5=9E=8B=E7=BB=9F=E8=AE=A1=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=8D=81=E5=85=AD=E8=BF=9B=E5=88=B6=E6=A0=A1=E9=AA=8C=E4=B8=8D?= =?UTF-8?q?=E7=94=9F=E6=95=88bug=20=E6=9B=B4=E6=8D=A2logo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/nis/util/DictUtils.java | 16 ++ .../ConfigureStatisticsController.java | 31 ++- .../statistics/ConfigureStatisticsDao.java | 4 + .../statistics/ConfigureStatisticsDao.xml | 23 ++ .../ConfigureStatisticsService.java | 7 + .../resources/messages/message_en.properties | 5 +- .../messages/message_zh_CN.properties | 22 +- src/main/resources/sql/statisticsSql.sql | 231 ++++++++++++++++++ .../WEB-INF/views/cfg/app/appHttpCfgForm.jsp | 6 +- .../WEB-INF/views/cfg/app/appIpCfgList.jsp | 2 +- .../views/cfg/app/appPolicyCfgForm.jsp | 16 +- .../views/cfg/av/contUrl/contUrlForm.jsp | 19 +- .../views/cfg/av/picUrl/picUrlForm.jsp | 18 +- .../WEB-INF/views/cfg/basicprotocol/form.jsp | 19 +- .../views/cfg/encryptedtunnelbehav/form.jsp | 19 +- src/main/webapp/WEB-INF/views/index.jsp | 163 +++++++----- src/main/webapp/static/pages/img/logo1.png | Bin 0 -> 18026 bytes 17 files changed, 507 insertions(+), 94 deletions(-) create mode 100644 src/main/resources/sql/statisticsSql.sql create mode 100644 src/main/webapp/static/pages/img/logo1.png diff --git a/src/main/java/com/nis/util/DictUtils.java b/src/main/java/com/nis/util/DictUtils.java index 0b2fcad8d..bdd871424 100644 --- a/src/main/java/com/nis/util/DictUtils.java +++ b/src/main/java/com/nis/util/DictUtils.java @@ -238,4 +238,20 @@ public class DictUtils { } return dictList; } + /** + * 功能配置域字典,获取相应功能菜单对应的配置域信息 + * @param functionId + * @return + */ + public static List getFunctionRegionDictList(){ + List allDictList = (List)CacheUtils.get(Constants.CACHE_FUNCTION_REGION_DICT); + List dictList = new ArrayList(); + if(StringUtil.isEmpty(allDictList)){ + FunctionRegionDict entity = new FunctionRegionDict(); + allDictList = functionRegionDictDao.getList(entity); + CacheUtils.put(Constants.CACHE_FUNCTION_REGION_DICT, allDictList); + } + + return allDictList; + } } diff --git a/src/main/java/com/nis/web/controller/configuration/statistics/ConfigureStatisticsController.java b/src/main/java/com/nis/web/controller/configuration/statistics/ConfigureStatisticsController.java index 1ff4021ba..002397f95 100644 --- a/src/main/java/com/nis/web/controller/configuration/statistics/ConfigureStatisticsController.java +++ b/src/main/java/com/nis/web/controller/configuration/statistics/ConfigureStatisticsController.java @@ -3,6 +3,7 @@ package com.nis.web.controller.configuration.statistics; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -16,10 +17,13 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import com.nis.domain.FunctionServiceDict; +import com.nis.domain.Page; import com.nis.domain.configuration.CfgIndexInfo; +import com.nis.domain.configuration.RequestInfo; import com.nis.util.CacheUtils; import com.nis.util.Constants; import com.nis.util.DictUtils; +import com.nis.util.StringUtil; import com.nis.web.controller.BaseController; import com.nis.web.service.BaseService; import com.nis.web.service.CommonService; @@ -37,11 +41,32 @@ public class ConfigureStatisticsController extends BaseController{ public String configStateStatistics(Model model,HttpServletRequest request ,HttpServletResponse response ,RedirectAttributes redirectAttributes){ - + /****************************Request Info Statistics*****************************/ + //1、查询所有有效的service List serviceDictList = DictUtils.getFunctionServiceDictList(); - List list = configureStatisticsService.getConfigStateStatistics(); - + //2、根据来函分页 + RequestInfo requestInfo=new RequestInfo(); + requestInfo.setIsAudit(1); + Page requestPage = requestInfoService.findRequestInfo(new Page(request, response,"r"),requestInfo); + List requestInfos=requestPage.getList(); + //3、根据当前页的requestInfo信息查询request统计信息 + List requestStatisticList=configureStatisticsService.getRequestStateStatistics(requestInfos,serviceDictList); + if(!StringUtil.isEmpty(requestStatisticList)){ + for (Iterator iterator = requestStatisticList.iterator(); iterator.hasNext();) { + Map map = (Map) iterator.next(); + for (RequestInfo requestInfoO : requestInfos) { + if(requestInfoO.getId().toString().equals(map.get("request").toString())){ + map.put("request", requestInfoO.getRequestTitle()); + } + } + } + } + requestPage.setList(requestStatisticList); + model.addAttribute("requestInfos", requestInfos); model.addAttribute("serviceList", serviceDictList); + model.addAttribute("page", requestPage); + /****************************Config Status Info Statistics*****************************/ + List list = configureStatisticsService.getConfigStateStatistics(); model.addAttribute("configStatistics", list); return "/index"; } diff --git a/src/main/java/com/nis/web/dao/configuration/statistics/ConfigureStatisticsDao.java b/src/main/java/com/nis/web/dao/configuration/statistics/ConfigureStatisticsDao.java index 147a797a1..615860b24 100644 --- a/src/main/java/com/nis/web/dao/configuration/statistics/ConfigureStatisticsDao.java +++ b/src/main/java/com/nis/web/dao/configuration/statistics/ConfigureStatisticsDao.java @@ -5,11 +5,15 @@ import java.util.List; import org.apache.ibatis.annotations.Param; +import com.nis.domain.FunctionServiceDict; +import com.nis.domain.Page; import com.nis.domain.configuration.HttpBodyCfg; +import com.nis.domain.configuration.RequestInfo; import com.nis.web.dao.MyBatisDao; @MyBatisDao public interface ConfigureStatisticsDao { public List getConfigStateStatistics( ) ; + public List getRequestStateStatistics(@Param("requestList")List requestList,@Param("serviceList")List serviceList) ; } diff --git a/src/main/java/com/nis/web/dao/configuration/statistics/ConfigureStatisticsDao.xml b/src/main/java/com/nis/web/dao/configuration/statistics/ConfigureStatisticsDao.xml index 68a0876bb..3c9d4698c 100644 --- a/src/main/java/com/nis/web/dao/configuration/statistics/ConfigureStatisticsDao.xml +++ b/src/main/java/com/nis/web/dao/configuration/statistics/ConfigureStatisticsDao.xml @@ -12,4 +12,27 @@ from cfg_num_statistics c group by service_id; + + + \ No newline at end of file diff --git a/src/main/java/com/nis/web/service/configuration/statistics/ConfigureStatisticsService.java b/src/main/java/com/nis/web/service/configuration/statistics/ConfigureStatisticsService.java index 850b9c106..bce7b6d17 100644 --- a/src/main/java/com/nis/web/service/configuration/statistics/ConfigureStatisticsService.java +++ b/src/main/java/com/nis/web/service/configuration/statistics/ConfigureStatisticsService.java @@ -6,9 +6,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.nis.domain.FunctionServiceDict; +import com.nis.domain.Page; import com.nis.domain.configuration.AreaIpCfg; import com.nis.domain.configuration.BaseIpCfg; import com.nis.domain.configuration.NumBoundaryCfg; +import com.nis.domain.configuration.RequestInfo; import com.nis.util.Constants; import com.nis.web.dao.configuration.NumCfgDao; import com.nis.web.dao.configuration.statistics.ConfigureStatisticsDao; @@ -25,4 +28,8 @@ public class ConfigureStatisticsService extends CrudService getConfigStateStatistics(){ return configureStatisticsDao.getConfigStateStatistics(); } + public List getRequestStateStatistics(List requestList,List serviceList){ + List dataList=configureStatisticsDao.getRequestStateStatistics(requestList,serviceList); + return dataList; + } } diff --git a/src/main/resources/messages/message_en.properties b/src/main/resources/messages/message_en.properties index 45a6e90a3..3c7b95714 100644 --- a/src/main/resources/messages/message_en.properties +++ b/src/main/resources/messages/message_en.properties @@ -166,7 +166,7 @@ ip_website_text_control=IP+Website Keyword Control request_task=Letter and Task realtime_report=Log Report protocol_and_app=Protocol And App -text_content_monitor=Text Content +text_content_monitor=Plaintext Content multimedia=Multimedia ddos_system=Ddos System ip_reuse_system=IP Reuse @@ -573,7 +573,8 @@ av_sample_voip_control=VoIP Sample av_sample_audio_porn_control=Audio Scene Detection av_sample_video_porn_control=Video Scene Detection av_sample_control=Sample -configure_statistics_info=Configure statistics info +configure_statistics_info=Configuration Service And Status Statistics +letter_statistics_info=Letter And Configuration Service Statistics harm_level=Degree of harm src_file=Source File file=File diff --git a/src/main/resources/messages/message_zh_CN.properties b/src/main/resources/messages/message_zh_CN.properties index d6ea85b24..257e67347 100644 --- a/src/main/resources/messages/message_zh_CN.properties +++ b/src/main/resources/messages/message_zh_CN.properties @@ -772,7 +772,7 @@ ip_intercept=IP\u62E6\u622A domain_intercept=\u57DF\u540D\u62E6\u622A control_policy=\u63A7\u5236\u7B56\u7565 domain_forward=\u57DF\u540D\u8F6C\u53D1 -http_redirect=HTTP\u91CD\u5B9A\u5411\u914D\u7F6E +http_redirect=HTTP(S) \u91CD\u5B9A\u5411\u914D\u7F6E http_req_replace=HTTP\u8BF7\u6C42\u5185\u5BB9\u66FF\u6362 http_res_replace=HTTP\u5E94\u7B54\u5185\u5BB9\u66FF\u6362 replace_content=\u66FF\u6362\u5185\u5BB9 @@ -894,11 +894,11 @@ temporary_redirect=\u4E34\u65F6\u91CD\u5B9A\u5411 prohibition_access=\u7981\u6B62\u8BBF\u95EE not_allowed_method=\u4E0D\u5141\u8BB8\u6B64\u65B9\u6CD5\u8BBF\u95EE law_prohibition_access=\u7531\u4E8E\u6CD5\u5F8B\u539F\u56E0\u4E0D\u53EF\u7528 -http_block=HTTP\u7BA1\u63A7 -http_reddirect=HTTP\u91CD\u5B9A\u5411 -http_replace=HTTP\u66FF\u6362 -http_monit=HTTP\u76D1\u6D4B -http_whitelist=HTTP\u767D\u540D\u5355 +http_block=HTTP(S) \u7BA1\u63A7 +http_reddirect=HTTP(S) \u91CD\u5B9A\u5411 +http_replace=HTTP(S) \u66FF\u6362 +http_monit=HTTP(S) \u76D1\u6D4B +http_whitelist=HTTP(S) \u767D\u540D\u5355 response_code=\u5E94\u7B54\u7801 response_content=\u54CD\u5E94\u5185\u5BB9 not_found=\u672A\u627E\u5230\u8BF7\u6C42\u754C\u9762 @@ -1012,11 +1012,11 @@ ddos_ip_drop=DDOS\u76EE\u6807\u9632\u62A4IP ip_reuse_adress_pool_loop=IP\u590D\u7528\u5730\u5740\u6C60\u914D\u7F6E app_strategy_monit=APP\u7B56\u7565\u76D1\u6D4B app_strategy_drop=APP\u7B56\u7565\u4E22\u5F03 -ctrl_http_reject=HTTP\u7BA1\u63A7 -ctrl_http_redirect=HTTP\u91CD\u5B9A\u5411 -ctrl_http_replace=HTTP\u66FF\u6362 -ctrl_http_monit=HTTP\u76D1\u6D4B -ctrl_http_whitelist=HTTP\u767D\u540D\u5355 +ctrl_http_reject=HTTP(S) \u7BA1\u63A7 +ctrl_http_redirect=HTTP(S) \u91CD\u5B9A\u5411 +ctrl_http_replace=HTTP(S) \u66FF\u6362 +ctrl_http_monit=HTTP(S) \u76D1\u6D4B +ctrl_http_whitelist=HTTP(S) \u767D\u540D\u5355 #=============function_service_dict==>service_name================= #=============about report=================== report_list=\u62A5\u8868 diff --git a/src/main/resources/sql/statisticsSql.sql b/src/main/resources/sql/statisticsSql.sql new file mode 100644 index 000000000..588339d84 --- /dev/null +++ b/src/main/resources/sql/statisticsSql.sql @@ -0,0 +1,231 @@ +-- ---------------------------- +-- Table structure for proc_exec_log +-- ---------------------------- +CREATE TABLE `proc_exec_log` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `proc_name` varchar(200) DEFAULT NULL, + `table_name` varchar(200) DEFAULT NULL, + `log_time` datetime DEFAULT NULL, + `description` varchar(200) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=449 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Table structure for statistics_tables +-- ---------------------------- +CREATE TABLE `statistics_tables` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `tab_name` varchar(200) NOT NULL, + `is_valid` int(11) NOT NULL, + `description` varchar(200) DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8; + +INSERT INTO `statistics_tables` VALUES ('1', 'app_byte_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('2', 'app_domain_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('3', 'app_features_index', '0', ''); +INSERT INTO `statistics_tables` VALUES ('4', 'app_http_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('5', 'app_id_cfg', '0', ''); +INSERT INTO `statistics_tables` VALUES ('6', 'app_ip_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('7', 'app_policy_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('8', 'asn_keyword_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('9', 'av_cont_ip_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('10', 'av_cont_url_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('11', 'av_file_sample_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('12', 'av_pic_ip_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('13', 'av_pic_url_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('14', 'av_sign_sample_cfg', '0', ''); +INSERT INTO `statistics_tables` VALUES ('15', 'av_voip_account_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('16', 'av_voip_ip_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('17', 'byte_features_cfg', '0', ''); +INSERT INTO `statistics_tables` VALUES ('18', 'complex_keyword_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('19', 'ddos_ip_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('20', 'dns_domain_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('21', 'dns_ip_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('22', 'dns_res_strategy', '1', ''); +INSERT INTO `statistics_tables` VALUES ('23', 'file_digest_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('24', 'ftp_keyword_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('25', 'http_body_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('26', 'http_req_head_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('27', 'http_res_head_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('28', 'http_url_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('29', 'ip_multiplex_pool_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('30', 'ip_port_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('31', 'l2tp_url_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('32', 'mail_keyword_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('33', 'multiple_cfg_relation', '0', ''); +INSERT INTO `statistics_tables` VALUES ('34', 'num_boundary_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('35', 'policy_group_info', '0', ''); +INSERT INTO `statistics_tables` VALUES ('36', 'pptp_url_cfg', '1', ''); +INSERT INTO `statistics_tables` VALUES ('37', 'ssl_keyword_cfg', '1', ''); + +-- ---------------------------- +-- Table structure for cfg_num_statistics +-- ---------------------------- +CREATE TABLE `cfg_num_statistics` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `function_id` int(11) NOT NULL, + `service_id` int(11) NOT NULL, + `action` int(11) NOT NULL, + `cfg_state` int(11) NOT NULL COMMENT '0未审核,1已审核,2审核未通过,3审核取消,-1删除', + `cfg_type` varchar(128) DEFAULT NULL COMMENT '配置类型,与业务配置表中相同', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5888338 DEFAULT CHARSET=utf8; + +-- ---------------------------- +-- Table structure for request_num_statistics +-- ---------------------------- +CREATE TABLE `request_num_statistics` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `function_id` int(11) NOT NULL, + `service_id` int(11) NOT NULL, + `request_id` int(11) NOT NULL COMMENT '来函信息', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=5913175 DEFAULT CHARSET=utf8; + + +-- ---------------------------- +-- Procedure structure for exec_procs +-- ---------------------------- +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `exec_procs`() +BEGIN + call proc_statistics_request(); + call proc_statistics_config(); +END;; +DELIMITER ; + +-- ---------------------------- +-- Procedure structure for proc_statistics_config +-- ---------------------------- +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `proc_statistics_config`() +BEGIN + DECLARE ntime VARCHAR(40);/*当前时间*/ + DECLARE tabName VARCHAR(500); + DECLARE description VARCHAR(500); + DECLARE deleteSql VARCHAR(500); + DECLARE done INT;/*游标标识*/ + DECLARE flag INT;/*循环标识*/ + DECLARE proc_log_table VARCHAR(100);/*存储过程日志表*/ + DECLARE proc_name VARCHAR(100);/*存储过程名称*/ + DECLARE icursor CURSOR FOR SELECT tab_name FROM statistics_tables where is_valid=1; + DECLARE CONTINUE HANDLER FOR NOT found SET done=1; + DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; + SET done=0; + SET proc_log_table='proc_exec_log'; + SET proc_name='proc_statistics_config'; + SET ntime=DATE_FORMAT(SYSDATE(),'%Y-%m-%d %H:%k:%S'); + set @deleteSql := 'delete from cfg_num_statistics'; + PREPARE execs FROM @deleteSql; + EXECUTE execs; + DEALLOCATE PREPARE execs; + COMMIT; + OPEN icursor; + loop_iloop:LOOP + FETCH icursor INTO tabName; + SET description=tabName; + set @descriptionStart=concat(description,'表统计start'); + /*统计当前配置表数据到统计表中start*/ + set @v_log_sql1 := concat('insert into ',proc_log_table,'(proc_name,table_name,log_time,description) values(?,?,?,?)'); + PREPARE execs FROM @v_log_sql1; + EXECUTE execs using proc_name,proc_log_table,ntime,@descriptionStart; + DEALLOCATE PREPARE execs; + COMMIT; + + set @insert_statistics_sql :=concat('insert into cfg_num_statistics(function_id,service_id,action,cfg_type,cfg_state) select function_id,service_id,action,cfg_type,if(is_audit=3,3,if(is_audit=2,2,if(is_audit=1,1,if(is_valid=0,0,if(is_valid,-1,-1))))) cfg_state from ',tabName); + PREPARE execs FROM @insert_statistics_sql; + EXECUTE execs; + DEALLOCATE PREPARE execs; + COMMIT; + + set @descriptionEnd=concat(description,'表统计end'); + set @v_log_sql2 := concat('insert into ',proc_log_table,'(proc_name,table_name,log_time,description) values(?,?,?,?)'); + PREPARE execs FROM @v_log_sql2; + EXECUTE execs using proc_name,proc_log_table,ntime,@descriptionEnd; + DEALLOCATE PREPARE execs; + COMMIT; + + /*统计当前配置表数据到统计表中end*/ + IF done=1 THEN + LEAVE loop_iloop; + ELSE + SET flag=0; + END IF; + IF flag=0 THEN + SET done=0; + END IF; + END LOOP; + CLOSE icursor; + COMMIT; +END;; +DELIMITER ; + +-- ---------------------------- +-- Procedure structure for proc_statistics_request +-- ---------------------------- +DELIMITER ;; +CREATE DEFINER=`root`@`%` PROCEDURE `proc_statistics_request`() +BEGIN + DECLARE ntime VARCHAR(40);/*当前时间*/ + DECLARE tabName VARCHAR(500); + DECLARE description VARCHAR(500); + DECLARE deleteSql VARCHAR(500); + DECLARE done INT;/*游标标识*/ + DECLARE flag INT;/*循环标识*/ + DECLARE proc_log_table VARCHAR(100);/*存储过程日志表*/ + DECLARE proc_name VARCHAR(100);/*存储过程名称*/ + DECLARE icursor CURSOR FOR SELECT tab_name FROM statistics_tables where is_valid=1; + DECLARE CONTINUE HANDLER FOR NOT found SET done=1; + DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; + SET done=0; + SET proc_log_table='proc_exec_log'; + SET proc_name='proc_statistics_request'; + SET ntime=DATE_FORMAT(SYSDATE(),'%Y-%m-%d %H:%k:%S'); + set @deleteSql := 'delete from request_num_statistics'; + PREPARE execs FROM @deleteSql; + EXECUTE execs; + DEALLOCATE PREPARE execs; + COMMIT; + OPEN icursor; + loop_iloop:LOOP + FETCH icursor INTO tabName; + SET description=tabName; + set @descriptionStart=concat(description,'表request统计start'); + /*统计当前配置表数据到统计表中start*/ + set @v_log_sql1 := concat('insert into ',proc_log_table,'(proc_name,table_name,log_time,description) values(?,?,?,?)'); + PREPARE execs FROM @v_log_sql1; + EXECUTE execs using proc_name,proc_log_table,ntime,@descriptionStart; + DEALLOCATE PREPARE execs; + COMMIT; + + set @insert_statistics_sql :=concat('insert into request_num_statistics(function_id,service_id,request_id) select function_id,service_id,request_id from ',tabName,' where request_id <> 0'); + PREPARE execs FROM @insert_statistics_sql; + EXECUTE execs; + DEALLOCATE PREPARE execs; + COMMIT; + + set @descriptionEnd=concat(description,'表request统计end'); + set @v_log_sql2 := concat('insert into ',proc_log_table,'(proc_name,table_name,log_time,description) values(?,?,?,?)'); + PREPARE execs FROM @v_log_sql2; + EXECUTE execs using proc_name,proc_log_table,ntime,@descriptionEnd; + DEALLOCATE PREPARE execs; + COMMIT; + + /*统计当前配置表数据到统计表中end*/ + IF done=1 THEN + LEAVE loop_iloop; + ELSE + SET flag=0; + END IF; + IF flag=0 THEN + SET done=0; + END IF; + END LOOP; + CLOSE icursor; + COMMIT; +END;; +DELIMITER ; + + +--增加事件,每分钟执行一次 exec_procs存储过程 diff --git a/src/main/webapp/WEB-INF/views/cfg/app/appHttpCfgForm.jsp b/src/main/webapp/WEB-INF/views/cfg/app/appHttpCfgForm.jsp index bd3dbc6df..8e82f408c 100644 --- a/src/main/webapp/WEB-INF/views/cfg/app/appHttpCfgForm.jsp +++ b/src/main/webapp/WEB-INF/views/cfg/app/appHttpCfgForm.jsp @@ -31,19 +31,19 @@ $(function(){ flag = false; } }) - /* $("select[name$='isHexbin']").each(function(){ + $("select[name$='isHexbin']").each(function(){ var isHexbin=$(this).val(); if(isHexbin == 1){ var keywords=$("input[name$='"+$(this).attr("name").replace("isHexbin","cfgKeywords")+"']").val(); if(!(/^([0-9|a-f|A-F]*)$/.test(keywords))){ - $(this).parents(".form-group").find( + $(this).parents(".form-body").find( "div[for='" + $(this).attr("name").replace("isHexbin","cfgKeywords") + "']").html(""); flag = false; } } - }); */ + }); if(flag){ $("input[name$='exprType']").attr("disabled",false); $("#appCode").val($("#specServiceIdId").val()); diff --git a/src/main/webapp/WEB-INF/views/cfg/app/appIpCfgList.jsp b/src/main/webapp/WEB-INF/views/cfg/app/appIpCfgList.jsp index 3189c316d..524bfa474 100644 --- a/src/main/webapp/WEB-INF/views/cfg/app/appIpCfgList.jsp +++ b/src/main/webapp/WEB-INF/views/cfg/app/appIpCfgList.jsp @@ -275,7 +275,7 @@ - IP + IP <%-- --%> diff --git a/src/main/webapp/WEB-INF/views/cfg/app/appPolicyCfgForm.jsp b/src/main/webapp/WEB-INF/views/cfg/app/appPolicyCfgForm.jsp index 508dfad05..6368c86b2 100644 --- a/src/main/webapp/WEB-INF/views/cfg/app/appPolicyCfgForm.jsp +++ b/src/main/webapp/WEB-INF/views/cfg/app/appPolicyCfgForm.jsp @@ -41,9 +41,21 @@ $(function(){ + $(this).attr("name") + "']").html(""); flag = false; - return; } }) + $("select[name$='isHexbin']").each(function(){ + var isHexbin=$(this).val(); + if(isHexbin == 1){ //十六进制 + var keywords=$("input[name$='"+$(this).attr("name").replace("isHexbin","cfgKeywords")+"']").val(); + if(!(/^([0-9|a-f|A-F]*)$/.test(keywords))){ + $(this).parents(".form-body").find( + "div[for='" + + $(this).attr("name").replace("isHexbin","cfgKeywords") + + "']").html(""); + flag = false; + } + } + }); if(flag){ //将disable属性的元素删除 $(".disabled").each(function(){ @@ -59,6 +71,8 @@ $(function(){ /* $("#appCode").val($("#specServiceIdId").val()); */ loading('onloading...'); form.submit(); + }else{ + return; } }, errorContainer: "#messageBox", diff --git a/src/main/webapp/WEB-INF/views/cfg/av/contUrl/contUrlForm.jsp b/src/main/webapp/WEB-INF/views/cfg/av/contUrl/contUrlForm.jsp index 59f62cd6d..efa40d57b 100644 --- a/src/main/webapp/WEB-INF/views/cfg/av/contUrl/contUrlForm.jsp +++ b/src/main/webapp/WEB-INF/views/cfg/av/contUrl/contUrlForm.jsp @@ -30,7 +30,6 @@ $(function(){ + $(this).attr("name") + "']").html(""); flag = false; - return; }/* else if(!(/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test($(this).val()))){ $(this).parents(".form-group").find( "div[for='" @@ -40,10 +39,25 @@ $(function(){ return; } */ }) + $("select[name$='isHexbin']").each(function(){ + var isHexbin=$(this).val(); + if(isHexbin == 1){ //十六进制 + var keywords=$("input[name$='"+$(this).attr("name").replace("isHexbin","cfgKeywords")+"']").val(); + if(!(/^([0-9|a-f|A-F]*)$/.test(keywords))){ + $(this).parents(".form-body").find( + "div[for='" + + $(this).attr("name").replace("isHexbin","cfgKeywords") + + "']").html(""); + flag = false; + } + } + }); if(flag){ loading('onloading...'); $("input[name$='exprType']").attr("disabled",false); form.submit(); + }else{ + return; } }, errorContainer: "#messageBox", @@ -52,7 +66,8 @@ $(function(){ - + +

diff --git a/src/main/webapp/WEB-INF/views/cfg/av/picUrl/picUrlForm.jsp b/src/main/webapp/WEB-INF/views/cfg/av/picUrl/picUrlForm.jsp index 30efa7984..7b76b3dca 100644 --- a/src/main/webapp/WEB-INF/views/cfg/av/picUrl/picUrlForm.jsp +++ b/src/main/webapp/WEB-INF/views/cfg/av/picUrl/picUrlForm.jsp @@ -33,10 +33,25 @@ $(function(){ return; } }) + $("select[name$='isHexbin']").each(function(){ + var isHexbin=$(this).val(); + if(isHexbin == 1){ //十六进制 + var keywords=$("input[name$='"+$(this).attr("name").replace("isHexbin","cfgKeywords")+"']").val(); + if(!(/^([0-9|a-f|A-F]*)$/.test(keywords))){ + $(this).parents(".form-body").find( + "div[for='" + + $(this).attr("name").replace("isHexbin","cfgKeywords") + + "']").html(""); + flag = false; + } + } + }); if(flag){ $("input[name$='exprType']").attr("disabled",false); loading('onloading...'); form.submit(); + }else{ + return; } }, errorContainer: "#messageBox", @@ -45,7 +60,8 @@ $(function(){ - + +

diff --git a/src/main/webapp/WEB-INF/views/cfg/basicprotocol/form.jsp b/src/main/webapp/WEB-INF/views/cfg/basicprotocol/form.jsp index fc75ac9f9..026727348 100644 --- a/src/main/webapp/WEB-INF/views/cfg/basicprotocol/form.jsp +++ b/src/main/webapp/WEB-INF/views/cfg/basicprotocol/form.jsp @@ -41,9 +41,21 @@ $(function(){ + $(this).attr("name") + "']").html(""); flag = false; - return; } }) + $("select[name$='isHexbin']").each(function(){ + var isHexbin=$(this).val(); + if(isHexbin == 1){ //十六进制 + var keywords=$($(this).attr("name").replace("isHexbin","cfgKeywords")).val(); + if(!(/^([0-9|a-f|A-F]*)$/.test(keywords))){ + $(this).parents(".form-body").find( + "div[for='" + + $(this).attr("name").replace("isHexbin","cfgKeywords") + + "']").html(""); + flag = false; + } + } + }); if(flag){ //将disable属性的元素删除 $(".disabled").each(function(){ @@ -59,6 +71,8 @@ $(function(){ /* $("#appCode").val($("#specServiceIdId").val()); */ loading('onloading...'); form.submit(); + }else{ + return; } }, errorContainer: "#messageBox", @@ -81,7 +95,8 @@ var delContent = function(contentClassName, addBtnClassName) { - + +
diff --git a/src/main/webapp/WEB-INF/views/cfg/encryptedtunnelbehav/form.jsp b/src/main/webapp/WEB-INF/views/cfg/encryptedtunnelbehav/form.jsp index 96a23a128..92f90a405 100644 --- a/src/main/webapp/WEB-INF/views/cfg/encryptedtunnelbehav/form.jsp +++ b/src/main/webapp/WEB-INF/views/cfg/encryptedtunnelbehav/form.jsp @@ -41,9 +41,21 @@ $(function(){ + $(this).attr("name") + "']").html(""); flag = false; - return; } }) + $("select[name$='isHexbin']").each(function(){ + var isHexbin=$(this).val(); + if(isHexbin == 1){ //十六进制 + var keywords=$("input[name$='"+$(this).attr("name").replace("isHexbin","cfgKeywords")+"']").val(); + if(!(/^([0-9|a-f|A-F]*)$/.test(keywords))){ + $(this).parents(".form-body").find( + "div[for='" + + $(this).attr("name").replace("isHexbin","cfgKeywords") + + "']").html(""); + flag = false; + } + } + }); if(flag){ //将disable属性的元素删除 $(".disabled").each(function(){ @@ -59,6 +71,8 @@ $(function(){ /* $("#appCode").val($("#specServiceIdId").val()); */ loading('onloading...'); form.submit(); + }else{ + return; } }, errorContainer: "#messageBox", @@ -130,7 +144,8 @@ var delContent = function(contentClassName, addBtnClassName) { - + +
diff --git a/src/main/webapp/WEB-INF/views/index.jsp b/src/main/webapp/WEB-INF/views/index.jsp index 84265f0ab..9c44e86c6 100644 --- a/src/main/webapp/WEB-INF/views/index.jsp +++ b/src/main/webapp/WEB-INF/views/index.jsp @@ -3,6 +3,27 @@ + index - -
- +
+
+ + + - +
+
- - - - - - + + + + - - - - - - - - - - - - - - - - - + + + + + + + -
- - - ${statistics.approved } - - ${statistics.unapproved } - - ${statistics.cancle_approved } - - ${statistics.created } - - ${statistics.deleted } -
${requestStatistics['request']}${requestStatistics[serviceDict.serviceName]}
-
+ +
+ +
${page}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + ${statistics.approved } + + ${statistics.unapproved } + + ${statistics.cancle_approved } + + ${statistics.created } + + ${statistics.deleted } +
+
diff --git a/src/main/webapp/static/pages/img/logo1.png b/src/main/webapp/static/pages/img/logo1.png new file mode 100644 index 0000000000000000000000000000000000000000..0a199a5c66322bf10c28d928f22d6b8904379f5e GIT binary patch literal 18026 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