From ae9edb47e7087c902a37b43e7dc2377848d70ab0 Mon Sep 17 00:00:00 2001 From: zhangwq Date: Thu, 29 Nov 2018 10:38:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=201.SNAT=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E7=AD=96=E7=95=A5=E3=80=81=E7=9B=B8=E5=85=B3sql=202.IP?= =?UTF-8?q?=E5=A4=8D=E7=94=A8=E8=B0=83=E7=94=A8CGI=E6=8E=A5=E5=8F=A3url?= =?UTF-8?q?=E5=AD=97=E5=85=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/nis/util/Constants.java | 3 + .../nis/web/controller/BaseController.java | 3 + .../manipulation/IpMultiplexController.java | 52 ++- .../dao/configuration/IpAddrPoolCfgDao.java | 2 + .../dao/configuration/IpAddrPoolCfgDao.xml | 6 + .../configuration/IpAddrPoolCfgService.java | 116 +++++ .../sql/20181129/add_ip_reuse_addr_pool.sql | 39 ++ .../maintenance/ipMultiplexPool/snatform2.jsp | 2 +- .../ipmulitiplex/snatPolicyForm2.jsp | 320 +++++++++++++ .../ipmulitiplex/snatPolicyList2.jsp | 431 ++++++++++++++++++ 10 files changed, 964 insertions(+), 10 deletions(-) create mode 100644 src/main/resources/sql/20181129/add_ip_reuse_addr_pool.sql create mode 100644 src/main/webapp/WEB-INF/views/cfg/manipulation/ipmulitiplex/snatPolicyForm2.jsp create mode 100644 src/main/webapp/WEB-INF/views/cfg/manipulation/ipmulitiplex/snatPolicyList2.jsp diff --git a/src/main/java/com/nis/util/Constants.java b/src/main/java/com/nis/util/Constants.java index f5cf8d76c..05c539a03 100644 --- a/src/main/java/com/nis/util/Constants.java +++ b/src/main/java/com/nis/util/Constants.java @@ -750,4 +750,7 @@ public final class Constants { public static final String NTC_IP_REUSE_USER_DELETE = Configurations.getStringProperty("userDelete",""); public static final String NTC_IP_REUSE_USER_GET = Configurations.getStringProperty("userGet",""); public static final String NTC_IP_REUSE_USER_LIST = Configurations.getStringProperty("userList",""); + + // IP复用模块调用相关CGI接口URL + public static final String IP_REUSE_CALL_CGI_URL = Configurations.getStringProperty("ip_reuse_call_cgi_url",""); } diff --git a/src/main/java/com/nis/web/controller/BaseController.java b/src/main/java/com/nis/web/controller/BaseController.java index 8a6bd2d25..08bf5f86c 100644 --- a/src/main/java/com/nis/web/controller/BaseController.java +++ b/src/main/java/com/nis/web/controller/BaseController.java @@ -126,6 +126,7 @@ import com.nis.web.service.configuration.FileTransferCfgService; import com.nis.web.service.configuration.GroupAreaService; import com.nis.web.service.configuration.HttpRedirectCfgService; import com.nis.web.service.configuration.InterceptCfgService; +import com.nis.web.service.configuration.IpAddrPoolCfgService; import com.nis.web.service.configuration.IpCfgService; import com.nis.web.service.configuration.IpMultiplexPoolCfgService; import com.nis.web.service.configuration.MailCfgService; @@ -261,6 +262,8 @@ public class BaseController { protected UserManageService userManageService; @Autowired protected IpReuseIpCfgService ipReuseIpCfgService; + @Autowired + protected IpAddrPoolCfgService ipAddrPoolCfgService;// 地址池管理service /** * 管理基础路径 */ diff --git a/src/main/java/com/nis/web/controller/configuration/manipulation/IpMultiplexController.java b/src/main/java/com/nis/web/controller/configuration/manipulation/IpMultiplexController.java index 579abca55..a353a2cbb 100644 --- a/src/main/java/com/nis/web/controller/configuration/manipulation/IpMultiplexController.java +++ b/src/main/java/com/nis/web/controller/configuration/manipulation/IpMultiplexController.java @@ -9,6 +9,7 @@ package com.nis.web.controller.configuration.manipulation; import java.util.ArrayList; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -31,9 +32,12 @@ import com.nis.domain.Page; import com.nis.domain.SysDataDictionaryItem; import com.nis.domain.basics.PolicyGroupInfo; import com.nis.domain.configuration.BaseIpCfg; +import com.nis.domain.configuration.IpAddrPoolCfg; import com.nis.domain.configuration.IpMultiplexPoolCfg; import com.nis.domain.configuration.IpPortCfg; +import com.nis.domain.configuration.UserManage; import com.nis.domain.configuration.template.IpMultiplexPolicyTemplate; +import com.nis.exceptions.MaatConvertException; import com.nis.util.Constants; import com.nis.util.DictUtils; import com.nis.util.StringUtil; @@ -126,24 +130,35 @@ public class IpMultiplexController extends CommonController { @RequestMapping(value = {"/snatPolicyList"}) public String snatPolicyList(String cfgName,Model model,@ModelAttribute("cfg")IpPortCfg cfg,HttpServletRequest request,HttpServletResponse response) { this._ipList(cfgName,model, cfg, request, response); - return "/cfg/manipulation/ipmulitiplex/snatPolicyList"; + + // 获取地址池、用户信息 + List users = userManageService.findUsers(); + List addrPools = ipAddrPoolCfgService.getEffectiveAddrPool(); + model.addAttribute("users", users); + model.addAttribute("addrPools", addrPools); + return "/cfg/manipulation/ipmulitiplex/snatPolicyList2"; } @RequestMapping(value = {"/snatPolicyForm"}) @RequiresPermissions(value={"snat_policy:config"}) - public String snatPolicyForm(String cfgName,Model model,String ids,Integer functionId,BaseIpCfg entity) { + public String snatPolicyForm(String cfgName,Model model,String ids,Integer functionId,BaseIpCfg entity, HttpServletRequest request,HttpServletResponse response) { this._ipForm(cfgName,model, ids, functionId, entity); - // 获取拥有区域信息的策略分组 - List policyGroups = policyGroupInfoService.getHasAreaPolicyGroups(2); - model.addAttribute("policyGroups", policyGroups); + + // 获取用户信息 地址池信息 + List users = userManageService.findUsers(); + List addrPools = ipAddrPoolCfgService.getEffectiveAddrPool(); + + model.addAttribute("users", users); + model.addAttribute("addrPools", addrPools); model.addAttribute("urlPrefix","/manipulation/ipmulitiplex"); - return "/cfg/manipulation/ipmulitiplex/snatPolicyForm"; + return "/cfg/manipulation/ipmulitiplex/snatPolicyForm2"; } @RequestMapping(value = {"/saveOrUpdateSnat"}) public String saveOrUpdateSnat(String cfgName,RedirectAttributes model, IpPortCfg cfg) { // 设置生效区域信息 - groupAreaService.setAreaEffective(cfg); + //groupAreaService.setAreaEffective(cfg); + this._saveOrUpdateIp(cfgName,model, cfg); return "redirect:" + adminPath +"/manipulation/ipmulitiplex/snatPolicyList?functionId="+cfg.getFunctionId(); } @@ -158,7 +173,26 @@ public class IpMultiplexController extends CommonController { @RequestMapping(value = {"/auditSnat"}) @RequiresPermissions("snat_policy:confirm") public String auditSnat(String cfgName,String ids,IpPortCfg cfg,RedirectAttributes redirectAttributes) { - this._auditIp(cfgName,ids, cfg, redirectAttributes); + //this._auditIp(cfgName,ids, cfg, redirectAttributes); + + if(!StringUtil.isEmpty(ids)){ + String[] idArray = ids.split(","); + Date auditTime=new Date(); + for(String id :idArray){ + try { + ipAddrPoolCfgService.auditSnatStrategy(id, cfg, auditTime); + } catch (Exception e) { + e.printStackTrace(); + logger.error("SNAT策略配置下发失败:"+e.getMessage()); + if(e instanceof MaatConvertException) { + addMessage(redirectAttributes,"error", "request_service_failed"); + }else { + addMessage(redirectAttributes,"error", "audit_failed"); + } + } + } + + } return "redirect:" + adminPath +"/manipulation/ipmulitiplex/snatPolicyList?functionId="+cfg.getFunctionId(); } @@ -234,7 +268,7 @@ public class IpMultiplexController extends CommonController { } titleList.add(entity.getMenuNameCode()); classMap.put(entity.getMenuNameCode(), BaseIpCfg.class); - String snatNoExport=",server_ip,ip_type,ip_pattern,port_pattern,client_port,server_port,ir_type,direction,protocol,do_log,whether_area_block,userregion1,userregion2,userregion3,userregion4,userregion5,"; + String snatNoExport=",client_ip,group_name,server_ip,ip_type,ip_pattern,port_pattern,client_port,server_port,ir_type,direction,protocol,do_log,whether_area_block,userregion1,userregion2,userregion3,userregion4,userregion5,"; noExportMap.put(entity.getMenuNameCode(),snatNoExport); dataMap.put(entity.getMenuNameCode(), page.getList()); /*}*/ diff --git a/src/main/java/com/nis/web/dao/configuration/IpAddrPoolCfgDao.java b/src/main/java/com/nis/web/dao/configuration/IpAddrPoolCfgDao.java index 96f266959..241239888 100644 --- a/src/main/java/com/nis/web/dao/configuration/IpAddrPoolCfgDao.java +++ b/src/main/java/com/nis/web/dao/configuration/IpAddrPoolCfgDao.java @@ -33,4 +33,6 @@ public interface IpAddrPoolCfgDao extends CrudDao{ IpAddrPoolCfg getCfgInfo(IpAddrPoolCfg cfg); + List findAddrPoolCfg(); + } diff --git a/src/main/java/com/nis/web/dao/configuration/IpAddrPoolCfgDao.xml b/src/main/java/com/nis/web/dao/configuration/IpAddrPoolCfgDao.xml index b1d1a6149..83b10017d 100644 --- a/src/main/java/com/nis/web/dao/configuration/IpAddrPoolCfgDao.xml +++ b/src/main/java/com/nis/web/dao/configuration/IpAddrPoolCfgDao.xml @@ -439,4 +439,10 @@ + + \ No newline at end of file diff --git a/src/main/java/com/nis/web/service/configuration/IpAddrPoolCfgService.java b/src/main/java/com/nis/web/service/configuration/IpAddrPoolCfgService.java index 8320a748b..f05e39e8d 100644 --- a/src/main/java/com/nis/web/service/configuration/IpAddrPoolCfgService.java +++ b/src/main/java/com/nis/web/service/configuration/IpAddrPoolCfgService.java @@ -21,20 +21,25 @@ import com.nis.domain.Page; import com.nis.domain.callback.InlineIp; import com.nis.domain.callback.IpAddrPool; import com.nis.domain.configuration.BaseIpCfg; +import com.nis.domain.configuration.CfgIndexInfo; import com.nis.domain.configuration.IpAddrPoolCfg; import com.nis.domain.configuration.IpMultiplexPoolCfg; import com.nis.domain.configuration.IpPortCfg; +import com.nis.domain.configuration.UserManage; import com.nis.domain.maat.ToMaatResult; import com.nis.domain.maat.MaatCfg.IpCfg; import com.nis.exceptions.MaatConvertException; import com.nis.util.ConfigServiceUtil; +import com.nis.util.Constants; import com.nis.util.StringUtils; import com.nis.util.httpclient.HttpClientUtil; import com.nis.web.dao.configuration.IpAddrPoolCfgDao; +import com.nis.web.dao.configuration.IpCfgDao; import com.nis.web.security.UserUtils; import com.nis.web.service.BaseService; import com.nis.web.service.SpringContextHolder; import com.nis.web.service.basics.PolicyGroupInfoService; +import com.nis.web.service.basics.SysDictInfoService; import jersey.repackaged.com.google.common.collect.Maps; @@ -282,4 +287,115 @@ public class IpAddrPoolCfgService extends BaseService{ return ipAddrPoolCfgDao.getCfgInfo(cfg); } + + /** + * 策略管理获取地址池信息(至少有1个IP地址有效状态该地址池才能被使用) + * @param response + * @param request + * @return + */ + public List getEffectiveAddrPool() { + List addrPools = ipAddrPoolCfgDao.findAddrPoolCfg(); + + /*String cgiUrl = "http://localhost:8080/gwall/nis/maintenance/ipMultiplexPoolCfg/cgiCall"; + if(StringUtils.isNotBlank(Constants.IP_REUSE_CGI_URL)){ + cgiUrl = Constants.IP_REUSE_CGI_URL; + } + for (IpAddrPoolCfg cfg : addrPools) { + + Map params = new HashMap(); + params.put("cmd", "IpNumGet"); + params.put("addr_pool_id", cfg.getAddrPoolId()); + try { + String resJson = HttpClientUtil.getMsg(cgiUrl, params, req); + + } catch (Exception e) { + logger.error("获取地址池信息失败!", e); + e.printStackTrace(); + } + + }*/ + + return addrPools; + } + + /** + * 策略配置审核 + * @param ids + * @param cfg + * @param auditTime + */ + @Transactional(readOnly=false,rollbackFor=RuntimeException.class) + public void auditSnatStrategy(String id, IpPortCfg cfg, Date auditTime) { + cfg.setCfgId(Long.valueOf(id)); + cfg.setTableName(IpPortCfg.getTablename()); + cfg.setAuditorId(UserUtils.getUser().getId()); + cfg.setAuditTime(auditTime); + // 更新配置审核状态 + IpCfgDao ipCfgDao = SpringContextHolder.getBean(IpCfgDao.class); + IpCfgService IpCfgService = SpringContextHolder.getBean(IpCfgService.class); + ipCfgDao.auditCfg(cfg); + + // 获取配置信息 + BaseIpCfg ipCfg = IpCfgService.getIpCfgById(cfg); + SysDictInfoService sysDictInfoService = SpringContextHolder.getBean(SysDictInfoService.class); + UserManageService userManageService = SpringContextHolder.getBean(UserManageService.class); + UserManage user = userManageService.getUserById(ipCfg.getUserRegion1()); + String json=""; + if(cfg.getIsAudit() == Constants.AUDIT_YES){ + Map params = new HashMap(); + params.put("configId", ipCfg.getCompileId()); + params.put("addrPoolId", ipCfg.getUserRegion2()); + params.put("userType", user.getUserType()); + params.put("userId", user.getId()); + params.put("isValid", 1); + params.put("opTime", auditTime); + if(ipCfg.getIsAreaEffective() == 1){ + params.put("effectiveRange", sysDictInfoService.setEffectiveRange(ipCfg.getAreaEffectiveIds())); + } + List list = Lists.newArrayList(); + list.add(params); + //调用服务接口下发配置数据 + json=gsonToJson(list); + logger.info("SNAT策略配置下发参数:"+json); + //调用服务接口下发配置 + try { + ToMaatResult result = ConfigServiceUtil.postCallbackCfg(json); + if(result!=null){ + logger.info("SNAT地址池配置下发响应信息:"+result.getMsg()); + } + } catch (Exception e) { + logger.error("SNAT策略配置下发失败",e); + throw e; + } + + }else if(cfg.getIsAudit() == Constants.AUDIT_NOT_YES){ + Map params = new HashMap(); + params.put("configId", ipCfg.getCompileId()); + params.put("addrPoolId", ipCfg.getUserRegion2()); + params.put("userType", user.getUserType()); + params.put("userId", user.getId()); + params.put("isValid", 0); + params.put("opTime", auditTime); + if(ipCfg.getIsAreaEffective() == 1){ + params.put("effectiveRange", sysDictInfoService.setEffectiveRange(ipCfg.getAreaEffectiveIds())); + } + List list = Lists.newArrayList(); + list.add(params); + //调用服务接口取消配置 + json=gsonToJson(list); + logger.info("SNAT策略配置下发参数:"+json); + //调用服务接口取消配置 + try { + ToMaatResult result = ConfigServiceUtil.put(json, 2); + logger.info("SNAT策略配置响应信息:"+result.getMsg()); + } catch (Exception e) { + e.printStackTrace(); + logger.info("SNAT策略配置配置失败"); + throw e; + } + + } + } + } diff --git a/src/main/resources/sql/20181129/add_ip_reuse_addr_pool.sql b/src/main/resources/sql/20181129/add_ip_reuse_addr_pool.sql new file mode 100644 index 000000000..816c0566e --- /dev/null +++ b/src/main/resources/sql/20181129/add_ip_reuse_addr_pool.sql @@ -0,0 +1,39 @@ +-- ---------------------------- +-- 地址池管理表 +-- ---------------------------- +DROP TABLE IF EXISTS `ip_reuse_addr_pool`; +CREATE TABLE `ip_reuse_addr_pool` ( + `cfg_id` bigint(20) NOT NULL AUTO_INCREMENT, + `addr_pool_id` int(11) NOT NULL COMMENT '地址池ID', + `addr_pool_name` varchar(128) DEFAULT NULL COMMENT '地址池名称', + `ip_total` int(11) DEFAULT NULL COMMENT '地址池IP总数', + `available_ip_total` int(11) DEFAULT NULL COMMENT '地址池可用IP数', + `action` int(11) NOT NULL COMMENT '1:阻断,2:监测, 5: FD 白名单,6:监测白名单,7: FD 监测都白名单,应与业务ID所代表的逻辑相匹配,8-灰名单', + `is_valid` int(11) NOT NULL COMMENT '0无效,1有效,-1删除\r\n1) 未审核时配置可删除\r\n2) 审核通过,此字段置1\r\n3) 取消审核通过,此字段置0', + `is_audit` int(11) NOT NULL COMMENT '0未审核,1审核通过,2审核未通过,3取消审核通过\r\n1) 审核未通过,配置可修改\r\n2) 审核通过,配置不可删除,只能取消审核通过', + `cfg_region_code` int(11) DEFAULT NULL, + `cfg_type` varchar(64) DEFAULT '', + `function_id` int(11) NOT NULL, + `service_id` int(11) NOT NULL COMMENT '参考系统业务类型管理表', + `compile_id` int(11) NOT NULL COMMENT '取自服务接口返回的maat配置的编译id,配置初始入库时获取。', + `is_area_effective` int(11) NOT NULL DEFAULT 0 COMMENT '0否,1是', + `area_effective_ids` varchar(1024) DEFAULT NULL COMMENT '多个以英文逗号分隔', + `request_id` int(11) NOT NULL COMMENT '取自request_info.id', + `classify` varchar(128) DEFAULT '' COMMENT '分类id,多个用英文逗号分隔', + `attribute` varchar(128) DEFAULT '' COMMENT '性质id,多个用英文逗号分隔', + `lable` varchar(128) DEFAULT '' COMMENT '标签id,多个用英文逗号分隔', + `creator_id` int(11) NOT NULL COMMENT '取自sys_user.id', + `create_time` datetime NOT NULL, + `editor_id` int(11) DEFAULT NULL COMMENT '取自sys_user.id', + `edit_time` datetime DEFAULT NULL, + `auditor_id` int(11) DEFAULT NULL COMMENT '取自sys_user.id', + `audit_time` datetime DEFAULT NULL, + `description` varchar(200) DEFAULT '' COMMENT '描述信息', + `cancel_request_id` int(11) DEFAULT NULL COMMENT '取消审核来函', + `user_region1` varchar(1024) DEFAULT '' COMMENT '预留自定义域1', + `user_region2` varchar(1024) DEFAULT '' COMMENT '预留自定义域2', + `user_region3` varchar(1024) DEFAULT '' COMMENT '预留自定义域3', + `user_region4` varchar(1024) DEFAULT '' COMMENT '预留自定义域4', + `user_region5` varchar(1024) DEFAULT '' COMMENT '预留自定义域5', + PRIMARY KEY (`cfg_id`) +) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4; diff --git a/src/main/webapp/WEB-INF/views/cfg/maintenance/ipMultiplexPool/snatform2.jsp b/src/main/webapp/WEB-INF/views/cfg/maintenance/ipMultiplexPool/snatform2.jsp index 3b3e7b5b1..4c6ffa9f2 100644 --- a/src/main/webapp/WEB-INF/views/cfg/maintenance/ipMultiplexPool/snatform2.jsp +++ b/src/main/webapp/WEB-INF/views/cfg/maintenance/ipMultiplexPool/snatform2.jsp @@ -140,7 +140,7 @@ var resetIndex = function(){
- +
diff --git a/src/main/webapp/WEB-INF/views/cfg/manipulation/ipmulitiplex/snatPolicyForm2.jsp b/src/main/webapp/WEB-INF/views/cfg/manipulation/ipmulitiplex/snatPolicyForm2.jsp new file mode 100644 index 000000000..abdd89fc4 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/cfg/manipulation/ipmulitiplex/snatPolicyForm2.jsp @@ -0,0 +1,320 @@ +<%@ page contentType="text/html;charset=UTF-8"%> +<%@ include file="/WEB-INF/include/taglib.jsp"%> + + +<spring:message code="${cfgName}"></spring:message> + + + +
+

+ +

+
+
+
+
+
+ + + +
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+ + + +
+
+
+
+
+
+
+
+
+ +
+ +
+
+
+
+
+ +
+ +
+ +
+ <%@include file="/WEB-INF/include/form/areaInfo.jsp"%> +
+ <%@include file="/WEB-INF/include/form/basicInfo.jsp" %> +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/cfg/manipulation/ipmulitiplex/snatPolicyList2.jsp b/src/main/webapp/WEB-INF/views/cfg/manipulation/ipmulitiplex/snatPolicyList2.jsp new file mode 100644 index 000000000..de276eb2d --- /dev/null +++ b/src/main/webapp/WEB-INF/views/cfg/manipulation/ipmulitiplex/snatPolicyList2.jsp @@ -0,0 +1,431 @@ +<%@ page contentType="text/html;charset=UTF-8"%> +<%@ include file="/WEB-INF/include/taglib.jsp"%> + + +<spring:message code="snat_policy"></spring:message> + + + + + + +
+ + +

+ +

+ +
+
+
+
+ + + + + + + + + + + + +
+
+ + + + + + + +
+ +
+ +
+
+ + + + + + + + +
+ + +
+ + + + + + + + + + + +
+
+
+
+ + + +
+
+ + + + + + +
+ + +
+
+ href="javascript:;"> + + +
+
+ + + +
+
+ +
+ +
+ + + + + + + + +
+ +
+ +
+ +
+ + + + + + + +
+ +
+ +
+ +
+ + + + + + + + +
+ +
+ +
+ +
+ + + + + + + +
+ +
+ +
+ +
+
+
+ + +
+
+ +
+
+ + " onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:true});"/> + +
+
+ +
+
+ + " onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:true});"/> + +
+
+ +
+
+ + " onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:true});"/> + +
+
+ +
+
+ + " onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:true});"/> + +
+
+ +
+
+ + " onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',isShowClear:true});"/> + +
+
+
+ + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + ${indexCfg.compileId }${indexCfg.cfgDesc } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${indexCfg.requestName } + + + + + + + + + + + + + + + ${fns:abbr(classify,20)} + + + + + + + + + + + + + + + + + ${fns:abbr(attribute,20)} + + + + + + + + + + + + + + + + + + ${fns:abbr(lableInfo,20)} + + ${indexCfg.creatorName }${indexCfg.editorName }${indexCfg.auditorName }
+
${page}
+
+
+
+
+
+ + + \ No newline at end of file