diff --git a/src/main/java/com/nis/domain/configuration/IpMultiplexPoolCfg.java b/src/main/java/com/nis/domain/configuration/IpMultiplexPoolCfg.java new file mode 100644 index 000000000..842c75536 --- /dev/null +++ b/src/main/java/com/nis/domain/configuration/IpMultiplexPoolCfg.java @@ -0,0 +1,103 @@ +package com.nis.domain.configuration; + +import java.util.Date; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +/** + * IP复用地址池配置 + * @author dell + * + */ +public class IpMultiplexPoolCfg extends BaseCfg { + + /** + * + */ + private static final long serialVersionUID = -5902468971425910528L; + @Expose + @SerializedName("cfgId") + private Integer compileId; + @Expose + @SerializedName("addType") + private String ipType; + @Expose + private Integer protocol; + @Expose + @SerializedName("ip") + private String srcIpAddress; + @Expose + private String port; + @Expose + private Integer direction; + @Expose + private String userRegion; + @Expose + private Integer location; + @Expose + private Integer policyGroup; + private String groupName; + public Integer getCompileId() { + return compileId; + } + public void setCompileId(Integer compileId) { + this.compileId = compileId; + } + public String getIpType() { + return ipType; + } + public void setIpType(String ipType) { + this.ipType = ipType; + } + public Integer getProtocol() { + return protocol; + } + public void setProtocol(Integer protocol) { + this.protocol = protocol; + } + + public String getSrcIpAddress() { + return srcIpAddress; + } + public void setSrcIpAddress(String srcIpAddress) { + this.srcIpAddress = srcIpAddress; + } + public String getPort() { + return port; + } + public void setPort(String port) { + this.port = port; + } + public Integer getDirection() { + return direction; + } + public void setDirection(Integer direction) { + this.direction = direction; + } + public String getUserRegion() { + return userRegion; + } + public void setUserRegion(String userRegion) { + this.userRegion = userRegion; + } + public Integer getLocation() { + return location; + } + public void setLocation(Integer location) { + this.location = location; + } + public Integer getPolicyGroup() { + return policyGroup; + } + public void setPolicyGroup(Integer policyGroup) { + this.policyGroup = policyGroup; + } + public String getGroupName() { + return groupName; + } + public void setGroupName(String groupName) { + this.groupName = groupName; + } + +} diff --git a/src/main/java/com/nis/web/controller/BaseController.java b/src/main/java/com/nis/web/controller/BaseController.java index 3d0047694..1e5b4bda3 100644 --- a/src/main/java/com/nis/web/controller/BaseController.java +++ b/src/main/java/com/nis/web/controller/BaseController.java @@ -67,6 +67,7 @@ import com.nis.web.service.configuration.DnsResStrategyService; import com.nis.web.service.configuration.FileTransferCfgService; import com.nis.web.service.configuration.HttpRedirectCfgService; import com.nis.web.service.configuration.IpCfgService; +import com.nis.web.service.configuration.IpMultiplexPoolCfgService; import com.nis.web.service.configuration.MailCfgService; import com.nis.web.service.configuration.NumCfgService; import com.nis.web.service.configuration.RequestInfoService; @@ -165,6 +166,8 @@ public class BaseController { protected HttpRedirectCfgService httpRedirectCfgService; @Autowired protected DdosCfgService ddosCfgService; + @Autowired + protected IpMultiplexPoolCfgService ipMultiplexPoolCfgService; /** * 管理基础路径 */ diff --git a/src/main/java/com/nis/web/controller/configuration/maintenance/IpMultiplexPoolCfgController.java b/src/main/java/com/nis/web/controller/configuration/maintenance/IpMultiplexPoolCfgController.java new file mode 100644 index 000000000..f395ca250 --- /dev/null +++ b/src/main/java/com/nis/web/controller/configuration/maintenance/IpMultiplexPoolCfgController.java @@ -0,0 +1,127 @@ +package com.nis.web.controller.configuration.maintenance; + +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import com.nis.domain.Page; +import com.nis.domain.basics.PolicyGroupInfo; +import com.nis.domain.configuration.IpMultiplexPoolCfg; +import com.nis.exceptions.MaatConvertException; +import com.nis.util.StringUtil; +import com.nis.web.controller.BaseController; + +/** + * IP复用地址池配置 + * + */ +@Controller +@RequestMapping("${adminPath}/maintenance/ipMultiplexPoolCfg") +public class IpMultiplexPoolCfgController extends BaseController { + + @RequestMapping(value = {"/form"}) + @RequiresPermissions(value={"ip:mulitiplex:pool:config"}) + public String from(Model model, + HttpServletRequest request, + HttpServletResponse response, + String ids, + @ModelAttribute("cfg")IpMultiplexPoolCfg cfg){ + if(cfg == null){ + cfg=new IpMultiplexPoolCfg(); + } + if(!StringUtil.isEmpty(ids)){ + cfg = ipMultiplexPoolCfgService.getIpMultiplexPoolCfg(Long.valueOf(ids),null); + initFormCondition(model, cfg); + }else{ + initFormCondition(model, cfg); + } + + //查询policyGroup列表,供响应策略选择 + List policyGroups=policyGroupInfoService.findPolicyGroupInfosByType(2); + model.addAttribute("policyGroups", policyGroups); + + model.addAttribute("_cfg", cfg); + return "/cfg/maintenance/ipMultiplexPool/form"; + } + + @RequestMapping(value = {"/saveOrUpdate"}) + @RequiresPermissions(value={"ip:mulitiplex:pool:config"}) + public String saveOrUpdate(Model model,HttpServletRequest request,HttpServletResponse response, + @ModelAttribute("cfg")IpMultiplexPoolCfg cfg){ + try{ + + ipMultiplexPoolCfgService.saveOrUpdate(cfg); + + addMessage(model,"save_success"); + }catch(Exception e){ + e.printStackTrace(); + addMessage(model,"save_failed"); + } + + return "redirect:" + adminPath +"/maintenance/ipMultiplexPoolCfg/list?functionId="+cfg.getFunctionId(); + } + + @RequestMapping(value = {"/list"}) + public String list(Model model,HttpServletRequest request,HttpServletResponse response,@ModelAttribute("cfg")IpMultiplexPoolCfg entity){ + //查询时left join policyGroup + Page page = ipMultiplexPoolCfgService.findPage(new Page(request, response,"r"), entity); + model.addAttribute("page", page); + initPageCondition(model); + return "/cfg/maintenance/ipMultiplexPool/list"; + } + + @RequestMapping(value = {"/delete"}) + @RequiresPermissions(value={"ip:mulitiplex:pool:config"}) + public String delete(Integer isAudit,Integer isValid,String ids,Integer functionId,Model model,HttpServletRequest request,HttpServletResponse response){ + try{ + if(!StringUtil.isEmpty(ids)){ + ipMultiplexPoolCfgService.delete(isAudit,isValid,ids,functionId); + } + addMessage(model,"delete_success"); + }catch(Exception e){ + addMessage(model,"delete_failed"); + } + + return "redirect:" + adminPath +"/maintenance/ipMultiplexPoolCfg/list?functionId="+functionId; + } + + @RequestMapping(value = {"/audit"}) + //@RequiresPermissions(value={"ip:mulitiplex:pool:audit"}) + public String audit(Integer isAudit,Integer isValid,String ids,Integer functionId,RedirectAttributes redirectAttributes) { + if(!StringUtil.isEmpty(ids)){ + String[] idArray = ids.split(","); + Date auditTime=new Date(); + for(String id :idArray){ + try { + ipMultiplexPoolCfgService.audit(isAudit,isValid,functionId,id,auditTime); + } catch (MaatConvertException e) { + e.printStackTrace(); + logger.info("VOIP配置下发失败:"+e.getMessage()); + addMessage(redirectAttributes, e.getMessage()); + } + } + + } + return "redirect:" + adminPath +"/maintenance/ipMultiplexPoolCfg/list?functionId="+functionId; + } + @ResponseBody + @RequestMapping(value = "/validCfgId") + public boolean validCfgId(Long cfgId) { + IpMultiplexPoolCfg dns=ipMultiplexPoolCfgService.getIpMultiplexPoolCfg(cfgId,null); + if(dns == null ){ + return false; + }else{ + return true; + } + } +} diff --git a/src/main/java/com/nis/web/dao/configuration/IpMultiplexPoolCfgDao.java b/src/main/java/com/nis/web/dao/configuration/IpMultiplexPoolCfgDao.java new file mode 100644 index 000000000..ff4108742 --- /dev/null +++ b/src/main/java/com/nis/web/dao/configuration/IpMultiplexPoolCfgDao.java @@ -0,0 +1,18 @@ +package com.nis.web.dao.configuration; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.nis.domain.configuration.IpMultiplexPoolCfg; +import com.nis.web.dao.CrudDao; +import com.nis.web.dao.MyBatisDao; + +@MyBatisDao +public interface IpMultiplexPoolCfgDao extends CrudDao { + List findPage(IpMultiplexPoolCfg cfg); + List findList(@Param("cfgId")Long cfgId + ,@Param("isAudit")Integer isAudit + ,@Param("isValid")Integer isValid); + +} \ No newline at end of file diff --git a/src/main/java/com/nis/web/dao/configuration/IpMultiplexPoolCfgDao.xml b/src/main/java/com/nis/web/dao/configuration/IpMultiplexPoolCfgDao.xml new file mode 100644 index 000000000..a911869d3 --- /dev/null +++ b/src/main/java/com/nis/web/dao/configuration/IpMultiplexPoolCfgDao.xml @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + r.cfg_id,r.cfg_desc,r.ip_type, + r.protocol,r.ip,r.port,r.direction + ,r.user_region,r.location,policy_group,r.action + ,r.is_valid,r.is_audit,r.creator_id,r.create_time,r.editor_id + ,r.edit_time,r.auditor_id,r.audit_time,r.service_id,r.request_id + ,r.is_area_effective,r.classify,r.attribute,r.lable + ,r.area_effective_ids,r.function_id,r.cfg_region_code,r.compile_id + + + + + + + + insert into ip_multiplex_pool_cfg ( + CFG_ID, + CFG_DESC, + ACTION, + IS_VALID, + IS_AUDIT, + CREATOR_ID, + CREATE_TIME, + EDITOR_ID, + EDIT_TIME, + AUDITOR_ID, + AUDIT_TIME, + SERVICE_ID, + REQUEST_ID, + IS_AREA_EFFECTIVE, + CLASSIFY, + ATTRIBUTE, + LABLE, + AREA_EFFECTIVE_IDS, + function_id, + ip_type, + protocol, + ip, + port, + direction, + user_region, + location, + policy_group, + cfg_type, + compile_Id, + cfg_region_code + )values ( + #{cfgId,jdbcType=VARCHAR}, + #{cfgDesc,jdbcType=VARCHAR}, + #{action,jdbcType=INTEGER}, + 0, + 0, + #{creatorId,jdbcType=INTEGER}, + #{createTime,jdbcType=TIMESTAMP}, + #{editorId,jdbcType=INTEGER}, + #{editTime,jdbcType=TIMESTAMP}, + #{auditorId,jdbcType=INTEGER}, + #{auditTime,jdbcType=TIMESTAMP}, + #{serviceId,jdbcType=INTEGER}, + #{requestId,jdbcType=INTEGER}, + #{isAreaEffective,jdbcType=INTEGER}, + #{classify,jdbcType=VARCHAR}, + #{attribute,jdbcType=VARCHAR}, + #{lable,jdbcType=VARCHAR}, + #{areaEffectiveIds,jdbcType=VARCHAR}, + #{functionId,jdbcType=INTEGER}, + #{ipType,jdbcType=INTEGER}, + #{protocol,jdbcType=INTEGER}, + #{srcIpAddress,jdbcType=VARCHAR}, + #{port,jdbcType=VARCHAR}, + #{direction,jdbcType=INTEGER}, + #{userRegion,jdbcType=VARCHAR}, + #{location,jdbcType=INTEGER}, + #{policyGroup,jdbcType=VARCHAR}, + #{cfgType,jdbcType=VARCHAR}, + #{compileId,jdbcType=INTEGER}, + #{cfgRegionCode,jdbcType=INTEGER} + ) + + + + update ip_multiplex_pool_cfg + + + + cfg_desc = #{cfgDesc,jdbcType=VARCHAR}, + + + compile_Id = #{compileId,jdbcType=VARCHAR}, + + + action = #{action,jdbcType=INTEGER}, + + + is_valid = #{isValid,jdbcType=INTEGER}, + + + is_audit = #{isAudit,jdbcType=INTEGER}, + + + editor_id = #{editorId,jdbcType=INTEGER}, + + + edit_time = #{editTime,jdbcType=TIMESTAMP}, + + + AUDITOR_ID = #{auditorId,jdbcType=INTEGER}, + + + AUDIT_TIME = #{auditTime,jdbcType=TIMESTAMP}, + + + request_id = #{requestId,jdbcType=INTEGER}, + + + is_area_effective = #{isAreaEffective,jdbcType=INTEGER}, + + + classify = #{classify,jdbcType=VARCHAR}, + + + attribute = #{attribute,jdbcType=VARCHAR}, + + + lable = #{lable,jdbcType=VARCHAR}, + + + area_effective_ids = #{areaEffectiveIds,jdbcType=VARCHAR}, + + + function_id = #{functionId,jdbcType=INTEGER}, + + + service_id = #{serviceId,jdbcType=INTEGER}, + + + ip_type = #{ipType,jdbcType=INTEGER}, + + + protocol = #{protocol,jdbcType=INTEGER}, + + + ip = #{srcIpAddress,jdbcType=VARCHAR}, + + + port = #{port,jdbcType=VARCHAR}, + + + direction = #{direction,jdbcType=INTEGER}, + + + user_region = #{userRegion,jdbcType=VARCHAR}, + + + location = #{location,jdbcType=INTEGER}, + + + policy_group = #{policyGroup,jdbcType=INTEGER}, + + + + + and cfg_id = #{cfgId,jdbcType=INTEGER} + + and function_id = #{functionId,jdbcType=INTEGER} + + + + + \ No newline at end of file diff --git a/src/main/java/com/nis/web/service/configuration/IpMultiplexPoolCfgService.java b/src/main/java/com/nis/web/service/configuration/IpMultiplexPoolCfgService.java new file mode 100644 index 000000000..c327ba5d7 --- /dev/null +++ b/src/main/java/com/nis/web/service/configuration/IpMultiplexPoolCfgService.java @@ -0,0 +1,173 @@ +package com.nis.web.service.configuration; + + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.nis.domain.Page; +import com.nis.domain.callback.NtcDnsResStrategy; +import com.nis.domain.configuration.DnsResStrategy; +import com.nis.domain.configuration.IpMultiplexPoolCfg; +import com.nis.domain.maat.ToMaatResult; +import com.nis.exceptions.MaatConvertException; +import com.nis.util.ConfigServiceUtil; +import com.nis.web.dao.configuration.IpMultiplexPoolCfgDao; +import com.nis.web.security.UserUtils; +import com.nis.web.service.BaseService; + + + +/** + * 音视频文本 + * @author dell + * + */ +@Service +public class IpMultiplexPoolCfgService extends BaseService{ + @Autowired + protected IpMultiplexPoolCfgDao ipMultiplexStrategyDao; + + + /** + * 查询分页数据 + * @param page 分页对象 + * @param entity + * @return + */ + public Page findPage(Page page, IpMultiplexPoolCfg entity) { + entity.getSqlMap().put("dsf", configScopeFilter(entity.getCurrentUser(),"r")); + entity.setPage(page); + List list=ipMultiplexStrategyDao.findPage(entity); + page.setList(list); + return page; + } + public List findIpMultiplexPoolCfgs(Long cfgId,Integer isValid,Integer isAudit) { + List list=ipMultiplexStrategyDao.findList(cfgId,isValid,isAudit); + return list; + } + + public IpMultiplexPoolCfg getIpMultiplexPoolCfg(Long id,Integer isValid) { + List list=ipMultiplexStrategyDao.findList(id,isValid,null); + IpMultiplexPoolCfg dnsResStrategy=null; + if(list != null && list.size()>0){ + dnsResStrategy=list.get(0); + } + return dnsResStrategy; + } + @Transactional(readOnly=false,rollbackFor=RuntimeException.class) + public void saveOrUpdate(IpMultiplexPoolCfg entity){ + Date createTime=new Date(); + setAreaEffectiveIds(entity); + if(entity.getCfgId()==null){ + entity.initDefaultValue(); + entity.setCreatorId(UserUtils.getUser().getId()); + entity.setCreateTime(createTime); + entity.setIsValid(0); + entity.setIsAudit(0); + //调用服务接口获取compileId + List compileIds = new ArrayList(); + try { + compileIds = ConfigServiceUtil.getId(1,1); + } catch (Exception e) { + e.printStackTrace(); + logger.info("获取编译ID出错"); + throw new MaatConvertException(":"+e.getMessage()); + } + if(compileIds != null && compileIds.size() >0 && compileIds.get(0) != 0){ + entity.setCompileId(compileIds.get(0)); + } + ipMultiplexStrategyDao.insert(entity); + //修改 + }else{ + Date editTime=new Date(); + entity.setIsValid(0); + entity.setIsAudit(0); + entity.setEditorId(UserUtils.getUser().getId()); + entity.setEditTime(editTime); + + ipMultiplexStrategyDao.update(entity); + } + } + + /** + * + * @param isAudit + * @param isValid + * @param ids compileIds + */ + @Transactional(readOnly=false,rollbackFor=RuntimeException.class) + public void delete(Integer isAudit,Integer isValid,String ids,Integer functionId){ + IpMultiplexPoolCfg entity = new IpMultiplexPoolCfg(); + String[] idArray = ids.split(","); + for(String id :idArray){ + entity.setCfgId(Long.valueOf(id)); + entity.setFunctionId(functionId); + entity.setIsAudit(isAudit); + entity.setIsValid(isValid); + entity.setEditorId(UserUtils.getUser().getId()); + entity.setEditTime(new Date()); + ipMultiplexStrategyDao.update(entity); + } + } + /** + * + * @param isAudit + * @param isValid + * @param ids cfgId + * @param functionId + */ + @Transactional(readOnly=false,rollbackFor=RuntimeException.class) + public void audit(Integer isAudit,Integer isValid,Integer functionId,String id,Date auditTime){ + IpMultiplexPoolCfg cfg=new IpMultiplexPoolCfg(); + cfg.setCfgId(Long.valueOf(id)); + cfg.setIsValid(isValid); + cfg.setIsAudit(isAudit); + cfg.setEditTime(auditTime); + cfg.setEditorId(UserUtils.getUser().getId()); + cfg.setAuditorId(UserUtils.getUser().getId()); + cfg.setAuditTime(auditTime); + ipMultiplexStrategyDao.update(cfg); + cfg=getIpMultiplexPoolCfg(cfg.getCfgId(), null); + String json=""; + if(cfg.getIsAudit()==1){ + List resStrategyList=new ArrayList(); + resStrategyList.add(cfg); + //调用服务接口下发配置数据 + json=gsonToJson(resStrategyList); + logger.info("IP复用地址池配置下发配置参数:"+json); + //调用服务接口下发配置 + try { + ToMaatResult result = ConfigServiceUtil.postCallbackCfg(json); + if(result!=null){ + logger.info("IP复用地址池配置下发响应信息:"+result.getMsg()); + } + } catch (Exception e) { + logger.error("IP复用地址池配置配置下发失败",e); + throw e; + } + }else if(cfg.getIsAudit()==3){ + List resStrategyList=new ArrayList<>(); + resStrategyList.add(cfg); + //调用服务接口取消配置 + json=gsonToJson(resStrategyList); + logger.info("IP复用地址池配置配置参数:"+json); + //调用服务接口取消配置 + try { + ToMaatResult result = ConfigServiceUtil.put(json, 2); + logger.info("IP复用地址池配置响应信息:"+result.getMsg()); + } catch (Exception e) { + e.printStackTrace(); + logger.info("IP复用地址池配置配置失败"); + throw e; + } + } + } +} + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/cfg/maintenance/ipMultiplexPool/form.jsp b/src/main/webapp/WEB-INF/views/cfg/maintenance/ipMultiplexPool/form.jsp new file mode 100644 index 000000000..7bf8bc050 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/cfg/maintenance/ipMultiplexPool/form.jsp @@ -0,0 +1,224 @@ +<%@ 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/basicInfo.jsp" %> +
+
+
+
+
+
+ + +
+
+
+
+
+
+
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/cfg/maintenance/ipMultiplexPool/list.jsp b/src/main/webapp/WEB-INF/views/cfg/maintenance/ipMultiplexPool/list.jsp new file mode 100644 index 000000000..251a48fa4 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/cfg/maintenance/ipMultiplexPool/list.jsp @@ -0,0 +1,432 @@ +<%@ page contentType="text/html;charset=UTF-8"%> +<%@ include file="/WEB-INF/include/taglib.jsp"%> + + +<spring:message code="${cfgName}"></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});"/> + +
+
+
+ + +
+ + +
+
+
+ + + + + <%-- --%> + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + + + + + + + + + +
+ + ${fns:abbr(cfg.cfgDesc,20)} + + + + ${fns:abbr(cfg.groupName,20)} + + ${cfg.srcIpAddress }${cfg.port } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${cfg.requestName } + + + + + + + + + + + + + + + ${fns:abbr(classify,20)} + + + + + + + + + + + + + + + + + ${fns:abbr(attribute,20)} + + + + + + + + + + + + + + + + + ${fns:abbr(lableInfo,20)} + + ${cfg.areaEffectiveIds } + + + + ${cfg.creatorName }${cfg.editorName }${cfg.auditorName }
+
${page}
+
+ +
+
+
+ + + \ No newline at end of file