From 609de9154402f2926dca775bbdc703ddc91b3422 Mon Sep 17 00:00:00 2001 From: "gao_xianglong@sina.com" Date: Fri, 5 Jan 2018 18:39:52 +0800 Subject: [PATCH] =?UTF-8?q?TITAN2.0.0-SNAPSHOT=E7=89=88=E6=9C=AC=E5=8F=91?= =?UTF-8?q?=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 16 + titan-agent/pom.xml | 72 +++ .../titan/agent/IdleConnectionEvictor.java | 51 ++ .../main/java/com/yunji/titan/agent/Main.java | 51 ++ .../com/yunji/titan/agent/RequestHandler.java | 294 +++++++++++ .../agent/adapter/BaseStresstestAdapter.java | 40 ++ .../yunji/titan/agent/bean/bo/OutParamBO.java | 57 ++ .../agent/config/HttpConnectionManager.java | 142 +++++ .../yunji/titan/agent/state/AgentState.java | 44 ++ .../titan/agent/state/AgentStateContext.java | 62 +++ .../titan/agent/state/BusynessState.java | 40 ++ .../yunji/titan/agent/state/FreeState.java | 40 ++ .../yunji/titan/agent/state/StopState.java | 39 ++ .../stresstest/HttpGetRequestStresstest.java | 100 ++++ .../stresstest/HttpPostRequestStresstest.java | 137 +++++ .../titan/agent/stresstest/Stresstest.java | 126 +++++ .../titan/agent/utils/ChangeAgentState.java | 57 ++ .../yunji/titan/agent/utils/MsgProvider.java | 57 ++ .../yunji/titan/agent/utils/ParamUtils.java | 137 +++++ .../titan/agent/utils/ResultStatistics.java | 45 ++ .../agent/watch/registry/RegisterAgent.java | 184 +++++++ .../yunji/titan/task/facade/TaskFacade.java | 72 +++ .../src/main/resources/dubbo-context.xml | 19 + .../src/main/resources/ftp-context.xml | 26 + titan-agent/src/main/resources/log4j.xml | 43 ++ .../resources/properties/agent.properties | 35 ++ .../src/main/resources/root-context.xml | 39 ++ titan-agent/src/main/resources/shutdown.sh | 11 + titan-agent/src/main/resources/start.sh | 5 + titan-agent/src/main/resources/zk-context.xml | 19 + .../agent/GetRequestPerformanceTestTest.java | 31 ++ titan-datacollect/pom.xml | 78 +++ .../com/yunji/titan/datacollect/Main.java | 53 ++ .../titan/datacollect/MasterElection.java | 100 ++++ .../titan/datacollect/SubscribeMessage.java | 164 ++++++ .../yunji/titan/datacollect/UploadData.java | 99 ++++ .../titan/datacollect/bean/po/ReportPO.java | 190 +++++++ .../datacollect/dao/report/MonitorDao.java | 38 ++ .../dao/report/MonitorDaoImpl.java | 55 ++ .../datacollect/dao/report/ReportDao.java | 54 ++ .../datacollect/dao/report/ReportDaoImpl.java | 52 ++ .../datacollect/utils/ResultStatistics.java | 87 ++++ .../src/main/resources/dao-context.xml | 42 ++ .../src/main/resources/log4j.xml | 43 ++ .../properties/datacollect.properties | 32 ++ .../src/main/resources/root-context.xml | 33 ++ .../src/main/resources/shutdown.sh | 11 + titan-datacollect/src/main/resources/start.sh | 5 + .../src/main/resources/zk-context.xml | 19 + titan-manager/doc/sql/yunjititan.sql | 130 +++++ titan-manager/pom.xml | 148 ++++++ .../titan/manager/bo/ActionPerformanceBO.java | 229 ++++++++ .../yunji/titan/manager/bo/AgentInfoBO.java | 50 ++ .../titan/manager/bo/AutomaticTaskBO.java | 93 ++++ .../yunji/titan/manager/bo/FileUploadBO.java | 52 ++ .../com/yunji/titan/manager/bo/LinkBO.java | 143 +++++ .../yunji/titan/manager/bo/LoginResultBO.java | 51 ++ .../yunji/titan/manager/bo/MonitorSetBO.java | 105 ++++ .../com/yunji/titan/manager/bo/OperateBO.java | 58 +++ .../titan/manager/bo/OverviewResultBO.java | 122 +++++ .../yunji/titan/manager/bo/PageRequestBO.java | 72 +++ .../com/yunji/titan/manager/bo/Pager.java | 59 +++ .../com/yunji/titan/manager/bo/ReportBO.java | 253 +++++++++ .../com/yunji/titan/manager/bo/SceneBO.java | 211 ++++++++ .../yunji/titan/manager/bo/SceneDetailBO.java | 74 +++ .../yunji/titan/manager/bo/UserInfoBO.java | 67 +++ .../titan/manager/common/CharsetTypeEnum.java | 92 ++++ .../titan/manager/common/ContentTypeEnum.java | 95 ++++ .../yunji/titan/manager/common/Groups.java | 32 ++ .../manager/common/OperateTypeConstant.java | 39 ++ .../titan/manager/common/RedisHelper.java | 100 ++++ .../titan/manager/common/SceneStatusEnum.java | 75 +++ .../manager/common/TaskSyncTypeEnum.java | 55 ++ .../titan/manager/common/TitanConstant.java | 30 ++ .../controller/AutomaticTaskController.java | 284 ++++++++++ .../manager/controller/FileController.java | 148 ++++++ .../manager/controller/LinkController.java | 266 ++++++++++ .../manager/controller/LoginController.java | 138 +++++ .../controller/MonitorSetController.java | 229 ++++++++ .../manager/controller/OperateController.java | 200 +++++++ .../controller/OverviewController.java | 155 ++++++ .../controller/PageJumpController.java | 190 +++++++ .../manager/controller/ReportController.java | 311 +++++++++++ .../manager/controller/SceneController.java | 310 +++++++++++ .../titan/manager/dao/AutomaticTaskDao.java | 129 +++++ .../com/yunji/titan/manager/dao/BaseDao.java | 145 ++++++ .../com/yunji/titan/manager/dao/LinkDao.java | 179 +++++++ .../yunji/titan/manager/dao/MonitorDao.java | 158 ++++++ .../titan/manager/dao/MonitorSetDao.java | 141 +++++ .../yunji/titan/manager/dao/ReportDao.java | 161 ++++++ .../com/yunji/titan/manager/dao/SceneDao.java | 308 +++++++++++ .../titan/manager/entity/AutomaticTask.java | 89 ++++ .../com/yunji/titan/manager/entity/Link.java | 127 +++++ .../yunji/titan/manager/entity/Monitor.java | 98 ++++ .../titan/manager/entity/MonitorSet.java | 77 +++ .../yunji/titan/manager/entity/Report.java | 188 +++++++ .../com/yunji/titan/manager/entity/Scene.java | 185 +++++++ .../entity/mapper/AutomaticTaskMapper.java | 48 ++ .../manager/entity/mapper/LinkMapper.java | 53 ++ .../manager/entity/mapper/ReportMapper.java | 60 +++ .../manager/entity/mapper/SceneMapper.java | 60 +++ .../titan/manager/impl/dao/BaseDaoImpl.java | 145 ++++++ .../manager/impl/dao/base/BeanInfoUtil.java | 103 ++++ .../titan/manager/impl/dao/base/Criteria.java | 101 ++++ .../impl/dao/base/DefaultNameHandler.java | 68 +++ .../manager/impl/dao/base/NameHandler.java | 47 ++ .../impl/dao/base/OperateTypeEnum.java | 66 +++ .../titan/manager/impl/dao/base/Operator.java | 57 ++ .../titan/manager/impl/dao/base/Pager.java | 65 +++ .../impl/dao/base/SqlAssembleTools.java | 335 ++++++++++++ .../titan/manager/impl/dao/base/SqlBean.java | 58 +++ .../impl/service/AgentServiceImpl.java | 91 ++++ .../service/AutomaticTaskServiceImpl.java | 151 ++++++ .../manager/impl/service/LinkServiceImpl.java | 254 +++++++++ .../impl/service/MonitorServiceImpl.java | 109 ++++ .../impl/service/MonitorSetServiceImpl.java | 226 ++++++++ .../impl/service/OperateServiceImpl.java | 217 ++++++++ .../impl/service/ReportServiceImpl.java | 163 ++++++ .../impl/service/SceneServiceImpl.java | 261 ++++++++++ .../manager/interceptor/LoginInterceptor.java | 101 ++++ .../yunji/titan/manager/job/MonitorTask.java | 91 ++++ .../titan/manager/result/ComponentResult.java | 45 ++ .../yunji/titan/manager/result/Result.java | 61 +++ .../titan/manager/service/AgentService.java | 36 ++ .../manager/service/AutomaticTaskService.java | 108 ++++ .../titan/manager/service/LinkService.java | 132 +++++ .../titan/manager/service/MonitorService.java | 77 +++ .../manager/service/MonitorSetService.java | 123 +++++ .../titan/manager/service/OperateService.java | 61 +++ .../titan/manager/service/ReportService.java | 110 ++++ .../titan/manager/service/SceneService.java | 173 ++++++ .../titan/manager/utils/CommonTypeUtil.java | 67 +++ .../yunji/titan/manager/utils/CookieUtil.java | 90 ++++ .../titan/manager/utils/EmailSender.java | 175 +++++++ .../yunji/titan/manager/utils/FileUtil.java | 94 ++++ .../yunji/titan/manager/utils/Md5Util.java | 48 ++ .../yunji/titan/manager/utils/ResultUtil.java | 150 ++++++ .../manager/utils/TicketBuilderUtil.java | 38 ++ .../titan/manager/utils/TitanDateUtil.java | 49 ++ .../titan/manager/utils/ValidatorUtil.java | 60 +++ .../utils/timertask/DistributedTimerTask.java | 52 ++ .../timertask/DistributedTimerTaskImpl.java | 54 ++ .../utils/timertask/MasterElection.java | 102 ++++ .../manager/utils/timertask/TaskExecutor.java | 77 +++ .../manager/utils/timertask/TaskInfoBean.java | 43 ++ .../utils/timertask/TimerTaskListener.java | 165 ++++++ .../yunji/titan/task/facade/TaskFacade.java | 72 +++ .../src/main/resources/dao-context.xml | 57 ++ .../src/main/resources/dubbo-context.xml | 21 + .../src/main/resources/ftp-context.xml | 27 + titan-manager/src/main/resources/log4j.xml | 64 +++ .../resources/properties/config.properties | 76 +++ .../resources/properties/dubbo.properties | 7 + .../resources/properties/redis.properties | 6 + .../src/main/resources/redis-context.xml | 31 ++ .../main/resources/shell/restart-agents.sh | 29 ++ .../main/resources/shell/shutdown-agents.sh | 18 + .../src/main/resources/shell/start-agents.sh | 20 + .../src/main/resources/springmvc-root.xml | 80 +++ .../src/main/resources/zk-context.xml | 27 + .../src/main/webapp/META-INF/MANIFEST.MF | 3 + .../src/main/webapp/WEB-INF/pages/main.jsp | 197 +++++++ .../WEB-INF/pages/monitor/monitor_list.jsp | 322 ++++++++++++ .../main/webapp/WEB-INF/pages/overview.jsp | 350 +++++++++++++ .../WEB-INF/pages/pressure/do_pressure.jsp | 198 +++++++ .../pages/pressure/do_pressure_list.jsp | 434 ++++++++++++++++ .../WEB-INF/pages/pressure/link_add.jsp | 264 ++++++++++ .../WEB-INF/pages/pressure/link_list.jsp | 211 ++++++++ .../WEB-INF/pages/pressure/scene_add.jsp | 491 ++++++++++++++++++ .../WEB-INF/pages/pressure/scene_list.jsp | 211 ++++++++ .../WEB-INF/pages/report/report_detail.jsp | 307 +++++++++++ .../WEB-INF/pages/report/report_list.jsp | 267 ++++++++++ titan-manager/src/main/webapp/WEB-INF/web.xml | 78 +++ titan-manager/src/main/webapp/css/login.css | 97 ++++ titan-manager/src/main/webapp/css/style.css | 169 ++++++ titan-manager/src/main/webapp/css/titan.css | 90 ++++ titan-manager/src/main/webapp/error/404.html | 10 + titan-manager/src/main/webapp/favicon.ico | Bin 0 -> 67646 bytes titan-manager/src/main/webapp/images/back.png | Bin 0 -> 914190 bytes titan-manager/src/main/webapp/images/bad.png | Bin 0 -> 39477 bytes .../src/main/webapp/images/github.png | Bin 0 -> 5045 bytes titan-manager/src/main/webapp/images/logo.png | Bin 0 -> 10043 bytes .../src/main/webapp/images/logo2.png | Bin 0 -> 4350 bytes titan-manager/src/main/webapp/images/qq.png | Bin 0 -> 16414 bytes titan-manager/src/main/webapp/images/well.png | Bin 0 -> 32144 bytes titan-manager/src/main/webapp/index.html | 110 ++++ titan-manager/src/main/webapp/js/common.js | 79 +++ titan-manager/src/main/webapp/js/cookie.js | 37 ++ .../src/main/webapp/js/jquery.min.js | 5 + titan-manager/src/main/webapp/js/overview.js | 159 ++++++ titan-manager/src/main/webapp/login.html | 145 ++++++ .../src/main/webapp/plugins/echarts.min.js | 38 ++ .../main/webapp/plugins/layui/css/layui.css | 2 + .../webapp/plugins/layui/css/layui.mobile.css | 2 + .../webapp/plugins/layui/css/modules/code.css | 2 + .../css/modules/laydate/default/laydate.css | 2 + .../css/modules/layer/default/icon-ext.png | Bin 0 -> 5911 bytes .../layui/css/modules/layer/default/icon.png | Bin 0 -> 11493 bytes .../layui/css/modules/layer/default/layer.css | 2 + .../css/modules/layer/default/loading-0.gif | Bin 0 -> 5793 bytes .../css/modules/layer/default/loading-1.gif | Bin 0 -> 701 bytes .../css/modules/layer/default/loading-2.gif | Bin 0 -> 1787 bytes .../webapp/plugins/layui/font/iconfont.eot | Bin 0 -> 33180 bytes .../webapp/plugins/layui/font/iconfont.svg | 402 ++++++++++++++ .../webapp/plugins/layui/font/iconfont.ttf | Bin 0 -> 33004 bytes .../webapp/plugins/layui/font/iconfont.woff | Bin 0 -> 21688 bytes .../webapp/plugins/layui/images/face/0.gif | Bin 0 -> 2689 bytes .../webapp/plugins/layui/images/face/1.gif | Bin 0 -> 5514 bytes .../webapp/plugins/layui/images/face/10.gif | Bin 0 -> 2797 bytes .../webapp/plugins/layui/images/face/11.gif | Bin 0 -> 4121 bytes .../webapp/plugins/layui/images/face/12.gif | Bin 0 -> 3361 bytes .../webapp/plugins/layui/images/face/13.gif | Bin 0 -> 7425 bytes .../webapp/plugins/layui/images/face/14.gif | Bin 0 -> 2375 bytes .../webapp/plugins/layui/images/face/15.gif | Bin 0 -> 1793 bytes .../webapp/plugins/layui/images/face/16.gif | Bin 0 -> 6721 bytes .../webapp/plugins/layui/images/face/17.gif | Bin 0 -> 4439 bytes .../webapp/plugins/layui/images/face/18.gif | Bin 0 -> 3017 bytes .../webapp/plugins/layui/images/face/19.gif | Bin 0 -> 3040 bytes .../webapp/plugins/layui/images/face/2.gif | Bin 0 -> 3222 bytes .../webapp/plugins/layui/images/face/20.gif | Bin 0 -> 5144 bytes .../webapp/plugins/layui/images/face/21.gif | Bin 0 -> 5191 bytes .../webapp/plugins/layui/images/face/22.gif | Bin 0 -> 9823 bytes .../webapp/plugins/layui/images/face/23.gif | Bin 0 -> 3792 bytes .../webapp/plugins/layui/images/face/24.gif | Bin 0 -> 8096 bytes .../webapp/plugins/layui/images/face/25.gif | Bin 0 -> 3127 bytes .../webapp/plugins/layui/images/face/26.gif | Bin 0 -> 3291 bytes .../webapp/plugins/layui/images/face/27.gif | Bin 0 -> 4377 bytes .../webapp/plugins/layui/images/face/28.gif | Bin 0 -> 2793 bytes .../webapp/plugins/layui/images/face/29.gif | Bin 0 -> 4854 bytes .../webapp/plugins/layui/images/face/3.gif | Bin 0 -> 4017 bytes .../webapp/plugins/layui/images/face/30.gif | Bin 0 -> 2555 bytes .../webapp/plugins/layui/images/face/31.gif | Bin 0 -> 2002 bytes .../webapp/plugins/layui/images/face/32.gif | Bin 0 -> 3481 bytes .../webapp/plugins/layui/images/face/33.gif | Bin 0 -> 2454 bytes .../webapp/plugins/layui/images/face/34.gif | Bin 0 -> 3700 bytes .../webapp/plugins/layui/images/face/35.gif | Bin 0 -> 1800 bytes .../webapp/plugins/layui/images/face/36.gif | Bin 0 -> 2331 bytes .../webapp/plugins/layui/images/face/37.gif | Bin 0 -> 1513 bytes .../webapp/plugins/layui/images/face/38.gif | Bin 0 -> 3615 bytes .../webapp/plugins/layui/images/face/39.gif | Bin 0 -> 6495 bytes .../webapp/plugins/layui/images/face/4.gif | Bin 0 -> 5689 bytes .../webapp/plugins/layui/images/face/40.gif | Bin 0 -> 3154 bytes .../webapp/plugins/layui/images/face/41.gif | Bin 0 -> 3644 bytes .../webapp/plugins/layui/images/face/42.gif | Bin 0 -> 5305 bytes .../webapp/plugins/layui/images/face/43.gif | Bin 0 -> 2674 bytes .../webapp/plugins/layui/images/face/44.gif | Bin 0 -> 4126 bytes .../webapp/plugins/layui/images/face/45.gif | Bin 0 -> 3417 bytes .../webapp/plugins/layui/images/face/46.gif | Bin 0 -> 3007 bytes .../webapp/plugins/layui/images/face/47.gif | Bin 0 -> 2333 bytes .../webapp/plugins/layui/images/face/48.gif | Bin 0 -> 2689 bytes .../webapp/plugins/layui/images/face/49.gif | Bin 0 -> 2315 bytes .../webapp/plugins/layui/images/face/5.gif | Bin 0 -> 4567 bytes .../webapp/plugins/layui/images/face/50.gif | Bin 0 -> 5866 bytes .../webapp/plugins/layui/images/face/51.gif | Bin 0 -> 2785 bytes .../webapp/plugins/layui/images/face/52.gif | Bin 0 -> 777 bytes .../webapp/plugins/layui/images/face/53.gif | Bin 0 -> 2127 bytes .../webapp/plugins/layui/images/face/54.gif | Bin 0 -> 2196 bytes .../webapp/plugins/layui/images/face/55.gif | Bin 0 -> 1971 bytes .../webapp/plugins/layui/images/face/56.gif | Bin 0 -> 2034 bytes .../webapp/plugins/layui/images/face/57.gif | Bin 0 -> 2705 bytes .../webapp/plugins/layui/images/face/58.gif | Bin 0 -> 2258 bytes .../webapp/plugins/layui/images/face/59.gif | Bin 0 -> 10311 bytes .../webapp/plugins/layui/images/face/6.gif | Bin 0 -> 2213 bytes .../webapp/plugins/layui/images/face/60.gif | Bin 0 -> 3245 bytes .../webapp/plugins/layui/images/face/61.gif | Bin 0 -> 2495 bytes .../webapp/plugins/layui/images/face/62.gif | Bin 0 -> 2017 bytes .../webapp/plugins/layui/images/face/63.gif | Bin 0 -> 5871 bytes .../webapp/plugins/layui/images/face/64.gif | Bin 0 -> 6448 bytes .../webapp/plugins/layui/images/face/65.gif | Bin 0 -> 3576 bytes .../webapp/plugins/layui/images/face/66.gif | Bin 0 -> 3029 bytes .../webapp/plugins/layui/images/face/67.gif | Bin 0 -> 2701 bytes .../webapp/plugins/layui/images/face/68.gif | Bin 0 -> 1424 bytes .../webapp/plugins/layui/images/face/69.gif | Bin 0 -> 2431 bytes .../webapp/plugins/layui/images/face/7.gif | Bin 0 -> 3398 bytes .../webapp/plugins/layui/images/face/70.gif | Bin 0 -> 4590 bytes .../webapp/plugins/layui/images/face/71.gif | Bin 0 -> 5304 bytes .../webapp/plugins/layui/images/face/8.gif | Bin 0 -> 4050 bytes .../webapp/plugins/layui/images/face/9.gif | Bin 0 -> 4221 bytes .../plugins/layui/lay/modules/carousel.js | 2 + .../webapp/plugins/layui/lay/modules/code.js | 2 + .../plugins/layui/lay/modules/element.js | 2 + .../webapp/plugins/layui/lay/modules/flow.js | 2 + .../webapp/plugins/layui/lay/modules/form.js | 2 + .../plugins/layui/lay/modules/jquery.js | 5 + .../plugins/layui/lay/modules/laydate.js | 2 + .../plugins/layui/lay/modules/layedit.js | 2 + .../webapp/plugins/layui/lay/modules/layer.js | 2 + .../plugins/layui/lay/modules/laypage.js | 2 + .../plugins/layui/lay/modules/laytpl.js | 2 + .../plugins/layui/lay/modules/mobile.js | 2 + .../webapp/plugins/layui/lay/modules/table.js | 2 + .../webapp/plugins/layui/lay/modules/tree.js | 2 + .../plugins/layui/lay/modules/upload.js | 2 + .../webapp/plugins/layui/lay/modules/util.js | 2 + .../main/webapp/plugins/layui/layui.all.js | 5 + .../src/main/webapp/plugins/layui/layui.js | 2 + .../com/yunji/titan/manager/BaseDaoTest.java | 224 ++++++++ .../yunji/titan/manager/EmailSenderTest.java | 47 ++ .../yunji/titan/manager/LinkServiceTest.java | 97 ++++ .../yunji/titan/manager/MonitorDaoTest.java | 47 ++ .../titan/manager/MonitorServiceTest.java | 57 ++ .../titan/manager/ReportServiceTest.java | 104 ++++ .../yunji/titan/manager/SceneServiceTest.java | 119 +++++ .../titan/manager/test/BaseJunit4Test.java | 33 ++ titan-monitor/pom.xml | 54 ++ titan-monitor/src/doc/readme.txt | 1 + .../java/com/yunji/titan/monitor/Main.java | 48 ++ .../titan/monitor/service/InitMonitor.java | 144 +++++ .../titan/monitor/utils/MsgProvider.java | 56 ++ .../yunji/titan/monitor/utils/NumberUtil.java | 45 ++ .../yunji/titan/monitor/utils/SigarUtil.java | 100 ++++ titan-monitor/src/main/resources/log4j.xml | 43 ++ .../resources/properties/monitor.properties | 8 + .../src/main/resources/root-context.xml | 24 + titan-monitor/src/main/resources/shutdown.sh | 11 + titan-monitor/src/main/resources/start.sh | 6 + titan-task/pom.xml | 100 ++++ .../main/java/com/yunji/titan/task/Main.java | 51 ++ .../yunji/titan/task/bean/bo/AgentInfoBO.java | 50 ++ .../yunji/titan/task/bean/po/SceneMapper.java | 37 ++ .../com/yunji/titan/task/bean/po/ScenePO.java | 39 ++ .../yunji/titan/task/dao/scene/SceneDao.java | 39 ++ .../titan/task/dao/scene/SceneDaoImpl.java | 43 ++ .../exception/PerformanceTestException.java | 47 ++ .../task/exception/PullTaskException.java | 47 ++ .../task/exception/ResourceException.java | 47 ++ .../StartPerformanceTestException.java | 47 ++ .../StopPerformanceTestException.java | 47 ++ .../titan/task/exception/TaskException.java | 46 ++ .../yunji/titan/task/facade/TaskFacade.java | 72 +++ .../titan/task/facade/TaskFacadeImpl.java | 65 +++ .../task/service/assign/TaskService.java | 61 +++ .../task/service/assign/TaskServiceImpl.java | 420 +++++++++++++++ .../task/service/info/AgentInfoService.java | 62 +++ .../service/info/AgentInfoServiceImpl.java | 177 +++++++ .../task/template/GetAgentsHostAddress.java | 40 ++ .../yunji/titan/task/template/PullTask.java | 40 ++ .../titan/task/template/ResultTemplate.java | 89 ++++ .../task/template/StartPerformanceTest.java | 41 ++ .../task/template/StopPerformanceTest.java | 40 ++ .../yunji/titan/task/watch/WatchAgents.java | 81 +++ titan-task/src/main/resources/dao-context.xml | 37 ++ .../src/main/resources/dubbo-context.xml | 20 + titan-task/src/main/resources/ftp-context.xml | 26 + titan-task/src/main/resources/log4j.xml | 43 ++ .../main/resources/properties/task.properties | 44 ++ .../src/main/resources/redis-context.xml | 34 ++ .../src/main/resources/root-context.xml | 17 + titan-task/src/main/resources/shutdown.sh | 11 + titan-task/src/main/resources/start.sh | 6 + titan-task/src/main/resources/zk-context.xml | 19 + titan-utils/pom.xml | 203 ++++++++ .../com/yunji/titan/utils/AgentTaskBean.java | 176 +++++++ .../java/com/yunji/titan/utils/AgentType.java | 42 ++ .../com/yunji/titan/utils/ContentType.java | 33 ++ .../java/com/yunji/titan/utils/ErrorCode.java | 58 +++ .../java/com/yunji/titan/utils/Localhost.java | 41 ++ .../com/yunji/titan/utils/MonitorBean.java | 93 ++++ .../java/com/yunji/titan/utils/NodePath.java | 30 ++ .../com/yunji/titan/utils/ProtocolType.java | 29 ++ .../com/yunji/titan/utils/RequestType.java | 29 ++ .../java/com/yunji/titan/utils/Result.java | 82 +++ .../com/yunji/titan/utils/ResultBean.java | 187 +++++++ .../yunji/titan/utils/SerializableUtils.java | 71 +++ .../com/yunji/titan/utils/TaskIssuedBean.java | 196 +++++++ .../yunji/titan/utils/ThreadPoolManager.java | 63 +++ .../com/yunji/titan/utils/UrlEncoder.java | 35 ++ .../titan/utils/ZookeeperConnManager.java | 98 ++++ .../titan/utils/config/DefaultMqFactory.java | 83 +++ .../utils/config/RocketMqDataSource.java | 98 ++++ .../yunji/titan/utils/ftp/FtpConnManager.java | 124 +++++ .../com/yunji/titan/utils/ftp/FtpUtils.java | 198 +++++++ .../yunji/titan/test/utils/ftp/FtpTest.java | 46 ++ titan-utils/src/test/resources/log4j.xml | 34 ++ 374 files changed, 25680 insertions(+) create mode 100644 pom.xml create mode 100644 titan-agent/pom.xml create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/IdleConnectionEvictor.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/Main.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/RequestHandler.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/adapter/BaseStresstestAdapter.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/bean/bo/OutParamBO.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/config/HttpConnectionManager.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/state/AgentState.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/state/AgentStateContext.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/state/BusynessState.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/state/FreeState.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/state/StopState.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/stresstest/HttpGetRequestStresstest.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/stresstest/HttpPostRequestStresstest.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/stresstest/Stresstest.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/utils/ChangeAgentState.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/utils/MsgProvider.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/utils/ParamUtils.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/utils/ResultStatistics.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/agent/watch/registry/RegisterAgent.java create mode 100644 titan-agent/src/main/java/com/yunji/titan/task/facade/TaskFacade.java create mode 100644 titan-agent/src/main/resources/dubbo-context.xml create mode 100644 titan-agent/src/main/resources/ftp-context.xml create mode 100644 titan-agent/src/main/resources/log4j.xml create mode 100644 titan-agent/src/main/resources/properties/agent.properties create mode 100644 titan-agent/src/main/resources/root-context.xml create mode 100644 titan-agent/src/main/resources/shutdown.sh create mode 100644 titan-agent/src/main/resources/start.sh create mode 100644 titan-agent/src/main/resources/zk-context.xml create mode 100644 titan-agent/src/test/java/com/yunji/titan/test/agent/GetRequestPerformanceTestTest.java create mode 100644 titan-datacollect/pom.xml create mode 100644 titan-datacollect/src/main/java/com/yunji/titan/datacollect/Main.java create mode 100644 titan-datacollect/src/main/java/com/yunji/titan/datacollect/MasterElection.java create mode 100644 titan-datacollect/src/main/java/com/yunji/titan/datacollect/SubscribeMessage.java create mode 100644 titan-datacollect/src/main/java/com/yunji/titan/datacollect/UploadData.java create mode 100644 titan-datacollect/src/main/java/com/yunji/titan/datacollect/bean/po/ReportPO.java create mode 100644 titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/MonitorDao.java create mode 100644 titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/MonitorDaoImpl.java create mode 100644 titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/ReportDao.java create mode 100644 titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/ReportDaoImpl.java create mode 100644 titan-datacollect/src/main/java/com/yunji/titan/datacollect/utils/ResultStatistics.java create mode 100644 titan-datacollect/src/main/resources/dao-context.xml create mode 100644 titan-datacollect/src/main/resources/log4j.xml create mode 100644 titan-datacollect/src/main/resources/properties/datacollect.properties create mode 100644 titan-datacollect/src/main/resources/root-context.xml create mode 100644 titan-datacollect/src/main/resources/shutdown.sh create mode 100644 titan-datacollect/src/main/resources/start.sh create mode 100644 titan-datacollect/src/main/resources/zk-context.xml create mode 100644 titan-manager/doc/sql/yunjititan.sql create mode 100644 titan-manager/pom.xml create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/ActionPerformanceBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/AgentInfoBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/AutomaticTaskBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/FileUploadBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/LinkBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/LoginResultBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/MonitorSetBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/OperateBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/OverviewResultBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/PageRequestBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/Pager.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/ReportBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/SceneBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/SceneDetailBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/bo/UserInfoBO.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/common/CharsetTypeEnum.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/common/ContentTypeEnum.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/common/Groups.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/common/OperateTypeConstant.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/common/RedisHelper.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/common/SceneStatusEnum.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/common/TaskSyncTypeEnum.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/common/TitanConstant.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/controller/AutomaticTaskController.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/controller/FileController.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/controller/LinkController.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/controller/LoginController.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/controller/MonitorSetController.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/controller/OperateController.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/controller/OverviewController.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/controller/PageJumpController.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/controller/ReportController.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/controller/SceneController.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/dao/AutomaticTaskDao.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/dao/BaseDao.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/dao/LinkDao.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/dao/MonitorDao.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/dao/MonitorSetDao.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/dao/ReportDao.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/dao/SceneDao.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/entity/AutomaticTask.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/entity/Link.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/entity/Monitor.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/entity/MonitorSet.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/entity/Report.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/entity/Scene.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/AutomaticTaskMapper.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/LinkMapper.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/ReportMapper.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/SceneMapper.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/BaseDaoImpl.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/BeanInfoUtil.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Criteria.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/DefaultNameHandler.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/NameHandler.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/OperateTypeEnum.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Operator.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Pager.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/SqlAssembleTools.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/SqlBean.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/service/AgentServiceImpl.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/service/AutomaticTaskServiceImpl.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/service/LinkServiceImpl.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/service/MonitorServiceImpl.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/service/MonitorSetServiceImpl.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/service/OperateServiceImpl.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/service/ReportServiceImpl.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/impl/service/SceneServiceImpl.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/interceptor/LoginInterceptor.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/job/MonitorTask.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/result/ComponentResult.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/result/Result.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/service/AgentService.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/service/AutomaticTaskService.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/service/LinkService.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/service/MonitorService.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/service/MonitorSetService.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/service/OperateService.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/service/ReportService.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/service/SceneService.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/CommonTypeUtil.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/CookieUtil.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/EmailSender.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/FileUtil.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/Md5Util.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/ResultUtil.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/TicketBuilderUtil.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/TitanDateUtil.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/ValidatorUtil.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/DistributedTimerTask.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/DistributedTimerTaskImpl.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/MasterElection.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TaskExecutor.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TaskInfoBean.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TimerTaskListener.java create mode 100644 titan-manager/src/main/java/com/yunji/titan/task/facade/TaskFacade.java create mode 100644 titan-manager/src/main/resources/dao-context.xml create mode 100644 titan-manager/src/main/resources/dubbo-context.xml create mode 100644 titan-manager/src/main/resources/ftp-context.xml create mode 100644 titan-manager/src/main/resources/log4j.xml create mode 100644 titan-manager/src/main/resources/properties/config.properties create mode 100644 titan-manager/src/main/resources/properties/dubbo.properties create mode 100644 titan-manager/src/main/resources/properties/redis.properties create mode 100644 titan-manager/src/main/resources/redis-context.xml create mode 100644 titan-manager/src/main/resources/shell/restart-agents.sh create mode 100644 titan-manager/src/main/resources/shell/shutdown-agents.sh create mode 100644 titan-manager/src/main/resources/shell/start-agents.sh create mode 100644 titan-manager/src/main/resources/springmvc-root.xml create mode 100644 titan-manager/src/main/resources/zk-context.xml create mode 100644 titan-manager/src/main/webapp/META-INF/MANIFEST.MF create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/main.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/monitor/monitor_list.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/overview.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/pressure/do_pressure.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/pressure/do_pressure_list.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/pressure/link_add.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/pressure/link_list.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/pressure/scene_add.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/pressure/scene_list.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/report/report_detail.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/pages/report/report_list.jsp create mode 100644 titan-manager/src/main/webapp/WEB-INF/web.xml create mode 100644 titan-manager/src/main/webapp/css/login.css create mode 100644 titan-manager/src/main/webapp/css/style.css create mode 100644 titan-manager/src/main/webapp/css/titan.css create mode 100644 titan-manager/src/main/webapp/error/404.html create mode 100644 titan-manager/src/main/webapp/favicon.ico create mode 100644 titan-manager/src/main/webapp/images/back.png create mode 100644 titan-manager/src/main/webapp/images/bad.png create mode 100644 titan-manager/src/main/webapp/images/github.png create mode 100644 titan-manager/src/main/webapp/images/logo.png create mode 100644 titan-manager/src/main/webapp/images/logo2.png create mode 100644 titan-manager/src/main/webapp/images/qq.png create mode 100644 titan-manager/src/main/webapp/images/well.png create mode 100644 titan-manager/src/main/webapp/index.html create mode 100644 titan-manager/src/main/webapp/js/common.js create mode 100644 titan-manager/src/main/webapp/js/cookie.js create mode 100644 titan-manager/src/main/webapp/js/jquery.min.js create mode 100644 titan-manager/src/main/webapp/js/overview.js create mode 100644 titan-manager/src/main/webapp/login.html create mode 100644 titan-manager/src/main/webapp/plugins/echarts.min.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/css/layui.css create mode 100644 titan-manager/src/main/webapp/plugins/layui/css/layui.mobile.css create mode 100644 titan-manager/src/main/webapp/plugins/layui/css/modules/code.css create mode 100644 titan-manager/src/main/webapp/plugins/layui/css/modules/laydate/default/laydate.css create mode 100644 titan-manager/src/main/webapp/plugins/layui/css/modules/layer/default/icon-ext.png create mode 100644 titan-manager/src/main/webapp/plugins/layui/css/modules/layer/default/icon.png create mode 100644 titan-manager/src/main/webapp/plugins/layui/css/modules/layer/default/layer.css create mode 100644 titan-manager/src/main/webapp/plugins/layui/css/modules/layer/default/loading-0.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/css/modules/layer/default/loading-1.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/css/modules/layer/default/loading-2.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/font/iconfont.eot create mode 100644 titan-manager/src/main/webapp/plugins/layui/font/iconfont.svg create mode 100644 titan-manager/src/main/webapp/plugins/layui/font/iconfont.ttf create mode 100644 titan-manager/src/main/webapp/plugins/layui/font/iconfont.woff create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/0.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/1.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/10.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/11.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/12.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/13.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/14.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/15.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/16.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/17.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/18.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/19.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/2.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/20.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/21.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/22.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/23.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/24.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/25.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/26.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/27.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/28.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/29.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/3.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/30.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/31.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/32.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/33.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/34.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/35.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/36.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/37.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/38.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/39.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/4.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/40.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/41.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/42.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/43.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/44.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/45.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/46.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/47.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/48.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/49.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/5.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/50.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/51.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/52.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/53.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/54.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/55.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/56.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/57.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/58.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/59.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/6.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/60.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/61.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/62.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/63.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/64.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/65.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/66.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/67.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/68.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/69.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/7.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/70.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/71.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/8.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/images/face/9.gif create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/carousel.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/code.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/element.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/flow.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/form.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/jquery.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/laydate.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/layedit.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/layer.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/laypage.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/laytpl.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/mobile.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/table.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/tree.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/upload.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/lay/modules/util.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/layui.all.js create mode 100644 titan-manager/src/main/webapp/plugins/layui/layui.js create mode 100644 titan-manager/src/test/java/com/yunji/titan/manager/BaseDaoTest.java create mode 100644 titan-manager/src/test/java/com/yunji/titan/manager/EmailSenderTest.java create mode 100644 titan-manager/src/test/java/com/yunji/titan/manager/LinkServiceTest.java create mode 100644 titan-manager/src/test/java/com/yunji/titan/manager/MonitorDaoTest.java create mode 100644 titan-manager/src/test/java/com/yunji/titan/manager/MonitorServiceTest.java create mode 100644 titan-manager/src/test/java/com/yunji/titan/manager/ReportServiceTest.java create mode 100644 titan-manager/src/test/java/com/yunji/titan/manager/SceneServiceTest.java create mode 100644 titan-manager/src/test/java/com/yunji/titan/manager/test/BaseJunit4Test.java create mode 100644 titan-monitor/pom.xml create mode 100644 titan-monitor/src/doc/readme.txt create mode 100644 titan-monitor/src/main/java/com/yunji/titan/monitor/Main.java create mode 100644 titan-monitor/src/main/java/com/yunji/titan/monitor/service/InitMonitor.java create mode 100644 titan-monitor/src/main/java/com/yunji/titan/monitor/utils/MsgProvider.java create mode 100644 titan-monitor/src/main/java/com/yunji/titan/monitor/utils/NumberUtil.java create mode 100644 titan-monitor/src/main/java/com/yunji/titan/monitor/utils/SigarUtil.java create mode 100644 titan-monitor/src/main/resources/log4j.xml create mode 100644 titan-monitor/src/main/resources/properties/monitor.properties create mode 100644 titan-monitor/src/main/resources/root-context.xml create mode 100644 titan-monitor/src/main/resources/shutdown.sh create mode 100644 titan-monitor/src/main/resources/start.sh create mode 100644 titan-task/pom.xml create mode 100644 titan-task/src/main/java/com/yunji/titan/task/Main.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/bean/bo/AgentInfoBO.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/bean/po/SceneMapper.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/bean/po/ScenePO.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/dao/scene/SceneDao.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/dao/scene/SceneDaoImpl.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/exception/PerformanceTestException.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/exception/PullTaskException.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/exception/ResourceException.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/exception/StartPerformanceTestException.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/exception/StopPerformanceTestException.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/exception/TaskException.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/facade/TaskFacade.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/facade/TaskFacadeImpl.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/service/assign/TaskService.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/service/assign/TaskServiceImpl.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/service/info/AgentInfoService.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/service/info/AgentInfoServiceImpl.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/template/GetAgentsHostAddress.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/template/PullTask.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/template/ResultTemplate.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/template/StartPerformanceTest.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/template/StopPerformanceTest.java create mode 100644 titan-task/src/main/java/com/yunji/titan/task/watch/WatchAgents.java create mode 100644 titan-task/src/main/resources/dao-context.xml create mode 100644 titan-task/src/main/resources/dubbo-context.xml create mode 100644 titan-task/src/main/resources/ftp-context.xml create mode 100644 titan-task/src/main/resources/log4j.xml create mode 100644 titan-task/src/main/resources/properties/task.properties create mode 100644 titan-task/src/main/resources/redis-context.xml create mode 100644 titan-task/src/main/resources/root-context.xml create mode 100644 titan-task/src/main/resources/shutdown.sh create mode 100644 titan-task/src/main/resources/start.sh create mode 100644 titan-task/src/main/resources/zk-context.xml create mode 100644 titan-utils/pom.xml create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/AgentTaskBean.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/AgentType.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/ContentType.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/ErrorCode.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/Localhost.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/MonitorBean.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/NodePath.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/ProtocolType.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/RequestType.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/Result.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/ResultBean.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/SerializableUtils.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/TaskIssuedBean.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/ThreadPoolManager.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/UrlEncoder.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/ZookeeperConnManager.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/config/DefaultMqFactory.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/config/RocketMqDataSource.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/ftp/FtpConnManager.java create mode 100644 titan-utils/src/main/java/com/yunji/titan/utils/ftp/FtpUtils.java create mode 100644 titan-utils/src/test/java/com/yunji/titan/test/utils/ftp/FtpTest.java create mode 100644 titan-utils/src/test/resources/log4j.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..c36f559 --- /dev/null +++ b/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + com.yunji + titan + 2.0.0-SNAPSHOT + pom + + titan-utils + titan-manager + titan-task + titan-agent + titan-datacollect + titan-monitor + + \ No newline at end of file diff --git a/titan-agent/pom.xml b/titan-agent/pom.xml new file mode 100644 index 0000000..e7be906 --- /dev/null +++ b/titan-agent/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + + com.yunji + titan + 2.0.0-SNAPSHOT + + com.yunji + titan-agent + 2.0.0-SNAPSHOT + titan-agent + http://maven.apache.org + + 1.8 + 2.0.0-SNAPSHOT + 4.8.2 + 2.5.3 + 4.5.2 + UTF-8 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + UTF-8 + ${java-version} + ${java-version} + + + ${env.JAVA_HOME}/jre/lib/rt.jar + ${project.basedir}/lib + + + + + + + + org.apache.httpcomponents + httpclient + ${httpclient-version} + + + junit + junit + ${junit-version} + test + + + com.alibaba + dubbo + ${dubbo-version} + + + org.springframework + spring + + + + + com.yunji + titan-utils + ${titan-utils-version} + + + diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/IdleConnectionEvictor.java b/titan-agent/src/main/java/com/yunji/titan/agent/IdleConnectionEvictor.java new file mode 100644 index 0000000..6604ee6 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/IdleConnectionEvictor.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent; + +import java.util.concurrent.TimeUnit; +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import com.yunji.titan.agent.config.HttpConnectionManager; + +/** + * 定时清理空闲和过期的http连接 + * + * @author gaoxianglong + */ +@Service +public class IdleConnectionEvictor { + @Resource + private HttpConnectionManager httpConnectionManager; + private Logger log = LoggerFactory.getLogger(IdleConnectionEvictor.class); + + @PostConstruct + public void init() { + /* 定时清理所有空闲的http连接 */ + httpConnectionManager.getPoolConnManager().closeIdleConnections(5, TimeUnit.SECONDS); + log.info("定时清理空闲和过期的http连接任务启动..."); + } + + @Scheduled(cron = "0/5 * * * * ?") + public void connectionEvictor() { + /* 定时关闭所有过期的http连接 */ + httpConnectionManager.getPoolConnManager().closeExpiredConnections(); + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/Main.java b/titan-agent/src/main/java/com/yunji/titan/agent/Main.java new file mode 100644 index 0000000..f51eb7a --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/Main.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * 压测引擎启动函数 + * + * @author gaoxianglong + */ +public class Main { + private Logger log = LoggerFactory.getLogger(Main.class); + + public static void main(String[] args) { + new Main(); + } + + Main() { + init(); + } + + @SuppressWarnings("resource") + private void init() { + new ClassPathXmlApplicationContext("classpath:*-context.xml"); + log.info("titan-agent启动成功..."); + try { + synchronized (this) { + this.wait(); + } + } catch (Exception e) { + log.error("error", e); + } + } +} diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/RequestHandler.java b/titan-agent/src/main/java/com/yunji/titan/agent/RequestHandler.java new file mode 100644 index 0000000..5f008ba --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/RequestHandler.java @@ -0,0 +1,294 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent; + +import java.io.StringReader; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import javax.annotation.Resource; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +import com.yunji.titan.agent.bean.bo.OutParamBO; +import com.yunji.titan.agent.state.AgentStateContext; +import com.yunji.titan.agent.state.FreeState; +import com.yunji.titan.agent.state.StopState; +import com.yunji.titan.agent.stresstest.Stresstest; +import com.yunji.titan.agent.utils.ChangeAgentState; +import com.yunji.titan.agent.utils.MsgProvider; +import com.yunji.titan.agent.utils.ResultStatistics; +import com.yunji.titan.agent.watch.registry.RegisterAgent; +import com.yunji.titan.utils.AgentTaskBean; +import com.yunji.titan.utils.ContentType; +import com.yunji.titan.utils.RequestType; +import com.yunji.titan.utils.ThreadPoolManager; +import com.yunji.titan.utils.ZookeeperConnManager; + +/** + * 请求处理者 + * + * @author gaoxianglong + */ +@Service +public class RequestHandler { + private Thread checkInterrupted; + @Resource + private ZookeeperConnManager zookeeperConnManager; + @Resource + private ThreadPoolManager threadPoolManager; + @Resource(name = "httpGetRequestStresstest") + private Stresstest httpGetRequestStresstest; + @Resource(name = "httpPostRequestStresstest") + private Stresstest httpPostRequestStresstest; + @Resource + private MsgProvider msgProvider; + @Resource + private RegisterAgent registerAgent; + @Resource + private AgentStateContext agentStateContext; + + /** + * 当前实际并发用户 + */ + private AtomicInteger concurrentUser; + private int initConcurrentUsersSize; + private int concurrentUsersSize; + @Value("${code}") + private String code; + private Logger log = LoggerFactory.getLogger(RequestHandler.class); + + public RequestHandler() { + concurrentUser = new AtomicInteger(0); + } + + public void handler(final String nodePath, final AgentTaskBean taskBean) { + if (null == taskBean) { + return; + } + final List urls = taskBean.getUrls(); + initConcurrentUsersSize = taskBean.getInitConcurrentUsersSize(); + concurrentUsersSize = taskBean.getConcurrentUsersSize(); + /* 每个并发用户分配的任务数 */ + final long taskSize = taskBean.getTaskSize(); + final Map contentTypes = taskBean.getContentTypes(); + final Map charsets = taskBean.getCharsets(); + final Map requestTypes = taskBean.getRequestTypes(); + final CountDownLatch latch = new CountDownLatch(concurrentUsersSize); + final Map paramIndex = new HashMap(16); + final AtomicInteger httpSuccessNum = new AtomicInteger(0); + final AtomicInteger serviceSuccessNum = new AtomicInteger(0); + /* 只有线程池shutdown后才重新初始化 */ + if (threadPoolManager.getThreadPool().isShutdown()) { + threadPoolManager.init(); + } + /* 获取每个agent所允许的最大的执行时间 */ + final long continuedTime = taskBean.getContinuedTime(); + if (0 < continuedTime) { + checkInterrupted = new Thread(() -> { + try { + TimeUnit.SECONDS.sleep(continuedTime); + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + String value = new String(zkClient.getData(nodePath, false, null)); + if (!StringUtils.isEmpty(value)) { + Properties properties = new Properties(); + properties.load(new StringReader(value)); + String agentStateKey = "task"; + String interruptedKey = "interrupted"; + /* 忙碌状态才可停止task=true\interrupted=false */ + if (Boolean.parseBoolean(properties.getProperty(agentStateKey)) + && !Boolean.parseBoolean(properties.getProperty(interruptedKey))) { + ChangeAgentState.change(agentStateContext, new StopState(), zkClient, nodePath); + } else { + log.info("当前agent任务已经结束,无需停止"); + } + } + } catch (Exception e) { + log.error("error", e); + } + }); + checkInterrupted.start(); + } + log.debug("agent准备工作已完成"); + long startTime = System.currentTimeMillis(); + if (0 < initConcurrentUsersSize) { + /* 准备开始预热 */ + runStresstest(initConcurrentUsersSize, taskSize, urls, requestTypes, taskBean, paramIndex, httpSuccessNum, + serviceSuccessNum, latch, contentTypes, charsets); + log.info("起步量级的预热任务(起步量级-->" + initConcurrentUsersSize + ",每个并发用户分配的任务数-->" + taskSize + + ")已经完成,开始准备过渡到正常流量"); + } + final int remConcurrentusersSize = concurrentUsersSize - initConcurrentUsersSize; + if (remConcurrentusersSize > 0) { + runStresstest(remConcurrentusersSize, taskSize, urls, requestTypes, taskBean, paramIndex, httpSuccessNum, + serviceSuccessNum, latch, contentTypes, charsets); + } + try { + latch.await(); + long endTime = System.currentTimeMillis(); + String result = ResultStatistics.result(startTime, endTime, httpSuccessNum.get(), serviceSuccessNum.get(), + taskBean); + log.info("压测结果-->" + result); + ChangeAgentState.change(agentStateContext, new FreeState(), zookeeperConnManager.getZkClient(), nodePath); + if (null != checkInterrupted) { + /* 暴力结束interrupted信号检测线程 */ + checkInterrupted.stop(); + } + if (!StringUtils.isEmpty(result)) { + msgProvider.sendMsg(result); + } + } catch (Exception e) { + log.error("error", e); + } finally { + concurrentUser.set(0); + } + } + + public static void main(String[] agrs) { + System.out.println("REM_CONCURRENTUSERS_SIZE".toLowerCase()); + } + + /** + * 执行压测任务 + * + * @author gaoxianglong + */ + private void runStresstest(int concurrentUsersSize, final long taskSize, final List urls, + final Map requestTypes, final AgentTaskBean taskBean, + final Map paramIndex, final AtomicInteger httpSuccessNum, + final AtomicInteger serviceSuccessNum, final CountDownLatch latch, + final Map contentTypes, final Map charsets) { + for (int i = 0; i < concurrentUsersSize; i++) { + threadPoolManager.getThreadPool().execute(() -> { + concurrentUser.getAndIncrement(); + for (long j = 0; j < taskSize; j++) { + int code = -10000; + /* 如果线程收到interrupted信号则停止执行压测任务 */ + if (Thread.currentThread().isInterrupted()) { + log.debug("当前线程" + Thread.currentThread().getName() + "收到interrupted信号,成功停止当前压测任务"); + break; + } + /* 全链路压测时上一个接口的出参 */ + String outParam = null; + boolean result = true; + for (String url : urls) { + if (RequestType.GET == requestTypes.get(url)) { + String inParam = null; + if (taskBean.getParams().containsKey(url)) { + List params = taskBean.getParams().get(url); + if (!params.isEmpty()) { + /* 获取压测参数索引 */ + int paramIdex = getParamIndex(taskBean, url, paramIndex, params.size()); + inParam = params.get(paramIdex); + } + } + OutParamBO outParamBO = httpGetRequestStresstest.runGetStresstest(url, outParam, inParam, + contentTypes.get(url), charsets.get(url)); + code = outParamBO.getErrorCode(); + /* 返回业务码不为${code}则失败 */ + if (Integer.parseInt(this.code) != code) { + result = false; + break; + } + outParam = outParamBO.getData(); + } else if (RequestType.POST == requestTypes.get(url)) { + String inParam = null; + if (taskBean.getParams().containsKey(url)) { + List params = taskBean.getParams().get(url); + if (!params.isEmpty()) { + int paramIdex = getParamIndex(taskBean, url, paramIndex, params.size()); + inParam = params.get(paramIdex); + } + } + OutParamBO outParamBean = httpPostRequestStresstest.runPostStresstest(url, outParam, + inParam, contentTypes.get(url), charsets.get(url)); + code = outParamBean.getErrorCode(); + if (0 != code) { + result = false; + break; + } + outParam = outParamBean.getData(); + } + } + if (result) { + httpSuccessNum.getAndIncrement(); + serviceSuccessNum.getAndIncrement(); + } else if (-10000 != code) { + httpSuccessNum.getAndIncrement(); + } + } + latch.countDown(); + }); + } + } + + /** + * 获取压测参数索引 + * + * @author gaoxianglong + */ + private int getParamIndex(AgentTaskBean taskBean, String url, Map paramIndex, int paramSize) { + synchronized (paramIndex) { + paramIndex.put(url, !paramIndex.containsKey(url) ? 0 : paramIndex.get(url) + 1); + /* 持续轮询 */ + if (paramIndex.get(url) == paramSize) { + log.debug("重新开始轮询参数"); + paramIndex.put(url, 0); + } + return paramIndex.get(url); + } + } + + /** + * 给线程池中所有的线程发出interrupted信号结束当前agent的压测任务,但线程并不会立即停止 + * + * @author gaoxianglong + */ + public void interruptedTask() { + ThreadPoolExecutor threadPool = threadPoolManager.getThreadPool(); + /* 只有线程池未shutdown才允许shutdown */ + if (!threadPool.isShutdown()) { + log.info("收到interrupted指令"); + while (true) { + try { + TimeUnit.SECONDS.sleep(1); + if (0 < concurrentUsersSize) { + /* + * 如果当前实际并发用户等于concurrentUsersSize才允许对ThreadPool执行shutdownNow操作 + * ,因为需要等待所有线程countDown,否则主线程就会一直阻塞 + */ + if (concurrentUser.get() == concurrentUsersSize) { + threadPoolManager.getThreadPool().shutdownNow(); + log.info("正在尝试中断当前agent的所有压测任务..."); + break; + } + } + } catch (InterruptedException e) { + log.error("error", e); + } + } + } + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/adapter/BaseStresstestAdapter.java b/titan-agent/src/main/java/com/yunji/titan/agent/adapter/BaseStresstestAdapter.java new file mode 100644 index 0000000..6fded15 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/adapter/BaseStresstestAdapter.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.adapter; + +import com.yunji.titan.agent.bean.bo.OutParamBO; +import com.yunji.titan.agent.stresstest.Stresstest; +import com.yunji.titan.utils.ContentType; + +/** + * 压测引擎核心接口适配器 + * + * @author gaoxianglong + */ +public abstract class BaseStresstestAdapter implements Stresstest { + @Override + public OutParamBO runGetStresstest(String url, String outParam, String param, ContentType contentType, + String charset) { + return null; + } + + @Override + public OutParamBO runPostStresstest(String url, String outParam, String param, ContentType contentType, + String charset) { + return null; + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/bean/bo/OutParamBO.java b/titan-agent/src/main/java/com/yunji/titan/agent/bean/bo/OutParamBO.java new file mode 100644 index 0000000..e19dc05 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/bean/bo/OutParamBO.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.bean.bo; + +/** + * 每次压测后的出参Bean + * + * @author gaoxianglong + */ +public class OutParamBO { + private Integer errorCode = -10000; + private String errorMessage = null; + private String data = null; + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } + + public Integer getErrorCode() { + return errorCode; + } + + public void setErrorCode(Integer errorCode) { + this.errorCode = errorCode; + } + + public String getErrorMessage() { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + + @Override + public String toString() { + return "OutParamBO [errorCode=" + errorCode + ", errorMessage=" + errorMessage + ", data=" + data + "]"; + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/config/HttpConnectionManager.java b/titan-agent/src/main/java/com/yunji/titan/agent/config/HttpConnectionManager.java new file mode 100644 index 0000000..bfb4071 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/config/HttpConnectionManager.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.config; + +import org.apache.http.client.config.RequestConfig; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.ssl.SSLContextBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * HTTP/HTTPS连接池管理类 + * + * @author gaoxianglong + */ +public class HttpConnectionManager { + private PoolingHttpClientConnectionManager poolConnManager = null; + private CloseableHttpClient httpClient; + private RequestConfig requestConfig; + /** + * 最大连接数 + */ + private int maxTotal = 2000; + /** + * 最大路由 + */ + private int defaultMaxPerRoute = 2000; + private int socketTimeout = 5000; + private int connectTimeout = 5000; + private int connectionRequestTimeout = 5000; + private Logger log = LoggerFactory.getLogger(HttpConnectionManager.class); + + public void init() { + try { + SSLContextBuilder builder = new SSLContextBuilder(); + builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build()); + /* 配置同时支持 HTTP 和 HTPPS */ + Registry socketFactoryRegistry = RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.getSocketFactory()).register("https", sslsf).build(); + /* 初始化连接管理器 */ + poolConnManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); + poolConnManager.setMaxTotal(maxTotal); + poolConnManager.setDefaultMaxPerRoute(defaultMaxPerRoute); + requestConfig = RequestConfig.custom().setConnectionRequestTimeout(connectionRequestTimeout) + .setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build(); + httpClient = getConnection(); + log.info("HttpConnectionManager初始化完成..."); + } catch (Exception e) { + log.error("error", e); + } + } + + private CloseableHttpClient getConnection() { + CloseableHttpClient httpClient = HttpClients.custom() + /* 设置连接池管理 */ + .setConnectionManager(poolConnManager) + /* 设置请求配置 */ + .setDefaultRequestConfig(requestConfig) + /* 设置重试次数 */ + .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false)).build(); + if (poolConnManager != null && poolConnManager.getTotalStats() != null) { + log.info("now client pool " + poolConnManager.getTotalStats().toString()); + } + return httpClient; + } + + public CloseableHttpClient getHttpClient() { + return httpClient; + } + + public void setHttpClient(CloseableHttpClient httpClient) { + this.httpClient = httpClient; + } + + public int getMaxTotal() { + return maxTotal; + } + + public void setMaxTotal(int maxTotal) { + this.maxTotal = maxTotal; + } + + public int getDefaultMaxPerRoute() { + return defaultMaxPerRoute; + } + + public void setDefaultMaxPerRoute(int defaultMaxPerRoute) { + this.defaultMaxPerRoute = defaultMaxPerRoute; + } + + public int getSocketTimeout() { + return socketTimeout; + } + + public void setSocketTimeout(int socketTimeout) { + this.socketTimeout = socketTimeout; + } + + public int getConnectTimeout() { + return connectTimeout; + } + + public void setConnectTimeout(int connectTimeout) { + this.connectTimeout = connectTimeout; + } + + public int getConnectionRequestTimeout() { + return connectionRequestTimeout; + } + + public void setConnectionRequestTimeout(int connectionRequestTimeout) { + this.connectionRequestTimeout = connectionRequestTimeout; + } + + public PoolingHttpClientConnectionManager getPoolConnManager() { + return poolConnManager; + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/state/AgentState.java b/titan-agent/src/main/java/com/yunji/titan/agent/state/AgentState.java new file mode 100644 index 0000000..589128b --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/state/AgentState.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.state; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.Stat; + +/** + * Agent运行状态 + * + * @author gaoxianglong + */ +public interface AgentState { + /** + * 状态逻辑 + * + * @author gaoxianglong + * + * @param zkClient + * + * @param nodePath + * + * @throws KeeperException + * @throws InterruptedException + * + * @return Stat + */ + public Stat opretion(ZooKeeper zkClient, String nodePath) throws KeeperException, InterruptedException; +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/state/AgentStateContext.java b/titan-agent/src/main/java/com/yunji/titan/agent/state/AgentStateContext.java new file mode 100644 index 0000000..caea308 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/state/AgentStateContext.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.state; + +import javax.annotation.PostConstruct; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.Stat; +import org.springframework.stereotype.Component; + +/** + * Agent状态上下文 + * + * @author gaoxianglong + */ +@Component +public class AgentStateContext { + private AgentState agentState; + private String stateInfo; + + public String getStateInfo() { + return stateInfo; + } + + private void setStateInfo(String stateInfo) { + this.stateInfo = stateInfo; + } + + /** + * 更改状态 + * + * @author gaoxianglong + */ + public void setState(AgentState agentState) { + this.agentState = agentState; + if (agentState instanceof FreeState) { + this.setStateInfo("空闲状态"); + } else if (agentState instanceof StopState) { + this.setStateInfo("暂停状态"); + } else if (agentState instanceof BusynessState) { + this.setStateInfo("忙碌状态"); + } + } + + public Stat opretion(ZooKeeper zkClient, String nodePath) throws KeeperException, InterruptedException { + return agentState.opretion(zkClient, nodePath); + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/state/BusynessState.java b/titan-agent/src/main/java/com/yunji/titan/agent/state/BusynessState.java new file mode 100644 index 0000000..75d9779 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/state/BusynessState.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.state; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.Stat; + +import com.yunji.titan.utils.AgentType; + +/** + * 忙碌状态 + * + * @author gaoxianglong + */ +public class BusynessState implements AgentState { + @Override + public Stat opretion(ZooKeeper zkClient, String nodePath) throws KeeperException, InterruptedException { + Stat stat = null; + if (null == zkClient) { + return stat; + } + stat = zkClient.setData(nodePath, AgentType.BUSYNESS, -1); + return stat; + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/state/FreeState.java b/titan-agent/src/main/java/com/yunji/titan/agent/state/FreeState.java new file mode 100644 index 0000000..0f1a348 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/state/FreeState.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.state; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.Stat; +import com.yunji.titan.utils.AgentType; + +/** + * 空闲状态 + * + * @author gaoxianglong + */ +public class FreeState implements AgentState { + + @Override + public Stat opretion(ZooKeeper zkClient, String nodePath) throws KeeperException, InterruptedException { + Stat stat = null; + if (null == zkClient) { + return stat; + } + stat = zkClient.setData(nodePath, AgentType.FREE, -1); + return stat; + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/state/StopState.java b/titan-agent/src/main/java/com/yunji/titan/agent/state/StopState.java new file mode 100644 index 0000000..68c9329 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/state/StopState.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.state; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.Stat; +import com.yunji.titan.utils.AgentType; + +/** + * 暂停状态 + * + * @author gaoxianglong + */ +public class StopState implements AgentState { + @Override + public Stat opretion(ZooKeeper zkClient, String nodePath) throws KeeperException, InterruptedException { + Stat stat = null; + if (null == zkClient) { + return stat; + } + stat = zkClient.setData(nodePath, AgentType.STOP, -1); + return stat; + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/stresstest/HttpGetRequestStresstest.java b/titan-agent/src/main/java/com/yunji/titan/agent/stresstest/HttpGetRequestStresstest.java new file mode 100644 index 0000000..6d0ff24 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/stresstest/HttpGetRequestStresstest.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.stresstest; + +import java.io.IOException; +import java.util.Map; + +import javax.annotation.Resource; + +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import com.yunji.titan.agent.adapter.BaseStresstestAdapter; +import com.yunji.titan.agent.bean.bo.OutParamBO; +import com.yunji.titan.agent.config.HttpConnectionManager; +import com.yunji.titan.agent.utils.ParamUtils; +import com.yunji.titan.utils.ContentType; + +/** + * 执行GET请求类型压测 + * + * @author gaoxianglong + */ +@Service("httpGetRequestStresstest") +public class HttpGetRequestStresstest extends BaseStresstestAdapter { + @Resource + public HttpConnectionManager httpConnectionManager; + private Logger log = LoggerFactory.getLogger(HttpGetRequestStresstest.class); + + @Override + public OutParamBO runGetStresstest(String url, String outParam, String param, ContentType contentType, + String charset) { + OutParamBO outParamBO = new OutParamBO(); + if (!StringUtils.isEmpty(url)) { + HttpEntity entity = null; + CloseableHttpClient httpClient = null; + CloseableHttpResponse httpResponse = null; + String headers = null; + /* 解析动态参数和头信息 */ + Map map = ParamUtils.resolve(param); + if (null != map && !map.isEmpty()) { + param = map.get("param"); + headers = map.get("headers"); + } + /* 将上一个接口的出参作为下一个接口的入参拼接 */ + if (!StringUtils.isEmpty(outParam)) { + String value = ParamUtils.jsonToUrl(param, outParam); + /* 动参合并操作 */ + param = StringUtils.isEmpty(value) ? param : value; + } + try { + httpClient = httpConnectionManager.getHttpClient(); + if (null != httpClient) { + HttpGet request = new HttpGet( + com.yunji.titan.utils.UrlEncoder.encode(null != param ? url + param : url)); + /* 设置请求头 */ + ParamUtils.setHeader(request, headers, contentType, charset); + httpResponse = httpClient.execute(request); + entity = httpResponse.getEntity(); + /* 获取压测执行结果 */ + outParamBO = super.getResult(httpResponse, entity); + } + } catch (Exception e) { + // ... + } finally { + try { + if (null != entity) { + entity.getContent().close(); + } + if (null != httpResponse) { + httpResponse.close(); + } + } catch (IOException e) { + log.error("error", e); + } + } + } + return outParamBO; + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/stresstest/HttpPostRequestStresstest.java b/titan-agent/src/main/java/com/yunji/titan/agent/stresstest/HttpPostRequestStresstest.java new file mode 100644 index 0000000..0791bc0 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/stresstest/HttpPostRequestStresstest.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.stresstest; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.message.BasicNameValuePair; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +import com.yunji.titan.agent.adapter.BaseStresstestAdapter; +import com.yunji.titan.agent.bean.bo.OutParamBO; +import com.yunji.titan.agent.config.HttpConnectionManager; +import com.yunji.titan.agent.utils.ParamUtils; +import com.yunji.titan.utils.ContentType; +import com.yunji.titan.utils.UrlEncoder; + +/** + * 执行POST请求类型压测 + * + * @author gaoxianglong + */ +@Service("httpPostRequestStresstest") +public class HttpPostRequestStresstest extends BaseStresstestAdapter { + @Resource + public HttpConnectionManager httpConnectionManager; + private Logger log = LoggerFactory.getLogger(HttpPostRequestStresstest.class); + + @Override + public OutParamBO runPostStresstest(String url, String outParam, String param, ContentType contentType, + String charset) { + OutParamBO outParamBO = new OutParamBO(); + if (!StringUtils.isEmpty(url)) { + HttpEntity entity = null; + CloseableHttpResponse httpResponse = null; + String headers = null; + /* 解析参数 */ + Map map = ParamUtils.resolve(param); + if (null != map && !map.isEmpty()) { + param = map.get("param"); + headers = map.get("headers"); + } + /* 将上一个接口的出参作为下一个接口的入参拼接 */ + if (!StringUtils.isEmpty(outParam) && contentType == ContentType.APPLICATION_JSON) { + String value = ParamUtils.jsonCombination(param, outParam); + /* JSON合并操作 */ + param = StringUtils.isEmpty(value) ? param : value; + log.debug("JSON合并后的参数-->" + param); + } + try { + CloseableHttpClient httpClient = httpConnectionManager.getHttpClient(); + if (null != httpClient) { + HttpPost request = new HttpPost(UrlEncoder.encode(url)); + /* 组装参数 */ + setEntity(request, param, contentType, charset); + /* 设置请求头 */ + ParamUtils.setHeader(request, headers, contentType, charset); + httpResponse = httpClient.execute(request); + entity = httpResponse.getEntity(); + /* 获取压测执行结果 */ + outParamBO = super.getResult(httpResponse, entity); + } + } catch (Exception e) { + // ... + } finally { + try { + if (null != entity) { + entity.getContent().close(); + } + if (null != httpResponse) { + httpResponse.close(); + } + } catch (IOException e) { + log.error("error", e); + } + } + } + return outParamBO; + } + + /** + * 组装参数 + * + * @author gaoxianglong + * @throws UnsupportedEncodingException + */ + private void setEntity(HttpPost request, String param, ContentType contentType, String charset) + throws UnsupportedEncodingException { + if (StringUtils.isEmpty(param)) { + return; + } + HttpEntity entity = null; + if (contentType == ContentType.APPLICATION_JSON) { + entity = new StringEntity(param, charset); + } else { + List nameValuePairs = new ArrayList(); + /* 表单参数格式为:key1=value1,key2=value2 */ + String[] parameters = param.split("\\,"); + Arrays.asList(parameters).stream().forEach(parameter -> { + String[] value = parameter.split("\\="); + nameValuePairs.add(new BasicNameValuePair(value[0], value[1])); + }); + entity = new UrlEncodedFormEntity(nameValuePairs, charset); + } + request.setEntity(entity); + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/stresstest/Stresstest.java b/titan-agent/src/main/java/com/yunji/titan/agent/stresstest/Stresstest.java new file mode 100644 index 0000000..5282615 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/stresstest/Stresstest.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.stresstest; + +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.fastjson.JSONObject; +import com.yunji.titan.agent.bean.bo.OutParamBO; +import com.yunji.titan.utils.ContentType; + +/** + * 压测引擎核心接口 + * + * @author gaoxianglong + */ +public interface Stresstest { + public String CHAR_SET = "UTF-8"; + public Logger log = LoggerFactory.getLogger(Stresstest.class); + + /** + * 执行GET请求类型压测 + * + * @author gaoxianglong + * + * @param url + * 需要进行压测的URL + * + * @param outParam + * 上一个接口的出参 + * + * @param param + * 表单参数或者JSON参数 + * + * @param contentType + * 内容类型 + * + * @param charset + * 编码格式 + * + * @exception Exception,IOException + * + * @return OutParamBO 压测结果,返回业务code为0时则成功 + */ + public OutParamBO runGetStresstest(String url, String outParam, String param, ContentType contentType, + String charset); + + /** + * 执行POST请求类型压测 + * + * @author gaoxianglong + * + * @param url + * 需要进行压测的URL + * + * @param outParam + * 上一个接口的出参 + * + * @param param + * 表单参数或者JSON参数 + * + * @param contentType + * 内容类型 + * + * @param charset + * 编码格式 + * + * @exception Exception,IOException + * + * @return OutParamBO 压测结果,返回业务code为0时则成功 + */ + public OutParamBO runPostStresstest(String url, String outParam, String param, ContentType contentType, + String charset); + + /** + * 获取执行结果 + * + * @author gaoxianglong + * + * @param httpResponse + * + * @param entity + * + * @exception Exception + * + * @return OutParamBean + */ + public default OutParamBO getResult(CloseableHttpResponse httpResponse, HttpEntity entity) { + OutParamBO outParamBO = new OutParamBO(); + int httpCode = 200; + if (httpCode == httpResponse.getStatusLine().getStatusCode()) { + outParamBO.setErrorCode(httpCode); + try { + JSONObject obj = JSONObject.parseObject(EntityUtils.toString(entity, CHAR_SET)); + Object errorCode = obj.get("errorCode"); + Object data = obj.get("data"); + if (null != errorCode) { + outParamBO.setErrorCode(Integer.parseInt(errorCode.toString())); + } + if (null != data) { + outParamBO.setData(data.toString()); + } + } catch (Exception e) { + log.debug("返回的并非是JSON"); + } + } + return outParamBO; + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/utils/ChangeAgentState.java b/titan-agent/src/main/java/com/yunji/titan/agent/utils/ChangeAgentState.java new file mode 100644 index 0000000..11e40e6 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/utils/ChangeAgentState.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.utils; + +import org.apache.log4j.Logger; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.Stat; +import com.yunji.titan.agent.state.AgentState; +import com.yunji.titan.agent.state.AgentStateContext; + +/** + * 更改Agent状态工具类 + * + * @author gaoxianglong + */ +public class ChangeAgentState { + private static Logger log = Logger.getLogger(ChangeAgentState.class); + + /** + * Agent自身状态变更 + * + * @author gaoxianglong + * + * @param agentStateContext + * + * @param state + * + * @param zkClient + * + * @param nodePath + * @throws InterruptedException + * @throws KeeperException + */ + public static void change(AgentStateContext agentStateContext, AgentState state, ZooKeeper zkClient, + String nodePath) throws KeeperException, InterruptedException { + agentStateContext.setState(state); + Stat stat = agentStateContext.opretion(zkClient, nodePath); + if (null != stat) { + log.info("zNode为" + nodePath + "的当前状态已经更新为" + agentStateContext.getStateInfo()); + } + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/utils/MsgProvider.java b/titan-agent/src/main/java/com/yunji/titan/agent/utils/MsgProvider.java new file mode 100644 index 0000000..05538ad --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/utils/MsgProvider.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.utils; + +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import com.alibaba.rocketmq.common.message.Message; +import com.yunji.titan.utils.config.RocketMqDataSource; + +/** + * 消息生产者 + * + * @author gaoxianglong + */ +@Component +public class MsgProvider { + @Resource + private RocketMqDataSource rocketMQDataSource; + private Logger log = LoggerFactory.getLogger(MsgProvider.class); + + /** + * 将压测结果写入消息队列 + * + * @author gaoxianglong + */ + public void sendMsg(String result) { + if (StringUtils.isEmpty(result)) { + return; + } + try { + String msgId = rocketMQDataSource.getProducer() + .send(new Message(rocketMQDataSource.getRocketTopic(), "*", "uploadKey", result.getBytes())) + .getMsgId(); + log.info(msgId); + } catch (Exception e) { + log.error("error", e); + } + } +} diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/utils/ParamUtils.java b/titan-agent/src/main/java/com/yunji/titan/agent/utils/ParamUtils.java new file mode 100644 index 0000000..5edb53a --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/utils/ParamUtils.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.utils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.protocol.HTTP; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.StringUtils; + +import com.alibaba.fastjson.JSONObject; +import com.yunji.titan.utils.ContentType; + +/** + * 参数相关工具类 + * + * @author gaoxianglong + */ +public class ParamUtils { + private static Logger log = LoggerFactory.getLogger(ParamUtils.class); + + public static Map resolve(String param) { + String[] params = null; + if (StringUtils.isEmpty(param)) { + return null; + } + Map map = new HashMap(16); + params = param.split("(%%%)"); + if (null != params) { + if (1 < params.length) { + map.put("param", params[0]); + map.put("headers", params[1]); + } else { + try { + Object header = JSONObject.parseObject(params[0]).get("header"); + /* 判断参数是否是头信息 */ + map.put(null != header ? "headers" : "param", params[0]); + } catch (Exception e) { + map.put("param", params[0]); + log.debug("header中不带参数"); + } + } + } + return map; + } + + /** + * 设置请求头 + * + * @author gaoxianglong + */ + public static void setHeader(HttpRequestBase request, String headers, ContentType contentType, String charset) { + if (null == request) { + return; + } + request.setHeader(HTTP.CONTENT_TYPE, + Optional.ofNullable(contentType.type).orElseGet(() -> ContentType.APPLICATION_XML.type) + ";" + + Optional.ofNullable(charset).orElseGet(() -> "UTF-8")); + if (!StringUtils.isEmpty(headers)) { + /* 设置请求头参数 */ + JSONObject jsonObj = JSONObject.parseObject(JSONObject.parseObject(headers).get("header").toString()); + jsonObj.keySet().stream().forEach(key -> request.setHeader(key, jsonObj.getString(key))); + } + } + + /** + * JSON请求合并 + * + * @author gaoxianglong + */ + public static String jsonCombination(String json1, String json2) { + if (StringUtils.isEmpty(json1)) { + return json2; + } + JSONObject jsonObj = null; + try { + jsonObj = JSONObject.parseObject(json1); + jsonObj.putAll(JSONObject.parseObject(json2)); + } catch (Exception e) { + log.debug("参数并非是JSON"); + } + return null != jsonObj ? jsonObj.toJSONString() : null; + } + + /** + * 将JSON转换为url参数 + * + * @author gaoxianglong + */ + public static String jsonToUrl(String p1, String p2) { + StringBuffer param = new StringBuffer(); + try { + JSONObject jsonObj = JSONObject.parseObject(p2); + Set keys = jsonObj.keySet(); + if (!keys.isEmpty()) { + // if (StringUtils.isEmpty(p1)) { + // param.append("?"); + // } else { + // param.append(p1 + "&"); + // } + param.append(StringUtils.isEmpty(p1) ? "?" : p1 + "&"); + keys.stream().forEach(key -> { + param.append(key + "=" + jsonObj.get(key).toString()); + param.append("&"); + }); + } + } catch (Exception e) { + log.debug("参数并非是JSON"); + } finally { + /* 删除最后一个符号& */ + if (!StringUtils.isEmpty(param.toString())) { + int length = param.length(); + param.delete(length - 1, length); + } + } + return param.toString(); + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/utils/ResultStatistics.java b/titan-agent/src/main/java/com/yunji/titan/agent/utils/ResultStatistics.java new file mode 100644 index 0000000..70e2634 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/utils/ResultStatistics.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.utils; + +import com.alibaba.fastjson.JSON; +import com.yunji.titan.utils.AgentTaskBean; +import com.yunji.titan.utils.ResultBean; + +/** + * 压测结果统计 + * + * @author gaoxianglong + */ +public class ResultStatistics { + public static String result(long startTime, long endTime, int httpSuccessNum, int serviceSuccessNum, + AgentTaskBean agentTaskBean) { + ResultBean resultBean = new ResultBean(); + resultBean.setTaskId(agentTaskBean.getTaskId()); + resultBean.setAgentSize(agentTaskBean.getAgentSize()); + resultBean.setStartTime(startTime); + resultBean.setExpectThroughput(agentTaskBean.getExpectThroughput()); + resultBean.setEndTime(endTime); + resultBean.setConcurrentUsers(agentTaskBean.getConcurrentUsersSize()); + resultBean.setSenceId(agentTaskBean.getSenceId()); + resultBean.setSenceName(agentTaskBean.getSenceName()); + resultBean.setTaskSize(agentTaskBean.getTaskSize()); + resultBean.setHttpSuccessNum(httpSuccessNum); + resultBean.setServiceSuccessNum(serviceSuccessNum); + return JSON.toJSONString(resultBean); + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/agent/watch/registry/RegisterAgent.java b/titan-agent/src/main/java/com/yunji/titan/agent/watch/registry/RegisterAgent.java new file mode 100644 index 0000000..2c9fb76 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/agent/watch/registry/RegisterAgent.java @@ -0,0 +1,184 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.agent.watch.registry; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.StringReader; +import java.util.Properties; +import java.util.Scanner; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import com.alibaba.fastjson.JSONObject; +import com.yunji.titan.agent.RequestHandler; +import com.yunji.titan.agent.state.AgentStateContext; +import com.yunji.titan.agent.state.FreeState; +import com.yunji.titan.agent.utils.ChangeAgentState; +import com.yunji.titan.task.facade.TaskFacade; +import com.yunji.titan.utils.AgentTaskBean; +import com.yunji.titan.utils.AgentType; +import com.yunji.titan.utils.NodePath; +import com.yunji.titan.utils.Result; +import com.yunji.titan.utils.ZookeeperConnManager; +import com.yunji.titan.utils.ftp.FtpUtils; + +/** + * 向注册中心注册agent节点,并监听TaskService的任务下发 + * + * @author gaoxianglong + */ +@Component +public class RegisterAgent implements Watcher { + private String nodePath = NodePath.ROOT_NODEPATH; + @Resource + private TaskFacade taskFacade; + @Resource + private ZookeeperConnManager zookeeperConnManager; + @Resource + private RequestHandler requestHandler; + @Resource + private FtpUtils ftpUtils; + @Resource + private AgentStateContext agentStateContext; + private Logger log = LoggerFactory.getLogger(RegisterAgent.class); + + /** + * 注册agent节点 + * + * @author gaoxianglong + */ + @PostConstruct + public void register() { + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + try { + /* 如果根节点不存在则创建 */ + if (null == zkClient.exists(nodePath, false)) { + zkClient.create(nodePath, new byte[] {}, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); + } + /* 创建临时节点 */ + nodePath = zkClient.create(nodePath + "/agent-", AgentType.FREE, Ids.OPEN_ACL_UNSAFE, + CreateMode.EPHEMERAL_SEQUENTIAL); + log.info("成功注册agent节点-->" + nodePath); + /* 注册节点 */ + zkClient.exists(nodePath, this); + } catch (KeeperException | InterruptedException e) { + log.error("error", e); + } + } + + @Override + public void process(WatchedEvent event) { + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + try { + /* 重新注册节点 */ + zkClient.exists(nodePath, this); + EventType eventType = event.getType(); + switch (eventType) { + case NodeDataChanged: + Properties properties = new Properties(); + properties.load(new StringReader(new String(zkClient.getData(nodePath, false, null)))); + Boolean task = Boolean.parseBoolean(properties.getProperty("task")); + Boolean interrupted = Boolean.parseBoolean(properties.getProperty("interrupted")); + if (null != task && null != interrupted) { + if (interrupted) { + requestHandler.interruptedTask(); + } else if (task) { + new Thread(() -> { + /* 领取taskService下发的任务 */ + Result result = taskFacade.pullTask(nodePath); + if (!result.isSuccess()) { + log.warn("领取任务失败,errorCode->" + result.getErrorCode() + "errorMsg->" + + result.getErrorMsg()); + try { + /* 领取任务失败后,恢复agent状态为空闲 */ + ChangeAgentState.change(agentStateContext, new FreeState(), + zookeeperConnManager.getZkClient(), nodePath); + log.warn("获取压测脚本失败,则恢复agent状态为空闲"); + } catch (Exception e) { + log.info("error", e); + } + return; + } + File ftpFile = new File(result.getData()); + /* 从FTP中获取脚本 */ + boolean downloadResult = ftpUtils.downloadFile(ftpFile); + try { + if (downloadResult) { + File localFile = new File( + System.getProperty("user.home") + "/" + ftpFile.getName()); + try (Scanner scan = new Scanner( + new BufferedInputStream(new FileInputStream(localFile)), "UTF-8")) { + StringBuffer strBuffer = new StringBuffer(); + while (scan.hasNextLine()) { + strBuffer.append(scan.nextLine()); + } + String taskInfo = strBuffer.toString(); + log.info("收到压测任务信息-->" + taskInfo); + AgentTaskBean agentTaskBean = JSONObject.parseObject(taskInfo, + AgentTaskBean.class); + requestHandler.handler(nodePath, agentTaskBean); + } catch (Exception e) { + log.error("error", e); + } finally { + if (localFile.exists()) { + if (localFile.delete()) { + log.info("从FTP下载的源文件-->" + localFile.getPath() + "已经成功从本地删除"); + } + } + } + } else { + try { + /* + * 获取压测脚本失败,则恢复agent状态为空闲,由于压测脚本获取失败, + * 无法获取taskid,所以需要手动修改场景状态 + */ + ChangeAgentState.change(agentStateContext, new FreeState(), + zookeeperConnManager.getZkClient(), nodePath); + log.warn("获取压测脚本失败,则恢复agent状态为空闲"); + } catch (Exception e) { + log.info("error", e); + } + } + } finally { + ftpUtils.deleteFile(ftpFile); + } + }).start(); + } + } + break; + default: + break; + } + } catch (Exception e) { + log.error("error", e); + } + } +} \ No newline at end of file diff --git a/titan-agent/src/main/java/com/yunji/titan/task/facade/TaskFacade.java b/titan-agent/src/main/java/com/yunji/titan/task/facade/TaskFacade.java new file mode 100644 index 0000000..87435b2 --- /dev/null +++ b/titan-agent/src/main/java/com/yunji/titan/task/facade/TaskFacade.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.facade; + +import com.yunji.titan.utils.Result; +import com.yunji.titan.utils.TaskIssuedBean; + +/** + * Task服务外观类,将需要对外提供的接口进行统一封装 + * + * @author gaoxianglong + */ +public interface TaskFacade { + /** + * 启动压测 + * + * @author gaoxianglong + * + * @param taskIssuedBean + * 任务下发Bean + * + * @return Result + */ + public Result startPerformanceTest(TaskIssuedBean taskIssuedBean); + + /** + * 停止压测 + * + * @author gaoxianglong + * + * @param senceId + * 场景ID + * + * @return Result + */ + public Result stopPerformanceTest(Integer senceId); + + /** + * agent领取压测任务 + * + * @author gaoxianglong + * + * @param zNode + * agent的zNode + * + * @return Result + */ + public Result pullTask(String zNode); + + /** + * 获取注册中心所有的agent的hostAddress信息 + * + * @author gaoxianglong + * + * @return Result + */ + public Result getAgentsHostAddress(); +} \ No newline at end of file diff --git a/titan-agent/src/main/resources/dubbo-context.xml b/titan-agent/src/main/resources/dubbo-context.xml new file mode 100644 index 0000000..a0f860d --- /dev/null +++ b/titan-agent/src/main/resources/dubbo-context.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/titan-agent/src/main/resources/ftp-context.xml b/titan-agent/src/main/resources/ftp-context.xml new file mode 100644 index 0000000..ae98868 --- /dev/null +++ b/titan-agent/src/main/resources/ftp-context.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-agent/src/main/resources/log4j.xml b/titan-agent/src/main/resources/log4j.xml new file mode 100644 index 0000000..dd65216 --- /dev/null +++ b/titan-agent/src/main/resources/log4j.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/titan-agent/src/main/resources/properties/agent.properties b/titan-agent/src/main/resources/properties/agent.properties new file mode 100644 index 0000000..46ac713 --- /dev/null +++ b/titan-agent/src/main/resources/properties/agent.properties @@ -0,0 +1,35 @@ +#dubbo +address= + +#http +maxTotal=10000 +defaultMaxPerRoute=10000 +socketTimeout=10000 +connectTimeout=10000 +connectionRequestTimeout=10000 + +#rocketmq +rocket_topic=titan-test-topic +namesrvAddr= + +#threadpool +corePoolSize=2000 +maximumPoolSize=2000 +keepAliveTime=5 +capacity=1000 + +#ftp +ftp.hostname= +ftp.userName= +ftp.passWord= +ftp.encoding=UTF-8 +ftp.bufferSize=1024 +ftp.connectTimeout=10000 +ftp.soTimeout=30000 + +#zk +zk_address= +zk_session_timeout=5000 + +#service_code +code=0 \ No newline at end of file diff --git a/titan-agent/src/main/resources/root-context.xml b/titan-agent/src/main/resources/root-context.xml new file mode 100644 index 0000000..3efdf31 --- /dev/null +++ b/titan-agent/src/main/resources/root-context.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-agent/src/main/resources/shutdown.sh b/titan-agent/src/main/resources/shutdown.sh new file mode 100644 index 0000000..fb42d44 --- /dev/null +++ b/titan-agent/src/main/resources/shutdown.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +source /etc/profile + +#获取本机agents的PID +pid=`ps -ef | grep "titan-agent" | grep -v "grep" | awk '{print $2}'` +echo $pid + +#kill本机的所有agents节点 +kill -9 $pid +echo "titan-agent进程已经全部kill" diff --git a/titan-agent/src/main/resources/start.sh b/titan-agent/src/main/resources/start.sh new file mode 100644 index 0000000..79b320c --- /dev/null +++ b/titan-agent/src/main/resources/start.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +source /etc/profile + +java -server -Xms4g -Xmx4g -Xmn1g -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:ParallelGCThreads=3 -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/yunji/titan-agent/logs/gc.log -jar titan-agent.jar & diff --git a/titan-agent/src/main/resources/zk-context.xml b/titan-agent/src/main/resources/zk-context.xml new file mode 100644 index 0000000..b5ec890 --- /dev/null +++ b/titan-agent/src/main/resources/zk-context.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/titan-agent/src/test/java/com/yunji/titan/test/agent/GetRequestPerformanceTestTest.java b/titan-agent/src/test/java/com/yunji/titan/test/agent/GetRequestPerformanceTestTest.java new file mode 100644 index 0000000..3740c9e --- /dev/null +++ b/titan-agent/src/test/java/com/yunji/titan/test/agent/GetRequestPerformanceTestTest.java @@ -0,0 +1,31 @@ +package com.yunji.titan.test.agent; + +import org.junit.Test; + +import com.yunji.titan.agent.config.HttpConnectionManager; +import com.yunji.titan.agent.stresstest.HttpPostRequestStresstest; + +/** + * 测试类 + * + * @author gaoxianglong + */ +public class GetRequestPerformanceTestTest { + public @Test void testGetRequest() { + // HttpGetRequestStresstest g = new HttpGetRequestStresstest(); + // g.httpConnectionManager = new HttpConnectionManager(); + // g.httpConnectionManager.init(); + // System.out.println( + // g.runGetStresstest("http://st.yunjiweidian.com/yunjibuyer/subject/getFullCoupon.json", + // null, null)); + + HttpPostRequestStresstest p = new HttpPostRequestStresstest(); + p.httpConnectionManager = new HttpConnectionManager(); + p.httpConnectionManager.init(); + // OutParamBean oBean = + // p.runPostStresstest("http://172.16.5.106:8081/SpringMVCDemo/titan/postsecond", + // null, null, + // false); + // System.out.println(oBean.getErrorCode()); + } +} \ No newline at end of file diff --git a/titan-datacollect/pom.xml b/titan-datacollect/pom.xml new file mode 100644 index 0000000..1a704cc --- /dev/null +++ b/titan-datacollect/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + com.yunji + titan + 2.0.0-SNAPSHOT + + com.yunji + titan-datacollect + 2.0.0-SNAPSHOT + titan-datacollect + http://maven.apache.org + + 4.8.2 + 1.8 + 2.0.0-SNAPSHOT + 5.1.39 + 1.0.15 + 2.1.3-201003011305 + 1.8.5 + UTF-8 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + UTF-8 + ${java-version} + ${java-version} + + + ${env.JAVA_HOME}/jre/lib/rt.jar + ${project.basedir}/lib + + + + + + + + org.aspectj + aspectjweaver + ${aspectjweaver-version} + + + com.kenai.nbpwr + net-sf-cglib + ${cglib-version} + + + com.alibaba + druid + ${druid-version} + + + mysql + mysql-connector-java + ${mysql-version} + + + junit + junit + ${junit-version} + test + + + com.yunji + titan-utils + ${titan-utils-version} + + + \ No newline at end of file diff --git a/titan-datacollect/src/main/java/com/yunji/titan/datacollect/Main.java b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/Main.java new file mode 100644 index 0000000..c2c845e --- /dev/null +++ b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/Main.java @@ -0,0 +1,53 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.datacollect; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * titan-datacollect启动函数 + * + * @author gaoxianglong + */ +public class Main { + private static ApplicationContext context; + private static Logger log = LoggerFactory.getLogger(Main.class); + + public static void main(String[] args) { + new Main(); + } + + Main() { + init(); + } + + public void init() { + context = new ClassPathXmlApplicationContext("classpath:*-context.xml"); + MasterElection masterElection = context.getBean("masterElection", MasterElection.class); + /* Master选举 */ + masterElection.election(); + try { + synchronized (this) { + this.wait(); + } + } catch (Exception e) { + log.error("error", e); + } + } +} \ No newline at end of file diff --git a/titan-datacollect/src/main/java/com/yunji/titan/datacollect/MasterElection.java b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/MasterElection.java new file mode 100644 index 0000000..bd8889a --- /dev/null +++ b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/MasterElection.java @@ -0,0 +1,100 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.datacollect; + +import javax.annotation.Resource; + +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import com.yunji.titan.utils.NodePath; +import com.yunji.titan.utils.ZookeeperConnManager; + +/** + * Master选举 + * + * @author gaoxianglong + */ +@Service +public class MasterElection implements Watcher { + @Resource + private ZookeeperConnManager zookeeperConnManager; + @Resource + private SubscribeMessage subscribeMessage; + private final String nodePath = NodePath.DATACOLLECT_LOCK_NODEPATH; + private Logger log = LoggerFactory.getLogger(MasterElection.class); + + /** + * 创建临时节点 + * + * @author gaoxianglong + * + * @exception Exception + * + * @return void + */ + public void election() { + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + try { + /* 验证临时节点是否已经被创建 */ + if (null == zkClient.exists(nodePath, false)) { + zkClient.create(nodePath, new byte[] {}, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); + log.info("titan-datacollect启动成功..."); + subscribeMessage.getMsg(); + /* 注册节点 */ + zkClient.exists(nodePath, this); + } else { + /* 如果节点已经存在,则监听 */ + zkClient.exists(nodePath, this); + log.info("mode --> slave"); + } + } catch (Exception e) { + try { + /* 如果节点已经存在,则监听 */ + zkClient.exists(nodePath, this); + log.info("mode --> slave"); + } catch (Exception e1) { + log.error("error", e1); + } + } + } + + @Override + public void process(WatchedEvent event) { + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + try { + /* 重新注册节点 */ + zkClient.exists(nodePath, this); + EventType eventType = event.getType(); + switch (eventType) { + case NodeDeleted: + election(); + break; + default: + break; + } + } catch (Exception e) { + log.error("error", e); + } + } +} \ No newline at end of file diff --git a/titan-datacollect/src/main/java/com/yunji/titan/datacollect/SubscribeMessage.java b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/SubscribeMessage.java new file mode 100644 index 0000000..c2ae5fa --- /dev/null +++ b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/SubscribeMessage.java @@ -0,0 +1,164 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.datacollect; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CountDownLatch; +import javax.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer; +import com.alibaba.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; +import com.alibaba.rocketmq.client.consumer.listener.MessageListenerConcurrently; +import com.alibaba.rocketmq.common.consumer.ConsumeFromWhere; +import com.yunji.titan.utils.MonitorBean; +import com.yunji.titan.utils.ResultBean; +import com.yunji.titan.utils.ThreadPoolManager; +import com.yunji.titan.utils.config.RocketMqDataSource; + +/** + * 从消息队列中获取压测结果数据信息 + * + * @author gaoxianglong + */ +@Service +public class SubscribeMessage { + @Resource + private ThreadPoolManager threadPoolManager; + @Resource + private UploadData uploadData; + @Resource(name = "operationalIndicator") + private RocketMqDataSource operationalIndicator; + @Resource(name = "monitorIndicator") + private RocketMqDataSource monitorIndicator; + private Map> resultMap; + private Map countDownLatchMap; + private Logger log = LoggerFactory.getLogger(SubscribeMessage.class); + + public SubscribeMessage() { + countDownLatchMap = new ConcurrentHashMap(); + resultMap = new ConcurrentHashMap>(); + } + + protected void getMsg() { + getOperationalIndicator(); + getMonitorIndicator(); + } + + /** + * 获取业务指标数据 + * + * @author gaoxianglong + */ + private void getOperationalIndicator() { + DefaultMQPushConsumer consumer = operationalIndicator.getConsumer(); + try { + consumer.subscribe(operationalIndicator.getRocketTopic(), "*"); + consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); + MessageListenerConcurrently titanMessageListenerConcurrently = (msgs, context) -> { + if (!msgs.isEmpty()) { + msgs.stream().forEach(msg -> { + final String body = new String(msg.getBody()); + try { + log.info("id-->" + msg.getMsgId() + "\tbody-->" + body); + ResultBean resultBean = JSONObject.parseObject(body, ResultBean.class); + if (null != resultBean) { + upload(resultBean.getTaskId(), resultBean); + } + } catch (Exception e) { + log.error("error", e); + } + }); + } + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + }; + consumer.registerMessageListener(titanMessageListenerConcurrently); + consumer.start(); + } catch (Exception e) { + log.error("error", e); + } + } + + /** + * 获取业务指标数据 + * + * @author gaoxianglong + */ + private void getMonitorIndicator() { + DefaultMQPushConsumer consumer = monitorIndicator.getConsumer(); + try { + consumer.subscribe(monitorIndicator.getRocketTopic(), "*"); + consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); + MessageListenerConcurrently titanMessageListenerConcurrently = (msgs, context) -> { + if (!msgs.isEmpty()) { + msgs.stream().forEach(msg -> { + final String body = new String(msg.getBody()); + try { + log.info("id-->" + msg.getMsgId() + "\tbody-->" + body); + if (null != body) { + MonitorBean monitorBean = JSONObject.parseObject(body, MonitorBean.class); + if (null != monitorBean) { + uploadData.uploadMontor(monitorBean); + } + } + } catch (Exception e) { + log.error("error", e); + } + }); + } + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + }; + consumer.registerMessageListener(titanMessageListenerConcurrently); + consumer.start(); + } catch (Exception e) { + log.error("error", e); + } + } + + /** + * 执行数据上报 + * + * @author gaoxianglong + */ + private synchronized void upload(final String taskId, ResultBean resultBean) { + if (!resultMap.containsKey(taskId)) { + log.info("taskId-->" + taskId + "\tagentSize-->" + resultBean.getAgentSize()); + final CountDownLatch latch = new CountDownLatch(resultBean.getAgentSize()); + countDownLatchMap.put(taskId, latch); + threadPoolManager.getThreadPool().execute(() -> { + /* 执行数据上报 */ + try { + uploadData.upload(taskId, countDownLatchMap, resultMap); + } catch (Exception e) { + log.error("error", e); + } + }); + List list = new ArrayList(); + list.add(resultBean); + resultMap.put(taskId, list); + latch.countDown(); + } else { + resultMap.get(taskId).add(resultBean); + CountDownLatch latch = countDownLatchMap.get(taskId); + latch.countDown(); + } + } +} \ No newline at end of file diff --git a/titan-datacollect/src/main/java/com/yunji/titan/datacollect/UploadData.java b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/UploadData.java new file mode 100644 index 0000000..0ee0501 --- /dev/null +++ b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/UploadData.java @@ -0,0 +1,99 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.datacollect; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.CountDownLatch; + +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSON; +import com.yunji.titan.datacollect.bean.po.ReportPO; +import com.yunji.titan.datacollect.dao.report.MonitorDao; +import com.yunji.titan.datacollect.dao.report.ReportDao; +import com.yunji.titan.datacollect.utils.ResultStatistics; +import com.yunji.titan.utils.MonitorBean; +import com.yunji.titan.utils.ResultBean; + +/** + * 接受agent的压测数据并上报到数据库中落盘 + * + * @author gaoxianglong + */ +@Service +public class UploadData { + @Resource + private ReportDao reportDao; + @Resource + private MonitorDao monitorDao; + private static Logger log = LoggerFactory.getLogger(UploadData.class); + + /** + * 执行数据上报 + * + * @author gaoxianglong + * @throws Exception + */ + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.DEFAULT) + public void upload(String taskId, Map countDownLatchMap, + Map> resultMap) throws Exception { + CountDownLatch latch = countDownLatchMap.get(taskId); + try { + /* 等待指定场景的压测数据 */ + latch.await(); + List results = resultMap.get(taskId); + /* 统计压测结果 */ + ReportPO reportPO = ResultStatistics.result(results); + if (null != reportPO) { + /* 新增压测结果信息 */ + reportDao.insertReport(reportPO); + /* 更改场景状态为未开始 */ + reportDao.updateScene(reportPO.getSceneId(), 0); + log.info("senceId为[" + reportPO.getSceneId() + "]的压测结果已经收集完成并成功上报"); + } + } finally { + /* 资源回收 */ + countDownLatchMap.remove(taskId); + resultMap.remove(taskId); + } + } + + /** + * @desc 数据上报-monitor + * + * @author liuliang + * + * @param monitorBean + */ + public void uploadMontor(MonitorBean monitorBean) { + try { + int result = monitorDao.insert(monitorBean); + if (1 != result) { + log.error("monitor数据上报失败,monitorBean:{}", JSON.toJSONString(monitorBean)); + } + } catch (Exception e) { + log.error("monitor数据上报异常,monitorBean:{}", JSON.toJSONString(monitorBean), e); + } + } +} \ No newline at end of file diff --git a/titan-datacollect/src/main/java/com/yunji/titan/datacollect/bean/po/ReportPO.java b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/bean/po/ReportPO.java new file mode 100644 index 0000000..114ffdd --- /dev/null +++ b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/bean/po/ReportPO.java @@ -0,0 +1,190 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.datacollect.bean.po; + +/** + * 报表实体Bean,对应数据库表[t_report] + * + * @author gaoxiangong + */ +public class ReportPO { + private String reportName; + private int sceneId; + private String sceneName; + private long startTime; + private long endTime; + /** + * 期待吞吐量 + */ + private int expectTps; + /** + * 实际吞吐量 + */ + private int actualTps; + /** + * 总并发请求数 + */ + private long totalRequest; + private int successRequest; + private int businessSuccessRequest; + /** + * 并发用户数 + */ + private int concurrentUser; + /** + * 用户平均请求等待时间 + */ + private long userWaittime; + /** + * 服务器平均请求等待时间 + */ + private long serverWaittime; + /** + * 测试报告结论(0:合格 1:不合格) + */ + private int conclusion; + private long createTime; + + public String getReportName() { + return reportName; + } + + public void setReportName(String reportName) { + this.reportName = reportName; + } + + public int getSceneId() { + return sceneId; + } + + public void setSceneId(int sceneId) { + this.sceneId = sceneId; + } + + public String getSceneName() { + return sceneName; + } + + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getEndTime() { + return endTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public int getExpectTps() { + return expectTps; + } + + public void setExpectTps(int expectTps) { + this.expectTps = expectTps; + } + + public int getActualTps() { + return actualTps; + } + + public void setActualTps(int actualTps) { + this.actualTps = actualTps; + } + + public long getTotalRequest() { + return totalRequest; + } + + public void setTotalRequest(long totalRequest) { + this.totalRequest = totalRequest; + } + + public int getSuccessRequest() { + return successRequest; + } + + public void setSuccessRequest(int successRequest) { + this.successRequest = successRequest; + } + + public int getBusinessSuccessRequest() { + return businessSuccessRequest; + } + + public void setBusinessSuccessRequest(int businessSuccessRequest) { + this.businessSuccessRequest = businessSuccessRequest; + } + + public int getConcurrentUser() { + return concurrentUser; + } + + public void setConcurrentUser(int concurrentUser) { + this.concurrentUser = concurrentUser; + } + + public long getUserWaittime() { + return userWaittime; + } + + public void setUserWaittime(long userWaittime) { + this.userWaittime = userWaittime; + } + + public long getServerWaittime() { + return serverWaittime; + } + + public void setServerWaittime(long serverWaittime) { + this.serverWaittime = serverWaittime; + } + + public int getConclusion() { + return conclusion; + } + + public void setConclusion(int conclusion) { + this.conclusion = conclusion; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "ReportPO [reportName=" + reportName + ", sceneid=" + sceneId + ", sceneName=" + sceneName + + ", startTime=" + startTime + ", endTime=" + endTime + ", expectTps=" + expectTps + ", actualTps=" + + actualTps + ", totalRequest=" + totalRequest + ", successRequest=" + successRequest + + ", businessSuccessRequest=" + businessSuccessRequest + ", concurrentUser=" + concurrentUser + + ", userWaittime=" + userWaittime + ", serverWaittime=" + serverWaittime + ", conclusion=" + conclusion + + ", createTime=" + createTime + "]"; + } +} \ No newline at end of file diff --git a/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/MonitorDao.java b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/MonitorDao.java new file mode 100644 index 0000000..54589aa --- /dev/null +++ b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/MonitorDao.java @@ -0,0 +1,38 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.datacollect.dao.report; + +import com.yunji.titan.utils.MonitorBean; + +/** + * @desc 机器资源情况Dao + * + * @author liuliang + * + */ +public interface MonitorDao { + + /** + * 插入记录 + * + * @author liuliang + * + * @param monitorBean + * @return int 受影响的记录数 + * @throws Exception + */ + int insert(MonitorBean monitorBean) throws Exception; +} diff --git a/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/MonitorDaoImpl.java b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/MonitorDaoImpl.java new file mode 100644 index 0000000..6f47078 --- /dev/null +++ b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/MonitorDaoImpl.java @@ -0,0 +1,55 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.datacollect.dao.report; + +import javax.annotation.Resource; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import com.yunji.titan.utils.MonitorBean; + +/** + * @desc 机器资源情况Dao实现类 + * + * @author liuliang + * + */ +@Repository +public class MonitorDaoImpl implements MonitorDao { + + @Resource + private JdbcTemplate jdbcTemplate; + + /** + * @desc 插入记录 + * + * @author liuliang + * + * @param monitorBean + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int insert(MonitorBean monitorBean) throws Exception { + String sql = "INSERT INTO t_monitor(server_type,ip,cpu_usage,memory_usage,iops,create_time) VALUES(?,?,?,?,?,?)"; + return jdbcTemplate.update(sql, + new Object[] { monitorBean.getServerType(), monitorBean.getIp(), monitorBean.getCpuUsage(), + monitorBean.getMemoryUsage(), monitorBean.getIops(), monitorBean.getCreateTime() }); + + } + +} diff --git a/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/ReportDao.java b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/ReportDao.java new file mode 100644 index 0000000..9f0f111 --- /dev/null +++ b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/ReportDao.java @@ -0,0 +1,54 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.datacollect.dao.report; + +import java.sql.SQLException; + +import com.yunji.titan.datacollect.bean.po.ReportPO; + +/** + * 数据上报DAO接口 + * + * @author gaoxianglong + */ +public interface ReportDao { + /** + * 新增压测结果信息 + * + * @author gaoxianglong + * + * @param reportPO + * 报表实体Bean + * + * @return void + */ + public void insertReport(ReportPO reportPO); + + /** + * 更改场景状态 + * + * @author gaoxianglong + * + * @param sceneId + * 场景ID + * + * @param sceneStatus + * 场景状态(0:未开始 ,1:进行中) + * + * @return void + */ + public void updateScene(int sceneId, int sceneStatus); +} \ No newline at end of file diff --git a/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/ReportDaoImpl.java b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/ReportDaoImpl.java new file mode 100644 index 0000000..aba8b14 --- /dev/null +++ b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/dao/report/ReportDaoImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.datacollect.dao.report; + +import javax.annotation.Resource; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import com.yunji.titan.datacollect.bean.po.ReportPO; + +/** + * 数据上报DAO接口实现 + * + * @author gaoxianglong + */ +@Repository +public class ReportDaoImpl implements ReportDao { + @Resource + private JdbcTemplate jdbcTemplate; + + @Override + public void insertReport(ReportPO reportPO) { + String sql = "INSERT INTO t_report(report_name,scene_id,scene_name,start_time,end_time,expect_tps,actual_tps," + + "total_request,success_request,business_success_request,concurrent_user,user_waittime,server_waittime,conclusion,create_time) " + + "values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + jdbcTemplate.update(sql, + new Object[] { reportPO.getReportName(), reportPO.getSceneId(), reportPO.getSceneName(), + reportPO.getStartTime(), reportPO.getEndTime(), reportPO.getExpectTps(), + reportPO.getActualTps(), reportPO.getTotalRequest(), reportPO.getSuccessRequest(), + reportPO.getBusinessSuccessRequest(), reportPO.getConcurrentUser(), + reportPO.getUserWaittime(), reportPO.getServerWaittime(), reportPO.getConclusion(), + reportPO.getCreateTime() }); + } + + @Override + public void updateScene(int sceneId, int sceneStatus) { + String sql = "UPDATE t_scene SET scene_status = ? WHERE scene_id = ?"; + jdbcTemplate.update(sql, new Object[] { sceneStatus, sceneId }); + } +} \ No newline at end of file diff --git a/titan-datacollect/src/main/java/com/yunji/titan/datacollect/utils/ResultStatistics.java b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/utils/ResultStatistics.java new file mode 100644 index 0000000..e7579c0 --- /dev/null +++ b/titan-datacollect/src/main/java/com/yunji/titan/datacollect/utils/ResultStatistics.java @@ -0,0 +1,87 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.datacollect.utils; + +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.yunji.titan.datacollect.bean.po.ReportPO; +import com.yunji.titan.utils.ResultBean; + +/** + * 压测结果统计 + * + * @author gaoxianglong + */ +public class ResultStatistics { + private static Logger log = LoggerFactory.getLogger(ResultStatistics.class); + + public static ReportPO result(List reportPOs) { + ReportPO reportEntity = null; + if (reportPOs.isEmpty()) { + return null; + } + reportEntity = new ReportPO(); + ResultBean resultBean = reportPOs.get(0); + try { + int httpSuccessNum = (int) reportPOs.stream().mapToInt(ResultBean::getHttpSuccessNum).summaryStatistics() + .getSum(); + int serviceSuccessNum = (int) reportPOs.stream().mapToInt(ResultBean::getServiceSuccessNum) + .summaryStatistics().getSum(); + /* 寻找各个agent节点中开始时间最早的 */ + long startTime = reportPOs.stream().mapToLong(ResultBean::getStartTime).summaryStatistics().getMin(); + /* 寻找各个agent节点中结束时间最晚的 */ + long endTime = reportPOs.stream().mapToLong(ResultBean::getEndTime).summaryStatistics().getMax(); + long continuedTime = endTime - startTime; + reportEntity.setSceneId(resultBean.getSenceId()); + reportEntity.setSceneName(resultBean.getSenceName()); + reportEntity.setExpectTps(resultBean.getExpectThroughput()); + reportEntity.setStartTime(startTime); + reportEntity.setEndTime(endTime); + reportEntity.setSuccessRequest(httpSuccessNum); + reportEntity.setBusinessSuccessRequest(serviceSuccessNum); + reportEntity.setConcurrentUser(resultBean.getConcurrentUsers() * resultBean.getAgentSize()); + reportEntity.setCreateTime(System.currentTimeMillis()); + reportEntity.setReportName(reportEntity.getSceneName() + "_" + reportEntity.getCreateTime()); + reportEntity.setTotalRequest(resultBean.getTaskSize() * reportEntity.getConcurrentUser()); + /* 吞吐量,单位秒 */ + reportEntity.setActualTps((int) (reportEntity.getTotalRequest() / ((double) continuedTime / 1000))); + /* + * 压测结果,满足3个条件(HTTP200成功请求数>=(总并发请求数/2)&&业务成功率>=(总并发请求数/2)&&实际吞吐量>= + * 期待吞吐量) + */ + reportEntity.setConclusion(reportEntity.getActualTps() >= reportEntity.getExpectTps() + && httpSuccessNum >= (reportEntity.getTotalRequest() / 2) + && serviceSuccessNum >= (reportEntity.getTotalRequest() / 2) ? 0 : 1); + /* + * 服务器平均请求等待时间,计算公式:处理完成所有请求数所花费的时间 / 总请求数:即Time taken for / + * testsComplete requests,单位毫秒 + */ + reportEntity.setServerWaittime(continuedTime / reportEntity.getTotalRequest()); + /* + * 用户平均请求等待时间,计算公式:处理完成所有请求数所花费的时间/(总请求数 / 并发用户数),即 Time per request + * = Time taken for tests / (Complete requests / Concurrency + * Level),单位毫秒 + */ + reportEntity.setUserWaittime( + continuedTime / (reportEntity.getTotalRequest() / reportEntity.getConcurrentUser())); + } catch (ArithmeticException e) { + log.debug("error", e); + } + return reportEntity; + } +} \ No newline at end of file diff --git a/titan-datacollect/src/main/resources/dao-context.xml b/titan-datacollect/src/main/resources/dao-context.xml new file mode 100644 index 0000000..c650063 --- /dev/null +++ b/titan-datacollect/src/main/resources/dao-context.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-datacollect/src/main/resources/log4j.xml b/titan-datacollect/src/main/resources/log4j.xml new file mode 100644 index 0000000..4b74441 --- /dev/null +++ b/titan-datacollect/src/main/resources/log4j.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/titan-datacollect/src/main/resources/properties/datacollect.properties b/titan-datacollect/src/main/resources/properties/datacollect.properties new file mode 100644 index 0000000..2e829da --- /dev/null +++ b/titan-datacollect/src/main/resources/properties/datacollect.properties @@ -0,0 +1,32 @@ +#mysql +name= +passWord= +url= +initialSize=10 +minIdle=10 +maxActive=50 +maxWait=6000 +poolPreparedStatements=false +maxOpenPreparedStatements=-1 +testOnBorrow=false +testOnReturn=false +testWhileIdle=true +filters=mergeStat,log4j,config +connectionProperties=config.decrypt=false +useGlobalDataSourceStat=false +timeBetweenLogStatsMillis=300000 + +#rocketmq +rocket_topic_1=titan-test-topic +rocket_topic_2=titan-monitor-topic +namesrvAddr= + +#threadpool +corePoolSize=100 +maximumPoolSize=1000 +keepAliveTime=5 +capacity=1000 + +#zk +zk_address= +zk_session_timeout=5000 \ No newline at end of file diff --git a/titan-datacollect/src/main/resources/root-context.xml b/titan-datacollect/src/main/resources/root-context.xml new file mode 100644 index 0000000..18bec7c --- /dev/null +++ b/titan-datacollect/src/main/resources/root-context.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-datacollect/src/main/resources/shutdown.sh b/titan-datacollect/src/main/resources/shutdown.sh new file mode 100644 index 0000000..e8b07a1 --- /dev/null +++ b/titan-datacollect/src/main/resources/shutdown.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +source /etc/profile + +#获取本机datacollect的PID +pid=`ps -ef | grep "titan-datacollect" | grep -v "grep" | awk '{print $2}'` +echo $pid + +#kill本机的所有datacollect节点 +kill -9 $pid +echo "titan-datacollect进程已经全部kill" diff --git a/titan-datacollect/src/main/resources/start.sh b/titan-datacollect/src/main/resources/start.sh new file mode 100644 index 0000000..16780dc --- /dev/null +++ b/titan-datacollect/src/main/resources/start.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +source /etc/profile + +java -server -Xms2048m -Xmx2048m -Xmn768m -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseParallelOldGC -XX:ParallelGCThreads=3 -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/yunji/titan-datacollect/logs/gc.log -jar titan-datacollect.jar & diff --git a/titan-datacollect/src/main/resources/zk-context.xml b/titan-datacollect/src/main/resources/zk-context.xml new file mode 100644 index 0000000..b5ec890 --- /dev/null +++ b/titan-datacollect/src/main/resources/zk-context.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/titan-manager/doc/sql/yunjititan.sql b/titan-manager/doc/sql/yunjititan.sql new file mode 100644 index 0000000..9f2a9c1 --- /dev/null +++ b/titan-manager/doc/sql/yunjititan.sql @@ -0,0 +1,130 @@ +/* +Navicat MySQL Data Transfer + +Source Server : 172.16.0.2 +Source Server Version : 50630 +Source Host : 172.16.0.2:3306 +Source Database : yunjititan + +Target Server Type : MYSQL +Target Server Version : 50630 +File Encoding : 65001 + +Date: 2017-12-14 16:12:43 +*/ + +SET FOREIGN_KEY_CHECKS=0; + +-- ---------------------------- +-- Table structure for t_automatic_task +-- ---------------------------- +DROP TABLE IF EXISTS `t_automatic_task`; +CREATE TABLE `t_automatic_task` ( + `automatic_task_id` int(12) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `scene_id` int(12) NOT NULL COMMENT '场景ID', + `scene_name` varchar(128) NOT NULL COMMENT '场景名称', + `start_time` time NOT NULL COMMENT '开始时间', + `pressure_times` int(4) NOT NULL COMMENT '压测次数', + `create_time` bigint(16) NOT NULL COMMENT '记录创建时间', + PRIMARY KEY (`automatic_task_id`), + KEY `IDX_SCENE_ID` (`scene_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='自动压测任务表'; + +-- ---------------------------- +-- Table structure for t_link +-- ---------------------------- +DROP TABLE IF EXISTS `t_link`; +CREATE TABLE `t_link` ( + `link_id` int(12) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID', + `link_name` varchar(128) NOT NULL COMMENT '链路名', + `protocol_type` int(1) NOT NULL DEFAULT '0' COMMENT '协议类型(0:http、1:https)', + `stresstest_url` varchar(256) NOT NULL COMMENT '压测URL', + `request_type` int(1) NOT NULL DEFAULT '0' COMMENT '请求类型(0:get:1:post)', + `content_type` int(2) NOT NULL COMMENT '内容类型', + `charset_type` int(2) NOT NULL COMMENT '字符编码', + `testfile_path` varchar(128) NOT NULL COMMENT '压测文件路径', + `create_time` bigint(16) NOT NULL COMMENT '记录创建时间', + `modify_time` bigint(16) NOT NULL COMMENT '记录最后修改时间', + PRIMARY KEY (`link_id`), + UNIQUE KEY `IDX_LINK_NAME` (`link_name`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='链路表'; + +-- ---------------------------- +-- Table structure for t_monitor +-- ---------------------------- +DROP TABLE IF EXISTS `t_monitor`; +CREATE TABLE `t_monitor` ( + `monitor_id` bigint(12) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `server_type` int(2) NOT NULL COMMENT '服务机器类型(0:agent机器 1:目标机器)', + `ip` varchar(64) NOT NULL COMMENT '机器IP', + `cpu_usage` double(4,2) NOT NULL COMMENT 'CPU使用率', + `memory_usage` double(4,2) NOT NULL COMMENT '内存使用率', + `iops` double(4,0) NOT NULL COMMENT '磁盘IOPS', + `create_time` bigint(16) NOT NULL COMMENT '记录创建时间', + PRIMARY KEY (`monitor_id`), + KEY `IDX_IP` (`ip`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='监控机器资源情况表'; + +-- ---------------------------- +-- Table structure for t_monitor_set +-- ---------------------------- +DROP TABLE IF EXISTS `t_monitor_set`; +CREATE TABLE `t_monitor_set` ( + `monitor_set_id` bigint(12) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `scene_id` bigint(12) NOT NULL COMMENT '场景ID', + `scene_name` varchar(128) NOT NULL COMMENT '场景名称', + `intranet_ip` varchar(64) NOT NULL COMMENT '内网IP', + `create_time` bigint(16) NOT NULL COMMENT '记录创建时间', + PRIMARY KEY (`monitor_set_id`), + UNIQUE KEY `IDX_SCENE_NAME` (`scene_name`) USING BTREE, + UNIQUE KEY `IDX_SCENE_ID` (`scene_id`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='监控集表'; + +-- ---------------------------- +-- Table structure for t_report +-- ---------------------------- +DROP TABLE IF EXISTS `t_report`; +CREATE TABLE `t_report` ( + `report_id` int(12) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID', + `report_name` varchar(128) NOT NULL COMMENT '报告名称', + `scene_id` int(12) NOT NULL COMMENT '场景ID', + `scene_name` varchar(128) NOT NULL COMMENT '场景名称', + `start_time` bigint(16) NOT NULL COMMENT '测试起始时间', + `end_time` bigint(16) NOT NULL COMMENT '测试结束时间', + `expect_tps` int(12) NOT NULL DEFAULT '0' COMMENT '期待吞吐量', + `actual_tps` int(12) NOT NULL DEFAULT '0' COMMENT '实际吞吐量', + `total_request` bigint(16) NOT NULL COMMENT '总并发请求数', + `success_request` bigint(16) NOT NULL DEFAULT '0' COMMENT 'HTTP200成功请求数', + `business_success_request` bigint(16) NOT NULL DEFAULT '0' COMMENT '业务成功请求数', + `concurrent_user` int(12) NOT NULL COMMENT '并发用户数', + `user_waittime` bigint(16) NOT NULL COMMENT '用户平均请求等待时间(单位:毫秒)', + `server_waittime` bigint(16) NOT NULL COMMENT '服务器平均请求等待时间(单位:毫秒)', + `conclusion` int(2) NOT NULL COMMENT '测试报告结论(0:合格 1:不合格)', + `create_time` bigint(16) NOT NULL COMMENT '记录创建时间', + PRIMARY KEY (`report_id`), + KEY `IDX_REPORT_NAME` (`report_name`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='测试报告表'; + +-- ---------------------------- +-- Table structure for t_scene +-- ---------------------------- +DROP TABLE IF EXISTS `t_scene`; +CREATE TABLE `t_scene` ( + `scene_id` int(12) NOT NULL AUTO_INCREMENT COMMENT '主键自增ID', + `scene_name` varchar(128) NOT NULL COMMENT '场景名称', + `duration_hour` int(2) NOT NULL COMMENT '持续时间-时', + `duration_min` int(2) NOT NULL COMMENT '持续时间-分', + `duration_sec` int(2) NOT NULL COMMENT '持续时间-秒', + `concurrent_user` int(12) NOT NULL DEFAULT '0' COMMENT '并发用户数', + `concurrent_start` int(12) NOT NULL COMMENT '起步并发用户数', + `total_request` bigint(16) NOT NULL DEFAULT '0' COMMENT '总并发请求数', + `expect_tps` int(12) NOT NULL DEFAULT '0' COMMENT '期待吞吐量', + `contain_linkid` varchar(256) NOT NULL COMMENT '包含的链路ID,多个链路ID以英文","隔开', + `link_relation` varchar(256) NOT NULL COMMENT '串行链路关系,按链路顺序,链路ID以英文","隔开', + `use_agent` int(8) NOT NULL DEFAULT '0' COMMENT '使用的agent数', + `scene_status` int(2) NOT NULL DEFAULT '0' COMMENT '状态(0:未开始 ,1:压测进行中,2:停止压测中)', + `create_time` bigint(16) NOT NULL COMMENT '记录创建时间', + `modify_time` bigint(16) NOT NULL COMMENT '记录最后修改时间', + PRIMARY KEY (`scene_id`), + UNIQUE KEY `IDX_SCENE_NAME` (`scene_name`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='场景表'; diff --git a/titan-manager/pom.xml b/titan-manager/pom.xml new file mode 100644 index 0000000..345c50e --- /dev/null +++ b/titan-manager/pom.xml @@ -0,0 +1,148 @@ + + + 4.0.0 + + com.yunji + titan + 2.0.0-SNAPSHOT + + com.yunji + titan-manager + 2.0.0-SNAPSHOT + war + titan-manager Maven Webapp + http://maven.apache.org + + 1.8 + 4.8.2 + 2.0.0-SNAPSHOT + 2.5.3 + 1.7.12 + 1.0.15 + UTF-8 + 5.4.1.Final + + + titan-manager + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + UTF-8 + ${java-version} + ${java-version} + + + ${env.JAVA_HOME}/jre/lib/rt.jar + ${project.basedir}/lib + + + + + + + + com.alibaba + dubbo + ${dubbo-version} + + + org.springframework + spring + + + + + junit + junit + ${junit-version} + test + + + com.yunji + titan-utils + ${titan-utils-version} + + + com.alibaba + druid + ${druid-version} + + + + commons-io + commons-io + 2.5 + + + commons-fileupload + commons-fileupload + 1.3.2 + + + org.apache.commons + commons-lang3 + 3.5 + + + + org.codehaus.jackson + jackson-core-asl + 1.9.13 + + + org.codehaus.jackson + jackson-mapper-asl + 1.9.13 + + + + com.fasterxml.jackson.core + jackson-core + 2.8.9 + + + com.fasterxml.jackson.core + jackson-databind + 2.8.9 + + + + mysql + mysql-connector-java + 5.1.39 + + + + javax.mail + mail + 1.4.7 + + + + org.apache.poi + poi + 3.15 + + + + + javax.servlet + javax.servlet-api + 3.1.0 + provided + + + + + org.hibernate + hibernate-validator + ${hibernate.validator.version} + + + + diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/ActionPerformanceBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/ActionPerformanceBO.java new file mode 100644 index 0000000..28680bf --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/ActionPerformanceBO.java @@ -0,0 +1,229 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.io.File; +import java.io.Serializable; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import com.yunji.titan.utils.ContentType; +import com.yunji.titan.utils.ProtocolType; +import com.yunji.titan.utils.RequestType; + +/** + * @desc 执行压压测参数BO + * + * @author liuliang + * + */ +public class ActionPerformanceBO implements Serializable { + + private static final long serialVersionUID = 8450751422421751510L; + /** + * 场景ID + */ + private Long sceneId; + /** + * 场景名称 + */ + private String sceneName; + /** + * 起步量级 + */ + private Integer initConcurrentUsersSize; + /** + * 并发用户数 + */ + private Integer concurrentUsersSize; + /** + * 总任务数 + */ + private Long taskSize; + /** + * 申请压测agent节点数 + */ + private Integer agentSize; + /** + * 期待吞吐量 + */ + private Integer expectThroughput; + /** + * 期待持续时间 + */ + private Integer continuedTime; + /** + * 时间单位 + */ + private TimeUnit timeUnit; + /** + * 协议类型 + */ + private Map protocolTypes; + /** + * 请求类型 + */ + private Map requestTypes; + /** + * 需要执行全链路压测的目标URL + */ + private List urls; + /** + * 每一个URL对应的动态参数 + */ + private Map params; + /** + * 内容类型 + */ + private Map contentTypes; + /** + * 编码格式 + */ + private Map charsets; + + public Long getSceneId() { + return sceneId; + } + + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + + public String getSceneName() { + return sceneName; + } + + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + + public Integer getInitConcurrentUsersSize() { + return initConcurrentUsersSize; + } + + public void setInitConcurrentUsersSize(Integer initConcurrentUsersSize) { + this.initConcurrentUsersSize = initConcurrentUsersSize; + } + + public Integer getConcurrentUsersSize() { + return concurrentUsersSize; + } + + public void setConcurrentUsersSize(Integer concurrentUsersSize) { + this.concurrentUsersSize = concurrentUsersSize; + } + + public Long getTaskSize() { + return taskSize; + } + + public void setTaskSize(Long taskSize) { + this.taskSize = taskSize; + } + + public Integer getAgentSize() { + return agentSize; + } + + public void setAgentSize(Integer agentSize) { + this.agentSize = agentSize; + } + + public Integer getExpectThroughput() { + return expectThroughput; + } + + public void setExpectThroughput(Integer expectThroughput) { + this.expectThroughput = expectThroughput; + } + + public Integer getContinuedTime() { + return continuedTime; + } + + public void setContinuedTime(Integer continuedTime) { + this.continuedTime = continuedTime; + } + + public TimeUnit getTimeUnit() { + return timeUnit; + } + + public void setTimeUnit(TimeUnit timeUnit) { + this.timeUnit = timeUnit; + } + + public Map getProtocolTypes() { + return protocolTypes; + } + + public void setProtocolTypes(Map protocolTypes) { + this.protocolTypes = protocolTypes; + } + + public Map getRequestTypes() { + return requestTypes; + } + + public void setRequestTypes(Map requestTypes) { + this.requestTypes = requestTypes; + } + + public List getUrls() { + return urls; + } + + public void setUrls(List urls) { + this.urls = urls; + } + + public Map getParams() { + return params; + } + + public void setParams(Map params) { + this.params = params; + } + + public Map getContentTypes() { + return contentTypes; + } + + public void setContentTypes(Map contentTypes) { + this.contentTypes = contentTypes; + } + + public Map getCharsets() { + return charsets; + } + + public void setCharsets(Map charsets) { + this.charsets = charsets; + } + + @Override + public String toString() { + return "ActionPerformanceBO [sceneId=" + sceneId + ", sceneName=" + sceneName + ", initConcurrentUsersSize=" + + initConcurrentUsersSize + ", concurrentUsersSize=" + concurrentUsersSize + ", taskSize=" + taskSize + + ", agentSize=" + agentSize + ", expectThroughput=" + expectThroughput + ", continuedTime=" + + continuedTime + ", timeUnit=" + timeUnit + ", protocolTypes=" + protocolTypes + ", requestTypes=" + + requestTypes + ", urls=" + urls + ", params=" + params + ", contentTypes=" + contentTypes + + ", charsets=" + charsets + "]"; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/AgentInfoBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/AgentInfoBO.java new file mode 100644 index 0000000..7ba1cb6 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/AgentInfoBO.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.util.List; + +/** + * Agent信息bean + * + * @author gaoxianglong + */ +public class AgentInfoBO { + private List freeAgents; + private List busynessAgents; + + public List getFreeAgents() { + return freeAgents; + } + + public void setFreeAgents(List freeAgents) { + this.freeAgents = freeAgents; + } + + public List getBusynessAgents() { + return busynessAgents; + } + + public void setBusynessAgents(List busynessAgents) { + this.busynessAgents = busynessAgents; + } + + @Override + public String toString() { + return "AgentInfoBO [freeAgents=" + freeAgents + ", busynessAgents=" + busynessAgents + "]"; + } +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/AutomaticTaskBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/AutomaticTaskBO.java new file mode 100644 index 0000000..2715bb1 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/AutomaticTaskBO.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.io.Serializable; +import java.util.Date; + +import javax.validation.constraints.NotNull; + +import com.yunji.titan.manager.common.Groups; + +/** + * @desc 自动压测BO + * + * @author liuliang + * + */ +public class AutomaticTaskBO implements Serializable{ + private static final long serialVersionUID = -1163866159102834279L; + /** + * 主键ID + */ + @NotNull(groups = {Groups.Update.class,Groups.Query.class},message = "自动压测任务ID不能为空") + private Long automaticTaskId; + /** + * 场景ID + */ + private Long sceneId; + /** + * 场景名称 + */ + private String sceneName; + /** + * 开始时间 + */ + @NotNull(groups = {Groups.Add.class,Groups.Update.class},message = "开始时间不能为空") + private Date startTime; + /** + * 压测次数 + */ + @NotNull(groups = {Groups.Add.class,Groups.Update.class},message = "压测次数不能为空") + private Integer pressureTimes; + public Long getAutomaticTaskId() { + return automaticTaskId; + } + public void setAutomaticTaskId(Long automaticTaskId) { + this.automaticTaskId = automaticTaskId; + } + public Long getSceneId() { + return sceneId; + } + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + public String getSceneName() { + return sceneName; + } + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + public Date getStartTime() { + return startTime; + } + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + public Integer getPressureTimes() { + return pressureTimes; + } + public void setPressureTimes(Integer pressureTimes) { + this.pressureTimes = pressureTimes; + } + + @Override + public String toString() { + return "AutomaticTaskBO [automaticTaskId=" + automaticTaskId + ", sceneId=" + sceneId + ", sceneName=" + + sceneName + ", startTime=" + startTime + ", pressureTimes=" + pressureTimes + "]"; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/FileUploadBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/FileUploadBO.java new file mode 100644 index 0000000..720557b --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/FileUploadBO.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +/** + * @desc 文件上传结果响应参数 + * + * @author liuliang + * + */ +public class FileUploadBO{ + + /** + * 文件名 + */ + private String filename; + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } + + public FileUploadBO() { + } + + public FileUploadBO(String filename) { + super(); + this.filename = filename; + } + + @Override + public String toString() { + return "FileUploadBO [filename=" + filename + "]"; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/LinkBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/LinkBO.java new file mode 100644 index 0000000..5d08ecf --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/LinkBO.java @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.io.Serializable; +import javax.validation.constraints.NotNull; +import org.hibernate.validator.constraints.NotBlank; +import com.yunji.titan.manager.common.Groups; + +/** + * @desc 链路数据BO + * + * @author liuliang + * + */ +public class LinkBO implements Serializable{ + private static final long serialVersionUID = -5465716714652203049L; + /** + * 主键自增ID + */ + @NotNull(groups = {Groups.Update.class,Groups.Query.class},message = "链路ID不能为空") + private Long linkId; + /** + * 链路名 + */ + @NotBlank(groups = {Groups.Add.class,Groups.Update.class},message = "链路名不能为空") + private String linkName; + /** + * 协议类型(0:http、1:https) + */ + private Integer protocolType; + /** + * 压测URL + */ + @NotBlank(groups = {Groups.Add.class,Groups.Update.class},message = "压测URL不能为空") + private String stresstestUrl; + /** + * 请求类型(0:get:1:post) + */ + private Integer requestType; + /** + * 内容类型 + */ + private Integer contentType; + /** + * 字符编码 + */ + private Integer charsetType; + /** + * 压测文件路径 + */ + private String testfilePath; + /** + * 记录创建时间 + */ + private Long createTime; + /** + * 记录最后修改时间 + */ + private Long modifyTime; + public Long getLinkId() { + return linkId; + } + public void setLinkId(Long linkId) { + this.linkId = linkId; + } + public String getLinkName() { + return linkName; + } + public void setLinkName(String linkName) { + this.linkName = linkName; + } + public Integer getProtocolType() { + return protocolType; + } + public void setProtocolType(Integer protocolType) { + this.protocolType = protocolType; + } + public String getStresstestUrl() { + return stresstestUrl; + } + public void setStresstestUrl(String stresstestUrl) { + this.stresstestUrl = stresstestUrl; + } + public Integer getRequestType() { + return requestType; + } + public void setRequestType(Integer requestType) { + this.requestType = requestType; + } + public Integer getContentType() { + return contentType; + } + public void setContentType(Integer contentType) { + this.contentType = contentType; + } + public Integer getCharsetType() { + return charsetType; + } + public void setCharsetType(Integer charsetType) { + this.charsetType = charsetType; + } + public String getTestfilePath() { + return testfilePath; + } + public void setTestfilePath(String testfilePath) { + this.testfilePath = testfilePath; + } + public Long getCreateTime() { + return createTime; + } + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + public Long getModifyTime() { + return modifyTime; + } + public void setModifyTime(Long modifyTime) { + this.modifyTime = modifyTime; + } + @Override + public String toString() { + return "LinkBO [linkId=" + linkId + ", linkName=" + linkName + ", protocolType=" + protocolType + + ", stresstestUrl=" + stresstestUrl + ", requestType=" + requestType + ", contentType=" + contentType + + ", charsetType=" + charsetType + ", testfilePath=" + testfilePath + ", createTime=" + createTime + + ", modifyTime=" + modifyTime + "]"; + } + +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/LoginResultBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/LoginResultBO.java new file mode 100644 index 0000000..fc4335a --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/LoginResultBO.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +/** + * @desc 登录结果BO + * + * @author liuliang + * + */ +public class LoginResultBO { + + /** + * 登录ticket + */ + private String ticket; + + public LoginResultBO() {} + public LoginResultBO(String ticket) { + super(); + this.ticket = ticket; + } + + public String getTicket() { + return ticket; + } + + public void setTicket(String ticket) { + this.ticket = ticket; + } + + @Override + public String toString() { + return "LoginResultBO [ticket=" + ticket + "]"; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/MonitorSetBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/MonitorSetBO.java new file mode 100644 index 0000000..67eea77 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/MonitorSetBO.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.io.Serializable; + +import javax.validation.constraints.NotNull; + +import org.hibernate.validator.constraints.NotBlank; + +import com.yunji.titan.manager.common.Groups; + +/** + * @desc 监控集BO + * + * @author liuliang + * + */ +public class MonitorSetBO implements Serializable { + private static final long serialVersionUID = 2485288312877404356L; + /** + * 主键ID + */ + @NotNull(groups = {Groups.Update.class,Groups.Query.class},message = "监控集ID不能为空") + private Long monitorSetId; + /** + * 场景ID + */ + private Long sceneId; + /** + * 场景名称 + */ + @NotBlank(groups = {Groups.Add.class,Groups.Update.class},message = "场景名称不能为空") + private String sceneName; + /** + * 内网IP + */ + @NotBlank(groups = {Groups.Add.class,Groups.Update.class},message = "内网IP不能为空") + private String intranetIp; + /** + * 记录创建时间 + */ + private Long createTime; + + public Long getMonitorSetId() { + return monitorSetId; + } + + public void setMonitorSetId(Long monitorSetId) { + this.monitorSetId = monitorSetId; + } + + public Long getSceneId() { + return sceneId; + } + + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + + public String getSceneName() { + return sceneName; + } + + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + + public String getIntranetIp() { + return intranetIp; + } + + public void setIntranetIp(String intranetIp) { + this.intranetIp = intranetIp; + } + + public Long getCreateTime() { + return createTime; + } + + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + return "MonitorSetBO [monitorSetId=" + monitorSetId + ", sceneId=" + sceneId + ", sceneName=" + sceneName + + ", intranetIp=" + intranetIp + ", createTime=" + createTime + "]"; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/OperateBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/OperateBO.java new file mode 100644 index 0000000..4463e00 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/OperateBO.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import javax.validation.constraints.NotNull; + +import com.yunji.titan.manager.common.Groups; + +/** + * @desc 操作请求参数BO + * + * @author liuliang + * + */ +public class OperateBO { + + /** + * 场景ID + */ + @NotNull(groups = {Groups.Query.class},message = "场景ID不能为空") + private Long sceneId; + /** + * 操作类型 + */ + @NotNull(groups = {Groups.Update.class,Groups.Query.class},message = "操作类型不能为空") + private Integer operateType; + public Long getSceneId() { + return sceneId; + } + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + public Integer getOperateType() { + return operateType; + } + public void setOperateType(Integer operateType) { + this.operateType = operateType; + } + @Override + public String toString() { + return "OperateBO [sceneId=" + sceneId + ", operateType=" + operateType + "]"; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/OverviewResultBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/OverviewResultBO.java new file mode 100644 index 0000000..d85fe73 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/OverviewResultBO.java @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.util.List; + +/** + * @desc 概览页数据响应结果BO + * + * @author liuliang + * + */ +public class OverviewResultBO { + + /** + * 总节点数 + */ + private Integer totalNodesNum; + /** + * 可用节点数 + */ + private Integer availableNodesNum; + /** + * 总链路数 + */ + private Integer totalLinkNum; + /** + * 总场景数 + */ + private Integer totalSceneNum; + /** + * 总测试报告数 + */ + private Integer totalReportNum; + /** + * 可用节点IP集合 + */ + private List availableNodesIPList; + /** + * 已用节点IP集合 + */ + private List usedNodesIPList; + + public Integer getTotalNodesNum() { + return totalNodesNum; + } + + public void setTotalNodesNum(Integer totalNodesNum) { + this.totalNodesNum = totalNodesNum; + } + + public Integer getAvailableNodesNum() { + return availableNodesNum; + } + + public void setAvailableNodesNum(Integer availableNodesNum) { + this.availableNodesNum = availableNodesNum; + } + + public Integer getTotalLinkNum() { + return totalLinkNum; + } + + public void setTotalLinkNum(Integer totalLinkNum) { + this.totalLinkNum = totalLinkNum; + } + + public Integer getTotalSceneNum() { + return totalSceneNum; + } + + public void setTotalSceneNum(Integer totalSceneNum) { + this.totalSceneNum = totalSceneNum; + } + + public Integer getTotalReportNum() { + return totalReportNum; + } + + public void setTotalReportNum(Integer totalReportNum) { + this.totalReportNum = totalReportNum; + } + + public List getAvailableNodesIPList() { + return availableNodesIPList; + } + + public void setAvailableNodesIPList(List availableNodesIPList) { + this.availableNodesIPList = availableNodesIPList; + } + + public List getUsedNodesIPList() { + return usedNodesIPList; + } + + public void setUsedNodesIPList(List usedNodesIPList) { + this.usedNodesIPList = usedNodesIPList; + } + + @Override + public String toString() { + return "OverviewResultBO [totalNodesNum=" + totalNodesNum + ", availableNodesNum=" + availableNodesNum + + ", totalLinkNum=" + totalLinkNum + ", totalSceneNum=" + totalSceneNum + ", totalReportNum=" + + totalReportNum + ", availableNodesIPList=" + availableNodesIPList + ", usedNodesIPList=" + + usedNodesIPList + "]"; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/PageRequestBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/PageRequestBO.java new file mode 100644 index 0000000..3a639f8 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/PageRequestBO.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.io.Serializable; + +import javax.validation.constraints.NotNull; + +/** + * @desc 分页查询请求参数BO + * + * @author liuliang + * + */ +public class PageRequestBO implements Serializable{ + + private static final long serialVersionUID = -6419653684529269165L; + + /** + * 当前页数 + */ + @NotNull(message = "当前页数不能为空") + private Integer pageIndex; + /** + * 每页记录数 + */ + @NotNull(message = "每页记录数不能为空") + private Integer pageSize; + /** + * 过滤条件(链路名称、场景名称、报告名称) + */ + private String filterCondition; + + public Integer getPageIndex() { + return pageIndex; + } + public void setPageIndex(Integer pageIndex) { + this.pageIndex = pageIndex; + } + public Integer getPageSize() { + return pageSize; + } + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + public String getFilterCondition() { + return filterCondition; + } + public void setFilterCondition(String filterCondition) { + this.filterCondition = filterCondition; + } + + @Override + public String toString() { + return "PageRequestBO [pageIndex=" + pageIndex + ", pageSize=" + pageSize + ", filterCondition=" + + filterCondition + "]"; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/Pager.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/Pager.java new file mode 100644 index 0000000..6c61539 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/Pager.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.util.List; + +/** + * @desc 分页查询基础响应参数BO + * + * @author liuliang + * + */ +public class Pager { + + /** + * 符合条件的总记录数 + */ + private int totalCount; + + /** + * 记录 + */ + private List records; + + public int getTotalCount() { + return totalCount; + } + public void setTotalCount(int totalCount) { + this.totalCount = totalCount; + } + public List getRecords() { + return records; + } + public void setRecords(List records) { + this.records = records; + } + + public Pager() {} + public Pager(int totalCount, List records) { + super(); + this.totalCount = totalCount; + this.records = records; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/ReportBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/ReportBO.java new file mode 100644 index 0000000..74a2fea --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/ReportBO.java @@ -0,0 +1,253 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import javax.validation.constraints.NotNull; + +import com.yunji.titan.manager.common.Groups; + +/** + * @desc 测试报告数据BO + * + * @author liuliang + * + */ +public class ReportBO { + /** + * 主键自增ID + */ + @NotNull(groups = {Groups.Query.class},message = "测试报告ID不能为空") + private Long reportId; + /** + * 报告名称 + */ + private String reportName; + /** + * 场景ID + */ + private Long sceneId; + /** + * 场景名称 + */ + private String sceneName; + /** + * 测试起始时间 + */ + private Long startTime; + /** + * 测试结束时间 + */ + private Long endTime; + /** + * 期待吞吐量 + */ + private Integer expectTps; + /** + * 实际吞吐量 + */ + private Integer actualTps; + /** + * 总并发请求数 + */ + private Long totalRequest; + /** + * HTTP200成功请求数 + */ + private Long successRequest; + /** + * 业务成功请求数 + */ + private Long businessSuccessRequest; + /** + * 并发用户数 + */ + private Long concurrentUser; + /** + * 用户平均请求等待时间(单位:毫秒) + */ + private Long userWaittime; + /** + * 服务器平均请求等待时间(单位:毫秒) + */ + private Long serverWaittime; + /** + * 测试报告结论(0:合格 1:不合格) + */ + private Integer conclusion; + /** + * 记录创建时间 + */ + private Long createTime; + /** + * 持续时间 (格式:XX小时 XX分钟 XX秒) + */ + private String durationTime; + /** + * 业务成功率(eg:85%,则返回85.00) + */ + private Double businessSuccessRate; + /** + * HTTP200成功率(eg:85%,则返回85.00) + */ + private Double httpSuccessRate; + /** + * 峰值持续时间(格式:XX小时 XX分钟 XX秒) + */ + private String peakDurationTime; + /** + * 峰值吞吐量/s + */ + private Long peakThroughput; + public Long getReportId() { + return reportId; + } + public void setReportId(Long reportId) { + this.reportId = reportId; + } + public String getReportName() { + return reportName; + } + public void setReportName(String reportName) { + this.reportName = reportName; + } + public Long getSceneId() { + return sceneId; + } + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + public String getSceneName() { + return sceneName; + } + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + public Long getStartTime() { + return startTime; + } + public void setStartTime(Long startTime) { + this.startTime = startTime; + } + public Long getEndTime() { + return endTime; + } + public void setEndTime(Long endTime) { + this.endTime = endTime; + } + public Integer getExpectTps() { + return expectTps; + } + public void setExpectTps(Integer expectTps) { + this.expectTps = expectTps; + } + public Integer getActualTps() { + return actualTps; + } + public void setActualTps(Integer actualTps) { + this.actualTps = actualTps; + } + public Long getTotalRequest() { + return totalRequest; + } + public void setTotalRequest(Long totalRequest) { + this.totalRequest = totalRequest; + } + public Long getSuccessRequest() { + return successRequest; + } + public void setSuccessRequest(Long successRequest) { + this.successRequest = successRequest; + } + public Long getBusinessSuccessRequest() { + return businessSuccessRequest; + } + public void setBusinessSuccessRequest(Long businessSuccessRequest) { + this.businessSuccessRequest = businessSuccessRequest; + } + public Long getConcurrentUser() { + return concurrentUser; + } + public void setConcurrentUser(Long concurrentUser) { + this.concurrentUser = concurrentUser; + } + public Long getUserWaittime() { + return userWaittime; + } + public void setUserWaittime(Long userWaittime) { + this.userWaittime = userWaittime; + } + public Long getServerWaittime() { + return serverWaittime; + } + public void setServerWaittime(Long serverWaittime) { + this.serverWaittime = serverWaittime; + } + public Integer getConclusion() { + return conclusion; + } + public void setConclusion(Integer conclusion) { + this.conclusion = conclusion; + } + public Long getCreateTime() { + return createTime; + } + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + public String getDurationTime() { + return durationTime; + } + public void setDurationTime(String durationTime) { + this.durationTime = durationTime; + } + public Double getBusinessSuccessRate() { + return businessSuccessRate; + } + public void setBusinessSuccessRate(Double businessSuccessRate) { + this.businessSuccessRate = businessSuccessRate; + } + public Double getHttpSuccessRate() { + return httpSuccessRate; + } + public void setHttpSuccessRate(Double httpSuccessRate) { + this.httpSuccessRate = httpSuccessRate; + } + public String getPeakDurationTime() { + return peakDurationTime; + } + public void setPeakDurationTime(String peakDurationTime) { + this.peakDurationTime = peakDurationTime; + } + public Long getPeakThroughput() { + return peakThroughput; + } + public void setPeakThroughput(Long peakThroughput) { + this.peakThroughput = peakThroughput; + } + @Override + public String toString() { + return "ReportBO [reportId=" + reportId + ", reportName=" + reportName + ", sceneId=" + sceneId + ", sceneName=" + + sceneName + ", startTime=" + startTime + ", endTime=" + endTime + ", expectTps=" + expectTps + + ", actualTps=" + actualTps + ", totalRequest=" + totalRequest + ", successRequest=" + successRequest + + ", businessSuccessRequest=" + businessSuccessRequest + ", concurrentUser=" + concurrentUser + + ", userWaittime=" + userWaittime + ", serverWaittime=" + serverWaittime + ", conclusion=" + conclusion + + ", createTime=" + createTime + ", durationTime=" + durationTime + ", businessSuccessRate=" + + businessSuccessRate + ", httpSuccessRate=" + httpSuccessRate + ", peakDurationTime=" + + peakDurationTime + ", peakThroughput=" + peakThroughput + "]"; + } + +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/SceneBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/SceneBO.java new file mode 100644 index 0000000..071562e --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/SceneBO.java @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.io.Serializable; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +import org.hibernate.validator.constraints.NotBlank; + +import com.yunji.titan.manager.common.Groups; + +/** + * @desc 场景数据BO + * + * @author liuliang + * + */ +public class SceneBO implements Serializable{ + + private static final long serialVersionUID = 9001068486883624735L; + /** + * 主键自增ID + */ + @NotNull(groups = {Groups.Update.class,Groups.Query.class},message = "场景ID不能为空") + private Long sceneId; + /** + * 场景名称 + */ + @NotBlank(groups = {Groups.Add.class,Groups.Update.class},message = "场景名称不能为空") + private String sceneName; + /** + * 持续时间-时 + */ + private Integer durationHour; + /** + * 持续时间-分 + */ + private Integer durationMin; + /** + * 持续时间-秒 + */ + private Integer durationSec; + /** + * 并发用户数 + */ + @Min(1) + private Integer concurrentUser; + /** + * 起步并发用户数 + */ + private Integer concurrentStart; + /** + * 总并发请求数 + */ + private Long totalRequest; + /** + * 期待吞吐量 + */ + private Integer expectTps; + /** + * 包含的链路ID,多个链路ID以英文","隔开 + */ + @NotBlank(groups = {Groups.Add.class,Groups.Update.class},message = "包含的链路ID不能为空") + private String containLinkid; + /** + * 串行链路关系,按链路顺序,链路ID以英文","隔开 + */ + @NotBlank(groups = {Groups.Add.class,Groups.Update.class},message = "链路关系不能为空") + private String linkRelation; + /** + * 使用的agent数 + */ + private Integer useAgent; + /** + * 状态(0:未开始 ,1:进行中) + */ + private Integer sceneStatus; + /** + * 记录创建时间 + */ + private Long createTime; + /** + * 记录最后修改时间 + */ + private Long modifyTime; + /** + * 是否有自动测试任务(0:没有 1:有) + */ + private Integer isAutomatic; + public Long getSceneId() { + return sceneId; + } + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + public String getSceneName() { + return sceneName; + } + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + public Integer getDurationHour() { + return durationHour; + } + public void setDurationHour(Integer durationHour) { + this.durationHour = durationHour; + } + public Integer getDurationMin() { + return durationMin; + } + public void setDurationMin(Integer durationMin) { + this.durationMin = durationMin; + } + public Integer getDurationSec() { + return durationSec; + } + public void setDurationSec(Integer durationSec) { + this.durationSec = durationSec; + } + public Integer getConcurrentUser() { + return concurrentUser; + } + public void setConcurrentUser(Integer concurrentUser) { + this.concurrentUser = concurrentUser; + } + public Integer getConcurrentStart() { + return concurrentStart; + } + public void setConcurrentStart(Integer concurrentStart) { + this.concurrentStart = concurrentStart; + } + public Long getTotalRequest() { + return totalRequest; + } + public void setTotalRequest(Long totalRequest) { + this.totalRequest = totalRequest; + } + public Integer getExpectTps() { + return expectTps; + } + public void setExpectTps(Integer expectTps) { + this.expectTps = expectTps; + } + public String getContainLinkid() { + return containLinkid; + } + public void setContainLinkid(String containLinkid) { + this.containLinkid = containLinkid; + } + public String getLinkRelation() { + return linkRelation; + } + public void setLinkRelation(String linkRelation) { + this.linkRelation = linkRelation; + } + public Integer getUseAgent() { + return useAgent; + } + public void setUseAgent(Integer useAgent) { + this.useAgent = useAgent; + } + public Integer getSceneStatus() { + return sceneStatus; + } + public void setSceneStatus(Integer sceneStatus) { + this.sceneStatus = sceneStatus; + } + public Long getCreateTime() { + return createTime; + } + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + public Long getModifyTime() { + return modifyTime; + } + public void setModifyTime(Long modifyTime) { + this.modifyTime = modifyTime; + } + public Integer getIsAutomatic() { + return isAutomatic; + } + public void setIsAutomatic(Integer isAutomatic) { + this.isAutomatic = isAutomatic; + } + @Override + public String toString() { + return "SceneBO [sceneId=" + sceneId + ", sceneName=" + sceneName + ", durationHour=" + durationHour + + ", durationMin=" + durationMin + ", durationSec=" + durationSec + ", concurrentUser=" + concurrentUser + + ", concurrentStart=" + concurrentStart + ", totalRequest=" + totalRequest + ", expectTps=" + expectTps + + ", containLinkid=" + containLinkid + ", linkRelation=" + linkRelation + ", useAgent=" + useAgent + + ", sceneStatus=" + sceneStatus + ", createTime=" + createTime + ", modifyTime=" + modifyTime + + ", isAutomatic=" + isAutomatic + "]"; + } +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/SceneDetailBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/SceneDetailBO.java new file mode 100644 index 0000000..cc2f704 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/SceneDetailBO.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.io.Serializable; +import java.util.List; + +import com.yunji.titan.manager.entity.Link; +import com.yunji.titan.manager.entity.Scene; + +/** + * @desc 查询场景详情响应参数BO + * + * @author liuliang + * + */ +public class SceneDetailBO implements Serializable { + + private static final long serialVersionUID = -7727253914369267173L; + + /** + * 场景基本信息 + */ + private Scene scene; + /** + * 场景包含的链路实体集合 + */ + private List linkList; + + public Scene getScene() { + return scene; + } + + public void setScene(Scene scene) { + this.scene = scene; + } + + public List getLinkList() { + return linkList; + } + + public void setLinkList(List linkList) { + this.linkList = linkList; + } + + public SceneDetailBO() { + } + + public SceneDetailBO(Scene scene, List linkList) { + super(); + this.scene = scene; + this.linkList = linkList; + } + + @Override + public String toString() { + return "SceneDetailBO [scene=" + scene + ", linkList=" + linkList + "]"; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/bo/UserInfoBO.java b/titan-manager/src/main/java/com/yunji/titan/manager/bo/UserInfoBO.java new file mode 100644 index 0000000..3204c8b --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/bo/UserInfoBO.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.bo; + +import java.io.Serializable; + +import org.hibernate.validator.constraints.NotBlank; +import org.springframework.stereotype.Component; + +/** + * 用户登录参数BO + * + * @author liuliang + * + */ +@Component +public class UserInfoBO implements Serializable { + + private static final long serialVersionUID = 8034878444962808442L; + + /** + * 用户名 + */ + @NotBlank(message = "用户名不能为空") + private String username; + /** + * 密码 + */ + @NotBlank(message = "密码不能为空") + private String password; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public String toString() { + return "UserInfoBO [username=" + username + ", password=" + password + "]"; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/common/CharsetTypeEnum.java b/titan-manager/src/main/java/com/yunji/titan/manager/common/CharsetTypeEnum.java new file mode 100644 index 0000000..32fad59 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/common/CharsetTypeEnum.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.common; + +/** + * @desc 压测请求 字符编码 枚举类 + * + * @author liuliang + * + */ +public enum CharsetTypeEnum { + /** + * UTF-8编码 + */ + UTF_8(0,"UTF-8"), + /** + * ISO-8859-1编码 + */ + ISO_8859_1(1,"ISO-8859-1"), + /** + * US-ASCII编码 + */ + US_ASCII(2,"US-ASCII"), + /** + * UTF-16编码 + */ + UTF_16(3,"UTF-16"), + /** + * UTF-16LE编码 + */ + UTF_16LE(4,"UTF-16LE"), + /** + * UTF-16BE编码 + */ + UTF_16BE(5,"UTF-16BE"); + + /** + * @desc 根据编码获取值 + * + * @author liuliang + * + * @param code DB中的编码 + * @return 字符编码 值 + */ + public static String getValue(int code){ + for(CharsetTypeEnum c:CharsetTypeEnum.values()){ + if(code == c.getCode()){ + return c.getValue(); + } + } + return null; + } + + private CharsetTypeEnum(int code, String value) { + this.code = code; + this.value = value; + } + public void setCode(int code) { + this.code = code; + } + public void setValue(String value) { + this.value = value; + } + /** + * DB存的编码 + */ + public int code; + /** + * 值 + */ + public String value; + public int getCode() { + return code; + } + public String getValue() { + return value; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/common/ContentTypeEnum.java b/titan-manager/src/main/java/com/yunji/titan/manager/common/ContentTypeEnum.java new file mode 100644 index 0000000..18db5e9 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/common/ContentTypeEnum.java @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.common; + +import com.yunji.titan.utils.ContentType; + +/** + * @desc 压测请求 内容类型枚举类 + * + * @author liuliang + * + */ +public enum ContentTypeEnum { + + /** + * application/json + */ + APP_JSON(0,"application/json"), + /** + * application/xml + */ + APP_XML(1,"application/xml"), + /** + * text/xml + */ + TEXT_XML(2,"text/xml"), + /** + * text/html + */ + TEXT_HTML(3,"text/html"), + /** + * application/x-www-form-urlencoded + */ + APP_FORM(4,"application/x-www-form-urlencoded"); + + + /** + * @desc 根据编码获取值 + * + * @author liuliang + * + * @param code DB中的编码 + * @return ContentType 内容枚举类型 + */ + public static ContentType getContentType(int code){ + switch (code) { + case 0: + return ContentType.APPLICATION_JSON; + case 1: + return ContentType.APPLICATION_XML; + case 2: + return ContentType.TEXT_XML; + case 3: + return ContentType.TEXT_HTML; + case 4: + return ContentType.APPLICATION_X_WWW_FORM_URLENCODED; + default: + break; + } + return null; + } + + private ContentTypeEnum(int code, String value) { + this.code = code; + this.value = value; + } + /** + * DB存的值 + */ + public int code; + /** + * 字符编码 + */ + public String value; + public int getCode() { + return code; + } + public String getValue() { + return value; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/common/Groups.java b/titan-manager/src/main/java/com/yunji/titan/manager/common/Groups.java new file mode 100644 index 0000000..ea7fcf4 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/common/Groups.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.common; + +/** + * @desc 参数校验 + * + * @author liuliang + * + */ +public interface Groups { + + interface Add{} + + interface Update{} + + interface Query{} +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/common/OperateTypeConstant.java b/titan-manager/src/main/java/com/yunji/titan/manager/common/OperateTypeConstant.java new file mode 100644 index 0000000..ba0961a --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/common/OperateTypeConstant.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.common; + +/** + * @desc 操作类型枚举 + * + * @author liuliang + * + */ +public class OperateTypeConstant { + /** + * 启动 + */ + public static final int START = 1; + /** + * 停止 + */ + public static final int STOP = 2; + /** + * 重启 + */ + public static final int RESTART = 3; + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/common/RedisHelper.java b/titan-manager/src/main/java/com/yunji/titan/manager/common/RedisHelper.java new file mode 100644 index 0000000..a28b80d --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/common/RedisHelper.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.common; + +import org.springframework.stereotype.Component; + +/** + * @desc redis操作辅助工具类 + * + * @author liuliang + * + */ +@Component +public class RedisHelper { +// @Resource +// private RedisTemplate redisTemplate; +// +// private static RedisHelper redisHelper; +// private static ValueOperations valueOperations; +// +// @PostConstruct +// public void init() { +// redisHelper = this; +// redisHelper.redisTemplate = this.redisTemplate; +// valueOperations = redisHelper.redisTemplate.opsForValue(); +// } +// +// /** +// * @desc 取key值 +// * +// * @author liuliang +// * +// * @param key +// * @return +// */ +// public static Object get(String key){ +// if(StringUtils.isNotBlank(key)){ +// return valueOperations.get(key); +// }else{ +// return null; +// } +// } +// +// /** +// * @desc 设key值 +// * +// * @author liuliang +// * +// * @param key +// * @param value +// */ +// public static void set(String key,Object value){ +// if(StringUtils.isNotBlank(key)){ +// valueOperations.set(key,value); +// } +// } +// +// /** +// * @desc 设值,带过期时间 +// * +// * @author liuliang +// * +// * @param key +// * @param value +// * @param ttl 过期时间(单位:秒) +// */ +// public static void set(String key,Object value,int ttl){ +// if(StringUtils.isNotBlank(key)){ +// valueOperations.set(key,value); +// redisHelper.redisTemplate.expire(key, ttl, TimeUnit.SECONDS); +// } +// } +// +// /** +// * @desc 删值 +// * +// * @author liuliang +// * +// * @param key +// */ +// public static void del(String key){ +// if(StringUtils.isNotBlank(key)){ +// redisHelper.redisTemplate.delete(key); +// } +// } +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/common/SceneStatusEnum.java b/titan-manager/src/main/java/com/yunji/titan/manager/common/SceneStatusEnum.java new file mode 100644 index 0000000..e43f09d --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/common/SceneStatusEnum.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.common; + +/** + * @desc 场景状态枚举 + * + * @author liuliang + * + */ +public enum SceneStatusEnum { + /** + * 未开始 + */ + NOT_START(0,"未开始"), + /** + * 压测进行中 + */ + STARTING(1,"压测进行中"), + /** + * 停止压测中 + */ + STOPPING(2,"停止压测中"); + /** + * 值 + */ + public int value; + /** + * 描述 + */ + public String desc; + + /** + * @desc 根据值获取描述 + * + * @author liuliang + * + * @param value 值 + * @return String 值描述 + */ + public static String getDesc(int value){ + for(SceneStatusEnum s:SceneStatusEnum.values()){ + if(value == s.getValue()){ + return s.getDesc(); + } + } + return null; + } + + private SceneStatusEnum(int value, String desc) { + this.value = value; + this.desc = desc; + } + public int getValue() { + return value; + } + public String getDesc() { + return desc; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/common/TaskSyncTypeEnum.java b/titan-manager/src/main/java/com/yunji/titan/manager/common/TaskSyncTypeEnum.java new file mode 100644 index 0000000..b60af29 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/common/TaskSyncTypeEnum.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.common; + +/** + * @desc 自动压测任务枚举 + * + * @author liuliang + * + */ +public enum TaskSyncTypeEnum { + + /** + * 更新 + */ + UPDATE(1,"更新"), + /** + * 删除 + */ + DELETE(2,"删除"); + + /** + * 值 + */ + public int value; + /** + * 描述 + */ + public String desc; + + private TaskSyncTypeEnum(int value, String desc) { + this.value = value; + this.desc = desc; + } + public int getValue() { + return value; + } + public String getDesc() { + return desc; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/common/TitanConstant.java b/titan-manager/src/main/java/com/yunji/titan/manager/common/TitanConstant.java new file mode 100644 index 0000000..2010d1c --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/common/TitanConstant.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.common; + +/** + * @desc 常量类 + * + * @author liuliang + * + */ +public class TitanConstant { + /** + * 缓存中的登录ticket前缀 + */ + public static final String TICKET_PREFIX = "ticket_"; +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/controller/AutomaticTaskController.java b/titan-manager/src/main/java/com/yunji/titan/manager/controller/AutomaticTaskController.java new file mode 100644 index 0000000..5a073ac --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/controller/AutomaticTaskController.java @@ -0,0 +1,284 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.controller; + +import java.util.List; + +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.yunji.titan.manager.bo.AutomaticTaskBO; +import com.yunji.titan.manager.bo.PageRequestBO; +import com.yunji.titan.manager.bo.Pager; +import com.yunji.titan.manager.common.Groups; +import com.yunji.titan.manager.common.TaskSyncTypeEnum; +import com.yunji.titan.manager.entity.AutomaticTask; +import com.yunji.titan.manager.result.ComponentResult; +import com.yunji.titan.manager.result.Result; +import com.yunji.titan.manager.service.AutomaticTaskService; +import com.yunji.titan.manager.utils.ResultUtil; +import com.yunji.titan.manager.utils.ValidatorUtil; +import com.yunji.titan.manager.utils.timertask.DistributedTimerTask; +import com.yunji.titan.utils.ErrorCode; + +/** + * @desc 自动压测任务管理Controller + * + * @author liuliang + * + */ +@Controller +@RequestMapping(value = "/task") +public class AutomaticTaskController implements ApplicationListener{ + private Logger logger = LoggerFactory.getLogger(AutomaticTaskController.class); + + /** + * 自动压测任务服务 + */ + @Resource + private AutomaticTaskService automaticTaskService; + /** + * 定时任务服务 + */ + @Resource + private DistributedTimerTask distributedTimerTask; + + /** + * @desc 分页列表 + * + * @author liuliang + * + * @param pr + * @param br + * @return + */ + @RequestMapping(value = "/list") + @ResponseBody + public ComponentResult> list(@Validated PageRequestBO pr,BindingResult br) { + ComponentResult> componentResult = new ComponentResult>(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, componentResult); + } + //查询 + try { + int totalCount = automaticTaskService.getCount(); + List records = automaticTaskService.getDataList(pr.getPageIndex(),pr.getPageSize()); + + componentResult.setData(new Pager(totalCount, records)); + return ResultUtil.success(componentResult); + } catch (Exception e) { + logger.error("分页获取数据异常,params:{}",pr.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,componentResult); + } + + /** + * @desc 新增 + * + * @author liuliang + * + * @param automaticTaskBO + * @param br + * @return + */ + @RequestMapping(value = "/add") + @ResponseBody + public Result add(@Validated(Groups.Add.class) AutomaticTaskBO automaticTaskBO,BindingResult br) { + Result result = new Result(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, result); + } + //新增 + try { + int addResult = automaticTaskService.add(automaticTaskBO); + if(0 < addResult) { + // 同步定时任务 + this.syncAutomaticTask(automaticTaskBO, TaskSyncTypeEnum.UPDATE.value); + return ResultUtil.success(result); + } + } catch(DuplicateKeyException de){ + logger.error("新增数据异常,主键重复,params:{}",automaticTaskBO.toString(),de); + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,"主键重复",result); + } catch (Exception e) { + logger.error("新增数据异常,params:{}",automaticTaskBO.toString(),e); + } + //返回失败结果 + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } + + /** + * @desc 删除 + * + * @author liuliang + * + * @param automaticTaskBO + * @param br + * @return + */ + @RequestMapping(value = "/del") + @ResponseBody + public Result del(@Validated(Groups.Query.class) AutomaticTaskBO automaticTaskBO,BindingResult br) { + Result result = new Result(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, result); + } + //删除 + try { + AutomaticTask automaticTask = automaticTaskService.getDataDetail(automaticTaskBO.getAutomaticTaskId()); + int delResult = automaticTaskService.del(automaticTaskBO.getAutomaticTaskId()); + if(0 < delResult) { + // 同步定时任务 + AutomaticTaskBO obj = new AutomaticTaskBO(); + BeanUtils.copyProperties(automaticTask, obj); + this.syncAutomaticTask(obj, TaskSyncTypeEnum.DELETE.value); + + return ResultUtil.success(result); + } + } catch (Exception e) { + logger.error("删除数据异常,params:{}",automaticTaskBO.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } + + /** + * @desc 更新 + * + * @author liuliang + * + * @param automaticTaskBO + * @param br + * @return + */ + @RequestMapping(value = "/update") + @ResponseBody + public Result update(@Validated(Groups.Update.class) AutomaticTaskBO automaticTaskBO,BindingResult br) { + Result result = new Result(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, result); + } + //更新 + try { + int updateResult = automaticTaskService.update(automaticTaskBO); + if (0 < updateResult) { + // 同步定时任务 + this.syncAutomaticTask(automaticTaskBO, TaskSyncTypeEnum.UPDATE.value); + return ResultUtil.success(result); + } + } catch (Exception e) { + logger.error("更新数据异常,params:{}",automaticTaskBO.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } + + /** + * @desc 查 + * + * @author liuliang + * + * @param automaticTaskBO + * @param br + * @return + */ + @RequestMapping(value = "/get") + @ResponseBody + public ComponentResult get(@Validated(Groups.Query.class) AutomaticTaskBO automaticTaskBO,BindingResult br) { + ComponentResult componentResult = new ComponentResult(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, componentResult); + } + //查询 + try { + AutomaticTask automaticTask = automaticTaskService.getDataDetail(automaticTaskBO.getAutomaticTaskId()); + if(null != automaticTask) { + componentResult.setData(automaticTask); + return ResultUtil.success(componentResult); + } + } catch (Exception e) { + logger.error("查询数据详情异常,params:{}",automaticTaskBO.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,componentResult); + } + + /** + * @desc 同步定时任务 + * + * @author liuliang + * + * @param automaticTask + * 任务内容 + * @param syncType + * 同步类型 1:更新 2、删除 + * @return + */ + private boolean syncAutomaticTask(AutomaticTaskBO automaticTaskBO, int syncType) { + logger.info("更新自动压测任务,syncType:" + syncType + "," + automaticTaskBO.toString()); + long sceneId = automaticTaskBO.getSceneId(); + if (TaskSyncTypeEnum.UPDATE.value == syncType) { + return distributedTimerTask.addTask(String.valueOf(sceneId)); + } else if (TaskSyncTypeEnum.DELETE.value == syncType) { + return distributedTimerTask.deleteTask(String.valueOf(sceneId)); + } + return false; + } + + /** + * @desc 启动时初始化定时压测任务 + * + * @author liuliang + * + */ + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + logger.info("---初始化自动化压测任务----"); + try { + List dataList = automaticTaskService.getDataList(0,automaticTaskService.getCount()); + if((null != dataList) && (0 < dataList.size())){ + for(AutomaticTaskBO automaticTaskBO:dataList){ + this.syncAutomaticTask(automaticTaskBO,TaskSyncTypeEnum.UPDATE.value); + } + } + } catch (Exception e) { + logger.error("初始化所有自动压测任务异常",e); + } + } + +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/controller/FileController.java b/titan-manager/src/main/java/com/yunji/titan/manager/controller/FileController.java new file mode 100644 index 0000000..d11388a --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/controller/FileController.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.controller; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Iterator; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; + +import com.yunji.titan.manager.bo.FileUploadBO; +import com.yunji.titan.manager.result.ComponentResult; +import com.yunji.titan.manager.utils.ResultUtil; +import com.yunji.titan.utils.ErrorCode; +import com.yunji.titan.utils.ftp.FtpUtils; + +/** + * @desc 文件操作Controller + * + * @author liuliang + * + */ +@Controller +@RequestMapping(value = "/file") +public class FileController { + + private Logger logger = LoggerFactory.getLogger(FileController.class); + + @Value("${pressure.data.filepath}") + private String pressureDataFilepath; + + /** + * ftp工具类 + */ + @Resource + private FtpUtils ftpUtils; + + /** + * 压测文件上传 + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/fileUpload") + @ResponseBody + public ComponentResult fileUpload(HttpServletRequest request,HttpServletResponse response) { + ComponentResult componentResult = new ComponentResult(); + //1、获取上传参数 + CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); + if (multipartResolver.isMultipart(request)) { + MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; + Iterator iterator = multiRequest.getFileNames(); + while (iterator.hasNext()) { + MultipartFile file = multiRequest.getFile(iterator.next().toString()); + if (null != file) { + //2、上传 + String filename = new SimpleDateFormat("yyyyMMddhhmmssSSS").format(new Date()) + ".xls"; + try { + File targetFile = new File(pressureDataFilepath + filename); + file.transferTo(targetFile); + //3、将本地文件上传到FTP + boolean uploadResult = ftpUtils.uploadFile(targetFile); + if(uploadResult){ + componentResult.setData(new FileUploadBO(filename)); + return ResultUtil.success(componentResult); + }else{ + logger.error("文件上传FTP失败,filename:{}",filename); + return ResultUtil.fail(ErrorCode.FAIL,"文件上传FTP失败",componentResult); + } + } catch (IllegalStateException | IOException e) { + logger.error("上传文件异常,filename->" + filename,e); + } + }else{ + logger.error("压测文件上传,file为NULL"); + } + } + }else{ + logger.error("压测文件上传,request校验失败"); + } + //3、返回 + return ResultUtil.fail(componentResult); + } + + /** + * @desc 下载压测数据文件 + * + * @author liuliang + * + * @param filename 文件名 + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/fileDownload") + public ResponseEntity fileDownload(@RequestParam("filename") String filename,HttpServletRequest request,HttpServletResponse response) { + //1、从ftp下载 + byte[] fileContent = ftpUtils.downloadFile(filename); + HttpHeaders headers = new HttpHeaders(); + if(null != fileContent){ + //2、成功返回 + try { + headers.setContentDispositionFormData("attachment", new String(filename.getBytes("UTF-8"),"iso-8859-1")); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + return new ResponseEntity(fileContent,headers, HttpStatus.CREATED); + } catch (Exception e) { + logger.error("下载压测数据文件异常,filename:{}",filename,e); + } + } + //下载失败返回 + logger.warn("从ftp下载压测文件失败,filename:{}",filename); + headers.add("Content-Disposition","attachment;filename=error.log"); + return new ResponseEntity(("从FTP服务器下载压测参数文件失败,filename:"+ filename).getBytes(),headers,HttpStatus.OK); + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/controller/LinkController.java b/titan-manager/src/main/java/com/yunji/titan/manager/controller/LinkController.java new file mode 100644 index 0000000..5fc0e0d --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/controller/LinkController.java @@ -0,0 +1,266 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.controller; + +import java.io.File; +import java.util.List; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.yunji.titan.manager.bo.LinkBO; +import com.yunji.titan.manager.bo.PageRequestBO; +import com.yunji.titan.manager.bo.Pager; +import com.yunji.titan.manager.common.Groups; +import com.yunji.titan.manager.entity.Link; +import com.yunji.titan.manager.result.ComponentResult; +import com.yunji.titan.manager.result.Result; +import com.yunji.titan.manager.service.LinkService; +import com.yunji.titan.manager.service.SceneService; +import com.yunji.titan.manager.utils.ResultUtil; +import com.yunji.titan.manager.utils.ValidatorUtil; +import com.yunji.titan.utils.ErrorCode; +import com.yunji.titan.utils.ftp.FtpUtils; + +/** + * @desc 链路管理Controller + * + * @author liuliang + * + */ +@Controller +@RequestMapping(value = "/link") +public class LinkController { + + private Logger logger = LoggerFactory.getLogger(LinkController.class); + /** + * 链路服务 + */ + @Resource + private LinkService linkService; + /** + * 场景服务 + */ + @Resource + private SceneService sceneService; + /** + * ftp工具类 + */ + @Resource + private FtpUtils ftpUtils; + + /** + * @desc 分页获取链路数据 + * + * @author liuliang + * + * @param request + * @param response + * @return ComponentResult> + */ + @RequestMapping(value = "/list") + @ResponseBody + public ComponentResult> list(@Validated PageRequestBO pr,BindingResult br) { + ComponentResult> componentResult = new ComponentResult>(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, componentResult); + } + //查询 + try { + int totalCount = linkService.getLinkCount(pr.getFilterCondition()); + List records = linkService.getLinkList(pr.getFilterCondition(),pr.getPageIndex(),pr.getPageSize()); + + componentResult.setData(new Pager(totalCount, records)); + return ResultUtil.success(componentResult); + } catch (Exception e) { + logger.error("分页获取数据异常,params:{}",pr.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,componentResult); + } + + /** + * @desc 新增链路 + * + * @author liuliang + * + * @param linkBO 链路BO + * @return Result + */ + @RequestMapping(value = "/add") + @ResponseBody + public Result add(@Validated(Groups.Add.class) LinkBO linkBO,BindingResult br){ + Result result = new Result(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, result); + } + //新增 + try { + int addResult = linkService.addLink(linkBO); + if(0 < addResult) { + return ResultUtil.success(result); + } + } catch(DuplicateKeyException de){ + logger.error("新增数据异常,链路名重复,params:{}",linkBO.toString(),de); + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,"链路名已存在",result); + } catch (Exception e) { + logger.error("新增数据异常,params:{}",linkBO.toString(),e); + } + //返回失败结果 + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } + + /** + * @desc 删除链路 + * + * @author liuliang + * + * @param ids 链路ID + * @return Result + */ + @RequestMapping(value = "/del") + @ResponseBody + public Result del(@RequestParam("ids") String ids){ + Result result = new Result(); + //参数校验 + if(StringUtils.isBlank(ids)){ + logger.warn("删除数据,参数错误,ids:{}",ids); + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,result); + } + //删除 + String[] idsArray = ids.split("\\,"); + int idsLength = idsArray.length; + int failNum = 0; + //逐个链路ID处理 + for(int i=0; i + */ + @RequestMapping(value = "/get") + @ResponseBody + public ComponentResult get(@Validated(Groups.Query.class) LinkBO linkBO,BindingResult br) { + ComponentResult componentResult = new ComponentResult(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, componentResult); + } + //查询 + try { + Link link = linkService.getLink(linkBO.getLinkId()); + if(null != link) { + componentResult.setData(link); + return ResultUtil.success(componentResult); + } + } catch (Exception e) { + logger.error("查询数据详情异常,params:{}",linkBO.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,componentResult); + } + +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/controller/LoginController.java b/titan-manager/src/main/java/com/yunji/titan/manager/controller/LoginController.java new file mode 100644 index 0000000..6a5b2fe --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/controller/LoginController.java @@ -0,0 +1,138 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.controller; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.yunji.titan.manager.bo.LoginResultBO; +import com.yunji.titan.manager.bo.UserInfoBO; +import com.yunji.titan.manager.common.TitanConstant; +import com.yunji.titan.manager.result.ComponentResult; +import com.yunji.titan.manager.result.Result; +import com.yunji.titan.manager.utils.CookieUtil; +import com.yunji.titan.manager.utils.ResultUtil; +import com.yunji.titan.manager.utils.TicketBuilderUtil; +import com.yunji.titan.manager.utils.ValidatorUtil; +import com.yunji.titan.utils.ErrorCode; + +import redis.clients.jedis.JedisCluster; + +/** + * @desc 登录controller + * + * @author liuliang + * + */ +@Controller +@RequestMapping(value = "/user") +public class LoginController { + + private Logger logger = LoggerFactory.getLogger(LoginController.class); + + /** + * 用户账号、密码 + */ + @Value("${titan.manager.user}") + private String titanManagerUser; + @Value("${ticket.expire.time}") + private int ticketExpireTime; + /** + * jedis + */ + @Resource + private JedisCluster jedisCluster; + + /** + * @desc 登录 + * + * @author liuliang + * + * @param request + * @param response + * @return LoginResponseBO 登录结果BO + */ + @RequestMapping(value = "/login") + @ResponseBody + public ComponentResult login(@Validated UserInfoBO userInfoBO,BindingResult br) { + ComponentResult componentResult = new ComponentResult(); + //1、参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, componentResult); + } + //2、登录 + String username = userInfoBO.getUsername(); + String password = userInfoBO.getPassword(); + String[] userArray = titanManagerUser.split("\\|"); + for(int i=0,userArraySize=userArray.length ; i + */ +package com.yunji.titan.manager.controller; + +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.yunji.titan.manager.bo.MonitorSetBO; +import com.yunji.titan.manager.bo.Pager; +import com.yunji.titan.manager.bo.PageRequestBO; +import com.yunji.titan.manager.bo.ReportBO; +import com.yunji.titan.manager.common.Groups; +import com.yunji.titan.manager.entity.Monitor; +import com.yunji.titan.manager.entity.Scene; +import com.yunji.titan.manager.result.ComponentResult; +import com.yunji.titan.manager.result.Result; +import com.yunji.titan.manager.service.MonitorSetService; +import com.yunji.titan.manager.service.SceneService; +import com.yunji.titan.manager.utils.ResultUtil; +import com.yunji.titan.manager.utils.ValidatorUtil; +import com.yunji.titan.utils.ErrorCode; + +/** + * @desc 监控管理Controller + * + * @author liuliang + * + */ +@Controller +@RequestMapping(value = "/monitor") +public class MonitorSetController { + + private Logger logger = LoggerFactory.getLogger(MonitorSetController.class); + + @Resource + private MonitorSetService monitorSetService; + /** + * 场景服务 + */ + @Resource + private SceneService sceneService; + + /** + * @desc 分页列表查询 + * + * @author liuliang + * + * @param pr + * @return ComponentResult> + */ + @RequestMapping(value = "/list") + @ResponseBody + public ComponentResult> list(@Validated PageRequestBO pr,BindingResult br) { + ComponentResult> componentResult = new ComponentResult>(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, componentResult); + } + //查询 + try { + int totalCount = monitorSetService.getCount(); + List records = monitorSetService.getDataList(pr.getPageIndex(),pr.getPageSize()); + + componentResult.setData(new Pager(totalCount, records)); + return ResultUtil.success(componentResult); + } catch (Exception e) { + logger.error("分页获取数据异常,params:{}",pr.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,componentResult); + } + + /** + * @desc 新增 + * + * @author liuliang + * + * @param monitorSetBO + * @param br + * @return + */ + @RequestMapping(value = "/add") + @ResponseBody + public Result add(@Validated(Groups.Add.class) MonitorSetBO monitorSetBO,BindingResult br) { + Result result = new Result(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, result); + } + //新增 + try { + Scene scene = sceneService.getSceneByName(monitorSetBO.getSceneName()); + if(null == scene) { + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,"场景名不存在",result); + } + monitorSetBO.setSceneId(scene.getSceneId()); + int addResult = monitorSetService.add(monitorSetBO); + if(0 < addResult) { + return ResultUtil.success(result); + } + } catch (DuplicateKeyException de) { + logger.error("新增异常,唯一索引重复,params:{}", monitorSetBO.toString(), de); + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,"场景名重复",result); + } catch (Exception e) { + logger.error("新增数据异常,params:{}",monitorSetBO.toString(),e); + } + //返回失败结果 + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } + + /** + * @desc 删除 + * + * @author liuliang + * + * @param ids + * @return + */ + @RequestMapping(value = "/del") + @ResponseBody + public Result del(@RequestParam("ids") String ids) { + Result result = new Result(); + //参数校验 + if(StringUtils.isBlank(ids)){ + logger.warn("删除数据,参数错误,ids:{}",ids); + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,result); + } + //删除 + try { + int delResult = monitorSetService.del(ids); + if(0 < delResult) { + return ResultUtil.success(result); + } + } catch (Exception e) { + logger.error("删除数据异常,ids:{}",ids,e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } + + /** + * @desc 更新 + * + * @author liuliang + * + * @param monitorSetBO + * @param br + * @return + */ + @RequestMapping(value = "/update") + @ResponseBody + public Result update(@Validated(Groups.Update.class) MonitorSetBO monitorSetBO,BindingResult br) { + Result result = new Result(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, result); + } + //更新 + try { + Scene scene = sceneService.getSceneByName(monitorSetBO.getSceneName()); + if(null == scene) { + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,"场景名不存在",result); + } + int updateResult = monitorSetService.update(monitorSetBO); + if(0 < updateResult) { + return ResultUtil.success(result); + } + } catch (DuplicateKeyException de) { + logger.error("更新异常,唯一索引重复,params:{}", monitorSetBO.toString(), de); + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,"场景名重复",result); + } catch (Exception e) { + logger.error("更新数据异常,params:{}",monitorSetBO.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } + + /** + * @desc 压测报告详情页 图表数据 + * + * @author liuliang + * + * @param reportBO + * @return + */ + @RequestMapping(value = "/chartdetail") + @ResponseBody + public ComponentResult chartdetail(@Validated(Groups.Query.class) ReportBO reportBO,BindingResult br) { + ComponentResult componentResult = new ComponentResult(); + try { + Map> map = monitorSetService.getReportDetailMonitorData(reportBO); + componentResult.setData(map); + return ResultUtil.success(componentResult); + } catch (Exception e) { + logger.error("压测报告详情,查询监控数据DB异常",e); + } + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,componentResult); + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/controller/OperateController.java b/titan-manager/src/main/java/com/yunji/titan/manager/controller/OperateController.java new file mode 100644 index 0000000..697c6d0 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/controller/OperateController.java @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.controller; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.yunji.titan.manager.bo.ActionPerformanceBO; +import com.yunji.titan.manager.bo.OperateBO; +import com.yunji.titan.manager.common.Groups; +import com.yunji.titan.manager.common.OperateTypeConstant; +import com.yunji.titan.manager.common.SceneStatusEnum; +import com.yunji.titan.manager.result.Result; +import com.yunji.titan.manager.service.AgentService; +import com.yunji.titan.manager.service.LinkService; +import com.yunji.titan.manager.service.OperateService; +import com.yunji.titan.manager.service.SceneService; +import com.yunji.titan.manager.utils.ResultUtil; +import com.yunji.titan.manager.utils.ValidatorUtil; +import com.yunji.titan.task.facade.TaskFacade; +import com.yunji.titan.utils.ErrorCode; +import com.yunji.titan.utils.TaskIssuedBean; + +/** + * @desc 操作Controller + * + * @author liuliang + * + */ +@Controller +@RequestMapping(value = "/operate") +public class OperateController { + + private Logger logger = LoggerFactory.getLogger(OperateController.class); + + /** + * 场景服务 + */ + @Resource + private SceneService sceneService; + /** + * 链路服务 + */ + @Resource + private LinkService linkService; + /** + * Agent命令执行服务 + */ + @Resource + private AgentService agentService; + /** + * 操作服务 + */ + @Resource + private OperateService operateService; + + @Resource + private TaskFacade taskFacade; + + /** + * Agent命令脚本路径 + */ + @Value("${start.agent.path}") + private String startAgentPath; + @Value("${stop.agent.path}") + private String stopAgentPath; + @Value("${restart.agent.path}") + private String restartAgentPath; + + /** + * @desc 操作压力测试 + * + * @author liuliang + * + * @param operateBO + * @param br + * @return + */ + @RequestMapping(value = "/performanceTest") + @ResponseBody + public Result performanceTest(@Validated(Groups.Query.class) OperateBO operateBO,BindingResult br){ + Result result = new Result(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, result); + } + //执行任务 + com.yunji.titan.utils.Result operateResult = null; + if(OperateTypeConstant.START == operateBO.getOperateType()) { + ActionPerformanceBO ap = null; + try { + ap = operateService.getActionParamer(operateBO.getSceneId()); + if(null == ap) { + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,"查询待压测参数失败",result); + } + } catch (Exception e) { + logger.error("查询待压测参数异常,params:{}",operateBO.toString(),e); + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,"查询待压测参数异常",result); + } + TaskIssuedBean taskIssuedBean = new TaskIssuedBean(); + operateService.copyBeanProperties(ap, taskIssuedBean); + operateResult = taskFacade.startPerformanceTest(taskIssuedBean); + }else if(OperateTypeConstant.STOP == operateBO.getOperateType()){ + operateResult = taskFacade.stopPerformanceTest(operateBO.getSceneId().intValue()); + } + if(operateResult.isSuccess()) { + //更新DB + try { + int sceneStatus = SceneStatusEnum.STARTING.value; + if(OperateTypeConstant.STOP == operateBO.getOperateType()) { + sceneStatus = SceneStatusEnum.STOPPING.value; + } + int updateResult = sceneService.updateSceneStatus(operateBO.getSceneId(),sceneStatus); + if(0 == updateResult) { + logger.error("执行压测命令成功,更新DB失败,params:{}",operateBO.toString()); + } + } catch (Exception e) { + logger.error("执行压测命令成功,更新DB异常,params:{}",operateBO.toString()); + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,"停止压测成功,更新DB异常",result); + } + return ResultUtil.success(result); + }else { + //失败返回 + return ResultUtil.fail(operateResult.getErrorCode(),operateResult.getErrorMsg(),result); + } + } + + /** + * @desc 操作Agent节点 + * + * @author liuliang + * + * @param operateBO + * @param br + * @return + */ + @RequestMapping(value = "/agent") + @ResponseBody + public Result agent(@Validated(Groups.Update.class) OperateBO operateBO,BindingResult br){ + Result result = new Result(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, result); + } + //执行命令 + String commandPath = null; + switch (operateBO.getOperateType()) { + case OperateTypeConstant.START: + commandPath = startAgentPath; + break; + case OperateTypeConstant.STOP: + commandPath = stopAgentPath; + break; + case OperateTypeConstant.RESTART: + commandPath = restartAgentPath; + break; + default: + logger.error("操作Agent,操作类型错误,params:{}",operateBO.toString()); + break; + } + if(StringUtils.isNotBlank(commandPath)){ + try { + String commandResult = agentService.executeCommand(commandPath); + logger.info("执行agent命令结果,commandResult:{}",commandResult); + return ResultUtil.success(result); + } catch (Exception e) { + logger.error("执行shell命令异常,params:{}",operateBO.toString(),e); + return ResultUtil.fail(ErrorCode.FAIL,"执行命令异常",result); + } + }else{ + return ResultUtil.fail(ErrorCode.FAIL,"操作类型错误",result); + } + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/controller/OverviewController.java b/titan-manager/src/main/java/com/yunji/titan/manager/controller/OverviewController.java new file mode 100644 index 0000000..19156b2 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/controller/OverviewController.java @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.controller; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.alibaba.fastjson.JSON; +import com.yunji.titan.manager.bo.AgentInfoBO; +import com.yunji.titan.manager.bo.OverviewResultBO; +import com.yunji.titan.manager.entity.Monitor; +import com.yunji.titan.manager.result.ComponentResult; +import com.yunji.titan.manager.service.LinkService; +import com.yunji.titan.manager.service.MonitorService; +import com.yunji.titan.manager.service.ReportService; +import com.yunji.titan.manager.service.SceneService; +import com.yunji.titan.manager.utils.ResultUtil; +import com.yunji.titan.task.facade.TaskFacade; +import com.yunji.titan.utils.ErrorCode; + +/** + * @desc 概览页相关数据Controller + * + * @author liuliang + * + */ +@Controller +@RequestMapping(value = "/overview") +public class OverviewController { + + private Logger logger = LoggerFactory.getLogger(OverviewController.class); + /** + * 链路服务接口 + */ + @Resource + private LinkService linkService; + /** + * 场景服务接口 + */ + @Resource + private SceneService sceneService; + /** + * 测试报告服务接口 + */ + @Resource + private ReportService reportService; + /** + * monitor信息服务接口 + */ + @Resource + private MonitorService monitorService; + /** + * agentchart数据点数量 + */ + @Value("${agent.chart.datanum}") + private int agentChartDatanum; + + @Resource + private TaskFacade taskFacade; + + /** + * @desc 获取概览页数据 + * + * @author liuliang + * + * @return + */ + @RequestMapping(value = "/getOverviewData") + @ResponseBody + public ComponentResult getOverviewData(){ + ComponentResult componentResult = new ComponentResult(); + OverviewResultBO data = new OverviewResultBO(); + //1、查当前agent状态 + int totalNodesNum = 0, availableNodesNum = 0; + List availableNodesIPList = new ArrayList(); + List usedNodesIPList = new ArrayList(); + com.yunji.titan.utils.Result result = taskFacade.getAgentsHostAddress(); + if(result.isSuccess()) { + AgentInfoBO agentInfoBO = JSON.parseObject(result.getData(), AgentInfoBO.class); + if(null != agentInfoBO.getFreeAgents()) { + availableNodesIPList = agentInfoBO.getFreeAgents(); + availableNodesNum = availableNodesIPList.size(); + } + if(null != agentInfoBO.getBusynessAgents()) { + usedNodesIPList = agentInfoBO.getBusynessAgents(); + } + totalNodesNum = availableNodesNum + usedNodesIPList.size(); + } + data.setTotalNodesNum(totalNodesNum); + data.setAvailableNodesNum(availableNodesNum); + data.setAvailableNodesIPList(availableNodesIPList); + data.setUsedNodesIPList(usedNodesIPList); + //2、查数据统计 + try { + int totalLinkNum = linkService.getLinkCount(); + int totalSceneNum = sceneService.getSceneCount(); + int totalReportNum = reportService.getReportCount(); + data.setTotalLinkNum(totalLinkNum); + data.setTotalSceneNum(totalSceneNum); + data.setTotalReportNum(totalReportNum); + } catch (Exception e) { + logger.error("查概览页统计数据异常",e); + } + //3、返回 + componentResult.setData(data); + return ResultUtil.success(componentResult); + } + + /** + * @desc 获取agent节点的monitor信息 + * + * @author liuliang + * + * @param request + * @return BaseResponseBO + */ + @RequestMapping(value = "/monitor") + @ResponseBody + public ComponentResult> getMonitorList(HttpServletRequest request) { + ComponentResult> componentResult = new ComponentResult>(); + try { + List list = monitorService.getMonitorFilterList(agentChartDatanum); + + componentResult.setData(list); + return ResultUtil.success(componentResult); + } catch (Exception e) { + logger.error("概览页monitor,查询DB异常",e); + } + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,componentResult); + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/controller/PageJumpController.java b/titan-manager/src/main/java/com/yunji/titan/manager/controller/PageJumpController.java new file mode 100644 index 0000000..c262331 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/controller/PageJumpController.java @@ -0,0 +1,190 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.controller; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +/** + * @desc 页面跳转controller + * + * @author liuliang + * + */ +@Controller +@RequestMapping(value = "/pages") +public class PageJumpController { + + /** + * @desc 跳转到主管理界面 + * + * @author liuliang + * + * @param request + * @param response + * @return ModelAndView + */ + @RequestMapping(value = "/main") + public ModelAndView toMainPage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("main"); + } + /** + * @desc 跳转到概览页 + * + * @author liuliang + * + * @param request + * @param response + * @return ModelAndView + */ + @RequestMapping(value = "/overview") + public ModelAndView toOverviewPage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("overview"); + } + + /** + * @desc 跳转到报表列表 + * + * @author liuliang + * + * @param request + * @param response + * @return ModelAndView + */ + @RequestMapping(value = "/report/report_list") + public ModelAndView toReportListPage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("report/report_list"); + } + + /** + * @desc 跳转到测试报告详情页 + * + * @author liuliang + * + * @param request + * @param response + * @return + */ + @RequestMapping(value = "/report/report_detail") + public ModelAndView toReportDetailPage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("report/report_detail"); + } + + /** + * @desc 跳转到链路列表 + * + * @author liuliang + * + * @param request + * @param response + * @return ModelAndView + */ + @RequestMapping(value = "/pressure/link_list") + public ModelAndView toLinkListPage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("pressure/link_list"); + } + + /** + * @desc 跳转到新增链路 + * + * @author liuliang + * + * @param request + * @param response + * @return ModelAndView + */ + @RequestMapping(value = "/pressure/link_add") + public ModelAndView toLinkAddPage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("pressure/link_add"); + } + + /** + * @desc 跳转到场景列表 + * + * @author liuliang + * + * @param request + * @param response + * @return ModelAndView + */ + @RequestMapping(value = "/pressure/scene_list") + public ModelAndView toSceneListPage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("pressure/scene_list"); + } + + /** + * @desc 跳转到新增场景 + * + * @author liuliang + * + * @param request + * @param response + * @return ModelAndView + */ + @RequestMapping(value = "/pressure/scene_add") + public ModelAndView toSceneAddPage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("pressure/scene_add"); + } + + /** + * @desc 跳转到执行压测列表页 + * + * @author liuliang + * + * @param request + * @param response + * @return ModelAndView + */ + @RequestMapping(value = "/pressure/do_pressure_list") + public ModelAndView toDoPressureListPage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("pressure/do_pressure_list"); + } + + /** + * @desc 跳转到执行压测操作页 + * + * @author liuliang + * + * @param request + * @param response + * @return ModelAndView + */ + @RequestMapping(value = "/pressure/do_pressure") + public ModelAndView toDoPressurePage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("pressure/do_pressure"); + } + + /** + * + * @desc 跳转到监控集列表页 + * + * @author liuliang + * + * @param request + * @param response + * @return ModelAndView + */ + @RequestMapping(value = "/monitor/monitor_list") + public ModelAndView toMonitorListPage(HttpServletRequest request,HttpServletResponse response){ + return new ModelAndView("monitor/monitor_list"); + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/controller/ReportController.java b/titan-manager/src/main/java/com/yunji/titan/manager/controller/ReportController.java new file mode 100644 index 0000000..a19869c --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/controller/ReportController.java @@ -0,0 +1,311 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.controller; + +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.List; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.yunji.titan.manager.bo.Pager; +import com.yunji.titan.manager.bo.PageRequestBO; +import com.yunji.titan.manager.bo.ReportBO; +import com.yunji.titan.manager.entity.Report; +import com.yunji.titan.manager.result.ComponentResult; +import com.yunji.titan.manager.result.Result; +import com.yunji.titan.manager.service.ReportService; +import com.yunji.titan.manager.utils.EmailSender; +import com.yunji.titan.manager.utils.ResultUtil; +import com.yunji.titan.manager.utils.TitanDateUtil; +import com.yunji.titan.manager.utils.ValidatorUtil; +import com.yunji.titan.utils.ErrorCode; + +/** + * @desc 测试报告管理Controller + * + * @author liuliang + * + */ +@Controller +@RequestMapping(value = "/report") +public class ReportController { + + private Logger logger = LoggerFactory.getLogger(ReportController.class); + /** + * 测试报告服务 + */ + @Resource + private ReportService reportService; + /** + * 邮件发送 + */ + @Resource + private EmailSender emailSender; + /** + * 邮件主题 + */ + @Value("${mail.subject}") + private String mailSubject; + /** + * 邮件收件人 + */ + @Value("${mail.receive.address}") + private String mailReceiveAddress; + /** + * 邮件抄送人 + */ + @Value("${mail.cc.receive.address}") + private String mailCcReceiveAddress; + /** + * 项目根目录 + */ + @Value("${base.path}") + private String basePath; + + /** + * @desc 分页获取测试报告数据 + * + * @author liuliang + * + * @param pr + * @param br + * @return + */ + @RequestMapping(value = "/list") + @ResponseBody + public ComponentResult> list(@Validated PageRequestBO pr,BindingResult br) { + ComponentResult> componentResult = new ComponentResult>(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, componentResult); + } + //查询 + try { + int totalCount = reportService.getReportCount(pr.getFilterCondition()); + List records = reportService.getReportList(pr.getFilterCondition(),pr.getPageIndex(),pr.getPageSize()); + if(null != records) { + String durationTime = ""; + long durationTimeTemp = 0; + double businessSuccessRate = 0.0D; + double httpSuccessRate = 0.0D; + long peakThroughput = 0; + String peakDurationTime = ""; + DecimalFormat df = new DecimalFormat("#.00"); + for(ReportBO reportBO : records){ + durationTimeTemp = (long)Math.ceil((reportBO.getEndTime() - reportBO.getStartTime())/1000.0); + + durationTime = TitanDateUtil.getDescBySecond(durationTimeTemp); + businessSuccessRate = Double.parseDouble(df.format(reportBO.getBusinessSuccessRequest() / (double)reportBO.getTotalRequest() * 100.00)); + httpSuccessRate = Double.parseDouble(df.format(reportBO.getSuccessRequest() / (double)reportBO.getTotalRequest() * 100.00)); + peakThroughput = (long) Math.ceil((reportBO.getTotalRequest() * 0.8)/(durationTimeTemp * 0.2)); + peakDurationTime = TitanDateUtil.getDescBySecond((long)(durationTimeTemp * 0.2)); + + reportBO.setDurationTime(durationTime); + reportBO.setBusinessSuccessRate(businessSuccessRate); + reportBO.setHttpSuccessRate(httpSuccessRate); + reportBO.setPeakThroughput(peakThroughput); + reportBO.setPeakDurationTime(peakDurationTime); + } + } + + componentResult.setData(new Pager(totalCount, records)); + return ResultUtil.success(componentResult); + } catch (Exception e) { + logger.error("分页获取数据异常,params:{}",pr.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,componentResult); + } + + /** + * @desc 删除 + * + * @author liuliang + * + * @param ids + * @return + */ + @RequestMapping(value = "/del") + @ResponseBody + public Result del(@RequestParam("ids") String ids) { + Result result = new Result(); + //参数校验 + if(StringUtils.isBlank(ids)){ + logger.warn("删除数据,参数错误,ids:{}",ids); + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,result); + } + //删除 + try { + int delResult = reportService.removeReport(ids); + if(0 < delResult) { + return ResultUtil.success(result); + } + } catch (Exception e) { + logger.error("删除数据异常,ids:{}",ids,e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } + + /** + * @desc 发送测试报告邮件 + * + * @author liuliang + * + * @param ids + * @return + */ + @RequestMapping(value = "/sendReportEmail") + @ResponseBody + public Result sendReportEmail(@RequestParam("ids") String ids){ + Result result = new Result(); + //参数校验 + if(StringUtils.isBlank(ids)){ + logger.warn("删除数据,参数错误,ids:{}",ids); + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,result); + } + //发送 + try { + List reportList = reportService.getReportListById(ids); + if((null != reportList) && (0 < reportList.size())){ + boolean sendResult = this.sendEmailContent(reportList); + if(sendResult){ + return ResultUtil.success(result); + } + }else { + logger.error("发送测试报告邮件,查询测试报告记录为空,ids:{}",ids); + } + } catch (Exception e) { + logger.error("发送压测报告邮件异常,ids:{}",ids,e); + } + //失败返回 + return ResultUtil.fail(result); + } + + /** + * @desc 发送邮件 + * + * @author liuliang + * + * @param reportList 待发送的数据 + * @return String 发送结果 + */ + private boolean sendEmailContent(List reportList) throws Exception{ + String durationTime = ""; + long durationTimeTemp = 0; + double businessSuccessRate = 0.0D; + double httpSuccessRate = 0.0D; + long peakThroughput = 0; + String peakDurationTime = ""; + DecimalFormat df = new DecimalFormat("#.00"); + + StringBuilder sb = new StringBuilder(); + //1、逐条组装 + for(Report report:reportList){ + durationTimeTemp = (long)Math.ceil((report.getEndTime() - report.getStartTime())/1000.0); + durationTime = TitanDateUtil.getDescBySecond(durationTimeTemp); + businessSuccessRate = Double.parseDouble(df.format(report.getBusinessSuccessRequest() / (double)report.getTotalRequest() * 100.00)); + httpSuccessRate = Double.parseDouble(df.format(report.getSuccessRequest() / (double)report.getTotalRequest() * 100.00)); + peakThroughput = (long) Math.ceil((report.getTotalRequest() * 0.8)/(durationTimeTemp * 0.2)); + peakDurationTime = TitanDateUtil.getDescBySecond((long)(durationTimeTemp * 0.2)); + + sb.append("
"); + sb.append(""); + sb.append("

" + report.getReportName() + "

"); + sb.append(""); + sb.append(""); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append(" "); + sb.append("
并发用户数总并发请求数HTTP200成功请求数业务成功请求数HTTP200成功率
" + report.getConcurrentUser() + "" + report.getTotalRequest() + "" + report.getSuccessRequest() + "" + report.getBusinessSuccessRequest()+ "" + httpSuccessRate + "%
业务成功率期待吞吐量/s实际吞吐量/s用户平均请求等待时间/ms服务器平均请求等待时间/ms
" + businessSuccessRate + "%" + report.getExpectTps() + "" + report.getActualTps() + "" + report.getUserWaittime() + "" + report.getServerWaittime() + "
峰值吞吐量/s峰值持续时间开始时间结束时间持续时间
" + peakThroughput + "" + peakDurationTime + "" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(report.getStartTime()) + "" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(report.getEndTime()) + "" + durationTime + "
"); + sb.append("
"); + } + //2、发送 + boolean sendResult = emailSender.sendHtml(mailSubject, sb.toString(), mailReceiveAddress, mailCcReceiveAddress); + + //3、返回发送结果 + return sendResult; + } + /** + * @desc 获取压测结果描述 + * + * @author liuliang + * + * @param conclusion 压测结果值 + * @return String 压测结果描述 + */ + private String getConclusionDesc(int conclusion){ + String conclusionImgUrl = basePath; + if(0 == conclusion){ + conclusionImgUrl += "images/well.png"; + }else{ + conclusionImgUrl += "images/bad.png"; + } + return conclusionImgUrl; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/controller/SceneController.java b/titan-manager/src/main/java/com/yunji/titan/manager/controller/SceneController.java new file mode 100644 index 0000000..3d164b2 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/controller/SceneController.java @@ -0,0 +1,310 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.controller; + +import java.util.List; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.dao.DuplicateKeyException; +import org.springframework.stereotype.Controller; +import org.springframework.validation.BindingResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.yunji.titan.manager.bo.PageRequestBO; +import com.yunji.titan.manager.bo.Pager; +import com.yunji.titan.manager.bo.SceneBO; +import com.yunji.titan.manager.bo.SceneDetailBO; +import com.yunji.titan.manager.common.Groups; +import com.yunji.titan.manager.common.SceneStatusEnum; +import com.yunji.titan.manager.entity.AutomaticTask; +import com.yunji.titan.manager.entity.Link; +import com.yunji.titan.manager.entity.Scene; +import com.yunji.titan.manager.result.ComponentResult; +import com.yunji.titan.manager.result.Result; +import com.yunji.titan.manager.service.AutomaticTaskService; +import com.yunji.titan.manager.service.LinkService; +import com.yunji.titan.manager.service.SceneService; +import com.yunji.titan.manager.utils.ResultUtil; +import com.yunji.titan.manager.utils.ValidatorUtil; +import com.yunji.titan.utils.ErrorCode; + +/** + * @desc 场景管理Controller + * + * @author liuliang + * + */ +@Controller +@RequestMapping(value = "/scene") +public class SceneController { + + private Logger logger = LoggerFactory.getLogger(SceneController.class); + /** + * 场景服务 + */ + @Resource + private SceneService sceneService; + /** + * 链路服务 + */ + @Resource + private LinkService linkService; + /** + * 自动化任务服务 + */ + @Resource + private AutomaticTaskService automaticTaskService; + + /** + * @desc 分页获取场景数据 + * + * @author liuliang + * + * @param request + * @param response + * @return ComponentResult> + */ + @RequestMapping(value = "/list") + @ResponseBody + public ComponentResult> list(@Validated PageRequestBO pr,BindingResult br) { + ComponentResult> componentResult = new ComponentResult>(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, componentResult); + } + //查询 + try { + int totalCount = sceneService.getSceneCount(pr.getFilterCondition()); + List records = sceneService.getSceneList(pr.getFilterCondition(),pr.getPageIndex(),pr.getPageSize()); + if(null != records) { + for(SceneBO sceneBO:records){ + AutomaticTask automaticTask = automaticTaskService.getDataDetailBySceneId(sceneBO.getSceneId()); + if(null != automaticTask){ + sceneBO.setIsAutomatic(1); + } + } + } + componentResult.setData(new Pager(totalCount, records)); + return ResultUtil.success(componentResult); + } catch (Exception e) { + logger.error("分页获取数据异常,pageRequestBO:{}",pr.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,componentResult); + } + + /** + * @desc 新增场景 + * + * @author liuliang + * + * @param sceneBO 场景BO + * @return Result + */ + @RequestMapping(value = "/add") + @ResponseBody + public Result add(@Validated(Groups.Add.class) SceneBO sceneBO,BindingResult br){ + Result result = new Result(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, result); + } + long totalRequest = sceneBO.getTotalRequest(); + long concurrentUser = sceneBO.getConcurrentUser(); + long useAgent = sceneBO.getUseAgent(); + long concurrentStart = sceneBO.getConcurrentStart(); + if( (totalRequest < concurrentUser) || (concurrentUser < useAgent) + || (0 != (totalRequest % concurrentUser)) || (0 != (concurrentUser % useAgent))){ + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,"总请求数、并发用户数、agent数倍数关系错误",result); + } + if(concurrentStart > concurrentUser){ + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,"起始并发用户数不能大于并发用户数",result); + } + //新增 + try { + int addResult = sceneService.addScene(sceneBO); + if(0 < addResult) { + return ResultUtil.success(result); + } + } catch(DuplicateKeyException de){ + logger.error("新增数据异常,场景名重复,params:{}",sceneBO.toString(),de); + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,"场景名已存在",result); + } catch (Exception e) { + logger.error("新增数据异常,params:{}",sceneBO.toString(),e); + } + //返回失败结果 + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } + + /** + * @desc 删除场景 + * + * @author liuliang + * + * @param ids 场景ID + * @return Result + */ + @RequestMapping(value = "/del") + @ResponseBody + public Result del(@RequestParam("ids") String ids){ + Result result = new Result(); + //参数校验 + if(StringUtils.isBlank(ids)){ + logger.warn("删除数据,参数错误,ids:{}",ids); + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,result); + } + //删除 + String[] idsArray = ids.split("\\,"); + int idsLength = idsArray.length; + int failNum = 0; + //逐个ID处理 + for(int i=0; i concurrentUser){ + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,"起始并发用户数不能大于并发用户数",result); + } + //更新 + try { + int updateResult = sceneService.updateScene(sceneBO); + if(0 < updateResult) { + return ResultUtil.success(result); + } else { + Scene scene = sceneService.getScene(sceneBO.getSceneId()); + if((null != scene) && (SceneStatusEnum.NOT_START.value != scene.getSceneStatus())){ + String errMsg = SceneStatusEnum.getDesc(scene.getSceneStatus()) + ",不可修改"; + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,errMsg,result); + } + } + } catch(DuplicateKeyException de){ + logger.error("更新数据异常,场景名重复,params:{}",sceneBO.toString(),de); + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,"场景名已存在",result); + } catch (Exception e) { + logger.error("更新数据异常,params:{}",sceneBO.toString(),e); + } + //返回失败结果 + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } + + /** + * @desc 查询场景详情 + * + * @author liuliang + * + * @param sceneId 场景ID + * @return ComponentResult + */ + @RequestMapping(value = "/get") + @ResponseBody + public ComponentResult get(@Validated(Groups.Query.class) SceneBO sceneBO,BindingResult br) { + ComponentResult componentResult = new ComponentResult(); + //参数校验 + Result validateResult = ValidatorUtil.getValidResult(br); + if(ResultUtil.isfail(validateResult)) { + return ResultUtil.copy(validateResult, componentResult); + } + //查询 + try { + Scene scene = sceneService.getScene(sceneBO.getSceneId()); + if(null != scene){ + String containLinkid = scene.getContainLinkid(); + List linkList = linkService.getLinkListByIds(containLinkid); + + componentResult.setData(new SceneDetailBO(scene, linkList)); + return ResultUtil.success(componentResult); + } + } catch (Exception e) { + logger.error("查询数据详情异常,params:{}",sceneBO.toString(),e); + } + //失败返回 + return ResultUtil.fail(ErrorCode.QUERY_DB_ERROR,componentResult); + } + + /** + * @desc 强制重置所有的场景状态为原始状态 + * + * @author liuliang + * + * @param request + * @return Result + */ + @RequestMapping(value = "/reset") + @ResponseBody + public Result reset(HttpServletRequest request){ + Result result = new Result(); + try { + sceneService.resetSceneStatus(); + return ResultUtil.success(result); + } catch (Exception e) { + logger.error("强制重置所有的场景状态为原始状态异常",e); + } + return ResultUtil.fail(ErrorCode.UPDATE_DB_ERROR,result); + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/dao/AutomaticTaskDao.java b/titan-manager/src/main/java/com/yunji/titan/manager/dao/AutomaticTaskDao.java new file mode 100644 index 0000000..b95f4d6 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/dao/AutomaticTaskDao.java @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.dao; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import com.yunji.titan.manager.bo.AutomaticTaskBO; +import com.yunji.titan.manager.entity.AutomaticTask; +import com.yunji.titan.manager.entity.mapper.AutomaticTaskMapper; + +/** + * @desc 自动压测任务表Dao + * + * @author liuliang + * + */ +@Repository +public class AutomaticTaskDao { + + @Resource + private JdbcTemplate jdbcTemplate; + + @Resource + private AutomaticTaskMapper automaticTaskMapper; + + /** + * @desc 查询自动压测任务总数量 + * + * @author liuliang + * + * @return + * @throws Exception + */ + public int queryAutomaticTaskCount() throws Exception { + final String sql = "SELECT count(*) FROM t_automatic_task"; + return jdbcTemplate.queryForObject(sql, Integer.class); + } + + /** + * @desc 分页查询所有自动压测任务 + * + * @author liuliang + * + * @param pageIndex 当前页数 + * @param pageSize 每页记录条数 + * @return List + */ + public List queryAutomaticTaskByPage(int pageIndex,int pageSize) throws Exception{ + int offset = pageIndex * pageSize; + final String sql = "SELECT * FROM t_automatic_task ORDER BY start_time DESC limit ?,?"; + return jdbcTemplate.query(sql,new Object[]{offset,pageSize},automaticTaskMapper); + } + + /** + * @desc 增加记录 + * + * @author liuliang + * + * @param automaticTaskBO 参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + public int add(AutomaticTaskBO automaticTaskBO) throws Exception{ + String sql = "INSERT INTO t_automatic_task(scene_id,scene_name,start_time,pressure_times,create_time) VALUES(?,?,?,?,?)"; + return jdbcTemplate.update(sql,new Object[]{automaticTaskBO.getSceneId(),automaticTaskBO.getSceneName(), + automaticTaskBO.getStartTime(),automaticTaskBO.getPressureTimes(),System.currentTimeMillis()}); + } + + public AutomaticTask queryDataDetail(long id) throws Exception{ + String sql = "SELECT * FROM t_automatic_task WHERE automatic_task_id = ?"; + List dataList = jdbcTemplate.query(sql,new Object[]{id},automaticTaskMapper); + if((null != dataList) && (0 < dataList.size())){ + return dataList.get(0); + }else{ + return null; + } + } + + public AutomaticTask queryDataDetailBySceneId(long sceneId) throws Exception{ + String sql = "SELECT * FROM t_automatic_task WHERE scene_id = ?"; + List dataList = jdbcTemplate.query(sql,new Object[]{sceneId},automaticTaskMapper); + if((null != dataList) && (0 < dataList.size())){ + return dataList.get(0); + }else{ + return null; + } + } + + public int del(long id) throws Exception { + String sql = "DELETE FROM t_automatic_task WHERE automatic_task_id = ?"; + return jdbcTemplate.update(sql,new Object[]{id}); + } + + public int update(AutomaticTaskBO automaticTaskBO) throws Exception{ + String sql = "UPDATE t_automatic_task SET start_time = ?,pressure_times = ? WHERE automatic_task_id = ?"; + return jdbcTemplate.update(sql,new Object[]{automaticTaskBO.getStartTime(),automaticTaskBO.getPressureTimes(),automaticTaskBO.getAutomaticTaskId()}); + } + + /** + * @desc 根据场景ID删除定时任务 + * + * @author liuliang + * + * @param sceneId + */ + public int delBySceneId(long sceneId) throws Exception{ + String sql = "DELETE FROM t_automatic_task WHERE scene_id = ?"; + return jdbcTemplate.update(sql,new Object[]{sceneId}); + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/dao/BaseDao.java b/titan-manager/src/main/java/com/yunji/titan/manager/dao/BaseDao.java new file mode 100644 index 0000000..72a4a9e --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/dao/BaseDao.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.dao; + +import java.util.List; + +import com.yunji.titan.manager.impl.dao.base.Criteria; +import com.yunji.titan.manager.impl.dao.base.Pager; +/** + * + * 基础dao + * + * @author liuliang + * + */ +public interface BaseDao { + + /** + * 查记录数-总数 + * + * @author liuliang + * + * @param clazz + * @return + * @throws Exception + */ + int queryCount(Class clazz) throws Exception; + + /** + * 查记录数-满足指定条件的 + * + * @author liuliang + * + * @param criteria + * @return + * @throws Exception + */ + int queryCount(Criteria criteria) throws Exception; + + /** + * 增 + * + * @author liuliang + * + * @param entity + * @return + * @throws Exception + */ + int insert(Object entity) throws Exception; + + /** + * 删 + * + * @author liuliang + * + * @param clazz + * @param id + * @return + * @throws Exception + */ + int delete(Class clazz, Long id) throws Exception; + + /** + * 删 根据指定条件 + * + * @author liuliang + * + * @param criteria + * @return + * @throws Exception + */ + int delete(Criteria criteria) throws Exception; + + /** + * 改 + * + * @author liuliang + * + * @param entity + * @return + * @throws Exception + */ + int update(Object entity) throws Exception; + + /** + * 查-主键 + * + * @author liuliang + * + * @param clazz + * @param id + * @return + * @throws Exception + */ + T query(Class clazz, Long id) throws Exception; + + /** + * 查-指定条件 + * + * @author liuliang + * + * @param criteria + * @return + * @throws Exception + */ + T query(Criteria criteria) throws Exception; + + /** + * 分页查询 + * + * @author liuliang + * + * @param clazz + * @param pager + * @return + * @throws Exception + */ + List queryList(Class clazz,Pager pager) throws Exception; + + /** + * 分页查询 + * + * @author liuliang + * + * @param criteria + * @param pager + * @return + * @throws Exception + */ + List queryList(Criteria criteria,Pager pager) throws Exception; +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/dao/LinkDao.java b/titan-manager/src/main/java/com/yunji/titan/manager/dao/LinkDao.java new file mode 100644 index 0000000..98e8bb4 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/dao/LinkDao.java @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.dao; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import com.yunji.titan.manager.bo.LinkBO; +import com.yunji.titan.manager.entity.Link; +import com.yunji.titan.manager.entity.mapper.LinkMapper; + +/** + * @desc 链路表Dao + * + * @author liuliang + * + */ +@Repository +public class LinkDao { + + @Resource + private JdbcTemplate jdbcTemplate; + + @Resource + private LinkMapper linkMapper; + + /** + * @desc 查询链路总数量 + * + * @author liuliang + * + * @return + * @throws Exception + */ + public int queryLinkCount() throws Exception { + final String sql = "SELECT count(*) FROM t_link"; + return jdbcTemplate.queryForObject(sql,Integer.class); + } + + /** + * @desc 查询符合条件的记录总数 + * + * @author liuliang + * + * @param linkName 链路名 + * @return int 符合条件的记录总数 + */ + public int queryLinkCount(String linkName) throws Exception{ + final String sql = "SELECT count(*) FROM t_link WHERE link_name LIKE ?"; + linkName = "%" + linkName + "%"; + return jdbcTemplate.queryForObject(sql,new Object[]{linkName},Integer.class); + } + + /** + * @desc 分页查询所有链路 + * + * @author liuliang + * + * @param pageIndex 当前页数 + * @param pageSize 每页记录条数 + * @return List + */ + public List queryLinkByPage(int pageIndex,int pageSize) throws Exception{ + int offset = pageIndex * pageSize; + final String sql = "SELECT * FROM t_link ORDER BY create_time DESC limit ?,?"; + return jdbcTemplate.query(sql,new Object[]{offset,pageSize},linkMapper); + } + + /** + * @desc 分页查询所有链路列表 + * + * @author liuliang + * + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 链路实体集合 + * @throws Exception + */ + public List queryLinkByPage(String linkName, int pageIndex,int pageSize) throws Exception{ + int offset = pageIndex * pageSize; + linkName = "%" + linkName + "%"; + final String sql = "SELECT * FROM t_link WHERE link_name LIKE ? ORDER BY create_time DESC limit ?,?"; + return jdbcTemplate.query(sql,new Object[]{linkName,offset,pageSize},linkMapper); + } + + /** + * @desc 增加链路记录 + * + * @author liuliang + * + * @param linkBO 链路参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + public int addLink(LinkBO linkBO) throws Exception{ + String sql = "INSERT INTO t_link(link_name,protocol_type,stresstest_url,request_type,content_type,charset_type,testfile_path,create_time,modify_time) VALUES(?,?,?,?,?,?,?,?,?)"; + return jdbcTemplate.update(sql,new Object[]{linkBO.getLinkName(),linkBO.getProtocolType(),linkBO.getStresstestUrl(),linkBO.getRequestType(),linkBO.getContentType(),linkBO.getCharsetType(),linkBO.getTestfilePath(),System.currentTimeMillis(),System.currentTimeMillis()}); + } + + /** + * @desc 更新链路记录 + * + * @author liuliang + * + * @param linkBO 链路参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + public int updateLink(LinkBO linkBO) throws Exception{ + String sql = "UPDATE t_link SET protocol_type = ?,stresstest_url = ?,request_type = ?,content_type = ?,charset_type = ?,testfile_path = ?,modify_time = ? WHERE link_id = ?"; + return jdbcTemplate.update(sql,new Object[]{linkBO.getProtocolType(),linkBO.getStresstestUrl(),linkBO.getRequestType(),linkBO.getContentType(),linkBO.getCharsetType(),linkBO.getTestfilePath(),System.currentTimeMillis(),linkBO.getLinkId()}); + } + + /** + * @desc 删除链路记录 + * + * @author liuliang + * + * @param idList 链路ID(多个ID以英文","隔开) + * @return int 受影响的记录数 + * @throws Exception + */ + public int removeLink(String idList) throws Exception{ + String sql = "DELETE FROM t_link WHERE link_id IN (" + idList + ")"; + return jdbcTemplate.update(sql); + } + + /** + * @desc 根据ID查询链路详情 + * + * @author liuliang + * + * @param linkId 链路ID + * @return Link 链路实体 + * @throws Exception + */ + public Link getLink(long linkId) throws Exception{ + String sql = "SELECT * FROM t_link WHERE link_id = ?"; + List dataList = jdbcTemplate.query(sql,new Object[]{linkId},linkMapper); + if((null != dataList) && (0 < dataList.size())){ + return dataList.get(0); + }else{ + return null; + } + } + + /** + * @desc 根据链路ID查询链路列表 + * + * @author liuliang + * + * @param ids 链路ID (多个ID以英文","隔开) + * @return List 链路实体集合 + * @throws Exception + */ + public List getLinkListByIds(String ids) throws Exception{ + final String sql = "SELECT * FROM t_link WHERE link_id IN (" + ids + ")"; + return jdbcTemplate.query(sql,linkMapper); + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/dao/MonitorDao.java b/titan-manager/src/main/java/com/yunji/titan/manager/dao/MonitorDao.java new file mode 100644 index 0000000..2d09393 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/dao/MonitorDao.java @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.dao; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import com.yunji.titan.manager.entity.Monitor; + +/** + * @desc 机器资源情况Dao + * + * @author liuliang + * + */ +@Repository +public class MonitorDao { + + @Resource + private JdbcTemplate jdbcTemplate; + + /** + * @desc 查询指定条数记录 + * + * @author liuliang + * + * @param size 记录数 + * @return List + * @throws Exception + */ + public List queryList(int size) throws Exception{ + String sql = "(SELECT * FROM t_monitor WHERE ip = (SELECT b.ip FROM(SELECT a.ip FROM t_monitor a ORDER BY a.create_time DESC) b GROUP BY b.ip LIMIT 0,1) ORDER BY create_time DESC LIMIT ?)" + +"UNION ALL" + +"(SELECT * FROM t_monitor WHERE ip = (SELECT b.ip FROM(SELECT a.ip FROM t_monitor a ORDER BY a.create_time DESC) b GROUP BY b.ip LIMIT 1,1) ORDER BY create_time DESC LIMIT ?)"; + return jdbcTemplate.query(sql,new Object[]{size,size},BeanPropertyRowMapper.newInstance(Monitor.class)); + } + + /** + * @desc 插入 + * + * @author liuliang + * + * @param monitor + * @return int 受影响的记录数 + * @throws Exception + */ + public int insert(Monitor monitor) throws Exception{ + String sql = "INSERT INTO t_monitor(ip,cpu_usage,memory_usage,iops,create_time) VALUES(?,?,?,?,?)"; + return jdbcTemplate.update(sql, new Object[]{monitor.getIp(),monitor.getCpuUsage(),monitor.getMemoryUsage(),monitor.getIops(),System.currentTimeMillis()}); + } + + /** + * @desc 查询指定条数的IP集合 + * + * @author liuliang + * + * @param serverType 服务类型 0:agent 1:目标机器 + * @param size 记录数 + * @return List IP集合 + */ + public List queryIPList(int serverType,int size) { + String sql = "SELECT ip FROM(SELECT * FROM t_monitor WHERE server_type = ? ORDER BY create_time DESC) b GROUP BY ip ORDER BY create_time DESC LIMIT ?"; + return jdbcTemplate.queryForList(sql,new Object[]{serverType,size},String.class); + } + + /** + * @desc 根据IP查询指定条数数据 + * + * @author liuliang + * + * @param ip + * @param size + * @return + */ + public List queryList(String ip, int size) { + String sql = "SELECT * FROM t_monitor WHERE ip = ? ORDER BY create_time DESC LIMIT ?"; + return jdbcTemplate.query(sql,new Object[]{ip,size},BeanPropertyRowMapper.newInstance(Monitor.class)); + } + + /** + * @desc 根据IP查询数据集合 + * + * @author liuliang + * + * @param serverType 服务类型 0:agent 1:目标机器 + * @param ips + * @return + */ + public List queryListByIP(int serverType,String ips) throws Exception{ + String[] arr = ips.split("\\,"); + StringBuilder sb = new StringBuilder(); + for(int i=0,length = arr.length;i queryListByIP(int serverType, String ips, long startTime, long endTime) throws Exception{ + String[] arr = ips.split("\\,"); + StringBuilder sb = new StringBuilder(); + for(int i=0,length = arr.length;i= " + startTime+ " AND create_time <= " + endTime + " ORDER BY create_time DESC"; + return jdbcTemplate.query(sql,BeanPropertyRowMapper.newInstance(Monitor.class)); + } + + /** + * @desc 删除指定时间之前的数据 + * + * @author liuliang + * + * @param serverType 机器类型 + * @param time 时间戳 + * @return int 受影响的记录数 + */ + public int delBreforeTime(int serverType,Long time) throws Exception{ + String sql = "DELETE FROM t_monitor WHERE server_type = ? AND create_time < ?"; + return jdbcTemplate.update(sql,new Object[] {serverType,time}); + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/dao/MonitorSetDao.java b/titan-manager/src/main/java/com/yunji/titan/manager/dao/MonitorSetDao.java new file mode 100644 index 0000000..939ffba --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/dao/MonitorSetDao.java @@ -0,0 +1,141 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.dao; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import com.yunji.titan.manager.bo.MonitorSetBO; +import com.yunji.titan.manager.entity.MonitorSet; + +/** + * @desc 监控集Dao + * + * @author liuliang + * + */ +@Repository +public class MonitorSetDao { + + @Resource + private JdbcTemplate jdbcTemplate; + + /** + * @desc 查总记录数 + * + * @author liuliang + * + * @return + */ + public int getCount() { + final String sql = "SELECT count(*) FROM t_monitor_set"; + return jdbcTemplate.queryForObject(sql, Integer.class); + } + + /** + * @desc 查询一页数据 + * + * @author liuliang + * + * @param pageIndex + * @param pageSize + * @return + */ + public List getDataList(int pageIndex, int pageSize) { + int offset = pageIndex * pageSize; + final String sql = "SELECT * FROM t_monitor_set ORDER BY create_time DESC limit ?,?"; + return jdbcTemplate.query(sql,new Object[]{offset,pageSize},BeanPropertyRowMapper.newInstance(MonitorSet.class)); + } + + /** + * @desc 删除数据 + * + * @author liuliang + * + * @param ids + * @return + */ + public int del(String ids) { + String sql = "DELETE FROM t_monitor_set WHERE monitor_set_id IN (" + ids + ")"; + return jdbcTemplate.update(sql); + } + + /** + * @desc 新增 + * + * @author liuliang + * + * @param monitorSetBO + * @return + */ + public int add(MonitorSetBO monitorSetBO) { + String sql = "INSERT INTO t_monitor_set(scene_id,scene_name,intranet_ip,create_time) VALUES(?,?,?,?)"; + return jdbcTemplate.update(sql,new Object[]{monitorSetBO.getSceneId(),monitorSetBO.getSceneName(), + monitorSetBO.getIntranetIp(),System.currentTimeMillis()}); + + } + + /** + * @desc 修改 + * + * @author liuliang + * + * @param monitorSetBO + * @return + */ + public int update(MonitorSetBO monitorSetBO) { + String sql = "UPDATE t_monitor_set SET scene_id = ?,scene_name = ?,intranet_ip = ? WHERE monitor_set_id = ?"; + return jdbcTemplate.update(sql,new Object[]{monitorSetBO.getSceneId(),monitorSetBO.getSceneName(),monitorSetBO.getIntranetIp(),monitorSetBO.getMonitorSetId()}); + + } + + /** + * @desc 根据场景ID查询监控集 + * + * @author liuliang + * + * @param sceneId 场景ID + * @return + */ + public MonitorSet query(long sceneId) throws Exception{ + String sql = "SELECT * FROM t_monitor_set WHERE scene_id = ?"; + List dataList = jdbcTemplate.query(sql,new Object[]{sceneId},BeanPropertyRowMapper.newInstance(MonitorSet.class)); + if((null != dataList) && (0 < dataList.size())){ + return dataList.get(0); + }else{ + return null; + } + } + + /** + * @desc 根据场景ID删除数据 + * + * @author liuliang + * + * @param sceneId + */ + public int delBySceneId(long sceneId) { + String sql = "DELETE FROM t_monitor_set WHERE scene_id = ?"; + return jdbcTemplate.update(sql,new Object[]{sceneId}); + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/dao/ReportDao.java b/titan-manager/src/main/java/com/yunji/titan/manager/dao/ReportDao.java new file mode 100644 index 0000000..ca6d1e4 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/dao/ReportDao.java @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.dao; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import com.yunji.titan.manager.bo.ReportBO; +import com.yunji.titan.manager.entity.Report; +import com.yunji.titan.manager.entity.mapper.ReportMapper; + +/** + * @desc 测试报告表Dao + * + * @author liuliang + * + */ +@Repository +public class ReportDao { + + @Resource + private JdbcTemplate jdbcTemplate; + + @Resource + private ReportMapper reportMapper; + /** + * @desc 查询测试报告总数量 + * + * @author liuliang + * + * @return int 测试报告总数量 + * @throws Exception + */ + public int queryReportCount() throws Exception { + final String sql = "SELECT count(*) FROM t_report"; + return jdbcTemplate.queryForObject(sql,Integer.class); + } + + /** + * @desc 查询符合条件的报告数量 + * + * @author liuliang + * + * @param reportName + * @return int 总数量 + */ + public int queryReportCount(String reportName) throws Exception { + final String sql = "SELECT count(*) FROM t_report WHERE report_name LIKE ?"; + reportName = "%" + reportName + "%"; + return jdbcTemplate.queryForObject(sql,new Object[]{reportName},Integer.class); + } + + /** + * @desc 分页查询测试报告列表 + * + * @author liuliang + * + * @param reportName 报告名称 + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List + */ + public List queryReportByPage(int pageIndex, int pageSize) throws Exception { + int offset = pageIndex * pageSize; + final String sql = "SELECT * FROM t_report ORDER BY create_time DESC limit ?,?"; + return jdbcTemplate.query(sql,new Object[]{offset,pageSize},reportMapper); + } + + /** + * @desc 分页查询测试报告列表(带过滤条件) + * + * @author liuliang + * + * @param reportName 报告名称 + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List + */ + public List queryReportByPage(String reportName, int pageIndex, + int pageSize) throws Exception { + int offset = pageIndex * pageSize; + reportName = "%" + reportName + "%"; + final String sql = "SELECT * FROM t_report WHERE report_name LIKE ? ORDER BY create_time DESC limit ?,?"; + return jdbcTemplate.query(sql,new Object[]{reportName,offset,pageSize},reportMapper); + } + + /** + * @desc 根据测试报告ID查询详情列表 + * + * @author liuliang + * + * @param idList 测试报告ID ,多个ID,以英文','隔开 + * @return List 测试报告详情集合 + */ + public List queryReportListById(String idList) throws Exception { + final String sql = "SELECT * FROM t_report WHERE report_id IN (" + idList + ")"; + return jdbcTemplate.query(sql,reportMapper); + } + + /** + * @desc 删除测试报告 + * + * @author liuliang + * + * @param ids 测试报告ID(多个ID以英文","隔开) + * @return int 受影响的记录数 + * @throws Exception + */ + public int removeReport(String ids) throws Exception { + String sql = "DELETE FROM t_report WHERE report_id IN (" + ids + ")"; + return jdbcTemplate.update(sql); + } + + /** + * @desc 增加测试报告记录 + * + * @author liuliang + * + * @param reportBO 测试报告参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + public int addReport(ReportBO reportBO) throws Exception { + String sql = "INSERT INTO t_report(report_name,scene_id,scene_name,start_time,end_time,expect_tps,actual_tps,total_request,success_request,business_success_request,concurrent_user,user_waittime,server_waittime,conclusion,create_time) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + return jdbcTemplate.update(sql,new Object[]{reportBO.getReportName(),reportBO.getSceneId(),reportBO.getSceneName(),reportBO.getStartTime(),reportBO.getEndTime(), + reportBO.getExpectTps(),reportBO.getActualTps(),reportBO.getTotalRequest(),reportBO.getSuccessRequest(),reportBO.getBusinessSuccessRequest(),reportBO.getConcurrentUser(), + reportBO.getUserWaittime(),reportBO.getServerWaittime(),reportBO.getConclusion(),reportBO.getCreateTime()}); + } + + /** + * @desc 删除指定时间之前的数据 + * + * @author liuliang + * + * @param time + * @return + */ + public int delBreforeTime(Long time) throws Exception{ + String sql = "DELETE FROM t_report WHERE create_time < ?"; + return jdbcTemplate.update(sql,new Object[] {time}); + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/dao/SceneDao.java b/titan-manager/src/main/java/com/yunji/titan/manager/dao/SceneDao.java new file mode 100644 index 0000000..9426ea1 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/dao/SceneDao.java @@ -0,0 +1,308 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.dao; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import com.yunji.titan.manager.bo.SceneBO; +import com.yunji.titan.manager.entity.Scene; +import com.yunji.titan.manager.entity.mapper.SceneMapper; + +/** + * @desc 场景表Dao + * + * @author liuliang + * + */ +@Repository +public class SceneDao { + + @Resource + private JdbcTemplate jdbcTemplate; + @Resource + private SceneMapper sceneMapper; + + /** + * @desc 查询场景总数量 + * + * @author liuliang + * + * @return int 场景总数量 + * @throws Exception + */ + public int querySceneCount() throws Exception { + final String sql = "SELECT count(*) FROM t_scene"; + return jdbcTemplate.queryForObject(sql,Integer.class); + } + + /** + * @desc 查询符合条件的记录总数 + * + * @author liuliang + * + * @param scenekName 场景名 + * @return int 符合条件的记录总数 + * @throws Exception + */ + public int queryLinkCount(String scenekName) throws Exception { + final String sql = "SELECT count(*) FROM t_scene WHERE scene_name LIKE ?"; + scenekName = "%" + scenekName + "%"; + return jdbcTemplate.queryForObject(sql,new Object[]{scenekName},Integer.class); + } + + + /** + * @desc 分页查询所有场景列表 + * + * @author liuliang + * @param scenekName + * + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 场景实体集合 + * @throws Exception + */ + public List querySceneByPage(int pageIndex, int pageSize) throws Exception { + int offset = pageIndex * pageSize; + final String sql = "SELECT * FROM t_scene ORDER BY create_time DESC limit ?,?"; + List sceneList = jdbcTemplate.query(sql,new Object[]{offset,pageSize},sceneMapper); + return this.updateSceneContainLinkid(sceneList); + } + + /** + * @desc 分页查询所有场景列表 + * + * @author liuliang + * @param scenekName + * + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 场景实体集合 + * @throws Exception + */ + public List querySceneByPage(String scenekName, int pageIndex,int pageSize) throws Exception { + int offset = pageIndex * pageSize; + scenekName = "%" + scenekName + "%"; + final String sql = "SELECT * FROM t_scene WHERE scene_name LIKE ? ORDER BY create_time DESC limit ?,?"; + List sceneList = jdbcTemplate.query(sql,new Object[]{scenekName,offset,pageSize},sceneMapper); + return this.updateSceneContainLinkid(sceneList); + } + + /** + * @desc 增加场景记录 + * + * @author liuliang + * + * @param sceneBO 场景参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + public int addScene(SceneBO sceneBO) throws Exception { + String containLinkid = "," + sceneBO.getContainLinkid() + ","; + String sql = "INSERT INTO t_scene(scene_name,duration_hour,duration_min,duration_sec,concurrent_user,concurrent_start,total_request,expect_tps,contain_linkid,link_relation,use_agent,scene_status,create_time,modify_time) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; + return jdbcTemplate.update(sql,new Object[]{sceneBO.getSceneName().trim(),sceneBO.getDurationHour(),sceneBO.getDurationMin(),sceneBO.getDurationSec(), + sceneBO.getConcurrentUser(),sceneBO.getConcurrentStart(),sceneBO.getTotalRequest(),sceneBO.getExpectTps(),containLinkid, + sceneBO.getLinkRelation(),sceneBO.getUseAgent(),sceneBO.getSceneStatus(),System.currentTimeMillis(),System.currentTimeMillis()}); + } + + /** + * @desc 更新场景记录 + * + * @author liuliang + * + * @param sceneBO 场景参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + public int updateScene(Scene scene) throws Exception { + if(null == scene.getSceneStatus()) { + scene.setSceneStatus(0); + } + String containLinkid = "," + scene.getContainLinkid() + ","; + String sql = "UPDATE t_scene SET duration_hour = ?,duration_min = ?,duration_sec = ?,concurrent_user = ?,concurrent_start = ?,total_request = ?,expect_tps = ?,contain_linkid = ?,link_relation = ?,use_agent = ?,scene_status = ?,modify_time = ? WHERE scene_id = ? AND scene_status = 0"; + return jdbcTemplate.update(sql,new Object[]{scene.getDurationHour(),scene.getDurationMin(),scene.getDurationSec(), + scene.getConcurrentUser(),scene.getConcurrentStart(),scene.getTotalRequest(),scene.getExpectTps(),containLinkid, + scene.getLinkRelation(),scene.getUseAgent(),scene.getSceneStatus(),System.currentTimeMillis(),scene.getSceneId()}); + } + + /** + * @desc 删除场景记录 + * + * @author liuliang + * + * @param idList idList 链路ID(多个ID以英文","隔开) + * @return int 受影响的记录数 + * @throws Exception + */ + public int removeScene(String idList) throws Exception { + String sql = "DELETE FROM t_scene WHERE scene_id IN (" + idList + ")"; + return jdbcTemplate.update(sql); + } + + /** + * @desc 根据ID查询场景详情 + * + * @author liuliang + * + * @param sceneId 场景ID + * @return Scene 场景实体 + * @throws Exception + */ + public Scene getScene(long sceneId) throws Exception { + String sql = "SELECT * FROM t_scene WHERE scene_id = ?"; + List dataList = jdbcTemplate.query(sql,new Object[]{sceneId},sceneMapper); + if((null != dataList) && (0 < dataList.size())){ + return this.updateSceneContainLinkid(dataList.get(0)); + }else{ + return null; + } + } + + /** + * @desc 根据场景ID更新场景状态 + * + * @author liuliang + * + * @param sceneId 场景ID + * @param sceneStatus 场景转态 + * @return int 受影响的记录数 + * @throws Exception + */ + public int updateScene(long sceneId, int sceneStatus) throws Exception { + String sql = "UPDATE t_scene SET scene_status = ? WHERE scene_id = ?"; + return jdbcTemplate.update(sql,new Object[]{sceneStatus,sceneId}); + } + + /** + * @desc 根据linkId查询场景列表 + * + * @param linkId 链路ID + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 符合条件的场景列表 + */ + public List getSceneListByLinkId(long linkId, int pageIndex,int pageSize) throws Exception { + int offset = pageIndex * pageSize; + //加","用于处理大编号包含小编号的情况 + String linkIdTemp = "%," + linkId + ",%"; + final String sql = "SELECT * FROM t_scene WHERE contain_linkid LIKE ? ORDER BY create_time DESC limit ?,?"; + List sceneList = jdbcTemplate.query(sql,new Object[]{linkIdTemp,offset,pageSize},sceneMapper); + return this.updateSceneContainLinkid(sceneList); + } + + /** + * @desc 根据linkId查询包含该ID的场景数 + * + * @param linkId 链路ID + * @return int 符合条件的记录数 + * @throws Exception + */ + public int getSceneCountByLinkId(String linkId) throws Exception { + final String sql = "SELECT count(*) FROM t_scene WHERE contain_linkid LIKE ?"; + linkId = "%," + linkId + ",%"; + return jdbcTemplate.queryForObject(sql,new Object[]{linkId},Integer.class); + } + + /** + * @desc 根据linkId删除包含该ID的场景 + * + * @param linkId 链路ID + * @return 受影响的记录数 + * @throws Exception + */ + public int removeSceneByLinkId(long linkId) throws Exception { + String sql = "DELETE FROM t_scene WHERE contain_linkid LIKE ?"; + String linkIdTemp = "%," + linkId + ",%"; + return jdbcTemplate.update(sql,new Object[]{linkIdTemp}); + } + + /** + * @desc 设置Scene的ContainLinkid字段 + * + * @param sceneList 场景实体集合 + * @return List + * @throws Exception + */ + private List updateSceneContainLinkid(List sceneList) throws Exception { + List returnSceneList = new ArrayList(); + if((null != sceneList) && (0 < sceneList.size())){ + for(Scene scene:sceneList){ + returnSceneList.add(this.updateSceneContainLinkid(scene)); + } + //修改后返回 + return returnSceneList; + } + return sceneList; + } + + /** + * @desc 设置Scene的ContainLinkid字段 + * + * @param scene 场景实体 + * @return Scene + * @throws Exception + */ + private Scene updateSceneContainLinkid(Scene scene) throws Exception { + if(null != scene){ + String containLinkid = scene.getContainLinkid(); + if(StringUtils.isNotBlank(containLinkid)){ + scene.setContainLinkid(containLinkid.substring(1,containLinkid.length()-1)); + return scene; + } + } + return scene; + } + + /** + * @desc 更新所有场景状态 + * + * @author liuliang + * + * @param sceneStatus + * @return int + */ + public int updateStatusAll(int sceneStatus) throws Exception { + String sql = "UPDATE t_scene SET scene_status = ?"; + return jdbcTemplate.update(sql,new Object[]{sceneStatus}); + } + + /** + * @desc 根据场景名称查询场景 + * + * @author liuliang + * + * @param sceneName + * @return + */ + public Scene getSceneByName(String sceneName) throws Exception { + final String sql = "SELECT * FROM t_scene WHERE scene_name = ?"; + List dataList = jdbcTemplate.query(sql,new Object[]{sceneName},sceneMapper); + if((null != dataList) && (0 < dataList.size())){ + return dataList.get(0); + }else{ + return null; + } + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/entity/AutomaticTask.java b/titan-manager/src/main/java/com/yunji/titan/manager/entity/AutomaticTask.java new file mode 100644 index 0000000..368a57b --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/entity/AutomaticTask.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.entity; + +import java.util.Date; + +/** + * @desc 自动压测任务表实体,对应表[t_automatic_task] + * + * @author liuliang + * + */ +public class AutomaticTask { + /** + * 主键ID + */ + private Long automaticTaskId; + /** + * 场景ID + */ + private Long sceneId; + /** + * 场景名称 + */ + private String sceneName; + /** + * 开始时间 + */ + private Date startTime; + /** + * 压测次数 + */ + private Integer pressureTimes; + /** + * 记录创建时间 + */ + private Long createTime; + public Long getAutomaticTaskId() { + return automaticTaskId; + } + public void setAutomaticTaskId(Long automaticTaskId) { + this.automaticTaskId = automaticTaskId; + } + public Long getSceneId() { + return sceneId; + } + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + public String getSceneName() { + return sceneName; + } + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + public Date getStartTime() { + return startTime; + } + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + public Integer getPressureTimes() { + return pressureTimes; + } + public void setPressureTimes(Integer pressureTimes) { + this.pressureTimes = pressureTimes; + } + public Long getCreateTime() { + return createTime; + } + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/entity/Link.java b/titan-manager/src/main/java/com/yunji/titan/manager/entity/Link.java new file mode 100644 index 0000000..8f30c15 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/entity/Link.java @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.entity; + +/** + * @desc 链路表实体,对应表[t_link] + * + * @author liuliang + * + */ +public class Link { + /** + * 主键自增ID + */ + private Long linkId; + /** + * 链路名 + */ + private String linkName; + /** + * 协议类型(0:http、1:https) + */ + private Integer protocolType; + /** + * 压测URL + */ + private String stresstestUrl; + /** + * 请求类型(0:get:1:post) + */ + private Integer requestType; + /** + * 内容类型 + */ + private Integer contentType; + /** + * 字符编码 + */ + private Integer charsetType; + /** + * 压测文件路径 + */ + private String testfilePath; + /** + * 记录创建时间 + */ + private Long createTime; + /** + * 记录最后修改时间 + */ + private Long modifyTime; + public Long getLinkId() { + return linkId; + } + public void setLinkId(Long linkId) { + this.linkId = linkId; + } + public String getLinkName() { + return linkName; + } + public void setLinkName(String linkName) { + this.linkName = linkName; + } + public Integer getProtocolType() { + return protocolType; + } + public void setProtocolType(Integer protocolType) { + this.protocolType = protocolType; + } + public String getStresstestUrl() { + return stresstestUrl; + } + public void setStresstestUrl(String stresstestUrl) { + this.stresstestUrl = stresstestUrl; + } + public Integer getRequestType() { + return requestType; + } + public void setRequestType(Integer requestType) { + this.requestType = requestType; + } + public Integer getContentType() { + return contentType; + } + public void setContentType(Integer contentType) { + this.contentType = contentType; + } + public Integer getCharsetType() { + return charsetType; + } + public void setCharsetType(Integer charsetType) { + this.charsetType = charsetType; + } + public String getTestfilePath() { + return testfilePath; + } + public void setTestfilePath(String testfilePath) { + this.testfilePath = testfilePath; + } + public Long getCreateTime() { + return createTime; + } + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + public Long getModifyTime() { + return modifyTime; + } + public void setModifyTime(Long modifyTime) { + this.modifyTime = modifyTime; + } + +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/entity/Monitor.java b/titan-manager/src/main/java/com/yunji/titan/manager/entity/Monitor.java new file mode 100644 index 0000000..0aa49cd --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/entity/Monitor.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.entity; + +/** + * @desc 监控机器资源情况表,对应表[t_monitor] + * + * @author liuliang + * + */ +public class Monitor { + /** + * 主键ID + */ + private Long monitorId; + /** + * 服务机器类型(0:agent机器 1:目标机器) + */ + private Integer serverType; + /** + * 机器IP + */ + private String ip; + /** + * CPU使用率 + */ + private Double cpuUsage; + /** + * 内存使用率 + */ + private Double memoryUsage; + /** + * 磁盘IOPS + */ + private Double iops; + /** + * 记录创建时间 + */ + private Long createTime; + + public Long getMonitorId() { + return monitorId; + } + public void setMonitorId(Long monitorId) { + this.monitorId = monitorId; + } + public Integer getServerType() { + return serverType; + } + public void setServerType(Integer serverType) { + this.serverType = serverType; + } + public String getIp() { + return ip; + } + public void setIp(String ip) { + this.ip = ip; + } + public Double getCpuUsage() { + return cpuUsage; + } + public void setCpuUsage(Double cpuUsage) { + this.cpuUsage = cpuUsage; + } + public Double getMemoryUsage() { + return memoryUsage; + } + public void setMemoryUsage(Double memoryUsage) { + this.memoryUsage = memoryUsage; + } + public Double getIops() { + return iops; + } + public void setIops(Double iops) { + this.iops = iops; + } + public Long getCreateTime() { + return createTime; + } + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/entity/MonitorSet.java b/titan-manager/src/main/java/com/yunji/titan/manager/entity/MonitorSet.java new file mode 100644 index 0000000..c42be61 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/entity/MonitorSet.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.entity; + +/** + * @desc 监控集实体,对应表[t_monitor_set] + * + * @author liuliang + * + */ +public class MonitorSet { + /** + * 主键ID + */ + private Long monitorSetId; + /** + * 场景ID + */ + private Long sceneId; + /** + * 场景名称 + */ + private String sceneName; + /** + * 内网IP + */ + private String intranetIp; + /** + * 记录创建时间 + */ + private Long createTime; + public Long getMonitorSetId() { + return monitorSetId; + } + public void setMonitorSetId(Long monitorSetId) { + this.monitorSetId = monitorSetId; + } + public Long getSceneId() { + return sceneId; + } + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + public String getSceneName() { + return sceneName; + } + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + public String getIntranetIp() { + return intranetIp; + } + public void setIntranetIp(String intranetIp) { + this.intranetIp = intranetIp; + } + public Long getCreateTime() { + return createTime; + } + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/entity/Report.java b/titan-manager/src/main/java/com/yunji/titan/manager/entity/Report.java new file mode 100644 index 0000000..0336a53 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/entity/Report.java @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.entity; + + +/** + * @desc 测试报告表实体,对应表[t_report] + * + * @author liuliang + * + */ +public class Report { + /** + * 主键自增ID + */ + private Long reportId; + /** + * 报告名称 + */ + private String reportName; + /** + * 场景ID + */ + private Long sceneId; + /** + * 场景名称 + */ + private String sceneName; + /** + * 测试起始时间 + */ + private Long startTime; + /** + * 测试结束时间 + */ + private Long endTime; + /** + * 期待吞吐量 + */ + private Integer expectTps; + /** + * 实际吞吐量 + */ + private Integer actualTps; + /** + * 总并发请求数 + */ + private Long totalRequest; + /** + * HTTP200成功请求数 + */ + private Long successRequest; + /** + * 业务成功请求数 + */ + private Long businessSuccessRequest; + /** + * 并发用户数 + */ + private Long concurrentUser; + /** + * 用户平均请求等待时间(单位:毫秒) + */ + private Long userWaittime; + /** + * 服务器平均请求等待时间(单位:毫秒) + */ + private Long serverWaittime; + /** + * 测试报告结论(0:合格 1:不合格) + */ + private Integer conclusion; + /** + * 记录创建时间 + */ + private Long createTime; + public Long getReportId() { + return reportId; + } + public void setReportId(Long reportId) { + this.reportId = reportId; + } + public String getReportName() { + return reportName; + } + public void setReportName(String reportName) { + this.reportName = reportName; + } + public Long getSceneId() { + return sceneId; + } + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + public String getSceneName() { + return sceneName; + } + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + public Long getStartTime() { + return startTime; + } + public void setStartTime(Long startTime) { + this.startTime = startTime; + } + public Long getEndTime() { + return endTime; + } + public void setEndTime(Long endTime) { + this.endTime = endTime; + } + public Integer getExpectTps() { + return expectTps; + } + public void setExpectTps(Integer expectTps) { + this.expectTps = expectTps; + } + public Integer getActualTps() { + return actualTps; + } + public void setActualTps(Integer actualTps) { + this.actualTps = actualTps; + } + public Long getTotalRequest() { + return totalRequest; + } + public void setTotalRequest(Long totalRequest) { + this.totalRequest = totalRequest; + } + public Long getSuccessRequest() { + return successRequest; + } + public void setSuccessRequest(Long successRequest) { + this.successRequest = successRequest; + } + public Long getBusinessSuccessRequest() { + return businessSuccessRequest; + } + public void setBusinessSuccessRequest(Long businessSuccessRequest) { + this.businessSuccessRequest = businessSuccessRequest; + } + public Long getConcurrentUser() { + return concurrentUser; + } + public void setConcurrentUser(Long concurrentUser) { + this.concurrentUser = concurrentUser; + } + public Long getUserWaittime() { + return userWaittime; + } + public void setUserWaittime(Long userWaittime) { + this.userWaittime = userWaittime; + } + public Long getServerWaittime() { + return serverWaittime; + } + public void setServerWaittime(Long serverWaittime) { + this.serverWaittime = serverWaittime; + } + public Integer getConclusion() { + return conclusion; + } + public void setConclusion(Integer conclusion) { + this.conclusion = conclusion; + } + public Long getCreateTime() { + return createTime; + } + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/entity/Scene.java b/titan-manager/src/main/java/com/yunji/titan/manager/entity/Scene.java new file mode 100644 index 0000000..6c0c093 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/entity/Scene.java @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.entity; + +/** + * @desc 场景表实体,对应表[t_scene] + * + * @author liuliang + * + */ +public class Scene { + + /** + * 主键自增ID + */ + private Long sceneId; + /** + * 场景名称 + */ + private String sceneName; + /** + * 持续时间-时 + */ + private Integer durationHour; + /** + * 持续时间-分 + */ + private Integer durationMin; + /** + * 持续时间-秒 + */ + private Integer durationSec; + /** + * 并发用户数 + */ + private Integer concurrentUser; + /** + * 起步并发用户数 + */ + private Integer concurrentStart; + /** + * 总并发请求数 + */ + private Long totalRequest; + /** + * 期待吞吐量 + */ + private Integer expectTps; + /** + * 包含的链路ID,多个链路ID以英文","隔开 + */ + private String containLinkid; + /** + * 串行链路关系,按链路顺序,链路ID以英文","隔开 + */ + private String linkRelation; + /** + * 使用的agent数 + */ + private Integer useAgent; + /** + * 状态(0:未开始 ,1:进行中) + */ + private Integer sceneStatus; + /** + * 记录创建时间 + */ + private Long createTime; + /** + * 记录最后修改时间 + */ + private Long modifyTime; + public Long getSceneId() { + return sceneId; + } + public void setSceneId(Long sceneId) { + this.sceneId = sceneId; + } + public String getSceneName() { + return sceneName; + } + public void setSceneName(String sceneName) { + this.sceneName = sceneName; + } + public Integer getDurationHour() { + return durationHour; + } + public void setDurationHour(Integer durationHour) { + this.durationHour = durationHour; + } + public Integer getDurationMin() { + return durationMin; + } + public void setDurationMin(Integer durationMin) { + this.durationMin = durationMin; + } + public Integer getDurationSec() { + return durationSec; + } + public void setDurationSec(Integer durationSec) { + this.durationSec = durationSec; + } + public Integer getConcurrentUser() { + return concurrentUser; + } + public void setConcurrentUser(Integer concurrentUser) { + this.concurrentUser = concurrentUser; + } + public Integer getConcurrentStart() { + return concurrentStart; + } + public void setConcurrentStart(Integer concurrentStart) { + this.concurrentStart = concurrentStart; + } + public Long getTotalRequest() { + return totalRequest; + } + public void setTotalRequest(Long totalRequest) { + this.totalRequest = totalRequest; + } + public Integer getExpectTps() { + return expectTps; + } + public void setExpectTps(Integer expectTps) { + this.expectTps = expectTps; + } + public String getContainLinkid() { + return containLinkid; + } + public void setContainLinkid(String containLinkid) { + this.containLinkid = containLinkid; + } + public String getLinkRelation() { + return linkRelation; + } + public void setLinkRelation(String linkRelation) { + this.linkRelation = linkRelation; + } + public Integer getUseAgent() { + return useAgent; + } + public void setUseAgent(Integer useAgent) { + this.useAgent = useAgent; + } + public Integer getSceneStatus() { + return sceneStatus; + } + public void setSceneStatus(Integer sceneStatus) { + this.sceneStatus = sceneStatus; + } + public Long getCreateTime() { + return createTime; + } + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + public Long getModifyTime() { + return modifyTime; + } + public void setModifyTime(Long modifyTime) { + this.modifyTime = modifyTime; + } + @Override + public String toString() { + return "Scene [sceneId=" + sceneId + ", sceneName=" + sceneName + ", durationHour=" + durationHour + + ", durationMin=" + durationMin + ", durationSec=" + durationSec + ", concurrentUser=" + concurrentUser + + ", concurrentStart=" + concurrentStart + ", totalRequest=" + totalRequest + ", expectTps=" + expectTps + + ", containLinkid=" + containLinkid + ", linkRelation=" + linkRelation + ", useAgent=" + useAgent + + ", sceneStatus=" + sceneStatus + ", createTime=" + createTime + ", modifyTime=" + modifyTime + "]"; + } +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/AutomaticTaskMapper.java b/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/AutomaticTaskMapper.java new file mode 100644 index 0000000..567a864 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/AutomaticTaskMapper.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.entity.mapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import com.yunji.titan.manager.entity.AutomaticTask; + +/** + * @desc 自动压测任务表实体映射Mapper + * + * @author liuliang + * + */ +@Component +public class AutomaticTaskMapper implements RowMapper{ + + @Override + public AutomaticTask mapRow(ResultSet rs, int rowNum) throws SQLException { + AutomaticTask task = new AutomaticTask(); + task.setAutomaticTaskId(rs.getLong("automatic_task_id")); + task.setSceneId(rs.getLong("scene_id")); + task.setSceneName(rs.getString("scene_name")); + task.setStartTime(rs.getTime("start_time")); + task.setPressureTimes(rs.getInt("pressure_times")); + task.setCreateTime(rs.getLong("create_time")); + return task; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/LinkMapper.java b/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/LinkMapper.java new file mode 100644 index 0000000..4949931 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/LinkMapper.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.entity.mapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import com.yunji.titan.manager.entity.Link; + +/** + * @desc 链路表实体映射Mapper + * + * @author liuliang + * + */ +@Component +public class LinkMapper implements RowMapper{ + + @Override + public Link mapRow(ResultSet rs, int rowNum) throws SQLException { + Link link = new Link(); + link.setLinkId(rs.getLong("link_id")); + link.setLinkName(rs.getString("link_name")); + link.setProtocolType(rs.getInt("protocol_type")); + link.setStresstestUrl(rs.getString("stresstest_url")); + link.setRequestType(rs.getInt("request_type")); + + link.setContentType(rs.getInt("content_type")); + link.setCharsetType(rs.getInt("charset_type")); + link.setTestfilePath(rs.getString("testfile_path")); + link.setCreateTime(rs.getLong("create_time")); + link.setModifyTime(rs.getLong("modify_time")); + return link; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/ReportMapper.java b/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/ReportMapper.java new file mode 100644 index 0000000..0b66d7e --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/ReportMapper.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.entity.mapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import com.yunji.titan.manager.entity.Report; + +/** + * @desc 测试报告表实体映射Mapper + * + * @author liuliang + * + */ +@Component +public class ReportMapper implements RowMapper{ + + @Override + public Report mapRow(ResultSet rs, int rowNum) throws SQLException { + Report report = new Report(); + report.setReportId(rs.getLong("report_id")); + report.setReportName(rs.getString("report_name")); + report.setSceneId(rs.getLong("scene_id")); + report.setSceneName(rs.getString("scene_name")); + report.setStartTime(rs.getLong("start_time")); + + report.setEndTime(rs.getLong("end_time")); + report.setExpectTps(rs.getInt("expect_tps")); + report.setActualTps(rs.getInt("actual_tps")); + report.setTotalRequest(rs.getLong("total_request")); + report.setSuccessRequest(rs.getLong("success_request")); + + report.setBusinessSuccessRequest(rs.getLong("business_success_request")); + report.setConcurrentUser(rs.getLong("concurrent_user")); + report.setUserWaittime(rs.getLong("user_waittime")); + report.setServerWaittime(rs.getLong("server_waittime")); + report.setConclusion(rs.getInt("conclusion")); + report.setCreateTime(rs.getLong("create_time")); + return report; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/SceneMapper.java b/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/SceneMapper.java new file mode 100644 index 0000000..f44e8d8 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/entity/mapper/SceneMapper.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.entity.mapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +import com.yunji.titan.manager.entity.Scene; + +/** + * @desc 场景表实体映射Mapper + * + * @author liuliang + * + */ +@Component +public class SceneMapper implements RowMapper{ + + @Override + public Scene mapRow(ResultSet rs, int rowNum) throws SQLException { + + Scene scene = new Scene(); + scene.setSceneId(rs.getLong("scene_id")); + scene.setSceneName(rs.getString("scene_name")); + scene.setDurationHour(rs.getInt("duration_hour")); + scene.setDurationMin(rs.getInt("duration_min")); + scene.setDurationSec(rs.getInt("duration_sec")); + + scene.setConcurrentUser(rs.getInt("concurrent_user")); + scene.setTotalRequest(rs.getLong("total_request")); + scene.setExpectTps(rs.getInt("expect_tps")); + scene.setContainLinkid(rs.getString("contain_linkid")); + scene.setLinkRelation(rs.getString("link_relation")); + + scene.setUseAgent(rs.getInt("use_agent")); + scene.setSceneStatus(rs.getInt("scene_status")); + scene.setCreateTime(rs.getLong("create_time")); + scene.setModifyTime(rs.getLong("modify_time")); + scene.setConcurrentStart(rs.getInt("concurrent_start")); + return scene; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/BaseDaoImpl.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/BaseDaoImpl.java new file mode 100644 index 0000000..70a0bde --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/BaseDaoImpl.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.dao; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; +import org.springframework.util.CollectionUtils; + +import com.yunji.titan.manager.dao.BaseDao; +import com.yunji.titan.manager.impl.dao.base.Criteria; +import com.yunji.titan.manager.impl.dao.base.DefaultNameHandler; +import com.yunji.titan.manager.impl.dao.base.NameHandler; +import com.yunji.titan.manager.impl.dao.base.OperateTypeEnum; +import com.yunji.titan.manager.impl.dao.base.Pager; +import com.yunji.titan.manager.impl.dao.base.SqlAssembleTools; +import com.yunji.titan.manager.impl.dao.base.SqlBean; +/** + * 基础dao实现 + * + * @author liuliang + * + */ +@Repository +public class BaseDaoImpl implements BaseDao{ + + @Resource + protected JdbcTemplate jdbcTemplate; + protected NameHandler nameHandler; + + /** + * 默认表名 + * + * @author liuliang + * + * @return + */ + protected NameHandler getNameHandler() { + if (null == nameHandler) { + nameHandler = new DefaultNameHandler(); + } + return nameHandler; + } + /** + * 获取 RowMapper + * + * @author liuliang + * + * @param clazz + * @return + */ + protected RowMapper getRowMapper(Class clazz) { + return BeanPropertyRowMapper.newInstance(clazz); + } + + @Override + public int queryCount(Class clazz) throws Exception{ + SqlBean sqlBean = SqlAssembleTools.buildSQL(clazz,this.getNameHandler(),OperateTypeEnum.COUNT); + return jdbcTemplate.queryForObject(sqlBean.getSql(), Integer.class); + } + @Override + public int queryCount(Criteria criteria) throws Exception{ + SqlBean sqlBean = SqlAssembleTools.buildSQL(criteria,this.getNameHandler(),OperateTypeEnum.COUNT_C); + return jdbcTemplate.queryForObject(sqlBean.getSql(),sqlBean.getParams().toArray(), Integer.class); + } + + @Override + public int insert(Object entity) throws Exception{ + SqlBean sqlBean = SqlAssembleTools.buildSQL(entity,this.getNameHandler(),OperateTypeEnum.INSERT); + return jdbcTemplate.update(sqlBean.getSql(),sqlBean.getParams().toArray()); + } + + @Override + public int delete(Class clazz, Long id) throws Exception{ + SqlBean sqlBean = SqlAssembleTools.buildSQL(clazz,String.valueOf(id),this.getNameHandler(),OperateTypeEnum.DELETE); + return jdbcTemplate.update(sqlBean.getSql(),sqlBean.getParams().toArray()); + } + + @Override + public int delete(Criteria criteria) throws Exception{ + SqlBean sqlBean = SqlAssembleTools.buildSQL(criteria,this.getNameHandler(),OperateTypeEnum.DELETE_C); + return jdbcTemplate.update(sqlBean.getSql(),sqlBean.getParams().toArray()); + } + + @Override + public int update(Object entity) throws Exception{ + SqlBean sqlBean = SqlAssembleTools.buildSQL(entity,this.getNameHandler(),OperateTypeEnum.UPDATE); + return jdbcTemplate.update(sqlBean.getSql(),sqlBean.getParams().toArray()); + } + + @Override + public T query(Class clazz, Long id) throws Exception{ + SqlBean sqlBean = SqlAssembleTools.buildSQL(clazz,String.valueOf(id),this.getNameHandler(),OperateTypeEnum.QUERY); + List list = jdbcTemplate.query(sqlBean.getSql(),sqlBean.getParams().toArray(),this.getRowMapper(clazz)); + if(CollectionUtils.isEmpty(list)){ + return null; + } + return list.get(0); + } + + @SuppressWarnings("unchecked") + @Override + public T query(Criteria criteria) throws Exception{ + SqlBean sqlBean = SqlAssembleTools.buildSQL(criteria,this.getNameHandler(),OperateTypeEnum.QUERY_C); + List list = jdbcTemplate.query(sqlBean.getSql(),sqlBean.getParams().toArray(),this.getRowMapper(criteria.getClazz())); + if(CollectionUtils.isEmpty(list)){ + return null; + } + return (T) list.get(0); + } + + @Override + public List queryList(Class clazz,Pager pager) throws Exception{ + SqlBean sqlBean = SqlAssembleTools.buildSQL(clazz,pager,this.getNameHandler(),OperateTypeEnum.QUERY); + return jdbcTemplate.query(sqlBean.getSql(),sqlBean.getParams().toArray(),this.getRowMapper(clazz)); + } + + @SuppressWarnings("unchecked") + @Override + public List queryList(Criteria criteria, Pager pager) throws Exception{ + SqlBean sqlBean = SqlAssembleTools.buildSQL(criteria,pager,this.getNameHandler(),OperateTypeEnum.QUERY_C); + List list = jdbcTemplate.query(sqlBean.getSql(),sqlBean.getParams().toArray(),this.getRowMapper(criteria.getClazz())); + return (List) list; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/BeanInfoUtil.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/BeanInfoUtil.java new file mode 100644 index 0000000..19fab94 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/BeanInfoUtil.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.dao.base; + +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.WeakHashMap; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @desc 获取对象信息工具类 + * + * @author liuliang + * + */ +public class BeanInfoUtil { + private static Logger logger = LoggerFactory.getLogger(BeanInfoUtil.class); + + private static Map, BeanInfo> methodCache = Collections.synchronizedMap(new WeakHashMap, BeanInfo>()); + + /** + * @desc 根据对象获取对象所有属性、属性值 + * + * @author liuliang + * + * @param entity 对象 + * @return Map [key:属性名 value:属性名对应的值] + */ + public static Map getBeanInfo(Object entity){ + Map map = new HashMap(16); + try { + Class clazz = entity.getClass(); + BeanInfo beanInfo = null; + if(null == methodCache.get(clazz)){ + Class superClazz =clazz.getSuperclass(); + beanInfo = Introspector.getBeanInfo(clazz, superClazz); + methodCache.put(clazz, beanInfo); + + Introspector.flushFromCaches(clazz); + if(null != superClazz){ + Introspector.flushFromCaches(superClazz); + } + }else{ + beanInfo = methodCache.get(clazz); + } + + PropertyDescriptor[] pdArr = beanInfo.getPropertyDescriptors(); + for(PropertyDescriptor pd:pdArr){ + String fieldName = pd.getName(); + Object fieldValue = getFieldValue(pd.getReadMethod(),entity); + map.put(fieldName, fieldValue); + } + } catch (IntrospectionException e) { + logger.error("获取对象信息异常,entity:{}",entity.getClass(),e); + } + return map; + } + /** + * 获取属性值 + * + * @author liuliang + * + * @param readMethod + * @param entity + * @return + */ + private static Object getFieldValue(Method readMethod, Object entity){ + try { + if(!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())){ + readMethod.setAccessible(true); + } + return readMethod.invoke(entity); + } catch (IllegalAccessException | IllegalArgumentException + | InvocationTargetException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Criteria.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Criteria.java new file mode 100644 index 0000000..5759069 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Criteria.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.dao.base; + +/** + * @desc SQL组装对象 + * + * @author liuliang + * + */ +public class Criteria { + + /** + * 操作的类 + */ + private Class clazz; + /** + * 字段名 + */ + private String[] fieldNames; + /** + * 运算符 + */ + private String[] operator; + /** + * 衔接符 + */ + private String[] connector; + /** + * 字段值 + */ + private Object[] fieldValues; + + public Criteria(){} + public Criteria(Class clazz, String[] fieldNames, String[] operator, + Object[] fieldValues) { + super(); + this.clazz = clazz; + this.fieldNames = fieldNames; + this.operator = operator; + this.fieldValues = fieldValues; + } + public Criteria(Class clazz, String[] fieldNames, String[] operator,String[] connector, + Object[] fieldValues) { + super(); + this.clazz = clazz; + this.fieldNames = fieldNames; + this.operator = operator; + this.connector = connector; + this.fieldValues = fieldValues; + } + + /** + * 一个参数查询条件 + * + * @author liuliang + * + * @param clazz + * @param fieldName + * @param operator + * @param fieldValue + * @return + */ + public static Criteria create(Class clazz,String fieldName,String operator,Object fieldValue){ + return new Criteria(clazz,new String[]{fieldName},new String[]{operator},new Object[]{fieldValue}); + } + + public Class getClazz() { + return clazz; + } + public String[] getFieldNames() { + return fieldNames; + } + public String[] getOperator() { + return operator; + } + public Object[] getFieldValues() { + return fieldValues; + } + public String[] getConnector() { + return connector; + } + public void setConnector(String[] connector) { + this.connector = connector; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/DefaultNameHandler.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/DefaultNameHandler.java new file mode 100644 index 0000000..a9f68f2 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/DefaultNameHandler.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.dao.base; +/** + * 默认名称获取实现 + * + * @author liuliang + * + */ +public class DefaultNameHandler implements NameHandler{ + + /** + * 表名前缀 + */ + private static final String TABLE_PREFIX = "t_"; + /** + * 主键后缀 + */ + private static final String PK_SUFFIX = "_id"; + + + @Override + public String getTableName(Class clazz) { + return TABLE_PREFIX + getUnderscoreName(clazz.getSimpleName()); + } + + @Override + public String getPrimaryKeyName(Class clazz) { + return getUnderscoreName(clazz.getSimpleName()) + PK_SUFFIX; + } + + @Override + public String getColumnName(String fieldName) { + return getUnderscoreName(fieldName); + } + + private String getUnderscoreName(String name){ + if((null == name) || ("" == name)){ + return name; + } + StringBuilder sb = new StringBuilder(); + sb.append(name.substring(0, 1).toLowerCase()); + for (int i = 1; i < name.length(); i++) { + String s = name.substring(i, i + 1); + String slc = s.toLowerCase(); + if (!s.equals(slc)) { + sb.append("_").append(slc); + }else { + sb.append(s); + } + } + return sb.toString(); + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/NameHandler.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/NameHandler.java new file mode 100644 index 0000000..d66de86 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/NameHandler.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.dao.base; +/** + * 名称获取接口 + * + * @author liuliang + * + */ +public interface NameHandler { + + /** + * 根据实体名获取表名 + * + * @param clazz + * @return + */ + public String getTableName(Class clazz); + /** + * 根据表名获取主键名 + * + * @param clazz + * @return + */ + public String getPrimaryKeyName(Class clazz); + /** + * 根据属性名获取列名 + * + * @param fieldName + * @return + */ + public String getColumnName(String fieldName); +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/OperateTypeEnum.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/OperateTypeEnum.java new file mode 100644 index 0000000..0967a53 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/OperateTypeEnum.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.dao.base; + +/** + * @desc SQL操作类型枚举 + * + * @author liuliang + * + */ +public enum OperateTypeEnum { + /** + * 增 + */ + INSERT, + /** + * 增 Criteria入参 + */ + INSERT_C, + /** + * 删 + */ + DELETE, + /** + * 删 Criteria入参 + */ + DELETE_C, + /** + * 改 + */ + UPDATE, + /** + * 改 Criteria入参 + */ + UPDATE_C, + /** + * 查 Criteria入参 + */ + QUERY, + /** + * 查 + */ + QUERY_C, + /** + * 统计 + */ + COUNT, + /** + * 统计 Criteria入参 + */ + COUNT_C; +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Operator.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Operator.java new file mode 100644 index 0000000..e625ea3 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Operator.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.dao.base; + +/** + * @desc SQL操作符 + * + * @author liuliang + * + */ +public class Operator { + + /** + * 模糊查询 + */ + public static String LIKE = "LIKE"; + /** + * 等于 + */ + public static String EQ = "="; + /** + * 不等于 + */ + public static String NE = "<>"; + /** + * 大于 + */ + public static String GT = ">"; + /** + * 小于 + */ + public static String LT = "<"; + + /** + * 大于等于 + */ + public static String GE = ">="; + + /** + * 小于等于 + */ + public static String LE = "<="; +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Pager.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Pager.java new file mode 100644 index 0000000..945b322 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/Pager.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.dao.base; + +/** + * @desc 分页 + * + * @author liuliang + * + */ +public class Pager { + + /** + * 当前页数 + */ + private int pageIndex; + /** + * 每页记录数 + */ + private int pageSize; + + public static Pager create(int pageIndex,int pageSize){ + return new Pager(pageIndex,pageSize); + } + + public Pager(){ + super(); + } + public Pager(int pageIndex, int pageSize) { + super(); + this.pageIndex = pageIndex; + this.pageSize = pageSize; + } + + public int getPageIndex() { + return pageIndex; + } + public void setPageIndex(int pageIndex) { + this.pageIndex = pageIndex; + } + public int getPageSize() { + return pageSize; + } + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getOffset() { + return this.pageIndex * this.pageSize; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/SqlAssembleTools.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/SqlAssembleTools.java new file mode 100644 index 0000000..4eaead1 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/dao/base/SqlAssembleTools.java @@ -0,0 +1,335 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.dao.base; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @desc SQL组装工具类 + * + * @author liuliang + * + */ +public class SqlAssembleTools { + + private static Logger logger = LoggerFactory.getLogger(SqlAssembleTools.class); + + public static SqlBean buildSQL(Class clazz,NameHandler nameHandler,OperateTypeEnum operateType){ + return buildSQL(clazz,null,null,null,null,nameHandler,operateType); + } + public static SqlBean buildSQL(Object entity,NameHandler nameHandler,OperateTypeEnum operateType){ + return buildSQL(null,entity,null,null,null,nameHandler,operateType); + } + public static SqlBean buildSQL(Class clazz,String primaryKey,NameHandler nameHandler,OperateTypeEnum operateType){ + return buildSQL(clazz,null,primaryKey,null,null,nameHandler,operateType); + } + public static SqlBean buildSQL(Criteria criteria,NameHandler nameHandler,OperateTypeEnum operateType){ + return buildSQL(null,null,null,criteria,null,nameHandler,operateType); + } + public static SqlBean buildSQL(Class clazz,Pager pager,NameHandler nameHandler,OperateTypeEnum operateType){ + return buildSQL(clazz,null,null,null,pager,nameHandler,operateType); + } + public static SqlBean buildSQL(Criteria criteria,Pager pager,NameHandler nameHandler,OperateTypeEnum operateType){ + return buildSQL(null,null,null,criteria,pager,nameHandler,operateType); + } + + /** + * @desc 创建SQL + * + * @author liuliang + * + * @param clazz + * @param nameHandler + * @param operateType sql类型 + * @return SQLBean + */ + private static SqlBean buildSQL(Class clazz,Object object,String primaryKey,Criteria criteria,Pager pager,NameHandler nameHandler,OperateTypeEnum operateType){ + SqlBean sqlBean = null; + switch (operateType) { + case COUNT: + sqlBean = buildCountSql(clazz,nameHandler); + break; + case COUNT_C: + sqlBean = buildCountSql(criteria,nameHandler); + break; + case INSERT: + sqlBean = buildInsertSql(object,nameHandler); + break; + case DELETE: + sqlBean = buildDeleteSql(clazz,primaryKey,nameHandler); + break; + case DELETE_C: + sqlBean = buildDeleteSql(criteria,nameHandler); + break; + case UPDATE: + sqlBean = buildUpdateSql(object,nameHandler); + break; + case QUERY: + sqlBean = buildQuerySql(clazz,pager,primaryKey,nameHandler); + break; + case QUERY_C: + sqlBean = buildQuerySql(criteria,pager,nameHandler); + break; + default: + logger.error("创建SQL语句错误,operateType不匹配,operateType:{}",operateType); + break; + } + return sqlBean; + } + + /** + * 查询 + * + * @author liuliang + * + * @param clazz + * @param pager + * @param primaryKey + * @param nameHandler + * @return + */ + private static SqlBean buildQuerySql(Class clazz,Pager pager, String primaryKey,NameHandler nameHandler) { + String tableName = nameHandler.getTableName(clazz); + String pkName = nameHandler.getPrimaryKeyName(clazz); + List params = new ArrayList(); + + StringBuilder sql = new StringBuilder("SELECT * FROM "); + sql.append(tableName); + if(StringUtils.isNotBlank(primaryKey)){ + sql.append(" WHERE ").append(pkName).append(" = ?"); + params.add(primaryKey); + } + if(null != pager){ + sql.append(" ORDER BY create_time DESC LIMIT ?,?"); + params.add(pager.getOffset()); + params.add(pager.getPageSize()); + } + return new SqlBean(sql.toString(),params); + } + + /** + * 更新 + * + * @author liuliang + * + * @param entity + * @param nameHandler + * @return + */ + private static SqlBean buildUpdateSql(Object entity, NameHandler nameHandler) { + Class clazz = entity.getClass(); + String tableName = nameHandler.getTableName(clazz); + String pkName = nameHandler.getPrimaryKeyName(clazz); + Object pkValue = null; + + Map fieldMap = BeanInfoUtil.getBeanInfo(entity); + List params = new ArrayList(); + + StringBuilder sql = new StringBuilder("UPDATE "); + sql.append(tableName).append(" SET "); + for(Map.Entry entry:fieldMap.entrySet()){ + //值为null,则表示不更新改字段;若需清空字段,可以设值为:空字符串"" + if(null == entry.getValue()){ + continue; + } + String columnName = nameHandler.getColumnName(entry.getKey()); + //主键最后添加 + if(pkName.equals(columnName)){ + pkValue = entry.getValue(); + continue; + } + sql.append(columnName).append(" = ?,"); + params.add(entry.getValue()); + } + sql.deleteCharAt(sql.length() - 1); + sql.append(" WHERE ").append(pkName).append(" = ?"); + params.add(pkValue); + + return new SqlBean(sql.toString(), params); + } + + /** + * 删除 + * + * @author liuliang + * + * @param clazz + * @param primaryKey + * @param nameHandler + * @return + */ + private static SqlBean buildDeleteSql(Class clazz,String primaryKey,NameHandler nameHandler) { + String tableName = nameHandler.getTableName(clazz); + String pkName = nameHandler.getPrimaryKeyName(clazz); + + StringBuilder sql = new StringBuilder("DELETE FROM "); + sql.append(tableName).append(" WHERE ").append(pkName).append(" = ?"); + List params = new ArrayList(); + params.add(primaryKey); + return new SqlBean(sql.toString(),params); + } + + /** + * 插入 + * + * @author liuliang + * + * @param entity + * @param nameHandler + * @return + */ + private static SqlBean buildInsertSql(Object entity,NameHandler nameHandler) { + Class clazz = entity.getClass(); + String tableName = nameHandler.getTableName(clazz); + String pkName = nameHandler.getPrimaryKeyName(clazz); + + Map fieldMap = BeanInfoUtil.getBeanInfo(entity); + List params = new ArrayList(); + StringBuilder placeholder = new StringBuilder(); + + StringBuilder sql = new StringBuilder("INSERT INTO "); + sql.append(tableName).append("("); + for(Map.Entry entry:fieldMap.entrySet()){ + String columnName = nameHandler.getColumnName(entry.getKey()); + //不传主键值,则需主键自增 + if(pkName.equals(columnName)){ + if(null == entry.getValue()){ + continue; + } + } + sql.append(columnName).append(","); + placeholder.append("?,"); + params.add(entry.getValue()); + } + sql.deleteCharAt(sql.length() - 1).append(") VALUES "); + sql.append("(").append(placeholder.deleteCharAt(placeholder.length() - 1)).append(")"); + return new SqlBean(sql.toString(),params); + } + + /** + * cout SQL 组建 + * + * @author liuliang + * + * @param clazz + * @param nameHandler + * @return + */ + private static SqlBean buildCountSql(Class clazz,NameHandler nameHandler){ + String tableName = nameHandler.getTableName(clazz); + StringBuilder sql = new StringBuilder("SELECT COUNT(*) FROM "); + sql.append(tableName); + return new SqlBean(sql.toString(),null); + } + + /** + * cout SQL 组建 Criteria + * + * @author liuliang + * + * @param criteria + * @param nameHandler + * @return + */ + private static SqlBean buildCountSql(Criteria criteria,NameHandler nameHandler){ + List params = new ArrayList(); + String tableName = nameHandler.getTableName(criteria.getClazz()); + StringBuilder sql = new StringBuilder("SELECT COUNT(*) FROM "); + sql.append(tableName).append(" WHERE "); + + assembleCriteria(criteria,sql,params,nameHandler); + + return new SqlBean(sql.toString(),params); + } + + /** + * 删除 条件删 + * + * @author liuliang + * + * @param criteria + * @param nameHandler + * @return + */ + private static SqlBean buildDeleteSql(Criteria criteria,NameHandler nameHandler){ + List params = new ArrayList(); + String tableName = nameHandler.getTableName(criteria.getClazz()); + StringBuilder sql = new StringBuilder("DELETE FROM "); + sql.append(tableName).append(" WHERE "); + + assembleCriteria(criteria,sql,params,nameHandler); + + return new SqlBean(sql.toString(),params); + } + + /** + * 条件查 + * + * @author liuliang + * + * @param criteria + * @param pager + * @param nameHandler + * @return + */ + private static SqlBean buildQuerySql(Criteria criteria, Pager pager,NameHandler nameHandler) { + List params = new ArrayList(); + + String tableName = nameHandler.getTableName(criteria.getClazz()); + StringBuilder sql = new StringBuilder("SELECT * FROM "); + sql.append(tableName).append(" WHERE "); + + assembleCriteria(criteria,sql,params,nameHandler); + + if(null != pager){ + sql.append(" ORDER BY create_time DESC LIMIT ?,?"); + params.add(pager.getOffset()); + params.add(pager.getPageSize()); + } + return new SqlBean(sql.toString(),params); + } + + /** + * 组装Criteria参数 + * + * @author liuliang + * + * @param criteria + * @param sql + * @param params + * @param nameHandler + */ + private static void assembleCriteria(Criteria criteria,StringBuilder sql,List params,NameHandler nameHandler){ + String[] fieldNames = criteria.getFieldNames(); + for(int i=0,length=fieldNames.length;i + */ +package com.yunji.titan.manager.impl.dao.base; + +import java.util.List; +/** + * SQL组装bean + * + * @author liuliang + * + */ +public class SqlBean { + + /** + * sql语句 + */ + private String sql; + /** + * 参数,与sql属性中的问号按顺序对应 + */ + private List params; + + public SqlBean() { + super(); + } + + public SqlBean(String sql, List params) { + super(); + this.sql = sql; + this.params = params; + } + public String getSql() { + return sql; + } + public void setSql(String sql) { + this.sql = sql; + } + public List getParams() { + return params; + } + public void setParams(List params) { + this.params = params; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/AgentServiceImpl.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/AgentServiceImpl.java new file mode 100644 index 0000000..de104bd --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/AgentServiceImpl.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.service; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import com.yunji.titan.manager.service.AgentService; + +/** + * @desc 操作agent节点service接口实现类 + * + * @author liuliang + * + */ +@Service +public class AgentServiceImpl implements AgentService{ + + private Logger logger = LoggerFactory.getLogger(AgentServiceImpl.class); + + /** + * @desc 执行shell脚本 + * + * @author liuliang + * + * @param commandPath 脚本路径 + * @return + */ + @Override + public String executeCommand(String commandPath) throws Exception{ + logger.info("执行命令,command:{}",commandPath); + String commondRealPath = Thread.currentThread().getContextClassLoader().getResource(commandPath).getPath(); + InputStreamReader stdISR = null; + InputStreamReader errISR = null; + Process process = null; + try { + process = Runtime.getRuntime().exec(commondRealPath); + process.waitFor(); + String line = null; + + stdISR = new InputStreamReader(process.getInputStream()); + BufferedReader stdBR = new BufferedReader(stdISR); + while ((line = stdBR.readLine()) != null) { + logger.info("STD line:" + line); + } + + errISR = new InputStreamReader(process.getErrorStream()); + BufferedReader errBR = new BufferedReader(errISR); + while ((line = errBR.readLine()) != null) { + logger.error("ERR line:" + line); + } + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + throw e; + } finally { + try { + if (stdISR != null) { + stdISR.close(); + } + if (errISR != null) { + errISR.close(); + } + if (process != null) { + process.destroy(); + } + } catch (IOException e) { + logger.error("正式执行命令有IO异常,commandPath:{}",commandPath,e); + } + } + return "a"; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/AutomaticTaskServiceImpl.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/AutomaticTaskServiceImpl.java new file mode 100644 index 0000000..cc78cb8 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/AutomaticTaskServiceImpl.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.service; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.yunji.titan.manager.bo.AutomaticTaskBO; +import com.yunji.titan.manager.dao.AutomaticTaskDao; +import com.yunji.titan.manager.entity.AutomaticTask; +import com.yunji.titan.manager.service.AutomaticTaskService; + +/** + * @desc 压测任务表Service接口实现类 + * + * @author liuliang + * + */ +@Service +public class AutomaticTaskServiceImpl implements AutomaticTaskService{ + + @Resource + private AutomaticTaskDao automaticTaskDao; + + /** + * 查询总数量 + * + * @author liuliang + * + * @return int 总数量 + * @throws Exception + */ + @Override + public int getCount() throws Exception { + return automaticTaskDao.queryAutomaticTaskCount(); + } + + /** + * 分页查询所有数据列表 + * + * @author liuliang + * + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 数据集合 + * @throws Exception + */ + @Override + public List getDataList(int pageIndex, int pageSize)throws Exception { + List list = automaticTaskDao.queryAutomaticTaskByPage(pageIndex, pageSize); + List automaticTaskBOList = new ArrayList(); + if((null != list) && (0 < list.size())){ + AutomaticTaskBO automaticTaskBO = null; + for(AutomaticTask automaticTask:list){ + automaticTaskBO = new AutomaticTaskBO(); + BeanUtils.copyProperties(automaticTask, automaticTaskBO); + automaticTaskBOList.add(automaticTaskBO); + } + } + return automaticTaskBOList; + } + + /** + * 增加记录 + * + * @author liuliang + * + * @param automaticTaskBO 参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int add(AutomaticTaskBO automaticTaskBO) throws Exception { + return automaticTaskDao.add(automaticTaskBO); + } + + /** + * 查询详情(根据主键) + * + * @author liuliang + * + * @param id + * @return + * @throws Exception + */ + @Override + public AutomaticTask getDataDetail(long id) throws Exception{ + return automaticTaskDao.queryDataDetail(id); + } + + /** + * 查询详情(根据 sceneId) + * + * @author liuliang + * + * @param sceneId + * @return + * @throws Exception + */ + @Override + public AutomaticTask getDataDetailBySceneId(long sceneId) throws Exception { + return automaticTaskDao.queryDataDetailBySceneId(sceneId); + } + + /** + * 删除 + * + * @author liuliang + * + * @param id + * @return + * @throws Exception + */ + @Override + public int del(long id) throws Exception { + return automaticTaskDao.del(id); + } + + /** + * 更新 + * + * @author liuliang + * + * @param automaticTaskBO + * @return + * @throws Exception + */ + @Override + public int update(AutomaticTaskBO automaticTaskBO) throws Exception { + return automaticTaskDao.update(automaticTaskBO); + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/LinkServiceImpl.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/LinkServiceImpl.java new file mode 100644 index 0000000..f6ad0ad --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/LinkServiceImpl.java @@ -0,0 +1,254 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.service; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import com.yunji.titan.manager.bo.LinkBO; +import com.yunji.titan.manager.dao.LinkDao; +import com.yunji.titan.manager.dao.SceneDao; +import com.yunji.titan.manager.entity.Link; +import com.yunji.titan.manager.entity.Scene; +import com.yunji.titan.manager.service.LinkService; + +/** + * @desc 链路表Service实现类 + * + * @author liuliang + * + */ +@Service +public class LinkServiceImpl implements LinkService{ + + @Resource + private LinkDao linkDao; + + @Resource + private SceneDao sceneDao; + + /** + * @desc 查询链路总数量 + * + * @author liuliang + * + * @return int 链路总数量 + * @throws Exception + */ + @Override + public int getLinkCount() throws Exception { + return linkDao.queryLinkCount(); + } + + /** + * @desc 查询符合条件的记录总数 + * + * @author liuliang + * + * @param linkName 链路名 + * @return int 符合条件的记录总数 + * @throws Exception + */ + @Override + public int getLinkCount(String linkName) throws Exception { + if(StringUtils.isBlank(linkName)){ + return this.getLinkCount(); + }else{ + return linkDao.queryLinkCount(linkName); + } + } + + /** + * @desc 分页查询所有链路列表 + * + * @author liuliang + * + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 链路BO集合 + * @throws Exception + */ + @Override + public List getLinkList(String linkName,int pageIndex, int pageSize) throws Exception{ + //1、查询 + List linkList = null; + if(StringUtils.isBlank(linkName)){ + linkList = linkDao.queryLinkByPage(pageIndex, pageSize); + }else{ + linkList = linkDao.queryLinkByPage(linkName,pageIndex, pageSize); + } + //2、转换 + List linkBOList = new ArrayList(); + if((null != linkList) && (0 < linkList.size())){ + LinkBO linkBO = null; + for(Link link:linkList){ + linkBO = new LinkBO(); + BeanUtils.copyProperties(link, linkBO); + linkBOList.add(linkBO); + } + } + //3、返回 + return linkBOList; + } + + /** + * @desc 增加链路记录 + * + * @author liuliang + * + * @param linkBO 链路参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int addLink(LinkBO linkBO) throws Exception { + return linkDao.addLink(linkBO); + } + + /** + * @desc 更新链路记录 + * + * @author liuliang + * + * @param linkBO 链路参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int updateLink(LinkBO linkBO) throws Exception { + return linkDao.updateLink(linkBO); + } + + /** + * @desc 删除链路记录 + * + * @author liuliang + * + * @param idList 链路ID(多个ID以英文","隔开) + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int removeLink(String idList) throws Exception { + return linkDao.removeLink(idList); + } + + /** + * @desc 根据ID查询链路详情 + * + * @author liuliang + * + * @param linkId 链路ID + * @return Link 链路实体 + * @throws Exception + */ + @Override + public Link getLink(long linkId) throws Exception { + return linkDao.getLink(linkId); + } + + /** + * @desc 根据链路ID查询链路列表 + * + * @author liuliang + * + * @param ids 链路ID (多个ID以英文","隔开) + * @return List 链路实体集合 + */ + @Override + public List getLinkListByIds(String ids) throws Exception{ + return linkDao.getLinkListByIds(ids); + } + + /** + * @desc 删除链路并更新链路相关的场景 + * + * @author liuliang + * + * @param linkId 链路ID + * @param sceneCount 包含该链路ID的场景数 + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.DEFAULT, timeout = 5) + public int removeLinkAndUpdateScene(long linkId, int sceneCount) throws Exception { + //1、删除链路 + int removedLinkNum = linkDao.removeLink(String.valueOf(linkId)); + //2、更新链路相关场景 + //2.1、查询linkId关联的所有场景 + List sceneList = sceneDao.getSceneListByLinkId(linkId, 0, sceneCount); + //2.2、逐条处理 + if((null != sceneList) && (0 < sceneList.size())){ + String containLinkid = ""; + String linkRelation = ""; + for(Scene scene:sceneList){ + containLinkid = scene.getContainLinkid(); + linkRelation = scene.getLinkRelation(); + if(containLinkid.equals(String.valueOf(linkId))){ + //2.2.1、该场景只包含待删除的一个链路,直接删除场景 + sceneDao.removeScene(String.valueOf(scene.getSceneId())); + }else{ + //2.2.2、该场景包含多个链路,更新场景 + //a、数据处理 + containLinkid = this.replaceLinkId(linkId, containLinkid); + linkRelation = this.replaceLinkId(linkId, linkRelation); + //b、更新 + scene.setContainLinkid(containLinkid); + scene.setLinkRelation(linkRelation); + sceneDao.updateScene(scene); + } + } + } + //3、返回处理结果 + return removedLinkNum; + } + + /** + * @desc 去除字符串中包含的的linkId + * + * @author liuliang + * + * @param linkId 链路ID + * @param waitReplaceStr 待处理的字符串 + * @return String 处理后的字符串 + */ + private String replaceLinkId(long linkId,String waitReplaceStr){ + if(StringUtils.isBlank(waitReplaceStr)){ + return waitReplaceStr; + } + waitReplaceStr = waitReplaceStr.replace(String.valueOf(linkId), "").replace(",,", ","); + final String checkKey = ","; + if(waitReplaceStr.startsWith(checkKey)){ + waitReplaceStr = waitReplaceStr.substring(1); + } + if(waitReplaceStr.endsWith(checkKey)){ + waitReplaceStr = waitReplaceStr.substring(0,waitReplaceStr.length()-1); + } + return waitReplaceStr; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/MonitorServiceImpl.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/MonitorServiceImpl.java new file mode 100644 index 0000000..2297637 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/MonitorServiceImpl.java @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.service; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import com.yunji.titan.manager.dao.MonitorDao; +import com.yunji.titan.manager.entity.Monitor; +import com.yunji.titan.manager.service.MonitorService; + +/** + * @desc 机器资源情况service接口实现类 + * + * @author liuliang + * + */ +@Service +public class MonitorServiceImpl implements MonitorService{ + + @Resource + private MonitorDao monitorDao; + /** + * @desc 查询指定条数记录 + * + * @author liuliang + * + * @param size 记录数 + * @return List + */ + @Override + public List getMonitorList(int size) throws Exception { + return monitorDao.queryList(size); + } + + /** + * @desc 查询指定条数记录(筛选去除符合时间范围的数据) + * + * @author liuliang + * + * @param size 记录数 + * @return List + */ + @Override + public List getMonitorFilterList(int size) throws Exception { + List returnList = new ArrayList(); + //1、查询符合条件的IP集合 + List ipList = monitorDao.queryIPList(0,1); + if((null != ipList) && (0 < ipList.size())) { + //2.1、获取数据集合 + List dataList1 = new ArrayList(); + if(StringUtils.isNotBlank(ipList.get(0))) { + dataList1 = monitorDao.queryList(ipList.get(0),size); + if((null != dataList1) && (0 < dataList1.size())) { + returnList.addAll(dataList1); + } + } + } + //3、返回 + return returnList; + } + + /** + * @desc 压测报告详情页 图表数据 + * + * @author liuliang + * + * @param ips + */ + @Override + public List getReportDetailMonitorData(String ips) throws Exception { + return monitorDao.queryListByIP(1,ips); + } + + /** + * @desc 压测报告详情页 图表数据 (时间区间) + * + * @author liuliang + * + * @param ips + * @param startTime + * @param endTime + * @return + */ + @Override + public List getReportDetailMonitorData(String ips, long startTime, long endTime) throws Exception { + return monitorDao.queryListByIP(1,ips,startTime,endTime); + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/MonitorSetServiceImpl.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/MonitorSetServiceImpl.java new file mode 100644 index 0000000..8572097 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/MonitorSetServiceImpl.java @@ -0,0 +1,226 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.service; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.yunji.titan.manager.bo.MonitorSetBO; +import com.yunji.titan.manager.bo.ReportBO; +import com.yunji.titan.manager.dao.MonitorDao; +import com.yunji.titan.manager.dao.MonitorSetDao; +import com.yunji.titan.manager.entity.Monitor; +import com.yunji.titan.manager.entity.MonitorSet; +import com.yunji.titan.manager.service.MonitorService; +import com.yunji.titan.manager.service.MonitorSetService; + +/** + * @desc 监控集service接口实现类 + * + * @author liuliang + * + */ +@Service +public class MonitorSetServiceImpl implements MonitorSetService{ + + Logger logger = LoggerFactory.getLogger(MonitorSetServiceImpl.class); + + @Resource + private MonitorSetDao monitorSetDao; + + @Resource + private MonitorDao monitorDao; + /** + * monitor信息服务接口 + */ + @Resource + private MonitorService monitorService; + /** + * @desc 查询总记录数 + * + * @author liuliang + * + * @return + */ + @Override + public int getCount() throws Exception { + return monitorSetDao.getCount(); + } + + /** + * @desc 分页查询数据列表 + * + * @author liuliang + * + * @param pageIndex + * @param pageSize + * @return + */ + @Override + public List getDataList(int pageIndex, int pageSize) throws Exception { + List list = monitorSetDao.getDataList(pageIndex, pageSize); + List boList = new ArrayList(); + if((null != list) && (0 < list.size())){ + MonitorSetBO monitorSetBO = null; + for(MonitorSet monitorSet:list){ + monitorSetBO = new MonitorSetBO(); + BeanUtils.copyProperties(monitorSet, monitorSetBO); + boList.add(monitorSetBO); + } + } + return boList; + } + + /** + * @desc 删除数据 + * + * @author liuliang + * + * @param ids + * @return + */ + @Override + public int del(String ids) throws Exception { + return monitorSetDao.del(ids); + } + + /** + * @desc 新增 + * + * @author liuliang + * + * @param monitorSetBO + * @return + */ + @Override + public int add(MonitorSetBO monitorSetBO) throws Exception { + return monitorSetDao.add(monitorSetBO); + } + + /** + * @desc 修改 + * + * @author liuliang + * + * @param monitorSetBO + * @return + */ + @Override + public int update(MonitorSetBO monitorSetBO) throws Exception { + return monitorSetDao.update(monitorSetBO); + } + /** + * @desc 压测报告详情页 图表数据 + * + * @author liuliang + * + * @param request + * @param sceneId 场景ID + * @return + */ + @Override + public Map> getReportDetailMonitorData(ReportBO reportBO) throws Exception { + Map> returnMap = new HashMap>(16); + //1、查监控集 + MonitorSet monitorSet = monitorSetDao.query(reportBO.getSceneId()); + if(null != monitorSet) { + String ips = monitorSet.getIntranetIp(); + List tempList = monitorService.getReportDetailMonitorData(ips,reportBO.getStartTime(),reportBO.getEndTime()); + + if((null != tempList) && (0 < tempList.size())) { + List list1 = new ArrayList(); + List list2 = new ArrayList(); + List list3 = new ArrayList(); + String ip1 = null; + String ip2 = null; + String ip3 = null; + String[] ipArr = ips.split("\\,"); + if(1 == ipArr.length) { + ip1 = ipArr[0]; + }else if(2 == ipArr.length) { + ip1 = ipArr[0]; + ip2 = ipArr[1]; + }else if(3 == ipArr.length){ + ip1 = ipArr[0]; + ip2 = ipArr[1]; + ip3 = ipArr[2]; + } + for(Monitor m:tempList) { + String mIP = m.getIp(); + if(mIP.equals(ip1)) { + list1.add(m); + }else if(mIP.equals(ip2)) { + list2.add(m); + }else if(mIP.equals(ip3)) { + list3.add(m); + } + } + if((null != ip1) && (0 < list1.size())) { + returnMap.put(ip1, list1); + } + if((null != ip2) && (0 < list2.size())) { + returnMap.put(ip2, list2); + } + if((null != ip2) && (0 < list3.size())) { + returnMap.put(ip3, list3); + } + } + } + //返回 + return returnMap; + } + + /** + * @desc 删除指定时间之前的monitor agent数据 + * + * @author liuliang + * + * @param breforeTime 多久之前(单位:s) + * @return int 受影响的记录数 + */ + @Override + public int delAgentMonitorByTime(Long breforeTime) throws Exception { + //计算当前系统时间breforeTime秒的时间 + Long time = System.currentTimeMillis() - breforeTime * 1000; + return monitorDao.delBreforeTime(0,time); + } + + /** + * @desc 删除指定时间之前的monitor agent数据 + * + * @author liuliang + * + * @param breforeTime 多久之前(单位:s) + * @return int 受影响的记录数 + */ + @Override + public int delTargetMonitorByTime(Long breforeTime) throws Exception { + //计算当前系统时间breforeTime秒的时间 + Long time = System.currentTimeMillis() - breforeTime * 1000; + return monitorDao.delBreforeTime(1,time); + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/OperateServiceImpl.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/OperateServiceImpl.java new file mode 100644 index 0000000..3fc36ae --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/OperateServiceImpl.java @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.service; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import com.yunji.titan.manager.bo.ActionPerformanceBO; +import com.yunji.titan.manager.common.CharsetTypeEnum; +import com.yunji.titan.manager.common.ContentTypeEnum; +import com.yunji.titan.manager.common.SceneStatusEnum; +import com.yunji.titan.manager.entity.Link; +import com.yunji.titan.manager.entity.Scene; +import com.yunji.titan.manager.service.LinkService; +import com.yunji.titan.manager.service.OperateService; +import com.yunji.titan.manager.service.SceneService; +import com.yunji.titan.manager.utils.CommonTypeUtil; +import com.yunji.titan.task.facade.TaskFacade; +import com.yunji.titan.utils.ContentType; +import com.yunji.titan.utils.ProtocolType; +import com.yunji.titan.utils.RequestType; +import com.yunji.titan.utils.TaskIssuedBean; + +/** + * @desc 操作Service接口实现类 + * + * @author liuliang + * + */ +@Service +public class OperateServiceImpl implements OperateService { + + private Logger logger = LoggerFactory.getLogger(OperateServiceImpl.class); + + /** + * 场景服务 + */ + @Resource + private SceneService sceneService; + /** + * 链路服务 + */ + @Resource + private LinkService linkService; + /** + * 压测任务下发接口 + */ + @Resource + private TaskFacade taskFacade; + + /** + * @desc 获取执行压测操作参数 + * + * @author liuliang + * + * @param sceneId + * 场景ID + * @return Map + * @throws Exception + */ + @Override + public ActionPerformanceBO getActionParamer(long sceneId) throws Exception { + // 1、查询场景信息 + Scene scene = sceneService.getScene(sceneId); + String sceneName = scene.getSceneName(); + int concurrentUsersSize = scene.getConcurrentUser(); + int initConcurrentUsersSize = scene.getConcurrentStart(); + long taskSize = scene.getTotalRequest(); + int agentSize = scene.getUseAgent(); + int expectThroughput = scene.getExpectTps(); + String ids = scene.getContainLinkid(); + int hour = scene.getDurationHour(); + int min = scene.getDurationMin(); + int sec = scene.getDurationSec(); + // 2、查询链路信息 + List linkList = linkService.getLinkListByIds(ids); + // 3、拼装参数 + Map protocolTypes = new HashMap(16); + Map requestTypes = new HashMap(16); + Map contentTypes = new HashMap(16); + Map charsets = new HashMap(16); + Map params = new HashMap(16); + List urls = new ArrayList(); + for (Link link : linkList) { + protocolTypes.put(link.getStresstestUrl(), CommonTypeUtil.getProtocolType(link.getProtocolType())); + requestTypes.put(link.getStresstestUrl(), CommonTypeUtil.getRequestType(link.getRequestType())); + contentTypes.put(link.getStresstestUrl(), ContentTypeEnum.getContentType(link.getContentType())); + charsets.put(link.getStresstestUrl(), CharsetTypeEnum.getValue(link.getCharsetType())); + + if (StringUtils.isBlank(link.getTestfilePath())) { + params.put(link.getStresstestUrl(), null); + } else { + params.put(link.getStresstestUrl(), new File(link.getTestfilePath())); + } + urls.add(link.getStresstestUrl()); + } + // 计算持续时间 + int continuedTime = hour * 60 * 60 + min * 60 + sec; + TimeUnit timeUnit = null; + if (0 < continuedTime) { + timeUnit = TimeUnit.SECONDS; + } + // 4、返回 + ActionPerformanceBO actionPerformanceBO = new ActionPerformanceBO(); + actionPerformanceBO.setSceneId(sceneId); + actionPerformanceBO.setSceneName(sceneName); + actionPerformanceBO.setInitConcurrentUsersSize(initConcurrentUsersSize); + actionPerformanceBO.setConcurrentUsersSize(concurrentUsersSize); + actionPerformanceBO.setTaskSize(taskSize); + + actionPerformanceBO.setAgentSize(agentSize); + actionPerformanceBO.setExpectThroughput(expectThroughput); + actionPerformanceBO.setContinuedTime(continuedTime); + actionPerformanceBO.setTimeUnit(timeUnit); + actionPerformanceBO.setProtocolTypes(protocolTypes); + + actionPerformanceBO.setRequestTypes(requestTypes); + actionPerformanceBO.setUrls(urls); + actionPerformanceBO.setParams(params); + actionPerformanceBO.setContentTypes(contentTypes); + actionPerformanceBO.setCharsets(charsets); + + return actionPerformanceBO; + } + + @Override + public void doAutomaticTask(long sceneId, int executeNum) throws Exception { + // 1、 + ActionPerformanceBO ap = this.getActionParamer(sceneId); + executeNum = executeNum < 1 ? 1 : executeNum; + // 2、 + if (null != ap) { + for (int i = 0; i < executeNum; i++) { + //状态校验 + while(true){ + Scene scene = sceneService.getScene(sceneId); + if((null != scene) && (0 == scene.getSceneStatus())){ + break; + } + Thread.sleep(5000); + } + //执行 + TaskIssuedBean taskIssuedBean = new TaskIssuedBean(); + this.copyBeanProperties(ap, taskIssuedBean); + com.yunji.titan.utils.Result operateResult = taskFacade.startPerformanceTest(taskIssuedBean); + if(operateResult.isSuccess()) { + int updateResult = sceneService.updateSceneStatus(sceneId, SceneStatusEnum.STARTING.value); + if(0 == updateResult){ + logger.warn("自动压测,更新DB失败,sceneId:{}", sceneId); + } + }else { + logger.warn("自动压测,失败,sceneId:{},operateResult:{}", sceneId,operateResult.toString()); + } + } + } else { + logger.info("自动压测失败,查询ActionPerformanceBO为空,sceneId:{}", sceneId); + } + } + + /** + * @desc 压测参数bean转换 + * + * @author liuliang + * + * @param ap + * @param tb + */ + @Override + public void copyBeanProperties(ActionPerformanceBO ap, TaskIssuedBean tb){ + tb.setTaskId(null); + tb.setZnode(null); + tb.setSenceId(ap.getSceneId().intValue()); + tb.setSenceName(ap.getSceneName()); + tb.setInitConcurrentUsersSize(ap.getInitConcurrentUsersSize()); + + tb.setConcurrentUsersSize(ap.getConcurrentUsersSize()); + tb.setTaskSize(ap.getTaskSize()); + tb.setAgentSize(ap.getAgentSize()); + tb.setExpectThroughput(ap.getExpectThroughput()); + tb.setContinuedTime(ap.getContinuedTime()); + + tb.setUrls(ap.getUrls()); + tb.setRequestTypes(ap.getRequestTypes()); + tb.setProtocolTypes(ap.getProtocolTypes()); + tb.setParams(ap.getParams()); + tb.setContentTypes(ap.getContentTypes()); + + tb.setCharsets(ap.getCharsets()); + tb.setTimeUnit(ap.getTimeUnit()); + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/ReportServiceImpl.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/ReportServiceImpl.java new file mode 100644 index 0000000..de195b7 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/ReportServiceImpl.java @@ -0,0 +1,163 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.service; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import com.yunji.titan.manager.bo.ReportBO; +import com.yunji.titan.manager.dao.ReportDao; +import com.yunji.titan.manager.entity.Report; +import com.yunji.titan.manager.service.ReportService; + +/** + * @desc 测试报告表Service实现类 + * + * @author liuliang + * + */ +@Service +public class ReportServiceImpl implements ReportService{ + + @Resource + private ReportDao reportDao; + + /** + * @desc 查询测试报告总数量 + * + * @author liuliang + * + * @return int 测试报告总数量 + * @throws Exception + */ + @Override + public int getReportCount() throws Exception { + return reportDao.queryReportCount(); + } + + /** + * @desc 查询符合条件的报告数量 + * + * @author liuliang + * + * @param reportName + * @return int 总数量 + */ + @Override + public int getReportCount(String reportName) throws Exception { + if(StringUtils.isBlank(reportName)){ + return this.getReportCount(); + }else{ + return reportDao.queryReportCount(reportName); + } + } + + /** + * @desc 分页查询所有测试报告列表 + * + * @author liuliang + * + * @param reportName 报告名称 + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return + */ + @Override + public List getReportList(String reportName, int pageIndex, int pageSize) throws Exception { + //1、查询 + List reportList = null; + if(StringUtils.isBlank(reportName)){ + reportList = reportDao.queryReportByPage(pageIndex, pageSize); + }else{ + reportList = reportDao.queryReportByPage(reportName,pageIndex, pageSize); + } + //2、转换 + List reportBOList = new ArrayList(); + if((null != reportList) && (0 < reportList.size())){ + ReportBO reportBO = null; + for(Report report:reportList){ + reportBO = new ReportBO(); + BeanUtils.copyProperties(report, reportBO); + reportBOList.add(reportBO); + } + } + //3、返回 + return reportBOList; + } + + /** + * @desc 根据测试报告ID查询详情列表 + * + * @author liuliang + * + * @param idList 测试报告ID ,多个ID,以英文','隔开 + * @return List 测试报告详情集合 + */ + @Override + public List getReportListById(String idList) throws Exception { + return reportDao.queryReportListById(idList); + } + + /** + * @desc 删除测试报告 + * + * @author liuliang + * + * @param ids 测试报告ID(多个ID以英文","隔开) + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int removeReport(String ids) throws Exception { + return reportDao.removeReport(ids); + } + + /** + * @desc 增加测试报告记录 + * + * @author liuliang + * + * @param reportBO 测试报告参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int addReport(ReportBO reportBO) throws Exception { + return reportDao.addReport(reportBO); + } + + /** + * @desc 删除指定时间之前的数据 + * + * @author liuliang + * + * @param breforeTime 多久之前(单位:s) + * @return int 受影响的记录数 + */ + @Override + public int delByTime(Long breforeTime) throws Exception { + //计算当前系统时间breforeTime秒的时间 + Long time = System.currentTimeMillis() - breforeTime * 1000; + return reportDao.delBreforeTime(time); + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/SceneServiceImpl.java b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/SceneServiceImpl.java new file mode 100644 index 0000000..2384f5d --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/impl/service/SceneServiceImpl.java @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.impl.service; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Resource; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import com.yunji.titan.manager.bo.SceneBO; +import com.yunji.titan.manager.common.SceneStatusEnum; +import com.yunji.titan.manager.dao.AutomaticTaskDao; +import com.yunji.titan.manager.dao.MonitorSetDao; +import com.yunji.titan.manager.dao.SceneDao; +import com.yunji.titan.manager.entity.Scene; +import com.yunji.titan.manager.service.SceneService; + +/** + * @desc 场景表Service实现类 + * + * @author liuliang + * + */ +@Service +public class SceneServiceImpl implements SceneService{ + + @Resource + private SceneDao sceneDao; + @Resource + private AutomaticTaskDao automaticTaskDao; + @Resource + private MonitorSetDao monitorSetDao; + /** + * @desc 查询场景总数量 + * + * @author liuliang + * + * @return int 场景总数量 + * @throws Exception + */ + @Override + public int getSceneCount() throws Exception { + return sceneDao.querySceneCount(); + } + + /** + * @desc 查询符合条件的记录总数 + * + * @author liuliang + * + * @param scenekName 场景名 + * @return int 符合条件的记录总数 + * @throws Exception + */ + @Override + public int getSceneCount(String scenekName) throws Exception { + if(StringUtils.isBlank(scenekName)){ + return this.getSceneCount(); + }else{ + return sceneDao.queryLinkCount(scenekName); + } + } + + /** + * @desc 分页查询所有场景列表 + * + * @author liuliang + * @param scenekName + * + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 场景BO集合 + * @throws Exception + */ + @Override + public List getSceneList(String scenekName,int pageIndex, int pageSize) throws Exception { + //1、查询 + List sceneList = null; + if(StringUtils.isBlank(scenekName)){ + sceneList = sceneDao.querySceneByPage(pageIndex, pageSize); + }else{ + sceneList = sceneDao.querySceneByPage(scenekName,pageIndex, pageSize); + } + //2、转换 + List sceneBOList = new ArrayList(); + if((null != sceneList) && (0 < sceneList.size())){ + SceneBO sceneBO = null; + for(Scene scene:sceneList){ + sceneBO = new SceneBO(); + BeanUtils.copyProperties(scene, sceneBO); + sceneBOList.add(sceneBO); + } + } + //3、返回 + return sceneBOList; + } + + /** + * @desc 增加场景记录 + * + * @author liuliang + * + * @param sceneBO 场景参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int addScene(SceneBO sceneBO) throws Exception { + sceneBO.setSceneStatus(SceneStatusEnum.NOT_START.value); + return sceneDao.addScene(sceneBO); + } + + /** + * @desc 更新场景记录 + * + * @author liuliang + * + * @param sceneBO 场景参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int updateScene(SceneBO sceneBO) throws Exception { + Scene scene = new Scene(); + BeanUtils.copyProperties(sceneBO, scene); + return sceneDao.updateScene(scene); + } + + /** + * @desc 删除场景记录 + * + * @author liuliang + * + * @param idList idList 链路ID(多个ID以英文","隔开) + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int removeScene(String idList) throws Exception { + return sceneDao.removeScene(idList); + } + + /** + * @desc 根据ID查询场景详情 + * + * @author liuliang + * + * @param sceneId 场景ID + * @return Scene 场景实体 + * @throws Exception + */ + @Override + public Scene getScene(long sceneId) throws Exception { + return sceneDao.getScene(sceneId); + } + + /** + * @desc 根据场景ID更新场景状态 + * + * @author liuliang + * + * @param sceneId 场景ID + * @param sceneStatus 场景转态 + * @return int 受影响的记录数 + * @throws Exception + */ + @Override + public int updateSceneStatus(long sceneId, int sceneStatus) throws Exception { + return sceneDao.updateScene(sceneId,sceneStatus); + } + + /** + * 根据linkId查询场景列表 + * + * @param linkId 链路ID + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 符合条件的场景列表 + */ + @Override + public List getSceneListByLinkId(long linkId, int pageIndex,int pageSize) throws Exception { + return sceneDao.getSceneListByLinkId(linkId,pageIndex, pageSize); + } + + /** + * 根据linkId查询包含该ID的场景数 + * + * @param linkId 链路ID + * @return int 符合条件的记录数 + * @throws Exception + */ + @Override + public int getSceneCountByLinkId(long linkId) throws Exception { + return sceneDao.getSceneCountByLinkId(String.valueOf(linkId)); + } + + /** + * @desc 更新场景状态为原始状态 + * + * @author liuliang + * + * @return int 受影响的记录数 + */ + @Override + public int resetSceneStatus() throws Exception { + return sceneDao.updateStatusAll(SceneStatusEnum.NOT_START.value); + } + + /** + * @desc 根据场景名称查询场景 + * + * @author liuliang + * + * @param sceneName + */ + @Override + public Scene getSceneByName(String sceneName) throws Exception { + return sceneDao.getSceneByName(sceneName); + } + + /** + * @desc 删除场景并更新相关连数据 + * + * @author liuliang + * + * @param sceneId + * @return + */ + @Override + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.DEFAULT, timeout = 5) + public int removeSceneAndUpdateRelatedData(long sceneId) throws Exception { + //1、删场景 + int result = sceneDao.removeScene(String.valueOf(sceneId)); + //2、删定时任务 + automaticTaskDao.delBySceneId(sceneId); + //3、删监控集 + monitorSetDao.delBySceneId(sceneId); + return result; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/interceptor/LoginInterceptor.java b/titan-manager/src/main/java/com/yunji/titan/manager/interceptor/LoginInterceptor.java new file mode 100644 index 0000000..de96d81 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/interceptor/LoginInterceptor.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.interceptor; + +import java.io.PrintWriter; +import java.util.List; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import com.yunji.titan.manager.common.TitanConstant; +import com.yunji.titan.manager.utils.CookieUtil; + +import redis.clients.jedis.JedisCluster; + +/** + * @desc 登录拦截器 + * + * @author liuliang + * + */ +@Component +public class LoginInterceptor implements HandlerInterceptor{ + + private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class); + /** + * 不需登录拦截的路径 + */ + private List uncheckUrls; + /** + * jedis + */ + @Resource + private JedisCluster jedisCluster; + + @Override + public void afterCompletion(HttpServletRequest arg0,HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { + // TODO Auto-generated method stub + } + + @Override + public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2, ModelAndView arg3) throws Exception { + // TODO Auto-generated method stub + } + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object arg2) throws Exception { + //1、获取请求的参数 + String requestUrl = request.getRequestURI(); + String ticket = CookieUtil.getCookieValueByName(request,TitanConstant.TICKET_PREFIX); + //2、验证url + if((null != uncheckUrls) && (0 < uncheckUrls.size()) && (uncheckUrls.contains(requestUrl))){ + return true; + }else{ + //3、验证ticket + String ticketInRedis = jedisCluster.get(TitanConstant.TICKET_PREFIX + ticket); + if(StringUtils.isBlank(ticket) || StringUtils.isBlank(ticketInRedis)) { + logger.warn("登录拦截,requestUrl:{},ticket:{},ticketInRedis:{}",requestUrl,ticket,ticketInRedis); + PrintWriter out = response.getWriter(); + out.println(""); + out.println(""); + out.println(""); + }else { + return true; + } + } + return false; + } + + public List getUncheckUrls() { + return uncheckUrls; + } + + public void setUncheckUrls(List uncheckUrls) { + this.uncheckUrls = uncheckUrls; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/job/MonitorTask.java b/titan-manager/src/main/java/com/yunji/titan/manager/job/MonitorTask.java new file mode 100644 index 0000000..543a319 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/job/MonitorTask.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.job; + +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import com.yunji.titan.manager.service.MonitorSetService; +import com.yunji.titan.manager.service.ReportService; + +/** + * @desc 定时清除监控数据 + * + * @author liuliang + * + */ +@Component +public class MonitorTask { + + private Logger logger = LoggerFactory.getLogger(MonitorTask.class); + + @Resource + private MonitorSetService monitorSetService; + + /** + * 测试报告服务 + */ + @Resource + private ReportService reportService; + + @Value("${monitor.agent.del.time}") + private Long monitorAgentDelTime; + @Value("${monitor.target.del.time}") + private Long monitorTargetDelTime; + + /** + * @desc 清除agent机器数据,每隔1小时1次 + * + * @author liuliang + * + */ + @Scheduled(cron = "0 0 0/1 * * ?") + public void delAgentJob() { + try { + int result = monitorSetService.delAgentMonitorByTime(monitorAgentDelTime); + logger.error("定时清除monitor agent记录数:{}",result); + } catch (Exception e) { + logger.error("定时清除monitor agent数据异常",e); + } + } + + /** + * @desc 清除target机器数据,每天晚上12点1次 + * + * @author liuliang + * + */ + @Scheduled(cron = "0 0 0 1/1 * ?") + public void delReportDataJob() { + try { + //1、删除测试报告 + int s1 = reportService.delByTime(monitorTargetDelTime); + logger.error("定时清除report记录数:{}",s1); + + //2、删除target监控数据 + int result = monitorSetService.delTargetMonitorByTime(monitorTargetDelTime); + logger.error("定时清除monitor target记录数:{}",result); + } catch (Exception e) { + logger.error("定时清除monitor target数据异常",e); + } + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/result/ComponentResult.java b/titan-manager/src/main/java/com/yunji/titan/manager/result/ComponentResult.java new file mode 100644 index 0000000..f2483b9 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/result/ComponentResult.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.result; + +/** + * @desc 业务结果类(含对象) + * + * @author liuliang + * + */ +public class ComponentResult extends Result{ + + /** + * 响应结果 + */ + private T data; + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public String toString() { + return "ComponentResult [data=" + data + "]"; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/result/Result.java b/titan-manager/src/main/java/com/yunji/titan/manager/result/Result.java new file mode 100644 index 0000000..02d5531 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/result/Result.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.result; + +/** + * @desc 业务结果类 + * + * @author liuliang + * + */ +public class Result { + /** + * 是否成功 + */ + private boolean isSuccess; + /** + * 错误码 ,必填。值为1表示成功 + */ + private int errorCode; + /** + * 错误码描述, 非必填。 当errorCode不为1时必填 + */ + private String errorMsg; + + public boolean isSuccess() { + return isSuccess; + } + public void setSuccess(boolean isSuccess) { + this.isSuccess = isSuccess; + } + public int getErrorCode() { + return errorCode; + } + public void setErrorCode(int errorCode) { + this.errorCode = errorCode; + } + public String getErrorMsg() { + return errorMsg; + } + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + @Override + public String toString() { + return "Result [isSuccess=" + isSuccess + ", errorCode=" + errorCode + ", errorMsg=" + errorMsg + "]"; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/service/AgentService.java b/titan-manager/src/main/java/com/yunji/titan/manager/service/AgentService.java new file mode 100644 index 0000000..b5d80c0 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/service/AgentService.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.service; + +/** + * @desc 操作agent节点service接口 + * + * @author liuliang + * + */ +public interface AgentService { + /** + * 执行shell脚本 + * + * @author liuliang + * + * @param commandPath + * @return + * @throws Exception + */ + String executeCommand(String commandPath) throws Exception; +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/service/AutomaticTaskService.java b/titan-manager/src/main/java/com/yunji/titan/manager/service/AutomaticTaskService.java new file mode 100644 index 0000000..5f8361d --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/service/AutomaticTaskService.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.service; + +import java.util.List; + +import com.yunji.titan.manager.bo.AutomaticTaskBO; +import com.yunji.titan.manager.entity.AutomaticTask; + +/** + * 压测任务表Service接口 + * + * @author liuliang + * + */ +public interface AutomaticTaskService { + + /** + * 查询总数量 + * + * @author liuliang + * + * @return int 总数量 + * @throws Exception + */ + int getCount() throws Exception; + + /** + * 分页查询所有数据列表 + * + * @author liuliang + * + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 数据集合 + * @throws Exception + */ + List getDataList(int pageIndex, int pageSize) throws Exception; + + /** + * 增加记录 + * + * @author liuliang + * + * @param automaticTaskBO 参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + int add(AutomaticTaskBO automaticTaskBO) throws Exception; + + /** + * 查询详情(根据主键) + * + * @author liuliang + * + * @param id + * @return + * @throws Exception + */ + AutomaticTask getDataDetail(long id) throws Exception; + + /** + * 查询详情(根据 sceneId) + * + * @author liuliang + * + * @param sceneId + * @return + * @throws Exception + */ + AutomaticTask getDataDetailBySceneId(long sceneId) throws Exception; + + /** + * 删除 + * + * @author liuliang + * + * @param id + * @return + * @throws Exception + */ + int del(long id) throws Exception; + + /** + * 更新 + * + * @author liuliang + * + * @param automaticTaskBO + * @return + * @throws Exception + */ + int update(AutomaticTaskBO automaticTaskBO) throws Exception; +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/service/LinkService.java b/titan-manager/src/main/java/com/yunji/titan/manager/service/LinkService.java new file mode 100644 index 0000000..0de7792 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/service/LinkService.java @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.service; + +import java.util.List; + +import com.yunji.titan.manager.bo.LinkBO; +import com.yunji.titan.manager.entity.Link; + +/** + * 链路表Service接口 + * + * @author liuliang + * + */ +public interface LinkService { + + /** + * 查询链路总数量 + * + * @author liuliang + * + * @return int 链路总数量 + * @throws Exception + */ + int getLinkCount() throws Exception; + + /** + * 查询符合条件的记录总数 + * + * @author liuliang + * + * @param linkName 链路名 + * @return int 符合条件的记录总数 + * @throws Exception + */ + int getLinkCount(String linkName) throws Exception; + + /** + * 分页查询所有链路列表 + * + * @author liuliang + * + * @param linkName + * @param pageIndex + * @param pageSize + * @return List + * @throws Exception + */ + List getLinkList(String linkName,int pageIndex, int pageSize) throws Exception; + + /** + * 增加链路记录 + * + * @author liuliang + * + * @param linkBO 链路参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + int addLink(LinkBO linkBO) throws Exception; + + /** + * 更新链路记录 + * + * @author liuliang + * + * @param linkBO 链路参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + int updateLink(LinkBO linkBO) throws Exception; + + /** + * 删除链路记录 + * + * @author liuliang + * + * @param idList 链路ID(多个ID以英文","隔开) + * @return int 受影响的记录数 + * @throws Exception + */ + int removeLink(String idList) throws Exception; + + /** + * 根据ID查询链路详情 + * + * @author liuliang + * + * @param linkId 链路ID + * @return Link 链路实体 + * @throws Exception + */ + Link getLink(long linkId) throws Exception; + + /** + * 根据链路ID查询链路列表 + * + * @author liuliang + * + * @param ids ids 链路ID (多个ID以英文","隔开) + * @return + * @throws Exception + */ + List getLinkListByIds(String ids) throws Exception; + + /** + * 删除链路并更新链路相关的场景 + * + * @author liuliang + * + * @param linkId 链路ID + * @param sceneCount 包含该链路ID的场景数 + * @return int 受影响的记录数 + * @throws Exception + */ + int removeLinkAndUpdateScene(long linkId,int sceneCount) throws Exception; +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/service/MonitorService.java b/titan-manager/src/main/java/com/yunji/titan/manager/service/MonitorService.java new file mode 100644 index 0000000..5b79a71 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/service/MonitorService.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.service; + +import java.util.List; + +import com.yunji.titan.manager.entity.Monitor; + +/** + * 机器资源情况service接口 + * + * @author liuliang + * + */ +public interface MonitorService { + + /** + * 查询指定条数记录 + * + * @author liuliang + * + * @param size 记录数 + * @return List + * @throws Exception + */ + List getMonitorList(int size) throws Exception; + + /** + * 查询指定条数记录(筛选去除符合时间范围的数据) + * + * @author liuliang + * + * @param size 记录数 + * @return List + * @throws Exception + */ + List getMonitorFilterList(int size) throws Exception; + + /** + * 压测报告详情页 图表数据 + * + * @author liuliang + * + * @param ips + * @return + * @throws Exception + */ + @Deprecated + List getReportDetailMonitorData(String ips) throws Exception; + + /** + * 压测报告详情页 图表数据 (时间区间) + * + * @author liuliang + * + * @param ips + * @param startTime + * @param endTime + * @return + * @throws Exception + */ + List getReportDetailMonitorData(String ips, long startTime, long endTime) throws Exception; +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/service/MonitorSetService.java b/titan-manager/src/main/java/com/yunji/titan/manager/service/MonitorSetService.java new file mode 100644 index 0000000..57368b5 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/service/MonitorSetService.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.service; + +import java.util.List; +import java.util.Map; + +import com.yunji.titan.manager.bo.MonitorSetBO; +import com.yunji.titan.manager.bo.ReportBO; +import com.yunji.titan.manager.entity.Monitor; + +/** + * 监控集service接口 + * + * @author liuliang + * + */ +public interface MonitorSetService { + + /** + * 查询总记录数 + * + * @author liuliang + * + * @return + * @throws Exception + */ + int getCount() throws Exception; + + /** + * 分页查询数据列表 + * + * @author liuliang + * + * @param pageIndex + * @param pageSize + * @return + * @throws Exception + */ + List getDataList(int pageIndex, int pageSize) throws Exception; + + /** + * 删除数据 + * + * @author liuliang + * + * @param ids + * @return + * @throws Exception + */ + int del(String ids) throws Exception; + + /** + * 新增 + * + * @author liuliang + * + * @param monitorSetBO + * @return + * @throws Exception + */ + int add(MonitorSetBO monitorSetBO) throws Exception; + + /** + * 修改 + * + * @author liuliang + * + * @param monitorSetBO + * @return + * @throws Exception + */ + int update(MonitorSetBO monitorSetBO) throws Exception; + + /** + * 压测报告详情页 图表数据 + * + * @author liuliang + * + * @param request + * @param reportBO + * @return + * @throws Exception + */ + public Map> getReportDetailMonitorData(ReportBO reportBO) throws Exception; + + /** + * 删除指定时间之前的monitor agent数据 + * + * @author liuliang + * + * @param breforeTime 多久之前(单位:s) + * @return int 受影响的记录数 + * @throws Exception + */ + int delAgentMonitorByTime(Long breforeTime) throws Exception; + + /** + * 删除指定时间之前的monitor agent数据 + * + * @author liuliang + * + * @param breforeTime 多久之前(单位:s) + * @return int 受影响的记录数 + * @throws Exception + */ + int delTargetMonitorByTime(Long breforeTime) throws Exception; + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/service/OperateService.java b/titan-manager/src/main/java/com/yunji/titan/manager/service/OperateService.java new file mode 100644 index 0000000..43868ef --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/service/OperateService.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.service; + +import com.yunji.titan.manager.bo.ActionPerformanceBO; +import com.yunji.titan.utils.TaskIssuedBean; + +/** + * 操作Service接口 + * + * @author liuliang + * + */ +public interface OperateService { + + /** + * 获取执行压测操作参数 + * + * @author liuliang + * + * @param sceneId 场景ID + * @return ActionPerformanceBO + * @throws Exception + */ + ActionPerformanceBO getActionParamer(long sceneId) throws Exception; + + /** + * 自动化压测任务 + * + * @author liuliang + * + * @param sceneId + * @param executeNum + * @throws Exception + */ + void doAutomaticTask(long sceneId,int executeNum) throws Exception; + + /** + * 压测参数bean转换 + * + * @author liuliang + * + * @param ap + * @param tb + */ + void copyBeanProperties(ActionPerformanceBO ap, TaskIssuedBean tb); +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/service/ReportService.java b/titan-manager/src/main/java/com/yunji/titan/manager/service/ReportService.java new file mode 100644 index 0000000..b87576a --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/service/ReportService.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.service; + +import java.util.List; + +import com.yunji.titan.manager.bo.ReportBO; +import com.yunji.titan.manager.entity.Report; + +/** + * 测试报告表Service接口 + * + * @author liuliang + * + */ +public interface ReportService { + + /** + * 查询测试报告总数量 + * + * @author liuliang + * + * @return int 测试报告总数量 + * @throws Exception + */ + int getReportCount() throws Exception; + + /** + * 查询符合条件的报告数量 + * + * @author liuliang + * + * @param reportName + * @return int 总数量 + * @throws Exception + */ + int getReportCount(String reportName) throws Exception; + + /** + * 分页查询所有测试报告列表 + * + * @author liuliang + * + * @param reportName 报告名称 + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return + * @throws Exception + */ + List getReportList(String reportName, int pageIndex, int pageSize) throws Exception; + + /** + * 根据测试报告ID查询详情列表 + * + * @author liuliang + * + * @param idList 测试报告ID ,多个ID,以英文','隔开 + * @return List 测试报告详情集合 + * @throws Exception + */ + List getReportListById(String idList) throws Exception; + + /** + * 删除测试报告 + * + * @author liuliang + * + * @param ids 测试报告ID(多个ID以英文","隔开) + * @return int 受影响的记录数 + * @throws Exception + */ + int removeReport(String ids) throws Exception; + + /** + * 增加测试报告记录 + * + * @author liuliang + * + * @param reportBO 测试报告参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + int addReport(ReportBO reportBO) throws Exception; + + /** + * 删除指定时间之前的数据 + * + * @author liuliang + * + * @param breforeTime 多久之前(单位:s) + * @return int 受影响的记录数 + * @throws Exception + */ + int delByTime(Long breforeTime) throws Exception; + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/service/SceneService.java b/titan-manager/src/main/java/com/yunji/titan/manager/service/SceneService.java new file mode 100644 index 0000000..7898fd9 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/service/SceneService.java @@ -0,0 +1,173 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.service; + +import java.util.List; + +import com.yunji.titan.manager.bo.SceneBO; +import com.yunji.titan.manager.entity.Scene; + +/** + * 场景表Service接口 + * + * @author liuliang + * + */ +public interface SceneService { + + /** + * 查询场景总数量 + * + * @author liuliang + * + * @return int 场景总数量 + * @throws Exception + */ + int getSceneCount() throws Exception; + + /** + * 查询符合条件的记录总数 + * + * @author liuliang + * + * @param scenekName 场景名 + * @return int 符合条件的记录总数 + * @throws Exception + */ + int getSceneCount(String scenekName) throws Exception ; + + /** + * 分页查询所有场景列表 + * + * @author liuliang + * @param scenekName + * + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 场景BO集合 + * @throws Exception + */ + List getSceneList(String scenekName, int pageIndex, int pageSize) throws Exception ; + + /** + * 增加场景记录 + * + * @author liuliang + * + * @param sceneBO 场景参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + int addScene(SceneBO sceneBO) throws Exception ; + + /** + * 更新场景记录 + * + * @author liuliang + * + * @param sceneBO 场景参数BO + * @return int 受影响的记录数 + * @throws Exception + */ + int updateScene(SceneBO sceneBO) throws Exception ; + + /** + * 删除场景记录 + * + * @author liuliang + * + * @param idList idList 链路ID(多个ID以英文","隔开) + * @return int 受影响的记录数 + * @throws Exception + */ + int removeScene(String idList) throws Exception ; + + /** + * 根据ID查询场景详情 + * + * @author liuliang + * + * @param sceneId 场景ID + * @return Scene 场景实体 + * @throws Exception + */ + Scene getScene(long sceneId) throws Exception ; + + /** + * 根据场景ID更新场景状态 + * + * @author liuliang + * + * @param sceneId 场景ID + * @param sceneStatus 场景转态 + * @return int 受影响的记录数 + * @throws Exception + */ + int updateSceneStatus(long sceneId,int sceneStatus) throws Exception ; + + /** + * 根据linkId查询场景列表 + * + * @param linkId 链路ID + * @param pageIndex 当前页 + * @param pageSize 每页条数 + * @return List 符合条件的场景列表 + * @throws Exception + */ + List getSceneListByLinkId(long linkId,int pageIndex,int pageSize) throws Exception ; + + /** + * 根据linkId查询包含该ID的场景数 + * + * @param linkId 链路ID + * @return int 符合条件的记录数 + * @throws Exception + */ + int getSceneCountByLinkId(long linkId) throws Exception ; + + /** + * 更新场景状态为原始状态 + * + * @author liuliang + * + * @return int 受影响的记录数 + * @throws Exception + */ + int resetSceneStatus() throws Exception ; + + /** + * 根据场景名称查询场景 + * + * @author liuliang + * + * @param sceneName + * @return + * @throws Exception + */ + Scene getSceneByName(String sceneName) throws Exception ; + + /** + * 删除场景并更新相关连数据 + * + * @author liuliang + * + * @param sceneId + * @return + * @throws Exception + */ + int removeSceneAndUpdateRelatedData(long sceneId) throws Exception ; +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/CommonTypeUtil.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/CommonTypeUtil.java new file mode 100644 index 0000000..4be3b2c --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/CommonTypeUtil.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils; + +import com.yunji.titan.utils.ProtocolType; +import com.yunji.titan.utils.RequestType; + +/** + * @desc 通用类型转换工具类 + * + * @author liuliang + * + */ +public class CommonTypeUtil { + + /** + * @desc 根据协议值获取协议枚举类型 + * + * @author liuliang + * + * @param value 协议值(0:http 1:https) + * @return ProtocolType 协议类型 枚举,默认返回HTTP + */ + public static ProtocolType getProtocolType(int value){ + switch (value) { + case 0: + return ProtocolType.HTTP; + case 1: + return ProtocolType.HTTPS; + default: + return ProtocolType.HTTP; + } + } + + /** + * @desc 根据请求类型值获取请求类型 + * + * @author liuliang + * + * @param value 类型值(0:get 1:post) + * @return 请求类型枚举 ,默认返回 GET + */ + public static RequestType getRequestType(int value){ + switch (value) { + case 0: + return RequestType.GET; + case 1: + return RequestType.POST; + default: + return RequestType.GET; + } + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/CookieUtil.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/CookieUtil.java new file mode 100644 index 0000000..43d152d --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/CookieUtil.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; + +/** + * @desc Cookie操作工具类 + * + * @author liuliang + * + */ +public class CookieUtil { + + /** + * @desc 获取cookie中指定key的值 + * + * @author liuliang + * + * @param request + * @param name cookie中的key + * @return String + */ + public static String getCookieValueByName(HttpServletRequest request, String name) { + Cookie cookie = getCookieByName(request, name); + if (cookie != null && StringUtils.isNotBlank(cookie.getValue())) { + return cookie.getValue(); + } else { + return null; + } + } + + /** + * @desc 获取cookie对象 + * + * @author liuliang + * + * @param request + * @param name + * @return Cookie + */ + public static Cookie getCookieByName(HttpServletRequest request, String name) { + Map cookieMap = readCookieMap(request); + if (cookieMap.containsKey(name)) { + Cookie cookie = (Cookie) cookieMap.get(name); + return cookie; + } else { + return null; + } + } + /** + * @desc 获取cookie中的数据,并返回map + * + * @author liuliang + * + * @param request + * @return Map + */ + private static Map readCookieMap(HttpServletRequest request) { + Map cookieMap = new HashMap(16); + Cookie[] cookies = request.getCookies(); + if (null != cookies) { + for (Cookie cookie : cookies) { + cookieMap.put(cookie.getName(), cookie); + } + } + return cookieMap; + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/EmailSender.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/EmailSender.java new file mode 100644 index 0000000..b47ead6 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/EmailSender.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils; + +import java.util.Date; +import java.util.Properties; + +import javax.mail.Address; +import javax.mail.Authenticator; +import javax.mail.BodyPart; +import javax.mail.MessagingException; +import javax.mail.Multipart; +import javax.mail.PasswordAuthentication; +import javax.mail.Session; +import javax.mail.Transport; +import javax.mail.Message.RecipientType; +import javax.mail.internet.AddressException; +import javax.mail.internet.InternetAddress; +import javax.mail.internet.MimeBodyPart; +import javax.mail.internet.MimeMessage; +import javax.mail.internet.MimeMultipart; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * @desc + * + * @author liuliang + * + */ +@Component +public class EmailSender { + + /** + * 发送者账号 + */ + @Value("${email.sender.name}") private String emailSenderName; + /** + * 发送者密码 + */ + @Value("${email.sender.password}") private String emailSenderPassword; + /** + * host + */ + private final static String MAIL_SMTP_HOST = "smtp.sina.com"; + /** + * port + */ + private final static int MAIL_SMTP_PORT = 25; + /** + * @desc 发送html格式邮件 + * + * @author liuliang + * + * @param mailSubject 邮件主题 + * @param mailContent 邮件内容 + * @param receiveAddress 接收人(多个收件人用因为','隔开) + * @return boolean + */ + public boolean sendHtml(String mailSubject, String mailContent, String receiveAddress) { + return sendHtml(mailSubject, mailContent, receiveAddress, null); + } + + /** + * @desc 发送html格式邮件 + * + * @author liuliang + * + * @param mailSubject 邮件主题 + * @param mailContent 邮件内容 + * @param receiveAddress 接收人 (多个收件人用因为','隔开) + * @param ccReceiveAddress 抄送人 (多个收件人用因为','隔开) + * @return boolean + */ + public boolean sendHtml(String mailSubject, String mailContent, String receiveAddress, String ccReceiveAddress) { + boolean flag = true; + try { + MimeMessage message = initialMessage(); + // 设置收件人 + String[] receiveAddressArray = receiveAddress.split(","); + //群发 + int len = receiveAddressArray.length; + Address[] to = new InternetAddress[len]; + for(int i=0; i + */ +package com.yunji.titan.manager.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.DataFormatter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @desc 文件操作工具类 + * + * @author liuliang + * + */ +public class FileUtil { + private static Logger logger = LoggerFactory.getLogger(FileUtil.class); + + + /** + * @desc 从文件中读取数据(只读取第一列) + * + * @author liuliang + * + * @param filePath + * @return + */ + public static List getDataFromFile(String filePath) { + if(StringUtils.isBlank(filePath)){ + return null; + } + //读取 + List dataList = new ArrayList(); + HSSFWorkbook wookbook = null; + try { + File file = new File(filePath); + FileInputStream inputStream = new FileInputStream(file); + wookbook = new HSSFWorkbook(inputStream); + HSSFSheet sheet = wookbook.getSheetAt(0); + int rows = sheet.getPhysicalNumberOfRows(); + for (int i = 0; i < rows; i++) { + HSSFRow sheetRow = sheet.getRow(i); + if (sheetRow != null) { + HSSFCell cell0 = sheetRow.getCell(0); + if (null != cell0) { + String s = new DataFormatter().formatCellValue(cell0); + dataList.add(s); + } else { + //logger.warn("该列为空->" + cell0); + } + } else { + logger.warn("该行为空,行号->" + i); + } + } + } catch (Exception e) { + logger.error("读取文件中的数据异常", e); + return null; + } finally { + if (null != wookbook) { + try { + wookbook.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + //返回 + return dataList; + } +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/Md5Util.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/Md5Util.java new file mode 100644 index 0000000..1936d40 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/Md5Util.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils; + +import java.math.BigInteger; +import java.security.MessageDigest; + +/** + * @desc MD5加密工具类 + * + * @author liuliang + * + */ +public class Md5Util { + + /** + * @desc 获取MD5加密后的字符串 + * + * @author liuliang + * + * @param str 待加密的字符串 + * @return String 加密后的字符串(若发生异常,则返回原待加密字符串) + */ + public static String getMD5Str(String str) { + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(str.getBytes()); + return new BigInteger(1, md.digest()).toString(16); + } catch (Exception e) { + e.printStackTrace(); + return str; + } + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/ResultUtil.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/ResultUtil.java new file mode 100644 index 0000000..2c41149 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/ResultUtil.java @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils; + +import org.apache.commons.lang3.StringUtils; + +import com.yunji.titan.manager.result.Result; +import com.yunji.titan.utils.ErrorCode; + +/** + * @desc 业务结果工具类 + * + * @author liuliang + * + */ +public class ResultUtil { + + /** + * @desc 成功 + * + * @author liuliang + * + * @param result + * @return + */ + public static T success(T result) { + return build(true,null,ErrorCode.SUCCESS, result); + } + + /** + * @desc 失败 + * + * @author liuliang + * + * @param result + * @return + */ + public static T fail(T result) { + return build(false,null,ErrorCode.FAIL, result); + } + + /** + * @desc 失败 + * + * @author liuliang + * + * @param result + * @return + */ + public static T fail(ErrorCode errorCode,T result) { + return build(false,null,errorCode, result); + } + + /** + * @desc 失败 + * + * @author liuliang + * + * @param result + * @return + */ + public static T fail(ErrorCode errorCode,String errMsg,T result) { + return build(false,errMsg,errorCode, result); + } + + /** + * @desc 失败 + * + * @author liuliang + * + * @param result + * @return + */ + public static T fail(int errorCode,String errMsg,T result) { + return build(false,errorCode,errMsg, result); + } + + /** + * @desc 判断是否成功 + * + * @author liuliang + * + * @param result + * @return boolean [true:成功 ,false:失败] + */ + public static boolean isSuccess(T result) { + return result == null?true:result.isSuccess(); + } + + /** + * @desc 判断是否失败 + * + * @author liuliang + * + * @param result + * @return boolean [true:失败 ,false:成功] + */ + public static boolean isfail(Result result){ + return !isSuccess(result); + } + + /** + * @desc 构建结果 + * + * @author liuliang + * + * @param isSuccess 是否成功 + * @param msg 提示信息,若为空,使用默认信息 + * @param errorCode 结果码 + * @param result 结果 + * @return Result + */ + public static T build(boolean isSuccess,String msg,ErrorCode errorCode,T result) { + result.setSuccess(isSuccess); + result.setErrorCode(errorCode.code); + result.setErrorMsg(StringUtils.isBlank(msg)?errorCode.errorMsg:msg); + return result; + } + + public static T build(boolean isSuccess,int errorCode,String errMsg,T result) { + result.setSuccess(isSuccess); + result.setErrorCode(errorCode); + result.setErrorMsg(errMsg); + return result; + } + + public static T copy(S source,T target){ + if(source == null || target ==null){ + return null; + } + target.setErrorCode(source.getErrorCode()); + target.setErrorMsg(source.getErrorMsg()); + target.setSuccess(source.isSuccess()); + return target; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/TicketBuilderUtil.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/TicketBuilderUtil.java new file mode 100644 index 0000000..ad888ba --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/TicketBuilderUtil.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils; + +/** + * @desc 登录ticket生成工具类 + * + * @author liuliang + * + */ +public class TicketBuilderUtil { + + /** + * @desc 生成ticket + * + * @author liuliang + * + * @param parameter 参与生成ticket的变量 + */ + public static final String getTicket(String parameter){ + return Md5Util.getMD5Str(System.nanoTime() + Math.round(Integer.MAX_VALUE) + parameter); + } + +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/TitanDateUtil.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/TitanDateUtil.java new file mode 100644 index 0000000..b89c504 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/TitanDateUtil.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils; + +/** + * @desc 日期工具类 + * + * @author liuliang + * + */ +public class TitanDateUtil { + + /** + * @desc 根据毫秒数获取转换为时、分、秒后的描述 + * + * @author liuliang + * + * @param second 秒 + * @return String + */ + public static String getDescBySecond(long seconds){ + String timeStr = seconds + "秒"; + if (seconds > 60) { + long second = seconds % 60; + long min = seconds / 60; + timeStr = min + "分" + second + "秒"; + if (min > 60) { + min = (seconds / 60) % 60; + long hour = (seconds / 60) / 60; + timeStr = hour + "小时" + min + "分" + second + "秒"; + } + } + return timeStr; + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/ValidatorUtil.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/ValidatorUtil.java new file mode 100644 index 0000000..68b8474 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/ValidatorUtil.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.BindingResult; +import org.springframework.validation.FieldError; + +import com.yunji.titan.manager.result.Result; +import com.yunji.titan.utils.ErrorCode; + +/** + * @desc 参数校验工具类 + * + * @author liuliang + * + */ +public class ValidatorUtil { + private static Logger logger = LoggerFactory.getLogger(ValidatorUtil.class); + /** + * @desc 根据BindingResult获取数据校验信息 + * + * @author liuliang + * + * @param br + * @return + */ + public static Result getValidResult(BindingResult br){ + if(!br.hasErrors()){ + return ResultUtil.success(new Result()); + }else{ + List list = br.getFieldErrors(); + StringBuilder sb = new StringBuilder(); + for (FieldError e: list) { + sb.append(e.getField()).append(":").append(e.getDefaultMessage()).append(";"); + } + String errorMessage = StringUtils.removeEnd(sb.toString(),";"); + logger.error("参数异常,errorMessage:{}",errorMessage); + return ResultUtil.fail(ErrorCode.REQUEST_PARA_ERROR,errorMessage,new Result()); + } + } +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/DistributedTimerTask.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/DistributedTimerTask.java new file mode 100644 index 0000000..5752d5a --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/DistributedTimerTask.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils.timertask; + +/** + * 分布式定时任务 + * + * @author gaoxianglong + */ +public interface DistributedTimerTask { + /** + * 添加分布式定时任务 + * + * @author gaoxianglong + * + * @param taskName + * 任务名称 + * + * @exception Exception + * + * @return boolean 任务添加结果 + */ + public boolean addTask(String taskName); + + /** + * 删除分布式定时任务 + * + * @author gaoxianglong + * + * @param taskName + * 任务名称 + * + * @exception Exception + * + * @return boolean 任务删除结果 + */ + public boolean deleteTask(String taskName); +} diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/DistributedTimerTaskImpl.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/DistributedTimerTaskImpl.java new file mode 100644 index 0000000..d31c6a8 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/DistributedTimerTaskImpl.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils.timertask; + +import javax.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; +/** + * 分布式定时任务 + * + * @author gaoxianglong + */ +@Service("distributedTimerTask") +public class DistributedTimerTaskImpl implements DistributedTimerTask { + @Resource + private TimerTaskListener timerTaskListener; + + @Override + public boolean addTask(String taskName) { + return notifyTask(taskName, new String("taskName=" + taskName + "\n" + "type=true")); + } + + @Override + public boolean deleteTask(String taskName) { + return notifyTask(taskName, new String("taskName=" + taskName + "\n" + "type=false")); + } + + /** + * 通知其他节点任务发生变化需要重新更新本地 + * + * @author gaoxianglong + */ + private boolean notifyTask(String taskName, String task) { + boolean result = false; + if (StringUtils.isEmpty(taskName)) { + return result; + } + return timerTaskListener.synTask(task.getBytes()); + } +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/MasterElection.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/MasterElection.java new file mode 100644 index 0000000..d108c75 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/MasterElection.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils.timertask; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import com.yunji.titan.utils.NodePath; +import com.yunji.titan.utils.ZookeeperConnManager; + +/** + * 如果能够获取到分布式锁,则意味着可以执行任务调度 + * + * @author gaoxianglong + */ +@Service +public class MasterElection implements Watcher { + private ZooKeeper zkClient; + @Resource + private ZookeeperConnManager zookeeperConnManager; + private String nodePath = NodePath.TIMETASK_LOCK_NODEPATH; + protected static boolean IS_MASTER = false; + private Logger log = LoggerFactory.getLogger(MasterElection.class); + + public @PostConstruct void init() { + zkClient = zookeeperConnManager.getZkClient(); + createNode(); + } + + /** + * 创建临时节点 + * + * @author gaoxianglong + * + * @exception Exception + * + * @return void + */ + private void createNode() { + try { + /* 验证临时节点是否已经被创建 */ + if (null == zkClient.exists(nodePath, false)) { + zkClient.create(nodePath, new byte[] {}, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); + log.info("mode --> 成功获取到分布式锁,可执行定时任务调度"); + IS_MASTER = true; + } else { + zkClient.exists(nodePath, this); + } + } catch (KeeperException e) { + try { + /* 如果节点已经存在,则监听 */ + zkClient.exists(nodePath, this); + } catch (Exception e1) { + log.error("error", e1); + } + } catch (Exception e) { + log.error("error", e); + } + } + + @Override + public void process(WatchedEvent event) { + try { + /* 重新注册节点 */ + zkClient.exists(nodePath, this); + EventType eventType = event.getType(); + switch (eventType) { + case NodeDeleted: + createNode(); + break; + default: + break; + } + } catch (Exception e) { + log.error("error", e); + } + } +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TaskExecutor.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TaskExecutor.java new file mode 100644 index 0000000..cdc9814 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TaskExecutor.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils.timertask; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import com.yunji.titan.utils.ThreadPoolManager; +/** + * 自动压测任务 + * + * @author liuliang + * + */ +@Service +public class TaskExecutor { + private SimpleDateFormat dateFormat; + protected static Map tasksMap; + @Resource + private ThreadPoolManager tpManager; + private Logger log = LoggerFactory.getLogger(TaskExecutor.class); + + public TaskExecutor() { + dateFormat = new SimpleDateFormat("HH:mm:ss"); + tasksMap = new HashMap<>(); + } + + private @PostConstruct void execute() { + new Thread() { + @Override + public void run() { + while (true) { + /* 只有拿到锁后才允许执行任务调度 */ + if (MasterElection.IS_MASTER) { + synchronized (tasksMap) { + Set taskNames = tasksMap.keySet(); + for (String taskName : taskNames) { + TaskInfoBean taskinfoBean = tasksMap.get(taskName); + if (taskinfoBean.getTime().equals(dateFormat.format(new Date()))) { + tpManager.getThreadPool().execute(taskinfoBean.getTask()); + } + } + } + } + try { + TimeUnit.SECONDS.sleep(1); + } catch (InterruptedException e) { + log.error("error", e); + } + } + } + }.start(); + } +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TaskInfoBean.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TaskInfoBean.java new file mode 100644 index 0000000..00b0761 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TaskInfoBean.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils.timertask; + +/** + * 任务信息Bean + * + * @author gaoxianglong + */ +public class TaskInfoBean { + private String time; + private Runnable task; + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public Runnable getTask() { + return task; + } + + public void setTask(Runnable task) { + this.task = task; + } +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TimerTaskListener.java b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TimerTaskListener.java new file mode 100644 index 0000000..1a2a7e4 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/manager/utils/timertask/TimerTaskListener.java @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.utils.timertask; + +import java.io.StringReader; +import java.text.SimpleDateFormat; +import java.util.Map; +import java.util.Properties; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import com.yunji.titan.manager.entity.AutomaticTask; +import com.yunji.titan.manager.service.AutomaticTaskService; +import com.yunji.titan.manager.service.OperateService; +import com.yunji.titan.utils.NodePath; +import com.yunji.titan.utils.ZookeeperConnManager; +/** + * 自动压测任务监听 + * + * @author liuliang + * + */ +@Service +public class TimerTaskListener implements Watcher { + private ZooKeeper zkClient; + @Resource + private ZookeeperConnManager zookeeperConnManager; + private String nodePath = NodePath.TIMETASK_NODEPATH; + private Logger log = LoggerFactory.getLogger(TimerTaskListener.class); + + /** + * 自动压测任务服务 + */ + @Resource + private AutomaticTaskService automaticTaskService; + + /** + * 操作服务 + */ + @Resource + private OperateService operateService; + + public @PostConstruct void init() { + zkClient = zookeeperConnManager.getZkClient(); + createNode(); + } + + /** + * 创建临时节点 + * + * @author gaoxianglong + * + * @exception Exception + * + * @return void + */ + private void createNode() { + try { + /* 验证临时节点是否已经被创建 */ + if (null == zkClient.exists(nodePath, false)) { + zkClient.create(nodePath, new byte[] {}, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); + } + zkClient.exists(nodePath, this); + } catch (KeeperException e) { + try { + zkClient.exists(nodePath, this); + } catch (Exception e1) { + log.error("error", e1); + } + } catch (Exception e) { + log.error("error", e); + } + } + + /** + * 将任务同步给所有的子节点 + * + * @author gaoxianglong + */ + protected boolean synTask(byte[] task) { + boolean result = false; + try { + result = null != zkClient.setData(nodePath, task, -1) ? true : result; + } catch (Exception e) { + log.error("error", e); + } + return result; + } + + @Override + public void process(WatchedEvent event) { + try { + /* 重新注册节点 */ + zkClient.exists(nodePath, this); + EventType eventType = event.getType(); + switch (eventType) { + case NodeDataChanged: + byte[] value = zkClient.getData(nodePath, false, null); + if (null != value) { + Properties properties = new Properties(); + properties.load(new StringReader(new String(value))); + Map tasksMap = TaskExecutor.tasksMap; + synchronized (tasksMap) { + final String taskName = properties.getProperty("taskName"); + log.info("探测到定时任务-->" + taskName + "发生更新,准备重置本地定时任务"); + if (properties.getProperty("type").equals("true")) { + // 新增、修改 + AutomaticTask automaticTask = automaticTaskService + .getDataDetailBySceneId(Long.parseLong(taskName)); + String time = new SimpleDateFormat("HH:mm:ss").format(automaticTask.getStartTime()); + /* 执行次数 */ + final int executeNum = automaticTask.getPressureTimes(); + TaskInfoBean taskInfoBean = new TaskInfoBean(); + taskInfoBean.setTime(time); + taskInfoBean.setTask(new Runnable() { + @Override + public void run() { + try { + operateService.doAutomaticTask(Long.parseLong(taskName), executeNum); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + tasksMap.put(taskName, taskInfoBean); + } else { // 删除 + tasksMap.remove(taskName); + } + } + } + break; + default: + break; + } + } catch (Exception e) { + log.error("error", e); + } + } +} \ No newline at end of file diff --git a/titan-manager/src/main/java/com/yunji/titan/task/facade/TaskFacade.java b/titan-manager/src/main/java/com/yunji/titan/task/facade/TaskFacade.java new file mode 100644 index 0000000..87435b2 --- /dev/null +++ b/titan-manager/src/main/java/com/yunji/titan/task/facade/TaskFacade.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.facade; + +import com.yunji.titan.utils.Result; +import com.yunji.titan.utils.TaskIssuedBean; + +/** + * Task服务外观类,将需要对外提供的接口进行统一封装 + * + * @author gaoxianglong + */ +public interface TaskFacade { + /** + * 启动压测 + * + * @author gaoxianglong + * + * @param taskIssuedBean + * 任务下发Bean + * + * @return Result + */ + public Result startPerformanceTest(TaskIssuedBean taskIssuedBean); + + /** + * 停止压测 + * + * @author gaoxianglong + * + * @param senceId + * 场景ID + * + * @return Result + */ + public Result stopPerformanceTest(Integer senceId); + + /** + * agent领取压测任务 + * + * @author gaoxianglong + * + * @param zNode + * agent的zNode + * + * @return Result + */ + public Result pullTask(String zNode); + + /** + * 获取注册中心所有的agent的hostAddress信息 + * + * @author gaoxianglong + * + * @return Result + */ + public Result getAgentsHostAddress(); +} \ No newline at end of file diff --git a/titan-manager/src/main/resources/dao-context.xml b/titan-manager/src/main/resources/dao-context.xml new file mode 100644 index 0000000..ccc0c69 --- /dev/null +++ b/titan-manager/src/main/resources/dao-context.xml @@ -0,0 +1,57 @@ + + + + + + + + classpath:properties/config.properties + classpath:properties/dubbo.properties + classpath:properties/redis.properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-manager/src/main/resources/dubbo-context.xml b/titan-manager/src/main/resources/dubbo-context.xml new file mode 100644 index 0000000..b159f69 --- /dev/null +++ b/titan-manager/src/main/resources/dubbo-context.xml @@ -0,0 +1,21 @@ + + + + + + + + \ No newline at end of file diff --git a/titan-manager/src/main/resources/ftp-context.xml b/titan-manager/src/main/resources/ftp-context.xml new file mode 100644 index 0000000..20a5155 --- /dev/null +++ b/titan-manager/src/main/resources/ftp-context.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-manager/src/main/resources/log4j.xml b/titan-manager/src/main/resources/log4j.xml new file mode 100644 index 0000000..8d66758 --- /dev/null +++ b/titan-manager/src/main/resources/log4j.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-manager/src/main/resources/properties/config.properties b/titan-manager/src/main/resources/properties/config.properties new file mode 100644 index 0000000..da5e569 --- /dev/null +++ b/titan-manager/src/main/resources/properties/config.properties @@ -0,0 +1,76 @@ +#dubbo服务zk +dubbo.registry.address= + +#登录ticket效时间,-1表示永久有效(单位:s) +ticket.expire.time=3600 + +#登录用户、密码 +titan.manager.user=yj1001,123|yj1002,abc|aa,11 + +#mysql数据源 +name= +passWord= +url= +initialSize=10 +minIdle=10 +maxActive=50 +maxWait=6000 +poolPreparedStatements=false +maxOpenPreparedStatements=-1 +testOnBorrow=false +testOnReturn=false +testWhileIdle=true +filters=mergeStat,log4j,config +connectionProperties=config.decrypt=false +useGlobalDataSourceStat=false +timeBetweenLogStatsMillis=300000 + +#压测文件上传存放目录 +pressure.data.filepath=${user.home}/ + +#redis缓存地址配置 +redis.host= +redis.port= + +#测试报告邮件发送信息配置(yunjititan压测报告) +mail.subject=yunjititan\u538B\u6D4B\u62A5\u544A +mail.receive.address= +mail.cc.receive.address= + +#邮箱发送账号信息 +email.sender.name= +email.sender.password= + +#项目访问路径 +base.path=http://ip:port/titan-manager/ + +#压测文件ftp +ftp.hostname= +ftp.userName=titan-ftp +ftp.passWord=fj39sl20 +ftp.encoding=UTF-8 +ftp.bufferSize=1024 +ftp.connectTimeout=10000 +ftp.soTimeout=30000 + +#agent节点命令路径 +start.agent.path=shell/start-agents.sh +stop.agent.path=shell/shutdown-agents.sh +restart.agent.path=shell/restart-agents.sh + +#自动压测任务zk +zk.address= +zk.session.timeout=5000 + +#自动压测任务线程池 +tp_core_poolsize=10 +tp_maximum_poolsize=100 +tp_keepalive_time=2 +tp_capacity=10 + +#agentchart数据点数量 +agent.chart.datanum=50 +#monitor定时清除多久以前的数据,agent机器(单位:s) +monitor.agent.del.time=3600 +#monitor定时清除多久以前的数据,target机器(单位:s) +monitor.target.del.time=604800 \ No newline at end of file diff --git a/titan-manager/src/main/resources/properties/dubbo.properties b/titan-manager/src/main/resources/properties/dubbo.properties new file mode 100644 index 0000000..d0962ec --- /dev/null +++ b/titan-manager/src/main/resources/properties/dubbo.properties @@ -0,0 +1,7 @@ +dubbo.container=spring +dubbo.log4j.file=logs/titan_manager.log +dubbo.log4j.level=WARN +dubbo.consumer.check=false +dubbo.consumer.cluster=failfast +dubbo.registry.file=dubbo-registry/dubbo-registry.properties +dubbo.application.name=titan_manager \ No newline at end of file diff --git a/titan-manager/src/main/resources/properties/redis.properties b/titan-manager/src/main/resources/properties/redis.properties new file mode 100644 index 0000000..8f5274f --- /dev/null +++ b/titan-manager/src/main/resources/properties/redis.properties @@ -0,0 +1,6 @@ +redis.pool.maxTotal=100 +redis.pool.minIdle=10 +redis.pool.maxIdle=50 +redis.pool.maxWait=5000 +redis.pool.testOnBorrow=true +redis.pool.testOnReturn=true \ No newline at end of file diff --git a/titan-manager/src/main/resources/redis-context.xml b/titan-manager/src/main/resources/redis-context.xml new file mode 100644 index 0000000..26dd929 --- /dev/null +++ b/titan-manager/src/main/resources/redis-context.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-manager/src/main/resources/shell/restart-agents.sh b/titan-manager/src/main/resources/shell/restart-agents.sh new file mode 100644 index 0000000..027925e --- /dev/null +++ b/titan-manager/src/main/resources/shell/restart-agents.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +#每台机器启动的agent节点数量 +AGENT_NUM=2 + +#所有agent机器地址 +AGENT_ADDRESS=('192.168.1.1' +'192.168.1.2' +) + +#停止所有机器上的agents节点 +for address in ${AGENT_ADDRESS[*]} +do + nohup ssh root@$address "cd /usr/local/yunji/titan-agent; sh shutdown.sh &" >/dev/null 2>log & +done +echo '所有机器上的agent节点已经全部停止' + +#等待所有机器上的agent节点全部停止后再重启 +sleep 5 + +#重新启动所有机器上的agent节点 +for i in `seq 1 $AGENT_NUM` +do + for address in ${AGENT_ADDRESS[*]} + do + nohup ssh root@$address "cd /usr/local/yunji/titan-agent; sh start.sh &" >/dev/null 2>log & + done +done +echo '所有机器上的agent节点已经全部重启' diff --git a/titan-manager/src/main/resources/shell/shutdown-agents.sh b/titan-manager/src/main/resources/shell/shutdown-agents.sh new file mode 100644 index 0000000..abb4a85 --- /dev/null +++ b/titan-manager/src/main/resources/shell/shutdown-agents.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +#每台机器启动的agent节点数量 +AGENT_NUM=2 + +#所有agent机器地址 +AGENT_ADDRESS=('192.168.1.1' +'192.168.1.2' +) + +#停止所有机器上的agents节点 +for address in ${AGENT_ADDRESS[*]} +do + nohup ssh root@$address "cd /usr/local/yunji/titan-agent; sh shutdown.sh &" >/dev/null 2>log & +done +sleep 5 +echo '所有机器上的agent节点已经全部停止' + diff --git a/titan-manager/src/main/resources/shell/start-agents.sh b/titan-manager/src/main/resources/shell/start-agents.sh new file mode 100644 index 0000000..3bd88bd --- /dev/null +++ b/titan-manager/src/main/resources/shell/start-agents.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +#每台机器启动的agent节点数量 +AGENT_NUM=2 + +#所有agent机器地址 +AGENT_ADDRESS=('192.168.1.1' +'192.168.1.2' +) + +#重新启动所有机器上的agent节点 +for i in `seq 1 $AGENT_NUM` +do + for address in ${AGENT_ADDRESS[*]} + do + nohup ssh root@$address "cd /usr/local/yunji/titan-agent; sh start.sh &" >/dev/null 2>log & + done +done +sleep 5 +echo '所有机器上的agent节点已经全部重启' diff --git a/titan-manager/src/main/resources/springmvc-root.xml b/titan-manager/src/main/resources/springmvc-root.xml new file mode 100644 index 0000000..c2257e0 --- /dev/null +++ b/titan-manager/src/main/resources/springmvc-root.xml @@ -0,0 +1,80 @@ + + + + + + + + classpath:properties/config.properties + classpath:properties/dubbo.properties + classpath:properties/redis.properties + + + + + + + + + + + + + + + + + + + + + + + text/plain;charset=UTF-8 + + + + + + + applicaton/json;charset=UTF-8 + + + + + + + + + + + + + + /titan-manager/user/login + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-manager/src/main/resources/zk-context.xml b/titan-manager/src/main/resources/zk-context.xml new file mode 100644 index 0000000..57d16cd --- /dev/null +++ b/titan-manager/src/main/resources/zk-context.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-manager/src/main/webapp/META-INF/MANIFEST.MF b/titan-manager/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000..5e94951 --- /dev/null +++ b/titan-manager/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/main.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/main.jsp new file mode 100644 index 0000000..c8995bc --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/main.jsp @@ -0,0 +1,197 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + + +TITAN + + + + + + + +
+
+
+ +
+
+ 退出 +
+
+ + + +
+ +
+
+ +
+ + + + + + + \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/monitor/monitor_list.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/monitor/monitor_list.jsp new file mode 100644 index 0000000..f4942a9 --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/monitor/monitor_list.jsp @@ -0,0 +1,322 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +
+ +
+
+ 监控集列表 +
+ + + + + + + + + +
+
+
场景名称内网IP
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/overview.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/overview.jsp new file mode 100644 index 0000000..84246cb --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/overview.jsp @@ -0,0 +1,350 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> + +
+
+
+
当前Agent状态:
+
+
+
+ + + + +
+
+
+
+
我的全链路压测:
+
+ + + + + + + + + + + + + + + +
 链路您当前有0个链路
 场景您当前有0个场景
 报告您当前有0个报告
+
+
+
+ +
+
Agent性能监控:
+
+
+ CPU使用率(%) +
+
+
+
+
+
+ 内存使用率(%) +
+
+
+
+
+
+ 磁盘IOPS(次/秒) +
+
+
+
+
+ +
+ + + \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/pressure/do_pressure.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/do_pressure.jsp new file mode 100644 index 0000000..df0454c --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/do_pressure.jsp @@ -0,0 +1,198 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +
+
+
+ 场景构建成功,可以启动压测 +
+
+
+ + +
+
+ + + + + + + + + +
并发用户数总并发请求数期待吞吐量
+
+
+ + + + + + + + + +
链路ID链路名称创建时间
+
+
+ \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/pressure/do_pressure_list.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/do_pressure_list.jsp new file mode 100644 index 0000000..5f8469b --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/do_pressure_list.jsp @@ -0,0 +1,434 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> + +
+
+
+
+ + +
+
+
+
+
+
    +
  • 压测场景列表
  • +
  • 自动化压测任务列表
  • +
+
+
+
+ +
+ + + + + + + + + + + +
场景ID场景名称创建时间状态操作
+
+
+
+
+
+
+
+ + + + + + + + + + + +
场景ID场景名称定时压测开始时间压测次数操作
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/pressure/link_add.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/link_add.jsp new file mode 100644 index 0000000..34b27da --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/link_add.jsp @@ -0,0 +1,264 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +
+
+
+ 链路管理 >> +
+
+
+
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + + +
+
+
+
+ 保存 + 取消 +
+
+
+
+
+
+ \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/pressure/link_list.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/link_list.jsp new file mode 100644 index 0000000..487f62f --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/link_list.jsp @@ -0,0 +1,211 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +
+
+
+
+ + +
+
+ +
+
+
+ 链路列表 +
+ + + + + + + + + + + +
+
+
链路ID链路名称创建时间修改时间
+
+
+
+
+
+ \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/pressure/scene_add.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/scene_add.jsp new file mode 100644 index 0000000..f5be3a9 --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/scene_add.jsp @@ -0,0 +1,491 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> + +
+
+
+ 场景管理 >> +
+
+
+
+
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+
+ +
+
+
+ +
+
+
+
+ +
+ +
+ +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ + +
+
+ +
+ +
+ +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + +
链路ID链路名称操作
+ + +
+ +
+
+
+ +
+ + +
+ + + + + + + + + + + +
 链路调用关系
+
+
+
+
+ 保存 + 取消 +
+
+ +
+
+ +
+ +
+ \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/pressure/scene_list.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/scene_list.jsp new file mode 100644 index 0000000..60991ad --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/pressure/scene_list.jsp @@ -0,0 +1,211 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +
+
+
+
+ + +
+
+ +
+
+
+ 场景列表 +
+ + + + + + + + + + + +
+
+
场景ID场景名称创建时间修改时间
+
+
+
+
+
+ \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/report/report_detail.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/report/report_detail.jsp new file mode 100644 index 0000000..0c4f679 --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/report/report_detail.jsp @@ -0,0 +1,307 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +
+
+
+ 压测报告 >> +
+
+
+
+
+ 业务指标 +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
并发用户数总并发请求数HTTP200成功请求数业务成功请求数HTTP200成功率
     
业务成功率期待吞吐量/s实际吞吐量/s用户平均请求等待时间/ms服务器平均请求等待时间/ms
     
峰值吞吐量/s峰值持续时间开始时间结束时间持续时间
     
+
+
+
+
+ +
+
+ +
+
+
+ CPU使用率(%) +
+
+
+ +
+
+ 内存使用率(%) +
+
+
+ +
+
+ 磁盘IOPS(次/秒) +
+
+
+
+
+ \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/pages/report/report_list.jsp b/titan-manager/src/main/webapp/WEB-INF/pages/report/report_list.jsp new file mode 100644 index 0000000..6d114d4 --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/pages/report/report_list.jsp @@ -0,0 +1,267 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> + +
+
+
+
+ + +
+
+ +
+
+
+ 压测报告列表 +
+ + + + + + + + + + + +
+
+
报告名称场景名称起止时间持续时间
+
+
+
+
+
+ \ No newline at end of file diff --git a/titan-manager/src/main/webapp/WEB-INF/web.xml b/titan-manager/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..c5749e0 --- /dev/null +++ b/titan-manager/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,78 @@ + + + titan-manager + + + org.springframework.web.context.ContextLoaderListener + + + springmvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springmvc-root.xml + + 1 + + + springmvc + / + + + + + contextConfigLocation + + classpath:*-context.xml + + + + + + encodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + forceEncoding + true + + + + encodingFilter + /* + + + + + default + *.html + *.js + *.css + *.eot + *.woff + *.ttf + *.png + *.gif + *.ico + /css/*" + /plugins/**/**" + /images/* + /js/* + /error/* + + + + + index.html + + + + 404 + /error/404.html + + \ No newline at end of file diff --git a/titan-manager/src/main/webapp/css/login.css b/titan-manager/src/main/webapp/css/login.css new file mode 100644 index 0000000..7b7b517 --- /dev/null +++ b/titan-manager/src/main/webapp/css/login.css @@ -0,0 +1,97 @@ +.beg-login-bg { + /* background: url(../images/login-bg-1.jpg) no-repeat center center fixed; + background-color: #393D49; */ +} + +.beg-login-box { + width: 450px; + /* height: 330px; */ + margin: 10% auto; + background-color: rgba(255, 255, 255, 0.407843); + /* border-radius: 8px; */ + /* color: aliceblue; */ + /* border: 1px solid #c2c2c2; */ +} + +.beg-login-box header { + height: 39px; + padding: 10px; + /* border-bottom: 1px solid aliceblue; */ + /* border-bottom: 1px solid #d2d2d2; */ +} + +.beg-login-box header h1 { + text-align: center; + font-size: 25px; + line-height: 40px; +} + +.beg-login-box .beg-login-main { + height: 185px; + padding: 30px 55px 0; + background-color: #FFFFFF; +} + +.beg-login-main .layui-form-item { + position: relative; +} + +.beg-login-main .layui-form-item .beg-login-icon { + position: absolute; + color: #cccccc; + top: 10px; + left: 10px; +} + +.beg-login-main .layui-form-item input { + padding-left: 34px; + width: 100%; + +} + +.beg-login-box footer { + height: 35px; + padding: 10px 10px 0 10px; +} + +.beg-login-box footer p { + line-height: 35px; + text-align: center; +} + +.beg-pull-left { + float: left !important; +} + +.beg-pull-right { + float: right !important; +} + +.beg-clear { + clear: both; +} + +.beg-login-remember { + line-height: 38px; +} + +.beg-login-remember .layui-form-switch { + margin-top: 0px; +} + +.beg-login-code-box { + position: relative; + padding: 10px; +} + +.beg-login-code-box input { + position: absolute; + width: 100px; +} + +.beg-login-code-box img { + cursor: pointer; + position: absolute; + left: 115px; + height: 38px; +} \ No newline at end of file diff --git a/titan-manager/src/main/webapp/css/style.css b/titan-manager/src/main/webapp/css/style.css new file mode 100644 index 0000000..74f69fb --- /dev/null +++ b/titan-manager/src/main/webapp/css/style.css @@ -0,0 +1,169 @@ +.titan-index-background{ + background: url(../images/back.png) no-repeat right 140px top fixed; + background-size: 40%; + min-height: 660px; +} + +.layui-fluid{ + margin:0; + padding:0; +} +.titan-index-header{ + background-color: #1F2325; + color:#FFFFFF; + height: 42px; + line-height: 42px; + font-size: 22px; + text-shadow: rgba(0,0,0,0.9) 0px 1px 2px; + border-bottom:1px solid #868C91; +} +.titan-index-body1 > div{ + border-bottom: 1px solid #868C91; +} +.titan-index-body1-title{ + margin-top: 80px; + margin-bottom: 20px; + font-weight: bolder; + font-size: 36px; +} +.titan-index-body1-desc{ + line-height: 26px; +} +.titan-index-body1-help{ + margin-top: 20px; + text-align: right; +} +.titan-index-body1-help a{ + color: #0B6295; + font-weight: bold; +} +.titan-index-body1-help a:hover{ + color: #024167; + font-weight: bold; +} +.titan-index-body2{ + margin-top: 145px; +} +.titan-index-module{ + opacity:0.85; + color: #fff; + min-width: 800px; + min-height: 330px; +} +.titan-index-module > div{ + padding: 32px 12px; + min-height: 165px; + height: auto; +} +.titan-index-module-divodd{ + background-color: #A9BEC3; +} +.titan-index-module-diveven{ + background-color: #86a2a9; +} +.titan-index-module-title{ + font-weight: bolder; + font-size: 18px; +} +.titan-index-module-title i{ + font-size: 30px; + padding-right: 16px; +} +.titan-index-module-desc{ + margin-top: 12px; + line-height: 24px; +} +.titan-index-footer{ + background-color: #F1F1F1; + position:fixed; + bottom:0px; + width: 100%; + height: 36px; + line-height: 36px; + opacity:0.85; +} + +/* 旋转体 */ +@keyframes rotate{ + 0%{ + transform:rotateX(0deg) rotateY(0deg); + } + 100%{ + transform:rotateX(360deg) rotateY(360deg); + } +} +.rotator{ + margin-top:50px; + margin-left:80px; + perspective: 1000px; +} +.surface{ + width:200px; + height:200px; + position:relative; + color:#fff; + font-size:18px; + font-weight:bold; + text-align:center; + line-height:200px; + transform-style:preserve-3d; + transform:rotateX(-30deg) rotateY(-70deg); + animation:rotate 80s infinite linear; +} +.rotator .out-front{ + transform: translateZ(200px); +} +.rotator .out-back{ + transform: translateZ(-200px) rotateY(180deg); +} +.rotator .out-left{ + transform: translateX(-200px) rotateY(-90deg); +} +.rotator .out-right{ + transform: translateX(200px) rotateY(90deg); +} +.rotator .out-top{ + transform: translateY(-200px) rotateX(90deg); +} +.rotator .out-bottom{ + transform: translateY(200px) rotateX(-90deg); +} +.surface .in-front{ + transform: translateZ(50px); +} +.surface .in-back{ + transform: translateZ(-50px) rotateY(180deg); +} +.surface .in-left{ + transform: translateX(-50px) rotateY(-90deg); +} +.surface .in-right{ + transform: translateX(50px) rotateY(90deg); +} +.surface .in-top{ + transform: translateY(-50px) rotateX(90deg); +} +.surface .in-bottom{ + transform: translateY(50px) rotateX(-90deg); +} +.surface > div{ + width:100%; + height:100%; + border:1px solid #0B6295; + position:absolute; + opacity:0.9; + transition:transform 0.5s ease-in; + background-color:#181818; + +} +.surface > span{ + display:block; + width:100px; + height:100px; + border:1px solid #FFFFFF; + background-color:#0B6295; + position:absolute; + top:50px; + left:50px; + opacity:1; +} \ No newline at end of file diff --git a/titan-manager/src/main/webapp/css/titan.css b/titan-manager/src/main/webapp/css/titan.css new file mode 100644 index 0000000..7fc5e51 --- /dev/null +++ b/titan-manager/src/main/webapp/css/titan.css @@ -0,0 +1,90 @@ +@CHARSET "UTF-8"; +/* 内容块 */ +.titan-content-div{ + margin-top: 30px; + margin-bottom: 24px +} +/* 搜索框 */ +.titan-search-input{ + padding-left: 34px; + width: 100%; +} +.titan-search-input-s{ + text-indent: 10px; +} +/* 分页条 */ +.titan-pagebar{ + float: right; +} +.titan-pagebar2{ + float: right; +} +.titan-search-input-icon{ + position: absolute; + color: #cccccc; + top: 10px; + left: 10px; + cursor: pointer; +} +.titan-data-table{} +.titan-data-table-s{} +.titan-data-id{} +.titan-data-name{ + cursor: pointer; +} +.titan-btn{ + /* background-color: #3da5e2; */ + background-color: #0B6295; + padding: 0px 20px; +} +.titan-btn-del{ +} +.titan-btn-cancel{} +.titan-btn-topage{ + color: #090; + margin-right: 20px; +} +.titan-btn-am{ + color: #FFB800; +} +.titan-btn-am-edit{ + color: #090; + margin-right: 20px; +} +.titan-btn-am-del{ + color: #FF5722; +} +/* 保存 */ +.titan-btn-save{} +/* 添加链路关系按钮 */ +.titan-btn-relation{ + width:32%; + display:inline-block; + float:right; + margin-top: 4px; +} +/* 文件上传 */ +.titan-file-upload span{ + margin-left: 30px; +} +.titan-file-upload span a{ + color: #FF5722; +} +.titan-file-upload-desc{ + font-size: 24px; + color: #ADADAD; + position:absolute; + top:6px; + cursor: pointer; +} +.titan-head-label{ + color: #0B6295; +} +.titan-head-span{ + font-size:14px; + color:#3879D9; + margin-left: 20px; +} +.titan-span-desc{ + color: #3879D9;font-size: 16px; +} diff --git a/titan-manager/src/main/webapp/error/404.html b/titan-manager/src/main/webapp/error/404.html new file mode 100644 index 0000000..a69a08e --- /dev/null +++ b/titan-manager/src/main/webapp/error/404.html @@ -0,0 +1,10 @@ + + + + +Insert title here + + +

404

+ + \ No newline at end of file diff --git a/titan-manager/src/main/webapp/favicon.ico b/titan-manager/src/main/webapp/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..33e14aef244ee8175a9a068de28cd97967afeb3b GIT binary patch literal 67646 zcmeI5U8ogR6vxl?YFATJvs4PZqNVmAW%!UKN@YS+1l5BSl@B3Vy+l}VddqsUB#451 z5b1-mBIqe3ND0cKm&%efrE5j>VWDMacD=XXI_K=`X_z@5ch>35+IJoKJF{o+S$pmO zZ}yxsb4E|8)Wx5^z7l`WDJ>k|Rhm&Ml@=m4$;R?_S(UZv6H8@P%Ko=I;10M0?tnYs z4!8sEfIHAR2fDiWBpazZ=W6kLPB5QDxfd-$iw)~?a-WALqw;ZGd=j0>ud-mCb6?nK|9p$K(|G2Mg47aT=L(!-Yp=ra@}`!J?` zjPDB65s!=9DW0rGzoOt(jLSjBw-$95nMEgZ!;>}WHxwiH+A%%C7|-g2$3^ZFPi{j; zBIhsjU(RzyM$wVn@Z>`D396kdv8^9qd`nPAJT7vlcp|Sm&_NU%cNx!NbT67vWDcFm z4PWH?ZyZ{Qo(tY3<*N9)mB=w~GFpG7_% zB)?zKPV_js3CTEQJmv8f8bSe*3qI8>dsv@_u0eZ{%&8(C1HxYJ_1%D`qw>8zmcz$& z0qixELaleK%WEl;^Jx+JA0{t(?;3-KnajGrbR57-dHr?%3(5CFMLGw_=hVBA-`7her?(N0<@>??s7U-zkk2yYCwo2AsgbbwDzq0BiT`o( znTt|$_KkWD;IZ&8+GjxFKim21an6cVWd2z>`*uACoWGuz79%--i`4XTcK&)^T8!lU zEmG6V+4<{vX)%)Xw@6JdXXmfyrNv0j-y$`=oSna(mlh*Ae~Z-ga(4cDURsRg{4G+` z%h~zsd1*0{^S4M%FK6ek=cUC+&fg+6y_}uDo|hIQIe&}P^m2CodR|(Lv?H0lJmDnO)qEXuji%3NY39PHNBjjzn+&CBRPMI)bw(8{(4?ojO6?+Qq#-X`RjRU zF_QDQNKG$i=db6b#YoQIA~n67oxh%!79%--i`4XTcK&)^T8!lUEmG6V+4<{vX)%)X zw@6JdXXmfyrNv0j-y$`=oSna(mlh*Ae~Z-ga(4cDURsRg{4G+`%h~zsd1*0{^S4M% zFK6ek=cUC+&fg+6y_}uDo|hIQIe&}P^m2CodR|(Lv?H0lJhSfHJJS8 z_m0!bT3L@4{%Ic8ZqxEJZ=9N(bPMYE@6D6LCiEAo%`dtBJ@q#` z|N0K#k<9(MsF~llevx)l>PKvUEjdUYN#4owKeTxgRIlP2IPW6`W(Cz|- z{$l1Y*HO=+X87-+ohANz$#<#q&vpQRrXsms8btNxlGIt_{~bBsm_7RDYKRf#{AXP9 z-gYkPM~&E9Y>>faLyOto(N|w)q)oo7&9&G4p?e@ip_=UycuJpZ_H1AJKBu z6zjA`>>DfpX^ibF)Xdzs%3tzcgGPMcntfyCzml>2fMVyrl`)R^GeC^|8IxT5ZA2$f z?ELpL#!FDz>Am4L_KR-*Gp0#M?vFOhUfNlF|ChW^A$eA0MAw1r7ZrcTBXfTll6f&2 z_{+V`H_>F&aK0xSuup9K<+|?)B;S#a2L3Wexei!@T0Q{SB^v%Rd^8WehgxATZLOaF zC3iX2pFz&Qay@huD@GH48S5b=b2)j6uUoF})6DZRt@@d#z1*{%T{rPWrHmWRK|9e% z`nEj(WxVoS;C9r567FOdX>0!cFXKh>tj9X^HyVxnWz2_>JjdAd0YFpJ{AH+BEo9ls z{l4TeVtxM0c;s5(U34+Zp7b>}w2Ohie9!*^l5=2^YqRAT_=jWQd3+F0YDlNA(#9-* z86O&t9z}nmW?84Ti-o_8O}uyt$#)>-^J6;wlGK^xUmcfx){*!8pHLdpR<^~&KO6&c zPMm|X@SEf><3Z=64M^^Nw8A;7ZEXByoTtz(bR8O-b`Y@L)chx3c`Zh-Bl&kbSv*_a z9wYzY!Poe7dnEiXVl47GKhI~q;7jc?X8yn9*L{)jmus75pXsXQ+h{#z{_+fLO#J29 z=SDnRt#|(Vp0>&$w9mZ%3wN3S&c8KQKK~p0<@3L>M`3=pd+GCEmxa&&#(w(zZ|qUK z=Y5Fp^Iw;R&;Q1L7G?gw(uQjrnNRC7uK%y5ZeJVv40CxTOL=ZP_4yCB%d^gMUvngJ z>+SO~F^ll;{~sU^xwrYMl3pXuHncK>|9t8;qa8@A&%ANAlgspsd}mQ7|3^;VK9c)y zB4!c(|DSWnV}`QMBi@7zKjpa@`L0;I&ph$uyPeeM+1W17_ey=9_-Xr2%jz@Dw{~qK z2l;NRElSI|U43c9?L@w5eflu4o`jiIaEm2z(= z_f^VM8kBny^^MAz@sj-~^BXMZ(;d1S8Y(9^9Byc+9H941eZTC`YI#Lse=iRkQufpR za6hUJwDoxC8yc#{A1F`p(#B9eDQB3$Gv%XlN*FAy2=)D4spZ~Kzq?YeR_?3Bn-b!W zu-uc_KUwY$^`%OGS>?fMeOI-8qw+wteW}|1WGHW}_@68v4fQK3_5GpTTPg1j<(^8p SFO<8><>jR)%GD{*uEoE9*C)>a literal 0 HcmV?d00001 diff --git a/titan-manager/src/main/webapp/images/back.png b/titan-manager/src/main/webapp/images/back.png new file mode 100644 index 0000000000000000000000000000000000000000..03aecc58f1b752a957babb77b5df4d778e586a19 GIT binary patch literal 914190 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
-NZR;NFXn%KQtG>L?w7GMsC@-h3 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 aK<)Z3R>! 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ⅈ(LM)PmG-7^hT*N&qc{jI7Fd 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
+ + +
+
+

TITAN

+
+ 云集全链路压测军演系统具备强大的分布式压测能力,能够在短时间内发起超大规模的压测流量,使用TITAN能够快速挖掘出业务系统的性能瓶颈,探测出业务系统的真实容量水位,有指导的在大促前进行容量规划和性能优化,让系统坚如磐石。 +
+ +
+
+ +
+
+
+
+
超高的并发能力
+
操作简单
+
能够适配复杂业务场景
+
完善监控
+
分布式架构
+
自动化压测
+ + + + + + +
+
+
+
+
+

超高的并发能力

+
+ 可随意扩容Agent(压测引擎)节点,能够在短时间内发起超大规模的压测流量 +
+
+
+

操作简单

+
+ 上手简单,友好的交互体验 +
+
+
+

能够适配复杂业务场景

+
+ 支持多链路组装压测,无惧任何业务场景挑战 +
+
+
+

完善监控

+
+ 支持对压测引擎、目标机器的可视化CPU、内存、网卡、磁盘IOPS等监控 +
+
+
+

分布式架构

+
+ 基于分布式架构设计,任何一个子系统都不会成为瓶颈 +
+
+
+

自动化压测

+
+ 支持定时自动化压测任务,更好的实现线上压测常态化 +
+
+
+
+ + + +
+ + + + \ No newline at end of file diff --git a/titan-manager/src/main/webapp/js/common.js b/titan-manager/src/main/webapp/js/common.js new file mode 100644 index 0000000..825bfd1 --- /dev/null +++ b/titan-manager/src/main/webapp/js/common.js @@ -0,0 +1,79 @@ +/** + * 通用js + */ +/** + * 格式化日期 + * @param timestamp 时间戳 + * + * @return 格式化后的日期 格式: yyyy-MM-dd HH:mm:ss + */ +//全部变量 +var titanFirstPageIndex = 0; //首页索引值 +var titanPageSize = 10; //每页大小 +var titanTotalCount = 0; //总记录数初始值 +var titanDataIdArr = []; //表格选中的ID集合 +var getOperateStatusTimer; //刷新压测状态定时器 +var titanTimer1; //刷新压测状态定时器 +var titanTimer2; //刷新agent性能检测 + +//初始化方法,用于页面切换时,初始化相关参数 +function titanInitParam(){ + titanTotalCount = 0; //总记录数初始值 + titanDataIdArr = []; //表格选中的ID集合 + window.clearInterval(titanTimer1); //关闭定时任务 + window.clearInterval(titanTimer2); //关闭定时任务 +} + +//日期时间戳格式化 +function titanFormdate(timestamp){ + var tempDate = new Date(timestamp); + var yyyy = tempDate.getFullYear(); + var MM = correctForm(tempDate.getMonth() + 1); + var dd = correctForm(tempDate.getDate()); + var HH = correctForm(tempDate.getHours()); + var mm = correctForm(tempDate.getMinutes()); + var ss = correctForm(tempDate.getSeconds()); + function correctForm(i){ + if(i<=9){ + i = "0" + i; + } + return i + } + return yyyy + '-' + MM + '-' + dd + ' ' + HH + ':' + mm + ':' + ss; +}; +function titanFormdateMin(timestamp){ + var tempDate = new Date(timestamp); + var HH = correctForm(tempDate.getHours()); + var mm = correctForm(tempDate.getMinutes()); + var ss = correctForm(tempDate.getSeconds()); + function correctForm(i){ + if(i<=9){ + i = "0" + i; + } + return i + } + return HH + ':' + mm + ':' + ss; +} +//时间字符串格式为Date +function titanFormatTimeStr(timeStr){ + if(null != timeStr){ + return new Date(Date.parse('1970-01-01 ' + timeStr)); + }else{ + return null; + } +} + +//移除数组中的一个 +function titanRemoveArrDataByValue(arr, value) { + for(var i=0; ia?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),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))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),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===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(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?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.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 fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.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},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.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=fb.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=fb.selectors={cacheLength:50,createPseudo:hb,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(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===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]||fb.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]&&fb.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(cb,db).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("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.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+" ").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()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(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),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).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:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(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 sb(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 tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(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 vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(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?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(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 vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(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]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.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(cb,db),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(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(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&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.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?m.extend(a,d):d}},e={};return d.pipe=d.then,m.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&&m.isFunction(a.promise)?e:0,g=1===f?a:m.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]&&m.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;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.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.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.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 m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;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},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!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(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(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=wb(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=wb(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?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(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,m.cleanData(ub(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,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("',"",""].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

"),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

"),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

    ','
  • ','','
    ','',"
    ","
  • ",'
  • ','','
    ','",'","
    ","
  • ",'
  • ','','',"
  • ","
"].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
  • '+e+'
  • ')}),'
      '+t.join("")+"
    "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
      ','
    • ','','
      ','","
      ","
    • ",'
    • ','','
      ','',"
      ","
    • ",'
    • ','','',"
    • ","
    "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)}); \ No newline at end of file diff --git a/titan-manager/src/main/webapp/plugins/layui/lay/modules/layer.js b/titan-manager/src/main/webapp/plugins/layui/lay/modules/layer.js new file mode 100644 index 0000000..0d2e131 --- /dev/null +++ b/titan-manager/src/main/webapp/plugins/layui/lay/modules/layer.js @@ -0,0 +1,2 @@ +/** layui-v2.1.5 MIT License By http://www.layui.com */ + ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.scripts,t=e[e.length-1],i=t.src;if(!t.getAttribute("merge"))return i.substring(0,i.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.0",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
    '+(f?r.title[0]:r.title)+"
    ":"";return r.zIndex=s,t([r.shade?'
    ':"",'
    '+(e&&2!=r.type?"":u)+'
    '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
    '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
    '+e+"
    "}():"")+(r.resize?'':"")+"
    "],u,i('
    ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
      '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
    • '+(t[0].content||"no content")+"
    • ";i'+(t[i].content||"no content")+"";return a}()+"
    ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
    '+(u.length>1?'':"")+'
    '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
    ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
    是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/titan-manager/src/main/webapp/plugins/layui/lay/modules/laypage.js b/titan-manager/src/main/webapp/plugins/layui/lay/modules/laypage.js new file mode 100644 index 0000000..f7e981b --- /dev/null +++ b/titan-manager/src/main/webapp/plugins/layui/lay/modules/laypage.js @@ -0,0 +1,2 @@ +/** layui-v2.1.5 MIT License By http://www.layui.com */ + ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),skip:function(){return['到第','','页',""].join("")}()};return['
    ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
    "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); \ No newline at end of file diff --git a/titan-manager/src/main/webapp/plugins/layui/lay/modules/laytpl.js b/titan-manager/src/main/webapp/plugins/layui/lay/modules/laytpl.js new file mode 100644 index 0000000..0752f69 --- /dev/null +++ b/titan-manager/src/main/webapp/plugins/layui/lay/modules/laytpl.js @@ -0,0 +1,2 @@ +/** layui-v2.1.5 MIT License By http://www.layui.com */ + ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},n={exp:function(e){return new RegExp(e,"g")},query:function(e,n,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return c((n||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var n="Laytpl Error:";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},c=n.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=c("^"+r.open+"#",""),l=c(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(c(r.open+"#"),r.open+"# ").replace(c(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(n.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(n.query(1),function(e){var n='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(c(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),n='"+_escape_('),n+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,n.escape)}catch(u){return delete o.cache,n.error(u,p)}},t.pt.render=function(e,r){var c,t=this;return e?(c=t.cache?t.cache(e,n.escape):t.parse(t.tpl,e),r?void r(c):c):n.error("no data")};var o=function(e){return"string"!=typeof e?n.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var n in e)r[n]=e[n]},o.v="1.2.0",e("laytpl",o)}); \ No newline at end of file diff --git a/titan-manager/src/main/webapp/plugins/layui/lay/modules/mobile.js b/titan-manager/src/main/webapp/plugins/layui/lay/modules/mobile.js new file mode 100644 index 0000000..5281f8e --- /dev/null +++ b/titan-manager/src/main/webapp/plugins/layui/lay/modules/mobile.js @@ -0,0 +1,2 @@ +/** layui-v2.1.5 MIT License By http://www.layui.com */ + ;layui.define(function(i){i("layui.mobile",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},n={exp:function(e){return new RegExp(e,"g")},query:function(e,n,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return c((n||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var n="Laytpl Error:";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},c=n.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=c("^"+r.open+"#",""),l=c(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(c(r.open+"#"),r.open+"# ").replace(c(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(n.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(n.query(1),function(e){var n='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(c(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),n='"+_escape_('),n+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,n.escape)}catch(u){return delete o.cache,n.error(u,p)}},t.pt.render=function(e,r){var c,t=this;return e?(c=t.cache?t.cache(e,n.escape):t.parse(t.tpl,e),r?void r(c):c):n.error("no data")};var o=function(e){return"string"!=typeof e?n.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var n in e)r[n]=e[n]},o.v="1.2.0",e("laytpl",o)});layui.define(function(t){var e=function(){function t(t){return null==t?String(t):J[W.call(t)]||"object"}function e(e){return"function"==t(e)}function n(t){return null!=t&&t==t.window}function r(t){return null!=t&&t.nodeType==t.DOCUMENT_NODE}function i(e){return"object"==t(e)}function o(t){return i(t)&&!n(t)&&Object.getPrototypeOf(t)==Object.prototype}function a(t){var e=!!t&&"length"in t&&t.length,r=T.type(t);return"function"!=r&&!n(t)&&("array"==r||0===e||"number"==typeof e&&e>0&&e-1 in t)}function s(t){return A.call(t,function(t){return null!=t})}function u(t){return t.length>0?T.fn.concat.apply([],t):t}function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"}function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),$[t]=n),$[t]}function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes,function(t){if(1==t.nodeType)return t})}function d(t,e){var n,r=t?t.length:0;for(n=0;n]*>/,R=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Z=/^(?:body|html)$/i,q=/([A-Z])/g,H=["val","css","html","text","data","width","height","offset"],I=["after","prepend","before","append"],V=L.createElement("table"),_=L.createElement("tr"),B={tr:L.createElement("tbody"),tbody:V,thead:V,tfoot:V,td:_,th:_,"*":L.createElement("div")},U=/complete|loaded|interactive/,X=/^[\w-]*$/,J={},W=J.toString,Y={},G=L.createElement("div"),K={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(t){return t instanceof Array};return Y.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=G).appendChild(t),r=~Y.qsa(i,e).indexOf(t),o&&G.removeChild(t),r},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return A.call(t,function(e,n){return t.indexOf(e)==n})},Y.fragment=function(t,e,n){var r,i,a;return R.test(t)&&(r=T(L.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(z,"<$1>")),e===E&&(e=M.test(t)&&RegExp.$1),e in B||(e="*"),a=B[e],a.innerHTML=""+t,r=T.each(D.call(a.childNodes),function(){a.removeChild(this)})),o(n)&&(i=T(r),T.each(n,function(t,e){H.indexOf(t)>-1?i[t](e):i.attr(t,e)})),r},Y.Z=function(t,e){return new d(t,e)},Y.isZ=function(t){return t instanceof Y.Z},Y.init=function(t,n){var r;if(!t)return Y.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&M.test(t))r=Y.fragment(t,RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}else{if(e(t))return T(L).ready(t);if(Y.isZ(t))return t;if(Q(t))r=s(t);else if(i(t))r=[t],t=null;else if(M.test(t))r=Y.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}}return Y.Z(r,t)},T=function(t,e){return Y.init(t,e)},T.extend=function(t){var e,n=D.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){m(t,n,e)}),t},Y.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,a=X.test(o);return t.getElementById&&a&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:D.call(a&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},T.contains=L.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},T.type=t,T.isFunction=e,T.isWindow=n,T.isArray=Q,T.isPlainObject=o,T.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},T.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},T.inArray=function(t,e,n){return O.indexOf.call(e,t,n)},T.camelCase=C,T.trim=function(t){return null==t?"":String.prototype.trim.call(t)},T.uuid=0,T.support={},T.expr={},T.noop=function(){},T.map=function(t,e){var n,r,i,o=[];if(a(t))for(r=0;r=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return O.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return e(t)?this.not(this.not(t)):T(A.call(this,function(e){return Y.matches(e,t)}))},add:function(t,e){return T(N(this.concat(T(t,e))))},is:function(t){return this.length>0&&Y.matches(this[0],t)},not:function(t){var n=[];if(e(t)&&t.call!==E)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):a(t)&&e(t.item)?D.call(t):T(t);this.forEach(function(t){r.indexOf(t)<0&&n.push(t)})}return T(n)},has:function(t){return this.filter(function(){return i(t)?T.contains(this,t):T(this).find(t).size()})},eq:function(t){return t===-1?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!i(t)?t:T(t)},last:function(){var t=this[this.length-1];return t&&!i(t)?t:T(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?T(t).filter(function(){var t=this;return O.some.call(n,function(e){return T.contains(e,t)})}):1==this.length?T(Y.qsa(this[0],t)):this.map(function(){return Y.qsa(this,t)}):T()},closest:function(t,e){var n=[],i="object"==typeof t&&T(t);return this.each(function(o,a){for(;a&&!(i?i.indexOf(a)>=0:Y.matches(a,t));)a=a!==e&&!r(a)&&a.parentNode;a&&n.indexOf(a)<0&&n.push(a)}),T(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=T.map(n,function(t){if((t=t.parentNode)&&!r(t)&&e.indexOf(t)<0)return e.push(t),t});return v(e,t)},parent:function(t){return v(N(this.pluck("parentNode")),t)},children:function(t){return v(this.map(function(){return p(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||D.call(this.childNodes)})},siblings:function(t){return v(this.map(function(t,e){return A.call(p(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return T.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=h(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var n=e(t);if(this[0]&&!n)var r=T(t).get(0),i=r.parentNode||this.length>1;return this.each(function(e){T(this).wrapAll(n?t.call(this,e):i?r.cloneNode(!0):r)})},wrapAll:function(t){if(this[0]){T(this[0]).before(t=T(t));for(var e;(e=t.children()).length;)t=e.first();T(t).append(this)}return this},wrapInner:function(t){var n=e(t);return this.each(function(e){var r=T(this),i=r.contents(),o=n?t.call(this,e):t;i.length?i.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){T(this).replaceWith(T(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var e=T(this);(t===E?"none"==e.css("display"):t)?e.show():e.hide()})},prev:function(t){return T(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return T(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;T(this).empty().append(g(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=g(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,e){var n;return"string"!=typeof t||1 in arguments?this.each(function(n){if(1===this.nodeType)if(i(t))for(j in t)y(this,j,t[j]);else y(this,t,g(this,e,n,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(n=this[0].getAttribute(t))?n:E},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){y(this,t)},this)})},prop:function(t,e){return t=K[t]||t,1 in arguments?this.each(function(n){this[t]=g(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=K[t]||t,this.each(function(){delete this[t]})},data:function(t,e){var n="data-"+t.replace(q,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,e):this.attr(n);return null!==r?b(r):E},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=g(this,t,e,this.value)})):this[0]&&(this[0].multiple?T(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=T(this),r=g(this,t,e,n.offset()),i=n.offsetParent().offset(),o={top:r.top-i.top,left:r.left-i.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(L.documentElement!==this[0]&&!T.contains(L.documentElement,this[0]))return{top:0,left:0};var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(e,n){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[C(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var i={},o=getComputedStyle(r,"");return T.each(e,function(t,e){i[e]=r.style[C(e)]||o.getPropertyValue(e)}),i}}var a="";if("string"==t(e))n||0===n?a=c(e)+":"+f(e,n):this.each(function(){this.style.removeProperty(c(e))});else for(j in e)e[j]||0===e[j]?a+=c(j)+":"+f(j,e[j])+";":this.each(function(){this.style.removeProperty(c(j))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(T(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&O.some.call(this,function(t){return this.test(x(t))},l(t))},addClass:function(t){return t?this.each(function(e){if("className"in this){S=[];var n=x(this),r=g(this,t,e,n);r.split(/\s+/g).forEach(function(t){T(this).hasClass(t)||S.push(t)},this),S.length&&x(this,n+(n?" ":"")+S.join(" "))}}):this},removeClass:function(t){return this.each(function(e){if("className"in this){if(t===E)return x(this,"");S=x(this),g(this,t,e,S).split(/\s+/g).forEach(function(t){S=S.replace(l(t)," ")}),x(this,S.trim())}})},toggleClass:function(t,e){return t?this.each(function(n){var r=T(this),i=g(this,t,n,x(this));i.split(/\s+/g).forEach(function(t){(e===E?!r.hasClass(t):e)?r.addClass(t):r.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var e="scrollTop"in this[0];return t===E?e?this[0].scrollTop:this[0].pageYOffset:this.each(e?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var e="scrollLeft"in this[0];return t===E?e?this[0].scrollLeft:this[0].pageXOffset:this.each(e?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),r=Z.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(T(t).css("margin-top"))||0,n.left-=parseFloat(T(t).css("margin-left"))||0,r.top+=parseFloat(T(e[0]).css("border-top-width"))||0,r.left+=parseFloat(T(e[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||L.body;t&&!Z.test(t.nodeName)&&"static"==T(t).css("position");)t=t.offsetParent;return t})}},T.fn.detach=T.fn.remove,["width","height"].forEach(function(t){var e=t.replace(/./,function(t){return t[0].toUpperCase()});T.fn[t]=function(i){var o,a=this[0];return i===E?n(a)?a["inner"+e]:r(a)?a.documentElement["scroll"+e]:(o=this.offset())&&o[t]:this.each(function(e){a=T(this),a.css(t,g(this,i,e,a[t]()))})}}),I.forEach(function(e,n){var r=n%2;T.fn[e]=function(){var e,i,o=T.map(arguments,function(n){var r=[];return e=t(n),"array"==e?(n.forEach(function(t){return t.nodeType!==E?r.push(t):T.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(Y.fragment(t)))}),r):"object"==e||null==n?n:Y.fragment(n)}),a=this.length>1;return o.length<1?this:this.each(function(t,e){i=r?e:e.parentNode,e=0==n?e.nextSibling:1==n?e.firstChild:2==n?e:null;var s=T.contains(L.documentElement,i);o.forEach(function(t){if(a)t=t.cloneNode(!0);else if(!i)return T(t).remove();i.insertBefore(t,e),s&&w(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var e=t.ownerDocument?t.ownerDocument.defaultView:window;e.eval.call(e,t.innerHTML)}})})})},T.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(t){return T(t)[e](this),this}}),Y.Z.prototype=d.prototype=T.fn,Y.uniq=N,Y.deserializeValue=b,T.zepto=Y,T}();!function(t){function e(t){return t._zid||(t._zid=h++)}function n(t,n,o,a){if(n=r(n),n.ns)var s=i(n.ns);return(v[e(t)]||[]).filter(function(t){return t&&(!n.e||t.e==n.e)&&(!n.ns||s.test(t.ns))&&(!o||e(t.fn)===e(o))&&(!a||t.sel==a)})}function r(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function i(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function o(t,e){return t.del&&!y&&t.e in x||!!e}function a(t){return b[t]||y&&x[t]||t}function s(n,i,s,u,l,h,p){var d=e(n),m=v[d]||(v[d]=[]);i.split(/\s/).forEach(function(e){if("ready"==e)return t(document).ready(s);var i=r(e);i.fn=s,i.sel=l,i.e in b&&(s=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return i.fn.apply(this,arguments)}),i.del=h;var d=h||s;i.proxy=function(t){if(t=c(t),!t.isImmediatePropagationStopped()){t.data=u;var e=d.apply(n,t._args==f?[t]:[t].concat(t._args));return e===!1&&(t.preventDefault(),t.stopPropagation()),e}},i.i=m.length,m.push(i),"addEventListener"in n&&n.addEventListener(a(i.e),i.proxy,o(i,p))})}function u(t,r,i,s,u){var c=e(t);(r||"").split(/\s/).forEach(function(e){n(t,e,i,s).forEach(function(e){delete v[c][e.i],"removeEventListener"in t&&t.removeEventListener(a(e.e),e.proxy,o(e,u))})})}function c(e,n){return!n&&e.isDefaultPrevented||(n||(n=e),t.each(T,function(t,r){var i=n[t];e[t]=function(){return this[r]=w,i&&i.apply(n,arguments)},e[r]=E}),e.timeStamp||(e.timeStamp=Date.now()),(n.defaultPrevented!==f?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(e.isDefaultPrevented=w)),e}function l(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===f||(n[e]=t[e]);return c(n,t)}var f,h=1,p=Array.prototype.slice,d=t.isFunction,m=function(t){return"string"==typeof t},v={},g={},y="onfocusin"in window,x={focus:"focusin",blur:"focusout"},b={mouseenter:"mouseover",mouseleave:"mouseout"};g.click=g.mousedown=g.mouseup=g.mousemove="MouseEvents",t.event={add:s,remove:u},t.proxy=function(n,r){var i=2 in arguments&&p.call(arguments,2);if(d(n)){var o=function(){return n.apply(r,i?i.concat(p.call(arguments)):arguments)};return o._zid=e(n),o}if(m(r))return i?(i.unshift(n[r],n),t.proxy.apply(null,i)):t.proxy(n[r],n);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var w=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,T={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,n,r,i,o){var a,c,h=this;return e&&!m(e)?(t.each(e,function(t,e){h.on(t,n,r,e,o)}),h):(m(n)||d(i)||i===!1||(i=r,r=n,n=f),i!==f&&r!==!1||(i=r,r=f),i===!1&&(i=E),h.each(function(f,h){o&&(a=function(t){return u(h,t.type,i),i.apply(this,arguments)}),n&&(c=function(e){var r,o=t(e.target).closest(n,h).get(0);if(o&&o!==h)return r=t.extend(l(e),{currentTarget:o,liveFired:h}),(a||i).apply(o,[r].concat(p.call(arguments,1)))}),s(h,e,i,r,n,c||a)}))},t.fn.off=function(e,n,r){var i=this;return e&&!m(e)?(t.each(e,function(t,e){i.off(t,n,e)}),i):(m(n)||d(r)||r===!1||(r=n,n=f),r===!1&&(r=E),i.each(function(){u(this,e,r,n)}))},t.fn.trigger=function(e,n){return e=m(e)||t.isPlainObject(e)?t.Event(e):c(e),e._args=n,this.each(function(){e.type in x&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,r){var i,o;return this.each(function(a,s){i=l(m(e)?t.Event(e):e),i._args=r,i.target=s,t.each(n(s,e.type||e),function(t,e){if(o=e.proxy(i),i.isImmediatePropagationStopped())return!1})}),o},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){m(t)||(e=t,t=e.type);var n=document.createEvent(g[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),c(n)}}(e),function(t){function e(e,n,r){var i=t.Event(n);return t(e).trigger(i,r),!i.isDefaultPrevented()}function n(t,n,r,i){if(t.global)return e(n||x,r,i)}function r(e){e.global&&0===t.active++&&n(e,null,"ajaxStart")}function i(e){e.global&&!--t.active&&n(e,null,"ajaxStop")}function o(t,e){var r=e.context;return e.beforeSend.call(r,t,e)!==!1&&n(e,r,"ajaxBeforeSend",[t,e])!==!1&&void n(e,r,"ajaxSend",[t,e])}function a(t,e,r,i){var o=r.context,a="success";r.success.call(o,t,a,e),i&&i.resolveWith(o,[t,a,e]),n(r,o,"ajaxSuccess",[e,r,t]),u(a,e,r)}function s(t,e,r,i,o){var a=i.context;i.error.call(a,r,e,t),o&&o.rejectWith(a,[r,e,t]),n(i,a,"ajaxError",[r,i,t||e]),u(e,r,i)}function u(t,e,r){var o=r.context;r.complete.call(o,e,t),n(r,o,"ajaxComplete",[e,r]),i(r)}function c(t,e,n){if(n.dataFilter==l)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function l(){}function f(t){return t&&(t=t.split(";",2)[0]),t&&(t==T?"html":t==j?"json":w.test(t)?"script":E.test(t)&&"xml")||"text"}function h(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function p(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()&&"jsonp"!=e.dataType||(e.url=h(e.url,e.data),e.data=void 0)}function d(e,n,r,i){return t.isFunction(n)&&(i=r,r=n,n=void 0),t.isFunction(r)||(i=r,r=void 0),{url:e,data:n,success:r,dataType:i}}function m(e,n,r,i){var o,a=t.isArray(n),s=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),i&&(n=r?i:i+"["+(s||"object"==o||"array"==o?n:"")+"]"),!i&&a?e.add(u.name,u.value):"array"==o||!r&&"object"==o?m(e,u,r,n):e.add(n,u)})}var v,g,y=+new Date,x=window.document,b=/)<[^<]*)*<\/script>/gi,w=/^(?:text|application)\/javascript/i,E=/^(?:text|application)\/xml/i,j="application/json",T="text/html",S=/^\s*$/,C=x.createElement("a");C.href=window.location.href,t.active=0,t.ajaxJSONP=function(e,n){if(!("type"in e))return t.ajax(e);var r,i,u=e.jsonpCallback,c=(t.isFunction(u)?u():u)||"Zepto"+y++,l=x.createElement("script"),f=window[c],h=function(e){t(l).triggerHandler("error",e||"abort")},p={abort:h};return n&&n.promise(p),t(l).on("load error",function(o,u){clearTimeout(i),t(l).off().remove(),"error"!=o.type&&r?a(r[0],p,e,n):s(null,u||"error",p,e,n),window[c]=f,r&&t.isFunction(f)&&f(r[0]),f=r=void 0}),o(p,e)===!1?(h("abort"),p):(window[c]=function(){r=arguments},l.src=e.url.replace(/\?(.+)=\?/,"?$1="+c),x.head.appendChild(l),e.timeout>0&&(i=setTimeout(function(){h("timeout")},e.timeout)),p)},t.ajaxSettings={type:"GET",beforeSend:l,success:l,error:l,complete:l,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:j,xml:"application/xml, text/xml",html:T,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:l},t.ajax=function(e){var n,i,u=t.extend({},e||{}),d=t.Deferred&&t.Deferred();for(v in t.ajaxSettings)void 0===u[v]&&(u[v]=t.ajaxSettings[v]);r(u),u.crossDomain||(n=x.createElement("a"),n.href=u.url,n.href=n.href,u.crossDomain=C.protocol+"//"+C.host!=n.protocol+"//"+n.host),u.url||(u.url=window.location.toString()),(i=u.url.indexOf("#"))>-1&&(u.url=u.url.slice(0,i)),p(u);var m=u.dataType,y=/\?.+=\?/.test(u.url);if(y&&(m="jsonp"),u.cache!==!1&&(e&&e.cache===!0||"script"!=m&&"jsonp"!=m)||(u.url=h(u.url,"_="+Date.now())),"jsonp"==m)return y||(u.url=h(u.url,u.jsonp?u.jsonp+"=?":u.jsonp===!1?"":"callback=?")),t.ajaxJSONP(u,d);var b,w=u.accepts[m],E={},j=function(t,e){E[t.toLowerCase()]=[t,e]},T=/^([\w-]+:)\/\//.test(u.url)?RegExp.$1:window.location.protocol,N=u.xhr(),O=N.setRequestHeader;if(d&&d.promise(N),u.crossDomain||j("X-Requested-With","XMLHttpRequest"),j("Accept",w||"*/*"),(w=u.mimeType||w)&&(w.indexOf(",")>-1&&(w=w.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(w)),(u.contentType||u.contentType!==!1&&u.data&&"GET"!=u.type.toUpperCase())&&j("Content-Type",u.contentType||"application/x-www-form-urlencoded"),u.headers)for(g in u.headers)j(g,u.headers[g]);if(N.setRequestHeader=j,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=l,clearTimeout(b);var e,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==T){if(m=m||f(u.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)e=N.response;else{e=N.responseText;try{e=c(e,m,u),"script"==m?(0,eval)(e):"xml"==m?e=N.responseXML:"json"==m&&(e=S.test(e)?null:t.parseJSON(e))}catch(r){n=r}if(n)return s(n,"parsererror",N,u,d)}a(e,N,u,d)}else s(N.statusText||null,N.status?"error":"abort",N,u,d)}},o(N,u)===!1)return N.abort(),s(null,"abort",N,u,d),N;var P=!("async"in u)||u.async;if(N.open(u.type,u.url,P,u.username,u.password),u.xhrFields)for(g in u.xhrFields)N[g]=u.xhrFields[g];for(g in E)O.apply(N,E[g]);return u.timeout>0&&(b=setTimeout(function(){N.onreadystatechange=l,N.abort(),s(null,"timeout",N,u,d)},u.timeout)),N.send(u.data?u.data:null),N},t.get=function(){return t.ajax(d.apply(null,arguments))},t.post=function(){var e=d.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=d.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,r){if(!this.length)return this;var i,o=this,a=e.split(/\s/),s=d(e,n,r),u=s.success;return a.length>1&&(s.url=a[0],i=a[1]),s.success=function(e){o.html(i?t("
    ").html(e.replace(b,"")).find(i):e),u&&u.apply(o,arguments)},t.ajax(s),this};var N=encodeURIComponent;t.param=function(e,n){var r=[];return r.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(e)+"="+N(n))},m(r,e,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(t){var e=getComputedStyle;window.getComputedStyle=function(t,n){try{return e(t,n)}catch(r){return null}}}}(),t("zepto",e)});layui.define(["layer-mobile","zepto"],function(e){"use strict";var t=layui.zepto,a=layui["layer-mobile"],i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"};a.msg=function(e){return a.open({content:e||"",skin:"msg",time:2})};var s=function(e){this.options=e};s.prototype.init=function(){var e=this,a=e.options,r=t("body"),s=t(a.elem||".layui-upload-file"),u=t('');return t("#"+n)[0]||r.append(u),s.each(function(r,s){s=t(s);var u='
    ',l=s.attr("lay-type")||a.type;a.unwrap||(u='
    '+u+''+(s.attr("lay-title")||a.title||"上传"+(o[l]||"图片"))+"
    "),u=t(u),a.unwrap||u.on("dragover",function(e){e.preventDefault(),t(this).addClass(i)}).on("dragleave",function(){t(this).removeClass(i)}).on("drop",function(){t(this).removeClass(i)}),s.parent("form").attr("target")===n&&(a.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=t(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return a.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return a.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return a.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return a.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=t("#"+n),f=setInterval(function(){var t;try{t=c.contents().find("body").text()}catch(i){a.msg("上传接口存在跨域",r),clearInterval(f)}if(t){clearInterval(f),c.contents().find("body").html("");try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(t,e)}},30);e.value=""}},e("upload-mobile",function(e){var t=new s(e=e||{});t.init()})});layui.define(function(e){"use strict";var t=(window,document),i="querySelectorAll",n="getElementsByClassName",a=function(e){return t[i](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var i in e)t[i]=e[i];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var o=0,r=["layui-m-layer"],d=function(e){var t=this;t.config=l.extend(e),t.view()};d.prototype.view=function(){var e=this,i=e.config,s=t.createElement("div");e.id=s.id=r[0]+o,s.setAttribute("class",r[0]+" "+r[0]+(i.type||0)),s.setAttribute("index",o);var l=function(){var e="object"==typeof i.title;return i.title?'

    '+(e?i.title[0]:i.title)+"

    ":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e=''+i.btn[0]+"",2===t&&(e=''+i.btn[1]+""+e),'
    '+e+"
    "):""}();if(i.fixed||(i.top=i.hasOwnProperty("top")?i.top:100,i.style=i.style||"",i.style+=" top:"+(t.body.scrollTop+i.top)+"px"),2===i.type&&(i.content='

    '+(i.content||"")+"

    "),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"
    ':"")+'
    "+l+'
    '+i.content+"
    "+d+"
    ",!i.type||2===i.type){var y=t[n](r[0]+i.type),u=y.length;u>=1&&c.close(y[0].getAttribute("index"))}document.body.appendChild(s);var m=e.elem=a("#"+e.id)[0];i.success&&i.success(m),e.index=o++,e.action(i,m)},d.prototype.action=function(e,t){var i=this;e.time&&(l.timer[i.index]=setTimeout(function(){c.close(i.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),c.close(i.index)):e.yes?e.yes(i.index):c.close(i.index)};if(e.btn)for(var s=t[n]("layui-m-layerbtn")[0].children,o=s.length,r=0;r',"
    ","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# if(item2.checkbox){ }}",'',"{{# } else if(item2.space){ }}",'',"{{# } else { }}",'","{{# }; }}",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
    ',"{{# if(item2.colspan > 1){ }}",'
    ','{{item2.title||""}}',"
    ","{{# } else { }}",'
    ','{{item2.title||""}}',"{{# if(item2.sort){ }}",'',"{{# } }}","
    ","{{# } }}","
    "].join("")},F=['',"","
    "].join(""),T=['
    ',"{{# var left, right; }}",'
    ',z(),"
    ",'
    ',F,"
    ","{{# if(left){ }}",'
    ','
    ',z({fixed:!0}),"
    ",'
    ',F,"
    ","
    ","{{# }; }}","{{# if(right){ }}",'
    ','
    ',z({fixed:"right"}),'
    ',"
    ",'
    ',F,"
    ","
    ","{{# }; }}","{{# if(d.data.page){ }}",'
    ','
    ',"
    ","{{# } }}","","
    "].join(""),L=t(window),S=t(document),H=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};H.prototype.config={limit:30,loading:!0},H.prototype.render=function(e){var a,l=this;if(e&&(l.config=e),a=l.config,a.elem=t(a.elem),a.where=a.where||{},a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),!a.elem[0])return l;var n=a.elem,o=n.next("."+y);a.height&&/^full-\d+$/.test(a.height)&&(l.fullHeightGap=a.height.split("-")[1],a.height=L.height()-l.fullHeightGap);var r=l.elem=t(i(T).render({VIEW_CLASS:y,data:a,index:l.index}));if(a.index=l.index,o[0]&&o.remove(),n.after(r),l.layHeader=r.find(p),l.layMain=r.find(v),l.layBody=r.find(m),l.layFixed=r.find(g),l.layFixLeft=r.find(x),l.layFixRight=r.find(b),l.layTool=r.find(k),a.height&&l.fullSize(),a.cols.length>1){var d=l.layFixed.find(p).find("th");d.height(l.layHeader.height()-1-parseFloat(d.css("padding-top"))-parseFloat(d.css("padding-bottom")))}l.pullData(1),l.events()},H.prototype.reload=function(e){var i=this;i.config=t.extend({},i.config,e),i.render()},H.prototype.pullData=function(e,i){var a=this,n=a.config,o=n.request,r=n.response,d=function(){"object"==typeof n.initSort&&a.sort(n.initSort.field,n.initSort.type)};if(n.url){var c={};c[o.pageName]=e,c[o.limitName]=n.limit,t.ajax({type:n.method||"get",url:n.url,data:t.extend(c,n.where),dataType:"json",success:function(t){return t[r.statusName]!=r.statusCode?(a.renderForm(),a.layMain.html('
    '+(t[r.msgName]||"返回的数据状态异常")+"
    ")):(a.renderData(t,e,t[r.countName]),d(),i&&l.close(i),void("function"==typeof n.done&&n.done(t,e,t[r.countName])))},error:function(e,t){a.layMain.html('
    数据接口请求异常
    '),a.renderForm(),i&&l.close(i)}})}else if(n.data&&n.data.constructor===Array){var s={},u=e*n.limit-n.limit;s[r.dataName]=n.data.concat().splice(u,n.limit),s[r.countName]=n.data.length,a.renderData(s,e,n.data.length),d(),"function"==typeof n.done&&n.done(s,e,s[r.countName])}},H.prototype.page=1,H.prototype.eachCols=function(e){var i=t.extend(!0,[],this.config.cols),a=[],l=0;layui.each(i,function(e,t){layui.each(t,function(t,n){if(n.colspan>1){var o=0;l++,n.CHILD_COLS=[],layui.each(i[e+1],function(e,t){t.PARENT_COL||o==n.colspan||(t.PARENT_COL=l,n.CHILD_COLS.push(t),o+=t.colspan>1?t.colspan:1)})}n.PARENT_COL||a.push(n)})});var n=function(t){layui.each(t||a,function(t,i){return i.CHILD_COLS?n(i.CHILD_COLS):void e(t,i)})};n()},H.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],f=[],y=[],p=[],m=function(){return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(e,a){var l=[],n=[],o=[];0!==a.length&&(r||(a[d.config.indexName]=e),c.eachCols(function(e,r){var c=a[r.field||e];if(void 0!==c&&null!==c||(c=""),!(r.colspan>1)){var u=['",'
    '+function(){return r.checkbox?'":r.toolbar?i(t(r.toolbar).html()||"").render(a):r.templet?i(t(r.templet).html()||String(c)).render(a):c}(),"
    "].join("");l.push(u),r.fixed&&"right"!==r.fixed&&n.push(u),"right"===r.fixed&&o.push(u)}}),f.push(''+l.join("")+""),y.push(''+n.join("")+""),p.push(''+o.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+h).remove(),c.layMain.find("tbody").html(f.join("")),c.layFixLeft.find("tbody").html(y.join("")),c.layFixRight.find("tbody").html(p.join("")),c.renderForm(),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,void l.close(c.tipsIndex))};return c.key=s.id||s.index,d.cache[c.key]=u,r?m():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+h).remove(),c.layMain.append('
    无数据
    ')):(m(),void(s.page&&(c.page=n,c.count=o,a.render({elem:"layui-table-page"+s.index,count:o,groups:3,limits:s.limits||[10,20,30,40,50,60,70,80,90],limit:s.limit,curr:n,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr,c.loading()))}}),c.layTool.find(".layui-table-count span").html(o))))},H.prototype.renderForm=function(e){n.render(e||"checkbox","LAY-table-"+this.index)},H.prototype.sort=function(e,i,a,n){var r,c,u=this,f={},h=u.config,y=h.elem.attr("lay-filter"),p=d.cache[u.key];"string"==typeof e&&u.layHeader.find("th").each(function(i,a){var l=t(this),n=l.data("field");if(n===e)return e=l,r=n,!1});try{var r=r||e.data("field");if(u.sortKey&&!a&&r===u.sortKey.field&&i===u.sortKey.sort)return;var m=u.layHeader.find("th .laytable-cell-"+h.index+"-"+r).find(C);u.layHeader.find("th").find(C).removeAttr("lay-sort"),m.attr("lay-sort",i||null),u.layFixed.find("th")}catch(v){return o.error("Table modules: Did not match to field")}u.sortKey={field:r,sort:i},"asc"===i?c=layui.sort(p,r):"desc"===i?c=layui.sort(p,r,!0):(c=layui.sort(p,d.config.indexName),delete u.sortKey),f[h.response.dataName]=c,u.renderData(f,u.page,u.count,!0),l.close(u.tipsIndex),n&&layui.event.call(e,s,"sort("+y+")",{field:r,type:i})},H.prototype.loading=function(){var e=this,t=e.config;if(t.loading&&t.url)return l.msg("数据请求中",{icon:16,offset:[e.elem.offset().top+e.elem.height()/2-35-L.scrollTop()+"px",e.elem.offset().left+e.elem.width()/2-90-L.scrollLeft()+"px"],anim:-1,fixed:!1})},H.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&(l[e][a.checkName]=t)},H.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){a.checkbox&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm()),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm()),a(!1)))},H.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet,n=l.cssRules||l.rules;layui.each(n,function(a,l){if(l.selectorText===".laytable-cell-"+i.index+"-"+e)return t(l),!0})},H.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=L.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),e=parseFloat(a)-parseFloat(t.layHeader.height())-1,i.page&&(e-=parseFloat(t.layTool.outerHeight()+1)),t.layMain.css("height",e)},H.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight");if(a&&l){if(!e.elem.find(".layui-table-patch")[0]){var n=t('
    ');n.find("div").css({width:a}),e.layHeader.eq(0).find("thead tr").append(n)}}else e.layHeader.eq(0).find(".layui-table-patch").remove();var o=e.layMain.height(),r=o-l;e.layFixed.find(m).css("height",i.height()>r?r:"auto"),e.layFixRight[i.width()>e.layMain.width()?"removeClass":"addClass"](f),e.layFixRight.css("right",a-1)},H.prototype.events=function(){var e,a=this,n=a.config,o=t("body"),c={},u=a.layHeader.find("th"),f=".layui-table-cell",h=n.elem.attr("lay-filter");u.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.attr("colspan")>1||i.attr("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){if(c.allowResize){var i=t(this).data("field");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],a.getCssRule(i,function(e){c.rule=e,c.ruleWidth=parseFloat(e.style.width)})}}),S.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var i=c.ruleWidth+t.clientX-c.offset[0];c.rule.style.width=i+"px",l.close(a.tipsIndex)}e=1}}).on("mouseup",function(t){c.resizeStart&&(c={},o.css("cursor",""),a.scrollPatch()),2===e&&(e=null)}),u.on("click",function(){var i,l=t(this),n=l.find(C),o=n.attr("lay-sort");return n[0]&&1!==e?(i="asc"===o?"desc":"desc"===o?null:"asc",void a.sort(l,i,null,!0)):e=2}).find(C+" .layui-edge ").on("click",function(e){var i=t(this),l=i.index(),n=i.parents("th").eq(0).data("field");layui.stope(e),0===l?a.sort(n,"asc",null,!0):a.sort(n,"desc",null,!0)}),a.elem.on("click",'input[name="layTableCheckbox"]+',function(){var e=t(this).prev(),i=a.layBody.find('input[name="layTableCheckbox"]'),l=e.parents("tr").eq(0).data("index"),n=e[0].checked,o="layTableAllChoose"===e.attr("lay-filter");o?(i.each(function(e,t){t.checked=n,a.setCheckData(e,n)}),a.syncCheckAll(),a.renderForm()):(a.setCheckData(l,n),a.syncCheckAll()),layui.event.call(this,s,"checkbox("+h+")",{checked:n,data:d.cache[a.key][l],type:o?"all":"one"})}),a.layBody.on("mouseenter","tr",function(){var e=t(this),i=e.index();a.layBody.find("tr:eq("+i+")").addClass(N)}).on("mouseleave","tr",function(){var e=t(this),i=e.index();a.layBody.find("tr:eq("+i+")").removeClass(N)}),a.layBody.on("change","."+w,function(){var e=t(this),i=this.value,l=e.parent().data("field"),n=e.parents("tr").eq(0).data("index"),o=d.cache[a.key][n];o[l]=i,layui.event.call(this,s,"edit("+h+")",{value:i,data:o,field:l})}).on("blur","."+w,function(){var e,l=t(this),n=l.parent().data("field"),o=l.parents("tr").eq(0).data("index"),r=d.cache[a.key][o];a.eachCols(function(t,i){i.field==n&&i.templet&&(e=i.templet)}),l.siblings(f).html(e?i(t(e).html()||this.value).render(r):this.value),l.parent().data("content",this.value),l.remove()}),a.layBody.on("click","td",function(){var e=t(this),i=(e.data("field"),e.children(f));if(!e.data("off")){if(e.data("edit")){var o=t('');return o[0].value=e.data("content")||i.text(),e.find("."+w)[0]||e.append(o),o.focus()}i.prop("scrollWidth")>i.outerWidth()&&(a.tipsIndex=l.tips(['
    ',i.html(),"
    ",''].join(""),i[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:600,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}))}}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),l=e.parents("tr").eq(0).data("index"),n=a.layBody.find('tr[data-index="'+l+'"]'),o="layui-table-click",r=d.cache[a.key][l];layui.event.call(this,s,"tool("+h+")",{data:d.clearCacheKey(r),event:e.attr("lay-event"),tr:n,del:function(){d.cache[a.key][l]=[],n.remove(),a.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,l){if(e in r){var o,d=n.children('td[data-field="'+e+'"]');r[e]=l,a.eachCols(function(t,i){i.field==e&&i.templet&&(o=i.templet)}),d.children(f).html(o?i(t(o).html()||l).render(r):l),d.data("content",l)}})}}),n.addClass(o).siblings("tr").removeClass(o)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layFixed.find(m).scrollTop(n),l.close(a.tipsIndex)}),L.on("resize",function(){a.fullSize(),a.scrollPatch()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':u+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},d.checkStatus=function(e){var t=0,i=[],a=d.cache[e];return a?(layui.each(a,function(e,a){a[d.config.checkName]&&(t++,i.push(d.clearCacheKey(a)))}),{data:i,isAll:t===a.length}):{}},c.config={},d.reload=function(e,i){var a=c.config[e];return a?d.render(t.extend({},a,i)):o.error("The ID option was not found in the table instance")},d.render=function(e){var t=new H(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(s,d)}); \ No newline at end of file diff --git a/titan-manager/src/main/webapp/plugins/layui/lay/modules/tree.js b/titan-manager/src/main/webapp/plugins/layui/lay/modules/tree.js new file mode 100644 index 0000000..e55dbb7 --- /dev/null +++ b/titan-manager/src/main/webapp/plugins/layui/lay/modules/tree.js @@ -0,0 +1,2 @@ +/** layui-v2.1.5 MIT License By http://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
      '),s=o(["
    • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
    • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
      '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); \ No newline at end of file diff --git a/titan-manager/src/main/webapp/plugins/layui/lay/modules/upload.js b/titan-manager/src/main/webapp/plugins/layui/lay/modules/upload.js new file mode 100644 index 0000000..831aaf3 --- /dev/null +++ b/titan-manager/src/main/webapp/plugins/layui/lay/modules/upload.js @@ -0,0 +1,2 @@ +/** layui-v2.1.5 MIT License By http://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",s="layui-upload-iframe",f="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
      '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
      ',"
      "].join(""));i("#"+s)[0]||i("body").append(n),t.elem.next().hasClass(s)||(e.elemFile.wrap(a),t.elem.next("."+s).append(function(){var e=[];return layui.each(t.data,function(i,t){e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){layui.each(e||o.files||o.chooseFiles||r.files,function(e,t){var n=new FormData;n.append(l.field,t),layui.each(l.data,function(e,i){n.append(e,i)}),i.ajax({url:l.url,type:l.method,data:n,contentType:!1,processData:!1,dataType:"json",success:function(i){d(e,i)},error:function(){o.msg("请求上传接口出现异常"),m(e)}})})},c=function(){var e=i("#"+s);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+f).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},v=l.exts,h=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files}},y=function(){return"choose"===t?l.choose&&l.choose(g):(l.before&&l.before(g),a.ie?a.ie>9?u():c():void u())};switch(h=0===h.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":h,l.accept){case"file":if(v&&!RegExp("\\w\\.("+v+")$","i").test(escape(h)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(v||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(h)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(v||"mp3|wav|mid")+")$","i").test(escape(h)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(h,function(e,i){RegExp("\\w\\.("+(v||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?Math.floor(t)+(t%1>0?t.toFixed(1):0)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(f)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)}); \ No newline at end of file diff --git a/titan-manager/src/main/webapp/plugins/layui/lay/modules/util.js b/titan-manager/src/main/webapp/plugins/layui/lay/modules/util.js new file mode 100644 index 0000000..f1ff7ae --- /dev/null +++ b/titan-manager/src/main/webapp/plugins/layui/lay/modules/util.js @@ -0,0 +1,2 @@ +/** layui-v2.1.5 MIT License By http://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var o=layui.$,t={fixbar:function(e){var t,a,i="layui-fixbar",l="layui-fixbar-top",r=o(document),c=o("body");e=o.extend({showHeight:200},e),e.bar1=e.bar1===!0?"":e.bar1,e.bar2=e.bar2===!0?"":e.bar2,e.bgcolor=e.bgcolor?"background-color:"+e.bgcolor:"";var n=[e.bar1,e.bar2,""],u=o(['
        ',e.bar1?'
      • '+n[0]+"
      • ":"",e.bar2?'
      • '+n[1]+"
      • ":"",'
      • '+n[2]+"
      • ","
      "].join("")),s=u.find("."+l),b=function(){var o=r.scrollTop();o>=e.showHeight?t||(s.show(),t=1):t&&(s.hide(),t=0)};o("."+i)[0]||("object"==typeof e.css&&u.css(e.css),c.append(u),b(),u.find("li").on("click",function(){var t=o(this),a=t.attr("lay-type");"top"===a&&o("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,a)}),r.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){b()},100)}))},countdown:function(e,o,t){var a=this,i="function"==typeof o,l=new Date(e).getTime(),r=new Date(!o||i?(new Date).getTime():o).getTime(),c=l-r,n=[Math.floor(c/864e5),Math.floor(c/36e5)%24,Math.floor(c/6e4)%60,Math.floor(c/1e3)%60];i&&(t=o);var u=setTimeout(function(){a.countdown(e,r+1e3,t)},1e3);return t&&t(c>0?n:[0,0,0,0],o,u),c<=0&&clearTimeout(u),u},timeAgo:function(e,o){var t=(new Date).getTime()-new Date(e).getTime();return t>2592e6?(t=new Date(e).toLocaleString(),o&&(t=t.replace(/\s[\S]+$/g,"")),t):t>=864e5?(t/1e3/60/60/24|0)+"天前":t>=36e5?(t/1e3/60/60|0)+"小时前":t>=18e4?(t/1e3/60|0)+"分钟前":t<0?"未来":"刚刚"}};e("util",t)}); \ No newline at end of file diff --git a/titan-manager/src/main/webapp/plugins/layui/layui.all.js b/titan-manager/src/main/webapp/plugins/layui/layui.all.js new file mode 100644 index 0000000..e1b7f8b --- /dev/null +++ b/titan-manager/src/main/webapp/plugins/layui/layui.all.js @@ -0,0 +1,5 @@ +/** layui-v2.1.5 MIT License By http://www.layui.com */ + ;!function(e){"use strict";var t=document,o={modules:{},status:{},timeout:10,event:{}},n=function(){this.v="2.1.5"},r=function(){var e=t.scripts,o=e[e.length-1].src;return o.substring(0,o.lastIndexOf("/")+1)}(),a=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},i="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",util:"modules/util",flow:"modules/flow",carousel:"modules/carousel",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,a=function(){return"function"==typeof t&&t(function(e,t){layui[e]=t,o.status[e]=!0}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?a.call(n):(n.use(e,a),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?a(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?a(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":o.base||"")+(y.modules[f]||f)+".js";v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||i?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var i=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?i:(function p(){return++y>1e3*o.timeout/100?a(e+" timeout"):void(1989===parseInt(i.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),i)},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?a("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,"").replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o){if(t=t||"layui",e.JSON&&e.JSON.parse){if(null===o)return delete localStorage[t];o="object"==typeof o?o:{key:o};try{var n=JSON.parse(localStorage[t])}catch(r){var n={}}return o.value&&(n[o.key]=o.value),o.remove&&delete n[o.key],localStorage[t]=JSON.stringify(n),o.key?n[o.key]:n}},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:a}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;oa?1:r/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var n="Laytpl Error:";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},c=n.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=c("^"+r.open+"#",""),l=c(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(c(r.open+"#"),r.open+"# ").replace(c(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(n.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(n.query(1),function(e){var n='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(c(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),n='"+_escape_('),n+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,n.escape)}catch(u){return delete o.cache,n.error(u,p)}},t.pt.render=function(e,r){var c,t=this;return e?(c=t.cache?t.cache(e,n.escape):t.parse(t.tpl,e),r?void r(c):c):n.error("no data")};var o=function(e){return"string"!=typeof e?n.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var n in e)r[n]=e[n]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),skip:function(){return['到第','','页',""].join("")}()};return['
      ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
      "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.scripts,t=e[e.length-1],n=t.src;if(!t.getAttribute("merge"))return n.substring(0,n.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.7",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var n=this;return n.config=t.extend({},n.config,e),n},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期
      建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push(''+n.timeTips+""),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push(''+o+""))}),e.push('"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElem),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElem=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n[0]&&!n.hasClass(c)&&t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3)},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length必须遵循下述格式:
      "+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"
      已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html(''+n+""),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.nowl.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.yeard[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e=t&&e=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["

      "+r.time[e]+"

        "];w.each(new Array(t),function(t){i.push(""+w.digit(t,2)+"")}),a.innerHTML=i.join("")+"
      ",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), +l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
      a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
      ","
      "],area:[1,"",""],param:[1,"",""],thead:[1,"","
      "],tr:[2,"","
      "],col:[2,"","
      "],td:[3,"","
      "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
      ","
      "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
      a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
      ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ +for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe});!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.scripts,t=e[e.length-1],i=t.src;if(!t.getAttribute("merge"))return i.substring(0,i.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.0",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
      '+(f?r.title[0]:r.title)+"
      ":"";return r.zIndex=s,t([r.shade?'
      ':"",'
      '+(e&&2!=r.type?"":u)+'
      '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
      '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
      '+e+"
      "}():"")+(r.resize?'':"")+"
      "],u,i('
      ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
        '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
      • '+(t[0].content||"no content")+"
      • ";i'+(t[i].content||"no content")+"";return a}()+"
      ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
      '+(u.length>1?'':"")+'
      '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
      ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
      是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);layui.define("jquery",function(i){"use strict";var a=layui.$,t=(layui.hint(),layui.device()),l="element",e="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(i){var t=this;return a.extend(!0,t.config,i),t},s.prototype.on=function(i,a){return layui.onevent.call(this,l,i,a)},s.prototype.tabAdd=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=n.children(".layui-tab-bar"),o=e.children(".layui-tab-content"),c='
    • '+(t.title||"unnaming")+"
    • ";return s[0]?s.before(c):n.append(c),o.append('
      '+(t.content||"")+"
      "),y.hideTabMore(!0),y.tabAuto(),this},s.prototype.tabDelete=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=n.find('>li[lay-id="'+t+'"]');return y.tabDelete(null,s),this},s.prototype.tabChange=function(i,t){var l=".layui-tab-title",e=a(".layui-tab[lay-filter="+i+"]"),n=e.children(l),s=n.find('>li[lay-id="'+t+'"]');return y.tabClick(null,null,s),this},s.prototype.progress=function(i,t){var l="layui-progress",e=a("."+l+"[lay-filter="+i+"]"),n=e.find("."+l+"-bar"),s=n.find("."+l+"-text");return n.css("width",t),s.text(t),this};var o=".layui-nav",c="layui-nav-item",r="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",h="layui-nav-more",f="layui-anim layui-anim-upbit",y={tabClick:function(i,t,s){var o=s||a(this),t=t||o.parent().children("li").index(o),c=o.parents(".layui-tab").eq(0),r=c.children(".layui-tab-content").children(".layui-tab-item"),u=o.find("a"),d=c.attr("lay-filter");"javascript:;"!==u.attr("href")&&"_blank"===u.attr("target")||(o.addClass(e).siblings().removeClass(e),r.eq(t).addClass(n).siblings().removeClass(n)),layui.event.call(this,l,"tab("+d+")",{elem:c,index:t})},tabDelete:function(i,t){var l=t||a(this).parent(),n=l.index(),s=l.parents(".layui-tab").eq(0),o=s.children(".layui-tab-content").children(".layui-tab-item");l.hasClass(e)&&(l.next()[0]?y.tabClick.call(l.next()[0],null,n+1):l.prev()[0]&&y.tabClick.call(l.prev()[0],null,n-1)),l.remove(),o.eq(n).remove(),setTimeout(function(){y.tabAuto()},50)},tabAuto:function(){var i="layui-tab-more",l="layui-tab-bar",e="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),c=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),r=a('');if(n===window&&8!=t.ie&&y.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var i=a(this);if(!i.find("."+e)[0]){var t=a('');t.on("click",y.tabDelete),i.append(t)}}),o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+l)[0])return;o.append(r),s.attr("overflow",""),r.on("click",function(a){o[this.title?"removeClass":"addClass"](i),this.title=this.title?"":"收缩"})}else o.find("."+l).remove(),s.removeAttr("overflow")})},hideTabMore:function(i){var t=a(".layui-tab-title");i!==!0&&"tabmore"===a(i.target).attr("lay-stope")||(t.removeClass("layui-tab-more"),t.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var i=a(this),t=i.parents(o),n=t.attr("lay-filter"),s=i.find("a");i.find("."+d)[0]||("javascript:;"!==s.attr("href")&&"_blank"===s.attr("target")||(t.find("."+e).removeClass(e),i.addClass(e)),layui.event.call(this,l,"nav("+n+")",i))},clickChild:function(){var i=a(this),t=i.parents(o),n=t.attr("lay-filter");t.find("."+e).removeClass(e),i.addClass(e),layui.event.call(this,l,"nav("+n+")",i)},showChild:function(){var i=a(this),t=i.parents(o),l=i.parent(),e=i.siblings("."+d);t.hasClass(u)&&(e.removeClass(f),l["none"===e.css("display")?"addClass":"removeClass"](c+"ed"))},collapse:function(){var i=a(this),t=i.find(".layui-colla-icon"),e=i.siblings(".layui-colla-content"),s=i.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),c="none"===e.css("display");if("string"==typeof s.attr("lay-accordion")){var r=s.children(".layui-colla-item").children("."+n);r.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),r.removeClass(n)}e[c?"addClass":"removeClass"](n),t.html(c?"":""),layui.event.call(this,l,"collapse("+o+")",{title:i,content:e,show:c})}};s.prototype.init=function(i){var l={tab:function(){y.tabAuto.call({})},nav:function(){var i=200,l={},e={},s={},p=function(o,c,r){var y=a(this),p=y.find("."+d);c.hasClass(u)?o.css({top:y.position().top,height:y.children("a").height(),opacity:1}):(p.addClass(f),o.css({left:y.position().left+parseFloat(y.css("marginLeft")),top:y.position().top+y.height()-5}),l[r]=setTimeout(function(){o.css({width:y.width(),opacity:1})},t.ie&&t.ie<10?0:i),clearTimeout(s[r]),"block"===p.css("display")&&clearTimeout(e[r]),e[r]=setTimeout(function(){p.addClass(n),y.find("."+h).addClass(h+"d")},300))};a(o).each(function(t){var o=a(this),f=a(''),v=o.find("."+c);o.find("."+r)[0]||(o.append(f),v.on("mouseenter",function(){p.call(this,f,o,t)}).on("mouseleave",function(){o.hasClass(u)||(clearTimeout(e[t]),e[t]=setTimeout(function(){o.find("."+d).removeClass(n),o.find("."+h).removeClass(h+"d")},300))}),o.on("mouseleave",function(){clearTimeout(l[t]),s[t]=setTimeout(function(){o.hasClass(u)?f.css({height:0,top:f.position().top+f.height()/2,opacity:0}):f.css({width:0,left:f.position().left+f.width()/2,opacity:0})},i)})),v.each(function(){var i=a(this),t=i.find("."+d);if(t[0]&&!i.find("."+h)[0]){var l=i.children("a");l.append('')}i.off("click",y.clickThis).on("click",y.clickThis),i.children("a").off("click",y.showChild).on("click",y.showChild),t.children("dd").off("click",y.clickChild).on("click",y.clickChild)})})},breadcrumb:function(){var i=".layui-breadcrumb";a(i).each(function(){var i=a(this),t=i.attr("lay-separator")||">",l=i.find("a");l.find(".layui-box")[0]||(l.each(function(i){i!==l.length-1&&a(this).append(''+t+"")}),i.css("visibility","visible"))})},progress:function(){var i="layui-progress";a("."+i).each(function(){var t=a(this),l=t.find(".layui-progress-bar"),e=l.attr("lay-percent");l.css("width",e),t.attr("lay-showPercent")&&setTimeout(function(){var a=Math.round(l.width()/t.width()*100);a>100&&(a=100),l.html(''+a+"%")},350)})},collapse:function(){var i="layui-collapse";a("."+i).each(function(){var i=a(this).find(".layui-colla-item");i.each(function(){var i=a(this),t=i.find(".layui-colla-title"),l=i.find(".layui-colla-content"),e="none"===l.css("display");t.find(".layui-colla-icon").remove(),t.append(''+(e?"":"")+""),t.off("click",y.collapse).on("click",y.collapse)})})}};return layui.each(l,function(i,a){a()})};var p=new s,v=a(document);p.init();var b=".layui-tab-title li";v.on("click",b,y.tabClick),v.on("click",y.hideTabMore),a(window).on("resize",y.tabAuto),i(l,p)});layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",s="layui-upload-iframe",f="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
      '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
      ',"
      "].join(""));i("#"+s)[0]||i("body").append(n),t.elem.next().hasClass(s)||(e.elemFile.wrap(a),t.elem.next("."+s).append(function(){var e=[];return layui.each(t.data,function(i,t){e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){layui.each(e||o.files||o.chooseFiles||r.files,function(e,t){var n=new FormData;n.append(l.field,t),layui.each(l.data,function(e,i){n.append(e,i)}),i.ajax({url:l.url,type:l.method,data:n,contentType:!1,processData:!1,dataType:"json",success:function(i){d(e,i)},error:function(){o.msg("请求上传接口出现异常"),m(e)}})})},c=function(){var e=i("#"+s);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+f).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},v=l.exts,h=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files}},y=function(){return"choose"===t?l.choose&&l.choose(g):(l.before&&l.before(g),a.ie?a.ie>9?u():c():void u())};switch(h=0===h.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":h,l.accept){case"file":if(v&&!RegExp("\\w\\.("+v+")$","i").test(escape(h)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(v||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(h)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(v||"mp3|wav|mid")+")$","i").test(escape(h)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(h,function(e,i){RegExp("\\w\\.("+(v||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?Math.floor(t)+(t%1>0?t.toFixed(1):0)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(f)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)});layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,a=layui.hint(),n=layui.device(),l="form",s=".layui-form",r="layui-this",u="layui-hide",c="layui-disabled",o=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};o.prototype.set=function(e){var t=this;return i.extend(!0,t.config,e),t},o.prototype.verify=function(e){var t=this;return i.extend(!0,t.config.verify,e),t},o.prototype.on=function(e,i){return layui.onevent.call(this,l,e,i)},o.prototype.render=function(e,t){var n=this,o=i(s+function(){return t?'[lay-filter="'+t+'"]':""}()),d={select:function(){var e,t="请选择",a="layui-form-select",n="layui-select-title",s="layui-select-none",d="",f=o.find("select"),y=function(t,l){i(t.target).parent().hasClass(n)&&!l||(i("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},h=function(t,o,f){var h=i(this),p=t.find("."+n),m=p.find("input"),k=t.find("dl"),g=k.children("dd");if(!o){var b=function(){var e=t.offset().top+t.outerHeight()+5-v.scrollTop(),i=k.outerHeight();t.addClass(a+"ed"),g.removeClass(u),e+i>v.height()&&e>=i&&t.addClass(a+"up")},x=function(e){t.removeClass(a+"ed "+a+"up"),m.blur(),e||C(m.val(),function(e){e&&(d=k.find("."+r).html(),m&&m.val(d))})};p.on("click",function(e){t.hasClass(a+"ed")?x():(y(e,!0),b()),k.find("."+s).remove()}),p.find(".layui-edge").on("click",function(){m.focus()}),m.on("keyup",function(e){var i=e.keyCode;9===i&&b()}).on("keydown",function(e){var i=e.keyCode;9===i?x():13===i&&e.preventDefault()});var C=function(e,t,a){var n=0;layui.each(g,function(){var t=i(this),l=t.text(),s=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:s)&&n++,"keyup"===a&&t[s?"addClass":"removeClass"](u)});var l=n===g.length;return t(l),l},w=function(e){var i=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&(C(i,function(e){e?k.find("."+s)[0]||k.append('

      无匹配项

      '):k.find("."+s).remove()},"keyup"),void(""===i&&k.find("."+s).remove()))};f&&m.on("keyup",w).on("blur",function(i){e=m,d=k.find("."+r).html(),setTimeout(function(){C(m.val(),function(e){e&&!d&&m.val("")},"blur")},200)}),g.on("click",function(){var e=i(this),a=e.attr("lay-value"),n=h.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?m.val(""):(m.val(e.text()),e.addClass(r)),e.siblings().removeClass(r),h.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:h[0],value:a,othis:t}),x(!0),!1)}),t.find("dl>dt").on("click",function(e){return!1}),i(document).off("click",y).on("click",y)}};f.each(function(e,l){var s=i(this),u=s.next("."+a),o=this.disabled,d=l.value,f=i(l.options[l.selectedIndex]),y=l.options[0];if("string"==typeof s.attr("lay-ignore"))return s.show();var v="string"==typeof s.attr("lay-search"),p=y?y.value?t:y.innerHTML||t:t,m=i(['
      ','
      ','
      ','
      '+function(e){var i=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?i.push("
      "+a.label+"
      "):i.push('
      '+a.innerHTML+"
      "):i.push('
      '+(a.innerHTML||t)+"
      ")}),0===i.length&&i.push('
      没有选项
      '),i.join("")}(s.find("*"))+"
      ","
      "].join(""));u[0]&&u.remove(),s.after(m),h.call(this,m,o,v)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},t=o.find("input[type=checkbox]"),a=function(e,t){var a=i(this);e.on("click",function(){var i=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(t[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(t[1]).find("em").text(n[0])),layui.event.call(a[0],l,t[2]+"("+i+")",{elem:a[0],value:a[0].value,othis:e}))})};t.each(function(t,n){var l=i(this),s=l.attr("lay-skin"),r=(l.attr("lay-text")||"").split("|"),u=this.disabled;"switch"===s&&(s="_"+s);var o=e[s]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+o[0]),f=i(['
      ',{_switch:""+((n.checked?r[0]:r[1])||"")+""}[s]||(n.title.replace(/\s/g,"")?""+n.title+"":"")+''+(s?"":"")+"","
      "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,o)})},radio:function(){var e="layui-form-radio",t=["",""],a=o.find("input[type=radio]"),n=function(a){var n=i(this),r="layui-anim-scaleSpring";a.on("click",function(){var u=n[0].name,c=n.parents(s),o=n.attr("lay-filter"),d=c.find("input[name="+u.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=i(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(r).html(t[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(r).html(t[0]),layui.event.call(n[0],l,"radio("+o+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var s=i(this),r=s.next("."+e),u=this.disabled;if("string"==typeof s.attr("lay-ignore"))return s.show();var o=i(['
      ',''+t[l.checked?0:1]+"",""+(l.title||"未命名")+"","
      "].join(""));r[0]&&r.remove(),s.after(o),n.call(this,o)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,i){i()}),n};var d=function(){var e=i(this),a=f.config.verify,r=null,u="layui-form-danger",c={},o=e.parents(s),d=o.find("*[lay-verify]"),y=e.parents("form")[0],v=o.find("input,select,textarea"),h=e.attr("lay-filter");return layui.each(d,function(e,l){var s=i(this),c=s.attr("lay-verify").split("|"),o="",d=s.val();if(s.removeClass(u),layui.each(c,function(e,i){var c="function"==typeof a[i];if(a[i]&&(c?o=a[i](d,l):!a[i][0].test(d)))return t.msg(o||a[i][1],{icon:5,shift:6}),n.android||n.ios||l.focus(),s.addClass(u),r=!0}),r)return r}),!r&&(layui.each(v,function(e,i){i.name&&(/^checkbox|radio$/.test(i.type)&&!i.checked||(c[i.name]=i.value))}),layui.event.call(this,l,"submit("+h+")",{elem:this,form:y,field:c}))},f=new o,y=i(document),v=i(window);f.render(),y.on("reset",s,function(){var e=i(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),y.on("submit",s,d).on("click","*[lay-submit]",d),e(l,f)});layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
        '),s=o(["
      • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
      • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
        '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})});layui.define(["laytpl","laypage","layer","form"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=layui.hint(),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,s,e,t)}},c=function(){var e=this,t=e.config,i=t.id;return i&&(c.config[i]=t),{reload:function(t){e.reload.call(e,t)},config:t}},s="table",u=".layui-table",f="layui-hide",h="layui-none",y="layui-table-view",p=".layui-table-header",m=".layui-table-body",v=".layui-table-main",g=".layui-table-fixed",x=".layui-table-fixed-l",b=".layui-table-fixed-r",k=".layui-table-tool",C=".layui-table-sort",w="layui-table-edit",N="layui-table-hover",z=function(e){return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# if(item2.checkbox){ }}",'',"{{# } else if(item2.space){ }}",'',"{{# } else { }}",'","{{# }; }}",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
        ',"{{# if(item2.colspan > 1){ }}",'
        ','{{item2.title||""}}',"
        ","{{# } else { }}",'
        ','{{item2.title||""}}',"{{# if(item2.sort){ }}",'',"{{# } }}","
        ","{{# } }}","
        "].join("")},F=['',"","
        "].join(""),T=['
        ',"{{# var left, right; }}",'
        ',z(),"
        ",'
        ',F,"
        ","{{# if(left){ }}",'
        ','
        ',z({fixed:!0}),"
        ",'
        ',F,"
        ","
        ","{{# }; }}","{{# if(right){ }}",'
        ','
        ',z({fixed:"right"}),'
        ',"
        ",'
        ',F,"
        ","
        ","{{# }; }}","{{# if(d.data.page){ }}",'
        ','
        ',"
        ","{{# } }}","","
        "].join(""),L=t(window),S=t(document),H=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};H.prototype.config={limit:30,loading:!0},H.prototype.render=function(e){var a,l=this;if(e&&(l.config=e),a=l.config,a.elem=t(a.elem),a.where=a.where||{},a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),!a.elem[0])return l;var n=a.elem,o=n.next("."+y);a.height&&/^full-\d+$/.test(a.height)&&(l.fullHeightGap=a.height.split("-")[1],a.height=L.height()-l.fullHeightGap);var r=l.elem=t(i(T).render({VIEW_CLASS:y,data:a,index:l.index}));if(a.index=l.index,o[0]&&o.remove(),n.after(r),l.layHeader=r.find(p),l.layMain=r.find(v),l.layBody=r.find(m),l.layFixed=r.find(g),l.layFixLeft=r.find(x),l.layFixRight=r.find(b),l.layTool=r.find(k),a.height&&l.fullSize(),a.cols.length>1){var d=l.layFixed.find(p).find("th");d.height(l.layHeader.height()-1-parseFloat(d.css("padding-top"))-parseFloat(d.css("padding-bottom")))}l.pullData(1),l.events()},H.prototype.reload=function(e){var i=this;i.config=t.extend({},i.config,e),i.render()},H.prototype.pullData=function(e,i){var a=this,n=a.config,o=n.request,r=n.response,d=function(){"object"==typeof n.initSort&&a.sort(n.initSort.field,n.initSort.type)};if(n.url){var c={};c[o.pageName]=e,c[o.limitName]=n.limit,t.ajax({type:n.method||"get",url:n.url,data:t.extend(c,n.where),dataType:"json",success:function(t){return t[r.statusName]!=r.statusCode?(a.renderForm(),a.layMain.html('
        '+(t[r.msgName]||"返回的数据状态异常")+"
        ")):(a.renderData(t,e,t[r.countName]),d(),i&&l.close(i),void("function"==typeof n.done&&n.done(t,e,t[r.countName])))},error:function(e,t){a.layMain.html('
        数据接口请求异常
        '),a.renderForm(),i&&l.close(i)}})}else if(n.data&&n.data.constructor===Array){var s={},u=e*n.limit-n.limit;s[r.dataName]=n.data.concat().splice(u,n.limit),s[r.countName]=n.data.length,a.renderData(s,e,n.data.length),d(),"function"==typeof n.done&&n.done(s,e,s[r.countName])}},H.prototype.page=1,H.prototype.eachCols=function(e){var i=t.extend(!0,[],this.config.cols),a=[],l=0;layui.each(i,function(e,t){layui.each(t,function(t,n){if(n.colspan>1){var o=0;l++,n.CHILD_COLS=[],layui.each(i[e+1],function(e,t){t.PARENT_COL||o==n.colspan||(t.PARENT_COL=l,n.CHILD_COLS.push(t),o+=t.colspan>1?t.colspan:1)})}n.PARENT_COL||a.push(n)})});var n=function(t){layui.each(t||a,function(t,i){return i.CHILD_COLS?n(i.CHILD_COLS):void e(t,i)})};n()},H.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],f=[],y=[],p=[],m=function(){return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(e,a){var l=[],n=[],o=[];0!==a.length&&(r||(a[d.config.indexName]=e),c.eachCols(function(e,r){var c=a[r.field||e];if(void 0!==c&&null!==c||(c=""),!(r.colspan>1)){var u=['",'
        '+function(){return r.checkbox?'":r.toolbar?i(t(r.toolbar).html()||"").render(a):r.templet?i(t(r.templet).html()||String(c)).render(a):c}(),"
        "].join("");l.push(u),r.fixed&&"right"!==r.fixed&&n.push(u),"right"===r.fixed&&o.push(u)}}),f.push(''+l.join("")+""),y.push(''+n.join("")+""),p.push(''+o.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+h).remove(),c.layMain.find("tbody").html(f.join("")),c.layFixLeft.find("tbody").html(y.join("")),c.layFixRight.find("tbody").html(p.join("")),c.renderForm(),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,void l.close(c.tipsIndex))};return c.key=s.id||s.index,d.cache[c.key]=u,r?m():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+h).remove(),c.layMain.append('
        无数据
        ')):(m(),void(s.page&&(c.page=n,c.count=o,a.render({elem:"layui-table-page"+s.index,count:o,groups:3,limits:s.limits||[10,20,30,40,50,60,70,80,90],limit:s.limit,curr:n,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.pullData(e.curr,c.loading()))}}),c.layTool.find(".layui-table-count span").html(o))))},H.prototype.renderForm=function(e){n.render(e||"checkbox","LAY-table-"+this.index)},H.prototype.sort=function(e,i,a,n){var r,c,u=this,f={},h=u.config,y=h.elem.attr("lay-filter"),p=d.cache[u.key];"string"==typeof e&&u.layHeader.find("th").each(function(i,a){var l=t(this),n=l.data("field");if(n===e)return e=l,r=n,!1});try{var r=r||e.data("field");if(u.sortKey&&!a&&r===u.sortKey.field&&i===u.sortKey.sort)return;var m=u.layHeader.find("th .laytable-cell-"+h.index+"-"+r).find(C);u.layHeader.find("th").find(C).removeAttr("lay-sort"),m.attr("lay-sort",i||null),u.layFixed.find("th")}catch(v){return o.error("Table modules: Did not match to field")}u.sortKey={field:r,sort:i},"asc"===i?c=layui.sort(p,r):"desc"===i?c=layui.sort(p,r,!0):(c=layui.sort(p,d.config.indexName),delete u.sortKey),f[h.response.dataName]=c,u.renderData(f,u.page,u.count,!0),l.close(u.tipsIndex),n&&layui.event.call(e,s,"sort("+y+")",{field:r,type:i})},H.prototype.loading=function(){var e=this,t=e.config;if(t.loading&&t.url)return l.msg("数据请求中",{icon:16,offset:[e.elem.offset().top+e.elem.height()/2-35-L.scrollTop()+"px",e.elem.offset().left+e.elem.width()/2-90-L.scrollLeft()+"px"],anim:-1,fixed:!1})},H.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&(l[e][a.checkName]=t)},H.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){a.checkbox&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm()),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm()),a(!1)))},H.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet,n=l.cssRules||l.rules;layui.each(n,function(a,l){if(l.selectorText===".laytable-cell-"+i.index+"-"+e)return t(l),!0})},H.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=L.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),e=parseFloat(a)-parseFloat(t.layHeader.height())-1,i.page&&(e-=parseFloat(t.layTool.outerHeight()+1)),t.layMain.css("height",e)},H.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight");if(a&&l){if(!e.elem.find(".layui-table-patch")[0]){var n=t('
        ');n.find("div").css({width:a}),e.layHeader.eq(0).find("thead tr").append(n)}}else e.layHeader.eq(0).find(".layui-table-patch").remove();var o=e.layMain.height(),r=o-l;e.layFixed.find(m).css("height",i.height()>r?r:"auto"),e.layFixRight[i.width()>e.layMain.width()?"removeClass":"addClass"](f),e.layFixRight.css("right",a-1)},H.prototype.events=function(){var e,a=this,n=a.config,o=t("body"),c={},u=a.layHeader.find("th"),f=".layui-table-cell",h=n.elem.attr("lay-filter");u.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.attr("colspan")>1||i.attr("unresize")||c.resizeStart||(c.allowResize=i.width()-l<=10,o.css("cursor",c.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);c.resizeStart||o.css("cursor","")}).on("mousedown",function(e){if(c.allowResize){var i=t(this).data("field");e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],a.getCssRule(i,function(e){c.rule=e,c.ruleWidth=parseFloat(e.style.width)})}}),S.on("mousemove",function(t){if(c.resizeStart){if(t.preventDefault(),c.rule){var i=c.ruleWidth+t.clientX-c.offset[0];c.rule.style.width=i+"px",l.close(a.tipsIndex)}e=1}}).on("mouseup",function(t){c.resizeStart&&(c={},o.css("cursor",""),a.scrollPatch()),2===e&&(e=null)}),u.on("click",function(){var i,l=t(this),n=l.find(C),o=n.attr("lay-sort");return n[0]&&1!==e?(i="asc"===o?"desc":"desc"===o?null:"asc",void a.sort(l,i,null,!0)):e=2}).find(C+" .layui-edge ").on("click",function(e){var i=t(this),l=i.index(),n=i.parents("th").eq(0).data("field");layui.stope(e),0===l?a.sort(n,"asc",null,!0):a.sort(n,"desc",null,!0)}),a.elem.on("click",'input[name="layTableCheckbox"]+',function(){var e=t(this).prev(),i=a.layBody.find('input[name="layTableCheckbox"]'),l=e.parents("tr").eq(0).data("index"),n=e[0].checked,o="layTableAllChoose"===e.attr("lay-filter");o?(i.each(function(e,t){t.checked=n,a.setCheckData(e,n)}),a.syncCheckAll(),a.renderForm()):(a.setCheckData(l,n),a.syncCheckAll()),layui.event.call(this,s,"checkbox("+h+")",{checked:n,data:d.cache[a.key][l],type:o?"all":"one"})}),a.layBody.on("mouseenter","tr",function(){var e=t(this),i=e.index();a.layBody.find("tr:eq("+i+")").addClass(N)}).on("mouseleave","tr",function(){var e=t(this),i=e.index();a.layBody.find("tr:eq("+i+")").removeClass(N)}),a.layBody.on("change","."+w,function(){var e=t(this),i=this.value,l=e.parent().data("field"),n=e.parents("tr").eq(0).data("index"),o=d.cache[a.key][n];o[l]=i,layui.event.call(this,s,"edit("+h+")",{value:i,data:o,field:l})}).on("blur","."+w,function(){var e,l=t(this),n=l.parent().data("field"),o=l.parents("tr").eq(0).data("index"),r=d.cache[a.key][o];a.eachCols(function(t,i){i.field==n&&i.templet&&(e=i.templet)}),l.siblings(f).html(e?i(t(e).html()||this.value).render(r):this.value),l.parent().data("content",this.value),l.remove()}),a.layBody.on("click","td",function(){var e=t(this),i=(e.data("field"),e.children(f));if(!e.data("off")){if(e.data("edit")){var o=t('');return o[0].value=e.data("content")||i.text(),e.find("."+w)[0]||e.append(o),o.focus()}i.prop("scrollWidth")>i.outerWidth()&&(a.tipsIndex=l.tips(['
        ',i.html(),"
        ",''].join(""),i[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:600,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}))}}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),l=e.parents("tr").eq(0).data("index"),n=a.layBody.find('tr[data-index="'+l+'"]'),o="layui-table-click",r=d.cache[a.key][l];layui.event.call(this,s,"tool("+h+")",{data:d.clearCacheKey(r),event:e.attr("lay-event"),tr:n,del:function(){d.cache[a.key][l]=[],n.remove(),a.scrollPatch()},update:function(e){e=e||{},layui.each(e,function(e,l){if(e in r){var o,d=n.children('td[data-field="'+e+'"]');r[e]=l,a.eachCols(function(t,i){i.field==e&&i.templet&&(o=i.templet)}),d.children(f).html(o?i(t(o).html()||l).render(r):l),d.data("content",l)}})}}),n.addClass(o).siblings("tr").removeClass(o)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layFixed.find(m).scrollTop(n),l.close(a.tipsIndex)}),L.on("resize",function(){a.fullSize(),a.scrollPatch()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':u+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},d.checkStatus=function(e){var t=0,i=[],a=d.cache[e];return a?(layui.each(a,function(e,a){a[d.config.checkName]&&(t++,i.push(d.clearCacheKey(a)))}),{data:i,isAll:t===a.length}):{}},c.config={},d.reload=function(e,i){var a=c.config[e];return a?d.render(t.extend({},a,i)):o.error("The ID option was not found in the table instance")},d.render=function(e){var t=new H(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(s,d)});layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.indicator(),e.elemItem.length<=1||(e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
          ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
        "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a',e.bar1?'
      • '+n[0]+"
      • ":"",e.bar2?'
      • '+n[1]+"
      • ":"",'
      • '+n[2]+"
      • ",""].join("")),s=u.find("."+l),b=function(){var o=r.scrollTop();o>=e.showHeight?t||(s.show(),t=1):t&&(s.hide(),t=0)};o("."+i)[0]||("object"==typeof e.css&&u.css(e.css),c.append(u),b(),u.find("li").on("click",function(){var t=o(this),a=t.attr("lay-type");"top"===a&&o("html,body").animate({scrollTop:0},200),e.click&&e.click.call(this,a)}),r.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){b()},100)}))},countdown:function(e,o,t){var a=this,i="function"==typeof o,l=new Date(e).getTime(),r=new Date(!o||i?(new Date).getTime():o).getTime(),c=l-r,n=[Math.floor(c/864e5),Math.floor(c/36e5)%24,Math.floor(c/6e4)%60,Math.floor(c/1e3)%60];i&&(t=o);var u=setTimeout(function(){a.countdown(e,r+1e3,t)},1e3);return t&&t(c>0?n:[0,0,0,0],o,u),c<=0&&clearTimeout(u),u},timeAgo:function(e,o){var t=(new Date).getTime()-new Date(e).getTime();return t>2592e6?(t=new Date(e).toLocaleString(),o&&(t=t.replace(/\s[\S]+$/g,"")),t):t>=864e5?(t/1e3/60/60/24|0)+"天前":t>=36e5?(t/1e3/60/60|0)+"小时前":t>=18e4?(t/1e3/60|0)+"分钟前":t<0?"未来":"刚刚"}};e("util",t)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("#"+t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
        ','
        '+f+"
        ",'
        ','',"
        ","
        "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

        ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

        "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

        "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

          ','
        • ','','
          ','',"
          ","
        • ",'
        • ','','
          ','",'","
          ","
        • ",'
        • ','','',"
        • ","
        "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
      • '+e+'
      • ')}),'
          '+t.join("")+"
        "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
          ','
        • ','','
          ','","
          ","
        • ",'
        • ','','
          ','',"
          ","
        • ",'
        • ','','',"
        • ","
        "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)});layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
        1. '+o.replace(/[\r\t\n]+/g,"
        2. ")+"
        "),c.find(">.layui-code-h3")[0]||c.prepend('

        '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

        ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/titan-manager/src/main/webapp/plugins/layui/layui.js b/titan-manager/src/main/webapp/plugins/layui/layui.js new file mode 100644 index 0000000..488ccf3 --- /dev/null +++ b/titan-manager/src/main/webapp/plugins/layui/layui.js @@ -0,0 +1,2 @@ +/** layui-v2.1.5 MIT License By http://www.layui.com */ + ;!function(e){"use strict";var t=document,o={modules:{},status:{},timeout:10,event:{}},n=function(){this.v="2.1.5"},r=function(){var e=t.scripts,o=e[e.length-1].src;return o.substring(0,o.lastIndexOf("/")+1)}(),a=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},i="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",util:"modules/util",flow:"modules/flow",carousel:"modules/carousel",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,a=function(){return"function"==typeof t&&t(function(e,t){layui[e]=t,o.status[e]=!0}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?a.call(n):(n.use(e,a),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?a(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?a(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":o.base||"")+(y.modules[f]||f)+".js";v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||i?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var i=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?i:(function p(){return++y>1e3*o.timeout/100?a(e+" timeout"):void(1989===parseInt(i.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),i)},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?a("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,"").replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o){if(t=t||"layui",e.JSON&&e.JSON.parse){if(null===o)return delete localStorage[t];o="object"==typeof o?o:{key:o};try{var n=JSON.parse(localStorage[t])}catch(r){var n={}}return o.value&&(n[o.key]=o.value),o.remove&&delete n[o.key],localStorage[t]=JSON.stringify(n),o.key?n[o.key]:n}},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:a}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;oa?1:r list = baseDao.queryList(Monitor.class,new Pager(1,2)); + System.out.println(list.size()); + System.out.println(JSON.toJSONString(list)); + + } + + /** + * 查询符合条件的 + * + * @author liuliang + * + * @throws Exception + */ + @Test + public void queryCountByCriteriaTest() throws Exception{ + Criteria criteria = new Criteria(Monitor.class, new String[]{"ip","cpuUsage","iops"}, new String[]{"LIKE","LIKE","="},new String[]{"AND","OR"},new Object[]{"%172.16.5%","%26%",8}); + int result = baseDao.queryCount(criteria); + + Criteria criteria2 = new Criteria(Monitor.class, new String[]{"ip"}, new String[]{"LIKE"},new Object[]{"%172.16.5%"}); + int result2 = baseDao.queryCount(criteria2); + + Criteria criteria3 = Criteria.create(Monitor.class, "ip", Operator.LIKE,"%172.16.5%"); + int result3 = baseDao.queryCount(criteria3); + + System.out.println(result); + System.out.println(result2); + System.out.println(result3); + } + + /** + * 删 + * + * @author liuliang + * + * @throws Exception + */ + @Test + public void deleteByCriteriaTest() throws Exception{ + Criteria criteria = new Criteria(Monitor.class, new String[]{"ip","cpuUsage","iops"}, new String[]{"LIKE","LIKE","="},new String[]{"AND","OR"},new Object[]{"%172.16.5%","%26%",8}); + baseDao.delete(criteria); + } + + /** + * 查 + * + * @author liuliang + * + * @throws Exception + */ + @Test + public void queryByCriteriaTest() throws Exception{ + Monitor monitor = baseDao.query(Criteria.create(Monitor.class, "ip", Operator.EQ, "172.16.4.107")); + System.out.println(JSON.toJSONString(monitor)); + + Link link = baseDao.query(Criteria.create(Link.class, "linkName", Operator.EQ, "测试链路")); + System.out.println(JSON.toJSONString(link)); + } + + /** + * 查 + * + * @author liuliang + * + * @throws Exception + */ + @Test + public void queryListByCriteriaTest() throws Exception{ + System.out.println("----------"); + + List list = baseDao.queryList(Criteria.create(Scene.class, "sceneName", Operator.LIKE, "%测试%"),Pager.create(0,2)); + System.out.println(JSON.toJSONString(list)); + System.out.println("----------"); + } +} diff --git a/titan-manager/src/test/java/com/yunji/titan/manager/EmailSenderTest.java b/titan-manager/src/test/java/com/yunji/titan/manager/EmailSenderTest.java new file mode 100644 index 0000000..40f7d7f --- /dev/null +++ b/titan-manager/src/test/java/com/yunji/titan/manager/EmailSenderTest.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager; + +import javax.annotation.Resource; + +import org.junit.Test; + +import com.yunji.titan.manager.test.BaseJunit4Test; +import com.yunji.titan.manager.utils.EmailSender; + +/** + * @desc + * + * @author liuliang + * + */ +public class EmailSenderTest extends BaseJunit4Test{ + + @Resource + private EmailSender emailSender; + + @Test + public void sendEmailTest() { + System.out.println("-------start------"); + +// boolean result = EmailUtil.sendHtml("HaHa邮件名", "测试邮件
        ,这里是html内容1111111111
        222222
        ", "liul@yunjiweidian.com", null); + boolean result = emailSender.sendHtml("HaHa邮件名", "测试邮件
        ,这里是html内容1111111111
        222222
        ", "liul@yunjiweidian.com", null); + System.out.println("result:" + result); + + System.out.println("------end-------"); + } +} diff --git a/titan-manager/src/test/java/com/yunji/titan/manager/LinkServiceTest.java b/titan-manager/src/test/java/com/yunji/titan/manager/LinkServiceTest.java new file mode 100644 index 0000000..f92f1fa --- /dev/null +++ b/titan-manager/src/test/java/com/yunji/titan/manager/LinkServiceTest.java @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.GenericXmlApplicationContext; + +import com.yunji.titan.manager.service.LinkService; +import com.yunji.titan.manager.service.SceneService; + +/** + * @desc 场景 + * + * @author liuliang + * + */ +public class LinkServiceTest { + + LinkService linkService = null; + SceneService sceneService = null; + GenericXmlApplicationContext context = new GenericXmlApplicationContext(); + + @Before + public void init() { + System.setProperty("config_env", "local"); + String root; + String separator; + String spring; + + root = System.getProperty("gateway.dir"); + separator = System.getProperty("file.separator"); + spring = "file:" + root + separator + "src/main/resources/*.xml"; + // context.setValidating(false); + context.load("classpath*:/*.xml", spring); + context.refresh(); + context.start(); + + linkService = (LinkService) context.getBean("linkServiceImpl"); + sceneService = (SceneService) context.getBean("sceneServiceImpl"); + } + + @After + public void close() { + context.close(); + } + + /** + * @desc 更新场景状态测试 + * + * @author liuliang + * + */ + @Test + public void addSceneTest(){ + System.out.println("--------"); + System.out.println("---------"); + } + + /** + * @desc 删除链路测试 + * + * @author liuliang + * + */ + @Test + public void removeLinkAndUpdateSceneTest(){ + System.out.println("----开始----"); + long linkId = 110; + int sceneCount = 0; + int result = 0; + try { + sceneCount = sceneService.getSceneCountByLinkId(linkId); + result = linkService.removeLinkAndUpdateScene(linkId, sceneCount); + + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println(sceneCount + ":" + result); + System.out.println("-----结束----"); + } +} diff --git a/titan-manager/src/test/java/com/yunji/titan/manager/MonitorDaoTest.java b/titan-manager/src/test/java/com/yunji/titan/manager/MonitorDaoTest.java new file mode 100644 index 0000000..810fbcc --- /dev/null +++ b/titan-manager/src/test/java/com/yunji/titan/manager/MonitorDaoTest.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager; + +import javax.annotation.Resource; + +import org.junit.Test; + +import com.yunji.titan.manager.dao.MonitorDao; +import com.yunji.titan.manager.test.BaseJunit4Test; + +/** + * @desc + * + * @author liuliang + * + */ +public class MonitorDaoTest extends BaseJunit4Test{ + + @Resource + private MonitorDao monitorDao; + + @Test + public void queryListTest(){ + System.out.println("-----1---"); + try { + System.out.println(monitorDao.queryList(10)); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("-----2---"); + } +} diff --git a/titan-manager/src/test/java/com/yunji/titan/manager/MonitorServiceTest.java b/titan-manager/src/test/java/com/yunji/titan/manager/MonitorServiceTest.java new file mode 100644 index 0000000..52e2425 --- /dev/null +++ b/titan-manager/src/test/java/com/yunji/titan/manager/MonitorServiceTest.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager; + +import java.util.List; + +import javax.annotation.Resource; + +import org.junit.Test; + +import com.alibaba.fastjson.JSON; +import com.yunji.titan.manager.entity.Monitor; +import com.yunji.titan.manager.service.MonitorService; +import com.yunji.titan.manager.test.BaseJunit4Test; + +/** + * @desc + * + * @author liuliang + * + */ +public class MonitorServiceTest extends BaseJunit4Test{ + + @Resource + private MonitorService monitorService; + + @Test + public void getMonitorFilterListTest() { + try { + List list = monitorService.getMonitorFilterList(10); + + System.out.println("-----------"); + System.out.println(list.size()); + for(Monitor m:list) { + System.out.println(JSON.toJSONString(m)) ; + } + System.out.println("-------------"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/titan-manager/src/test/java/com/yunji/titan/manager/ReportServiceTest.java b/titan-manager/src/test/java/com/yunji/titan/manager/ReportServiceTest.java new file mode 100644 index 0000000..723f26c --- /dev/null +++ b/titan-manager/src/test/java/com/yunji/titan/manager/ReportServiceTest.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.GenericXmlApplicationContext; + +import com.yunji.titan.manager.bo.ReportBO; +import com.yunji.titan.manager.service.ReportService; + +/** + * @desc 测试报告测试 + * + * @author liuliang + * + */ +public class ReportServiceTest { + + + ReportService reportService = null; + GenericXmlApplicationContext context = new GenericXmlApplicationContext(); + + @Before + public void init() { + System.setProperty("config_env", "local"); + String root; + String separator; + String spring; + + root = System.getProperty("gateway.dir"); + separator = System.getProperty("file.separator"); + spring = "file:" + root + separator + "src/main/resources/*.xml"; + // context.setValidating(false); + context.load("classpath*:/*.xml", spring); + context.refresh(); + context.start(); + + reportService = (ReportService) context.getBean("reportServiceImpl"); + + } + + @After + public void close() { + context.close(); + } + + /** + * @desc 添加测试报告 测试 + * + * @author liuliang + * + */ + @Test + public void addReportTest(){ + System.out.println("---开始-----"); + ReportBO reportBO = new ReportBO(); + reportBO.setReportName("测试名10333333"); + reportBO.setSceneId(1222222L); + reportBO.setSceneName("场景名1033333"); + reportBO.setStartTime(System.currentTimeMillis()); + reportBO.setEndTime(System.currentTimeMillis()); + reportBO.setExpectTps(2000); + + reportBO.setActualTps(100); + reportBO.setTotalRequest(33333L); + reportBO.setSuccessRequest(2222L); + reportBO.setConcurrentUser(300L); + reportBO.setUserWaittime(400L); + reportBO.setServerWaittime(600L); + + reportBO.setConclusion(1); + reportBO.setCreateTime(System.currentTimeMillis()); + try { + int result = reportService.addReport(reportBO); + + System.out.println("result:" + result); + } catch (Exception e) { + e.printStackTrace(); + } + + System.out.println("---结束-----"); + } + + public static void main(String[] args) { + + System.out.println(String.valueOf(System.currentTimeMillis()).length()); + } +} diff --git a/titan-manager/src/test/java/com/yunji/titan/manager/SceneServiceTest.java b/titan-manager/src/test/java/com/yunji/titan/manager/SceneServiceTest.java new file mode 100644 index 0000000..8342e3f --- /dev/null +++ b/titan-manager/src/test/java/com/yunji/titan/manager/SceneServiceTest.java @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager; + +import java.util.List; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.support.GenericXmlApplicationContext; + +import com.alibaba.fastjson.JSON; +import com.yunji.titan.manager.entity.Scene; +import com.yunji.titan.manager.service.SceneService; + +/** + * @desc 场景 + * + * @author liuliang + * + */ +public class SceneServiceTest { + + SceneService sceneService = null; + GenericXmlApplicationContext context = new GenericXmlApplicationContext(); + + @Before + public void init() { + System.setProperty("config_env", "local"); + String root; + String separator; + String spring; + + root = System.getProperty("gateway.dir"); + separator = System.getProperty("file.separator"); + spring = "file:" + root + separator + "src/main/resources/*.xml"; + // context.setValidating(false); + context.load("classpath*:/*.xml", spring); + context.refresh(); + context.start(); + + sceneService = (SceneService) context.getBean("sceneServiceImpl"); + + } + + @After + public void close() { + context.close(); + } + + /** + * @desc 更新场景状态测试 + * + * @author liuliang + * + */ + @Test + public void updateSceneStatusTest(){ + System.out.println("--开始-------"); + try { + int result = sceneService.updateSceneStatus(23, 1); + + System.out.println("result:" + result); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 根据linkId查询场景列表 测试 + */ + @Test + public void getSceneListByLinkIdTest(){ + System.out.println("------开始-------"); + List list; + try { + list = sceneService.getSceneListByLinkId(5, 0, 10); + System.out.println(JSON.toJSONString(list)); + + list = sceneService.getSceneListByLinkId(6, 0, 10); + System.out.println(JSON.toJSONString(list)); + + list = sceneService.getSceneListByLinkId(1, 0, 10); + System.out.println(JSON.toJSONString(list)); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("------结束-------"); + } + + /** + * 查询测试 + */ + @Test + public void getSceneTest(){ + System.out.println("------开始-------"); + try { + Scene scene = sceneService.getScene(3); + System.out.println(JSON.toJSONString(scene)); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("------结束-------"); + } +} diff --git a/titan-manager/src/test/java/com/yunji/titan/manager/test/BaseJunit4Test.java b/titan-manager/src/test/java/com/yunji/titan/manager/test/BaseJunit4Test.java new file mode 100644 index 0000000..3c7b6f6 --- /dev/null +++ b/titan-manager/src/test/java/com/yunji/titan/manager/test/BaseJunit4Test.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.manager.test; + +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +/** + * @desc 单元测试基础类 + * + * @author liuliang + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration({"classpath*:/*-context.xml","classpath*:/*-root.xml"}) +public class BaseJunit4Test { + +} diff --git a/titan-monitor/pom.xml b/titan-monitor/pom.xml new file mode 100644 index 0000000..230f33d --- /dev/null +++ b/titan-monitor/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + com.yunji + titan + 2.0.0-SNAPSHOT + + com.yunji + titan-monitor + 2.0.0-SNAPSHOT + titan-monitor + http://maven.apache.org + + 1.8 + 1.6.4 + 2.0.0-SNAPSHOT + UTF-8 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + UTF-8 + ${java-version} + ${java-version} + + + ${env.JAVA_HOME}/jre/lib/rt.jar + ${project.basedir}/lib + + + + + + + + + org.fusesource + sigar + ${sigar-version} + + + com.yunji + titan-utils + ${titan-utils-version} + + + diff --git a/titan-monitor/src/doc/readme.txt b/titan-monitor/src/doc/readme.txt new file mode 100644 index 0000000..e27420c --- /dev/null +++ b/titan-monitor/src/doc/readme.txt @@ -0,0 +1 @@ + libsigar-amd64-linux.so ļĿjarĿ¼¡磺titan-monitor_libĿ¼ \ No newline at end of file diff --git a/titan-monitor/src/main/java/com/yunji/titan/monitor/Main.java b/titan-monitor/src/main/java/com/yunji/titan/monitor/Main.java new file mode 100644 index 0000000..a5512e2 --- /dev/null +++ b/titan-monitor/src/main/java/com/yunji/titan/monitor/Main.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.monitor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * @desc titan-monitor 启动函数 + * + * @author liuliang + * + */ +public class Main { + private Logger logger = LoggerFactory.getLogger(Main.class); + + public static void main(String[] args) { + new Main(); + } + + @SuppressWarnings("resource") + Main() { + new ClassPathXmlApplicationContext("classpath:*-context.xml"); + logger.info("titan-monitor启动成功..."); + try { + synchronized (this) { + this.wait(); + } + } catch (Exception e) { + logger.error("error", e); + } + } +} diff --git a/titan-monitor/src/main/java/com/yunji/titan/monitor/service/InitMonitor.java b/titan-monitor/src/main/java/com/yunji/titan/monitor/service/InitMonitor.java new file mode 100644 index 0000000..9b0d276 --- /dev/null +++ b/titan-monitor/src/main/java/com/yunji/titan/monitor/service/InitMonitor.java @@ -0,0 +1,144 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.monitor.service; + +import java.io.BufferedReader; +import java.io.InputStreamReader; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import com.alibaba.fastjson.JSON; +import com.yunji.titan.monitor.utils.MsgProvider; +import com.yunji.titan.monitor.utils.SigarUtil; +import com.yunji.titan.utils.MonitorBean; + +/** + * @desc 初始化方法 + * + * @author liuliang + * + */ +@Component +public class InitMonitor { + + private Logger logger = LoggerFactory.getLogger(InitMonitor.class); + + /** + * 取样间隔时间 + */ + @Value("${get.data.time}") + private int getDataTime; + + /** + * 机器标识 0:agent机器 1:目标机 + */ + @Value("${machine.flag}") + private int machineFlag; + + /** + * MQ消息发送 + */ + @Resource + private MsgProvider msgProvider; + + /** + * 埋点机器IOPS + */ + private static Double MONITOR_MACHINE_IOPS = 0.0; + + /** + * @desc 初始启动 + * + * @author liuliang + * + */ + @PostConstruct + public void init() { + logger.info("----------------titan-monitor started..."); + new Thread(){ + @Override + public void run() { + doIostat(); + } + }.start(); + while(true) { + //1、获取组装信息 + MonitorBean monitorBean = new MonitorBean(); + Long localTime = System.currentTimeMillis(); + try { + monitorBean.setCreateTime(localTime); + monitorBean.setServerType(machineFlag); + monitorBean.setIp(SigarUtil.getHostAddress()); + monitorBean.setCpuUsage(SigarUtil.getCPUUsage()); + monitorBean.setMemoryUsage(SigarUtil.getMemoryUsage()); + monitorBean.setIops(MONITOR_MACHINE_IOPS); + //2、信息上报 + msgProvider.sendMsg(JSON.toJSONString(monitorBean)); + } catch (Exception e) { + logger.error("monitor数据上报异常,monitorBean:{}",JSON.toJSONString(monitorBean),e); + } + //休眠 + try { + Thread.sleep(getDataTime - (System.currentTimeMillis() - localTime)); + } catch (InterruptedException e) { + logger.error("monitor休眠异常",e); + } + } + } + /** + * @desc iostat命令获取IOPS,刷新全局变量 + * + * @author liuliang + * + */ + private void doIostat(){ + try { + String os = System.getProperty("os.name"); + String windowsFlag = "win"; + if((null != os) && os.toLowerCase().startsWith(windowsFlag)){ + return; //windows不执行 + } + + String command = "iostat -d -x 5"; + Runtime r = Runtime.getRuntime(); + Process pro = r.exec(command); + BufferedReader in = new BufferedReader(new InputStreamReader(pro.getInputStream())); + String line = null; + int count = 0; + while((line=in.readLine()) != null){ + if(++count >= 4){ + if((null != line) &&(line.startsWith("vda"))){ + String[] temp = line.split("\\s+"); + if(temp.length > 1){ + MONITOR_MACHINE_IOPS = Double.parseDouble(temp[3]) + Double.parseDouble(temp[4]); + } + } + } + } + in.close(); + pro.destroy(); + } catch (Exception e) { + logger.error("获取IOPS异常",e); + } + } +} diff --git a/titan-monitor/src/main/java/com/yunji/titan/monitor/utils/MsgProvider.java b/titan-monitor/src/main/java/com/yunji/titan/monitor/utils/MsgProvider.java new file mode 100644 index 0000000..538f38f --- /dev/null +++ b/titan-monitor/src/main/java/com/yunji/titan/monitor/utils/MsgProvider.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.monitor.utils; + +import javax.annotation.Resource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import com.alibaba.rocketmq.common.message.Message; +import com.yunji.titan.utils.config.RocketMqDataSource; + +/** + * @desc MQ消息发送者 + * + * @author liuliang + * + */ +@Component +public class MsgProvider { + @Resource + private RocketMqDataSource rocketMqDataSource; + private Logger logger = LoggerFactory.getLogger(MsgProvider.class); + + /** + * 将压测结果写入消息队列 + * + * @author gaoxianglong + */ + public void sendMsg(String result) { + if (StringUtils.isEmpty(result)) { + return; + } + try { + rocketMqDataSource.getProducer().sendOneway( + new Message(rocketMqDataSource.getRocketTopic(), "*", "uploadMonitorKey", result.getBytes())); + } catch (Exception e) { + logger.error("error", e); + } + } +} diff --git a/titan-monitor/src/main/java/com/yunji/titan/monitor/utils/NumberUtil.java b/titan-monitor/src/main/java/com/yunji/titan/monitor/utils/NumberUtil.java new file mode 100644 index 0000000..625a589 --- /dev/null +++ b/titan-monitor/src/main/java/com/yunji/titan/monitor/utils/NumberUtil.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.monitor.utils; + +import java.math.BigDecimal; + +/** + * @desc 数字格式化工具 + * + * @author liuliang + * + */ +public class NumberUtil { + + /** + * @desc 保留2位小数(四舍五入) + * + * @author liuliang + * + * @param number + * @return double + */ + public static double format(double number){ + try { + return new BigDecimal(number).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); + } catch (Exception e) { + e.printStackTrace(); + } + return number; + } +} diff --git a/titan-monitor/src/main/java/com/yunji/titan/monitor/utils/SigarUtil.java b/titan-monitor/src/main/java/com/yunji/titan/monitor/utils/SigarUtil.java new file mode 100644 index 0000000..15bbd7d --- /dev/null +++ b/titan-monitor/src/main/java/com/yunji/titan/monitor/utils/SigarUtil.java @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.monitor.utils; + +import java.net.InetAddress; +import java.net.UnknownHostException; + +import org.hyperic.sigar.CpuPerc; +import org.hyperic.sigar.Mem; +import org.hyperic.sigar.Sigar; +import org.hyperic.sigar.SigarException; + +/** + * @desc Sigar获取系统信息工具类 + * + * @author liuliang + * + */ +public class SigarUtil { + + private static Sigar sigar; + + private static Sigar getInstance() { + if (null == sigar) { + sigar = new Sigar(); + } + return sigar; + } + + /** + * @desc 获取cpu使用率 + * + * @author liuliang + * + * @return Double 比例(保留2位小数) + */ + public static Double getCPUUsage() { + double cpuUsage = 0; + try { + CpuPerc[] cpuList = getInstance().getCpuPercList(); + // 不管是单块CPU还是多CPU都适用 + for (int i = 0; i < cpuList.length; i++) { + cpuUsage += cpuList[i].getCombined() * 100; + } + cpuUsage = NumberUtil.format(cpuUsage / cpuList.length); + } catch (SigarException e) { + e.printStackTrace(); + } + return cpuUsage; + } + + /** + * @desc 获取内存使用率 + * + * @author liuliang + * + * @return Double 比例(保留2位小数) + */ + public static Double getMemoryUsage() { + double memoryUsage = 0; + try { + Mem mem = getInstance().getMem(); + memoryUsage = NumberUtil.format(mem.getUsedPercent()); + } catch (SigarException e) { + e.printStackTrace(); + } + return memoryUsage; + } + + /** + * @desc 获取机器IP地址 + * + * @author liuliang + * + * @return String + */ + public static String getHostAddress() { + InetAddress inetAddress = null; + try { + inetAddress = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return inetAddress.getHostAddress(); + } +} diff --git a/titan-monitor/src/main/resources/log4j.xml b/titan-monitor/src/main/resources/log4j.xml new file mode 100644 index 0000000..e83f71b --- /dev/null +++ b/titan-monitor/src/main/resources/log4j.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/titan-monitor/src/main/resources/properties/monitor.properties b/titan-monitor/src/main/resources/properties/monitor.properties new file mode 100644 index 0000000..f3d5bcf --- /dev/null +++ b/titan-monitor/src/main/resources/properties/monitor.properties @@ -0,0 +1,8 @@ +#数据抓取间隔时间(ms) +get.data.time=5000 +#monitor机器标识(0:agent机器 1:目标机) +machine.flag=0 + +#rocketmq +rocket.topic=titan-monitor-topic +namesrv.addr= \ No newline at end of file diff --git a/titan-monitor/src/main/resources/root-context.xml b/titan-monitor/src/main/resources/root-context.xml new file mode 100644 index 0000000..5a233cc --- /dev/null +++ b/titan-monitor/src/main/resources/root-context.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/titan-monitor/src/main/resources/shutdown.sh b/titan-monitor/src/main/resources/shutdown.sh new file mode 100644 index 0000000..f06430e --- /dev/null +++ b/titan-monitor/src/main/resources/shutdown.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +source /etc/profile + +#获取本机monitor的PID +pid=`ps -ef | grep "titan-monitor" | grep -v "grep" | awk '{print $2}'` +echo $pid + +#kill本机的所有monitor节点 +kill -9 $pid +echo "titan-monitor进程已经全部kill" diff --git a/titan-monitor/src/main/resources/start.sh b/titan-monitor/src/main/resources/start.sh new file mode 100644 index 0000000..556e2be --- /dev/null +++ b/titan-monitor/src/main/resources/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +source /etc/profile + +java -server -Xms4g -Xmx4g -Xmn1g -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:ParallelGCThreads=3 -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/yunji/titan-monitor/logs/gc.log -jar titan-monitor.jar & + diff --git a/titan-task/pom.xml b/titan-task/pom.xml new file mode 100644 index 0000000..e6e8935 --- /dev/null +++ b/titan-task/pom.xml @@ -0,0 +1,100 @@ + + + 4.0.0 + + com.yunji + titan + 2.0.0-SNAPSHOT + + com.yunji + titan-task + 2.0.0-SNAPSHOT + titan-task + http://maven.apache.org + + 1.8 + 1.0.15 + 5.1.39 + 2.5.3 + 2.0.0-SNAPSHOT + 4.8.2 + 3.15 + 3.20.0-GA + UTF-8 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + UTF-8 + ${java-version} + ${java-version} + + + ${env.JAVA_HOME}/jre/lib/rt.jar + ${project.basedir}/lib + + + + + + + + org.apache.poi + poi + ${poi-version} + + + mysql + mysql-connector-java + ${mysql-version} + + + com.alibaba + druid + ${druid-version} + + + com.alibaba + dubbo + ${dubbo-version} + + + org.springframework + spring + + + org.javassist + javassist + + + + + + org.javassist + javassist + ${javassist-version} + + + junit + junit + ${junit-version} + test + + + com.yunji + titan-utils + ${titan-version} + + + com.yunji + titan-agent + ${titan-version} + + + diff --git a/titan-task/src/main/java/com/yunji/titan/task/Main.java b/titan-task/src/main/java/com/yunji/titan/task/Main.java new file mode 100644 index 0000000..6161139 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/Main.java @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * taskService启动函数 + * + * @author gaoxianglong + */ +public class Main { + private Logger log = LoggerFactory.getLogger(Main.class); + + public static void main(String[] args) { + new Main(); + } + + Main() { + init(); + } + + @SuppressWarnings("resource") + private void init() { + new ClassPathXmlApplicationContext("classpath:*-context.xml"); + log.info("titan-task启动成功..."); + try { + synchronized (this) { + this.wait(); + } + } catch (Exception e) { + log.error("error", e); + } + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/bean/bo/AgentInfoBO.java b/titan-task/src/main/java/com/yunji/titan/task/bean/bo/AgentInfoBO.java new file mode 100644 index 0000000..0a4b290 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/bean/bo/AgentInfoBO.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.bean.bo; + +import java.util.List; + +/** + * Agent信息bean + * + * @author gaoxianglong + */ +public class AgentInfoBO { + private List freeAgents; + private List busynessAgents; + + public List getFreeAgents() { + return freeAgents; + } + + public void setFreeAgents(List freeAgents) { + this.freeAgents = freeAgents; + } + + public List getBusynessAgents() { + return busynessAgents; + } + + public void setBusynessAgents(List busynessAgents) { + this.busynessAgents = busynessAgents; + } + + @Override + public String toString() { + return "AgentInfoBO [freeAgents=" + freeAgents + ", busynessAgents=" + busynessAgents + "]"; + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/bean/po/SceneMapper.java b/titan-task/src/main/java/com/yunji/titan/task/bean/po/SceneMapper.java new file mode 100644 index 0000000..6f5a07c --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/bean/po/SceneMapper.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.bean.po; + +import java.sql.ResultSet; +import java.sql.SQLException; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; + +/** + * SceneBean的映射类 + * + * @author gaoxianglong + */ +@Component +public class SceneMapper implements RowMapper { + @Override + public ScenePO mapRow(ResultSet arg, int arg1) throws SQLException { + ScenePO scenePO = new ScenePO(); + scenePO.setSceneStatus(arg.getInt("scene_status")); + return scenePO; + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/bean/po/ScenePO.java b/titan-task/src/main/java/com/yunji/titan/task/bean/po/ScenePO.java new file mode 100644 index 0000000..a79cb95 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/bean/po/ScenePO.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.bean.po; + +/** + * 压测场景EntityBean,对饮数据库表[r_scene] + * + * @author gaoxianglong + */ +public class ScenePO { + private Integer sceneStatus; + + public Integer getSceneStatus() { + return sceneStatus; + } + + public void setSceneStatus(Integer sceneStatus) { + this.sceneStatus = sceneStatus; + } + + @Override + public String toString() { + return "ScenePO [sceneStatus=" + sceneStatus + "]"; + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/dao/scene/SceneDao.java b/titan-task/src/main/java/com/yunji/titan/task/dao/scene/SceneDao.java new file mode 100644 index 0000000..75bebec --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/dao/scene/SceneDao.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.dao.scene; + +import java.util.List; +import com.yunji.titan.task.bean.po.ScenePO; + +/** + * 压测场景Dao + * + * @author gaoxianglong + */ +public interface SceneDao { + /** + * 根据场景ID获取场景状态 + * + * @author gaoxianglong + * + * @param sceneID + * 场景ID + * + * @return List 场景状态 + */ + public List getSceneStatus(int sceneID); +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/dao/scene/SceneDaoImpl.java b/titan-task/src/main/java/com/yunji/titan/task/dao/scene/SceneDaoImpl.java new file mode 100644 index 0000000..fa3bd16 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/dao/scene/SceneDaoImpl.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.dao.scene; + +import java.util.List; +import javax.annotation.Resource; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import com.yunji.titan.task.bean.po.SceneMapper; +import com.yunji.titan.task.bean.po.ScenePO; + +/** + * 压测场景Dao实现 + * + * @author gaoxianglong + */ +@Repository +public class SceneDaoImpl implements SceneDao { + @Resource + private JdbcTemplate jdbcTemplate; + @Resource + private SceneMapper sceneMapper; + + @Override + public List getSceneStatus(int sceneID) { + String sql = "SELECT scene_status FROM t_scene WHERE scene_id = ?"; + return jdbcTemplate.query(sql, new Object[] { sceneID }, sceneMapper); + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/exception/PerformanceTestException.java b/titan-task/src/main/java/com/yunji/titan/task/exception/PerformanceTestException.java new file mode 100644 index 0000000..a563e90 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/exception/PerformanceTestException.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.exception; + +import com.yunji.titan.utils.ErrorCode; + +/** + * 压测异常 + * + * @author gaoxianglong + */ +public class PerformanceTestException extends TaskException { + private static final long serialVersionUID = 1736364586034649769L; + private ErrorCode errorCode; + + public PerformanceTestException(String msg) { + super(msg); + } + + public PerformanceTestException(String msg, ErrorCode errorCode) { + super(msg); + this.setErrorCode(errorCode); + } + + private void setErrorCode(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + @Override + public ErrorCode getErrorCode() { + return errorCode; + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/exception/PullTaskException.java b/titan-task/src/main/java/com/yunji/titan/task/exception/PullTaskException.java new file mode 100644 index 0000000..13dd37b --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/exception/PullTaskException.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.exception; + +import com.yunji.titan.utils.ErrorCode; + +/** + * Agent领取任务异常 + * + * @author gaoxianglong + */ +public class PullTaskException extends TaskException { + private static final long serialVersionUID = -1771049149303844212L; + private ErrorCode errorCode; + + public PullTaskException(String msg) { + super(msg); + } + + public PullTaskException(String msg, ErrorCode errorCode) { + super(msg); + this.setErrorCode(errorCode); + } + + private void setErrorCode(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + @Override + public ErrorCode getErrorCode() { + return errorCode; + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/exception/ResourceException.java b/titan-task/src/main/java/com/yunji/titan/task/exception/ResourceException.java new file mode 100644 index 0000000..12aeb4f --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/exception/ResourceException.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.exception; + +import com.yunji.titan.utils.ErrorCode; + +/** + * Agent资源异常 + * + * @author gaoxianglong + */ +public class ResourceException extends TaskException { + private static final long serialVersionUID = 2706580152490154359L; + private ErrorCode errorCode; + + public ResourceException(String msg) { + super(msg); + } + + public ResourceException(String msg, ErrorCode errorCode) { + super(msg); + this.setErrorCode(errorCode); + } + + private void setErrorCode(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + @Override + public ErrorCode getErrorCode() { + return errorCode; + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/exception/StartPerformanceTestException.java b/titan-task/src/main/java/com/yunji/titan/task/exception/StartPerformanceTestException.java new file mode 100644 index 0000000..9cc34e8 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/exception/StartPerformanceTestException.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.exception; + +import com.yunji.titan.utils.ErrorCode; + +/** + * 启动压测异常 + * + * @author gaoxianglong + */ +public class StartPerformanceTestException extends PerformanceTestException { + private static final long serialVersionUID = 5012467807971118330L; + private ErrorCode errorCode; + + public StartPerformanceTestException(String msg) { + super(msg); + } + + public StartPerformanceTestException(String msg, ErrorCode errorCode) { + super(msg); + this.setErrorCode(errorCode); + } + + private void setErrorCode(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + @Override + public ErrorCode getErrorCode() { + return errorCode; + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/exception/StopPerformanceTestException.java b/titan-task/src/main/java/com/yunji/titan/task/exception/StopPerformanceTestException.java new file mode 100644 index 0000000..a9ffc45 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/exception/StopPerformanceTestException.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.exception; + +import com.yunji.titan.utils.ErrorCode; + +/** + * 停止压测异常 + * + * @author gaoxianglong + */ +public class StopPerformanceTestException extends PerformanceTestException { + private static final long serialVersionUID = -3961104998257309189L; + private ErrorCode errorCode; + + public StopPerformanceTestException(String msg) { + super(msg); + } + + public StopPerformanceTestException(String msg, ErrorCode errorCode) { + super(msg); + this.setErrorCode(errorCode); + } + + private void setErrorCode(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + @Override + public ErrorCode getErrorCode() { + return errorCode; + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/exception/TaskException.java b/titan-task/src/main/java/com/yunji/titan/task/exception/TaskException.java new file mode 100644 index 0000000..50ba44a --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/exception/TaskException.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.exception; + +import com.yunji.titan.utils.ErrorCode; + +/** + * Task异常接口超类 + * + * @author gaoxianglong + */ +public class TaskException extends RuntimeException { + private static final long serialVersionUID = -1424130130826519574L; + private ErrorCode errorCode; + + public TaskException(String msg) { + super(msg); + } + + public TaskException(String msg, ErrorCode errorCode) { + super(msg); + this.setErrorCode(errorCode); + } + + private void setErrorCode(ErrorCode errorCode) { + this.errorCode = errorCode; + } + + public ErrorCode getErrorCode() { + return errorCode; + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/facade/TaskFacade.java b/titan-task/src/main/java/com/yunji/titan/task/facade/TaskFacade.java new file mode 100644 index 0000000..87435b2 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/facade/TaskFacade.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.facade; + +import com.yunji.titan.utils.Result; +import com.yunji.titan.utils.TaskIssuedBean; + +/** + * Task服务外观类,将需要对外提供的接口进行统一封装 + * + * @author gaoxianglong + */ +public interface TaskFacade { + /** + * 启动压测 + * + * @author gaoxianglong + * + * @param taskIssuedBean + * 任务下发Bean + * + * @return Result + */ + public Result startPerformanceTest(TaskIssuedBean taskIssuedBean); + + /** + * 停止压测 + * + * @author gaoxianglong + * + * @param senceId + * 场景ID + * + * @return Result + */ + public Result stopPerformanceTest(Integer senceId); + + /** + * agent领取压测任务 + * + * @author gaoxianglong + * + * @param zNode + * agent的zNode + * + * @return Result + */ + public Result pullTask(String zNode); + + /** + * 获取注册中心所有的agent的hostAddress信息 + * + * @author gaoxianglong + * + * @return Result + */ + public Result getAgentsHostAddress(); +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/facade/TaskFacadeImpl.java b/titan-task/src/main/java/com/yunji/titan/task/facade/TaskFacadeImpl.java new file mode 100644 index 0000000..9e3718f --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/facade/TaskFacadeImpl.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.facade; + +import javax.annotation.Resource; + +import com.yunji.titan.task.template.GetAgentsHostAddress; +import com.yunji.titan.task.template.PullTask; +import com.yunji.titan.task.template.StartPerformanceTest; +import com.yunji.titan.task.template.StopPerformanceTest; +import com.yunji.titan.utils.Result; +import com.yunji.titan.utils.TaskIssuedBean; + +/** + * Task服务外观类实现 + * + * @author gaoxianglong + */ +public class TaskFacadeImpl implements TaskFacade { + @Resource(name = "startPerformanceTest") + private StartPerformanceTest startPerformanceTest; + + @Resource(name = "stopPerformanceTest") + private StopPerformanceTest stopPerformanceTest; + + @Resource(name = "pullTask") + private PullTask pullTask; + + @Resource(name = "getAgentsHostAddress") + private GetAgentsHostAddress getAgentsHostAddress; + + @Override + public Result startPerformanceTest(TaskIssuedBean taskIssuedBean) { + return startPerformanceTest.getResult(taskIssuedBean); + } + + @Override + public Result stopPerformanceTest(Integer senceId) { + return stopPerformanceTest.getResult(senceId); + } + + @Override + public Result pullTask(String zNode) { + return pullTask.getResult(zNode); + } + + @Override + public Result getAgentsHostAddress() { + return getAgentsHostAddress.getResult(null); + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/service/assign/TaskService.java b/titan-task/src/main/java/com/yunji/titan/task/service/assign/TaskService.java new file mode 100644 index 0000000..17768c0 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/service/assign/TaskService.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.service.assign; + +import com.yunji.titan.utils.TaskIssuedBean; + +/** + * 任务编排和任务下发接口 + * + * @author gaoxianglong + */ +public interface TaskService { + /** + * 启动压测 + * + * @author gaoxianglong + * + * @param taskIssuedBean + * + * @return void + */ + public void startPerformanceTest(TaskIssuedBean taskIssuedBean); + + /** + * 给指定场景下所有正在执行压测任务的agent发出interrupted信号,但压测任务并不会立即停止 + * + * @author gaoxianglong + * + * @param senceId + * 场景ID + * + * @return void + */ + public void stopPerformanceTest(Integer senceId); + + /** + * 下发压测指令后,agent领取压测任务 + * + * @author gaoxianglong + * + * @param zNode + * agent的zNode + * + * @return String + */ + public String pullTask(String zNode); +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/service/assign/TaskServiceImpl.java b/titan-task/src/main/java/com/yunji/titan/task/service/assign/TaskServiceImpl.java new file mode 100644 index 0000000..d43998a --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/service/assign/TaskServiceImpl.java @@ -0,0 +1,420 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.service.assign; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Resource; + +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.data.Stat; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSON; +import com.yunji.titan.agent.state.AgentStateContext; +import com.yunji.titan.agent.state.BusynessState; +import com.yunji.titan.agent.state.StopState; +import com.yunji.titan.agent.utils.ChangeAgentState; +import com.yunji.titan.task.bean.po.ScenePO; +import com.yunji.titan.task.dao.scene.SceneDao; +import com.yunji.titan.task.exception.PullTaskException; +import com.yunji.titan.task.exception.ResourceException; +import com.yunji.titan.task.exception.StartPerformanceTestException; +import com.yunji.titan.task.exception.StopPerformanceTestException; +import com.yunji.titan.task.service.info.AgentInfoService; +import com.yunji.titan.task.watch.WatchAgents; +import com.yunji.titan.utils.AgentTaskBean; +import com.yunji.titan.utils.AgentType; +import com.yunji.titan.utils.ContentType; +import com.yunji.titan.utils.ErrorCode; +import com.yunji.titan.utils.NodePath; +import com.yunji.titan.utils.ProtocolType; +import com.yunji.titan.utils.RequestType; +import com.yunji.titan.utils.TaskIssuedBean; +import com.yunji.titan.utils.ZookeeperConnManager; +import com.yunji.titan.utils.ftp.FtpUtils; + +import redis.clients.jedis.JedisCluster; + +/** + * 任务编排和任务下发接口实现 + * + * @author gaoxianglong + */ +@Service +public class TaskServiceImpl implements TaskService { + private String nodePath = NodePath.AGENT_LOCK_NODEPATH; + @Resource + private ZookeeperConnManager zookeeperConnManager; + @Resource + private AgentInfoService agentInfoService; + @Resource + private SceneDao sceneDao; + @Resource + private JedisCluster jedisCluster; + @Resource + private WatchAgents watchAgents; + @Resource + private FtpUtils ftpUtils; + @Resource + private AgentStateContext agentStateContext; + private static Logger log = LoggerFactory.getLogger(TaskServiceImpl.class); + + @Override + public void startPerformanceTest(TaskIssuedBean taskIssuedBean) { + /* 获取当前场景状态,如果指定场景的状态非0则不允许执行压测 */ + if (!checkStatus(0, taskIssuedBean.getSenceId())) { + throw new ResourceException("场景状态非空闲不允许启动压测", ErrorCode.SCENE_TYPE_FAIL); + } + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + /* 通过分布式锁来确保获取agent数时的一致性 */ + log.info("正在尝试获取任务分布式锁"); + while (true) { + try { + Stat stat = zkClient.exists(nodePath, false); + if (null == stat) { + zkClient.create(nodePath, new byte[] {}, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); + log.info("成功获取到分布式锁"); + /* 执行任务编排和任务下发 */ + taskIssued(taskIssuedBean, zkClient); + zkClient.delete(nodePath, -1); + break; + } + } catch (KeeperException | InterruptedException e) { + throw new ResourceException("无法获取到任务锁,无法启动压测任务", ErrorCode.GET_TASK_STOCK_FAIL); + } + try { + TimeUnit.MILLISECONDS.sleep(100); + } catch (InterruptedException e) { + log.error("error", e); + } + } + } + + /** + * 执行任务下发 + * + * @author gaoxianglong + */ + private void taskIssued(TaskIssuedBean taskIssuedBean, ZooKeeper zkClient) { + /* 获取当前注册中心中内可用的agent数,如果agent数不足则不允许执行压测 */ + int freeAgentSize = agentInfoService.getFreeAgentSize(); + if (freeAgentSize < taskIssuedBean.getAgentSize()) { + throw new ResourceException("可用的agent节点数不足", ErrorCode.FREE_AGENT_lACK); + } + /* 获取当前注册中心内可用agent的znode地址 */ + List freeAgents = agentInfoService.getFreeAgents(); + /* 开始任务编排 */ + Map taskMap = missionSchedule(freeAgents, taskIssuedBean.getAgentSize(), + taskIssuedBean.getUrls(), downLoadFiles(taskIssuedBean.getParams()), taskIssuedBean.getRequestTypes(), + taskIssuedBean.getProtocolTypes(), taskIssuedBean.getContentTypes(), taskIssuedBean.getCharsets()); + /* 为每一个场景的压测任务分配一个唯一的任务ID */ + String taskId = UUID.randomUUID().toString(); + taskMap.forEach((znode, taskBean) -> { + taskBean.setTaskId(taskId); + /* 每个agent分配的起步量级并发用户数 */ + taskBean.setInitConcurrentUsersSize( + taskIssuedBean.getInitConcurrentUsersSize() / taskIssuedBean.getAgentSize()); + /* 每个agent分配的并发用户数 */ + taskBean.setConcurrentUsersSize(taskIssuedBean.getConcurrentUsersSize() / taskIssuedBean.getAgentSize()); + /* 每个并发用户分配的并发任务数 */ + taskBean.setTaskSize(taskIssuedBean.getTaskSize() / taskIssuedBean.getConcurrentUsersSize()); + taskBean.setSenceId(taskIssuedBean.getSenceId()); + taskBean.setSenceName(taskIssuedBean.getSenceName()); + taskBean.setAgentSize(taskIssuedBean.getAgentSize()); + taskBean.setExpectThroughput(taskIssuedBean.getExpectThroughput()); + if (0 != taskIssuedBean.getContinuedTime() && null != taskIssuedBean.getTimeUnit()) { + taskBean.setContinuedTime(taskIssuedBean.getTimeUnit().toSeconds(taskIssuedBean.getContinuedTime())); + } + String taskInfo = JSON.toJSONString(taskBean); + log.info("znode-->" + znode + "的任务信息-->" + taskInfo); + /* 将agent对应的任务信息上传至ftp等待任务下发 */ + final String filePath = znode + ".json"; + if (ftpUtils.uploadFile(new File(filePath), taskInfo.getBytes())) { + /* 将每一个agent的FTP脚本文件路径存储至Redis */ + jedisCluster.set(znode, filePath); + try { + /* 通知注册中心内指定的agent领取压测任务 */ + ChangeAgentState.change(agentStateContext, new BusynessState(), zkClient, znode); + } catch (Exception e) { + log.error("error", e); + throw new StartPerformanceTestException("下发压测任务失败", ErrorCode.START_PERFORMANCE_TEST_FAIL); + } + } + }); + Set znodes = taskMap.keySet(); + /* 将执行某场景压测的所有agent的znode信息存储到redis,便于后续暂停某个场景时使用 */ + jedisCluster.sadd(String.valueOf(taskIssuedBean.getSenceId()), znodes.toArray(new String[znodes.size()])); + } + + /** + * 从FTP服务器上下载指定的文件 + * + * @author gaoxianglong + * + * @param paths + * 每一个url对应的FTP文件路径 + * + * @exception Exception + * + * @return Map> 每一个URL对应的动态参数 + */ + private Map> downLoadFiles(Map paths) { + Map> params = new HashMap>(16); + if (null == paths || paths.isEmpty()) { + return null; + } + paths.forEach((url, ftpFile) -> { + if (null == ftpFile) { + return; + } + /* 从FTP进行下载 */ + boolean result = ftpUtils.downloadFile(ftpFile); + if (result) { + File localFile = new File(System.getProperty("user.home") + "/" + ftpFile.getName()); + if (localFile.exists()) { + List param = new ArrayList(); + try (HSSFWorkbook book = new HSSFWorkbook( + new BufferedInputStream(new FileInputStream(localFile.getPath())))) { + HSSFSheet sheet = book.getSheetAt(0); + /* 返回参数文件行数 */ + for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { + HSSFRow sheetRow = sheet.getRow(i); + if (null != sheetRow) { + HSSFCell cell = sheetRow.getCell(0); + if (null != cell) { + // cell.setCellType(Cell.CELL_TYPE_STRING); + cell.setCellType(CellType.STRING); + param.add(String.valueOf(cell.getRichStringCellValue())); + } + } + } + params.put(url, param); + } catch (FileNotFoundException e) { + log.error("error", e); + } catch (IOException e) { + log.error("error", e); + } finally { + if (localFile.delete()) { + log.info("从FTP下载的源文件-->" + localFile.getPath() + "已经成功从本地删除"); + } + } + } + } else { + log.error("无法从FTP下载目标文件-->" + ftpFile.getPath()); + } + }); + return params; + } + + @Override + public String pullTask(String zNode) { + if (!jedisCluster.exists(zNode)) { + throw new PullTaskException("领取任务失败", ErrorCode.PULL_TASK_FAIL); + } + String taskInfo = jedisCluster.get(zNode); + jedisCluster.del(zNode); + return taskInfo; + } + + /** + * 压测任务编排,包括调度指定的agent参与压测、agent分配动态参数等 + * + * @author gaoxianglong + * + * @param znodes + * 可用的agent节点集合 + * + * @param agentSize + * 申请压测agent节点数 + * + * @param urls + * 需要执行全链路压测的目标URL + * + * @param params + * 每一个URL对应的动态参数 + * + * @param requestTypes + * 请求类型 + * + * @param protocolTypes + * 请求协议 + * + * @throws Exception + * + * @return Map + */ + private Map missionSchedule(List znodes, int agentSize, List urls, + Map> params, Map requestTypes, + Map protocolTypes, Map contentTypes, + Map charsets) { + Map taskMap = new ConcurrentHashMap(16); + /* 定义目标agent分配动态参数的开始索引 */ + Map startIndex = new ConcurrentHashMap(16); + /* 定义目标agent分配动态参数的结束索引 */ + Map endIndex = new ConcurrentHashMap(16); + for (int i = 0; i < agentSize; i++) { + AgentTaskBean taskBean = new AgentTaskBean(); + urls.stream().forEach(url -> { + if (null != params) { + /* 获取manager下发的一个url包含的完整动态参数集合 */ + List param = params.get(url); + if (null != param && (!param.isEmpty())) { + if (param.size() >= agentSize) { + /* 每一个agent预计分配的动态参数数量 */ + int agentParamsize = 0 == (param.size() % agentSize) ? param.size() / agentSize + : param.size() / agentSize + 1; + /* 初始化索引 */ + if (!startIndex.containsKey(url)) { + startIndex.put(url, 0); + } + if (!endIndex.containsKey(url)) { + endIndex.put(url, agentParamsize); + } + /* 为每个agent分配相应的动态参数 */ + taskBean.getParams().put(url, + paramAllocation(param, startIndex.get(url), endIndex.get(url))); + /* 更新索引的起始位置 */ + startIndex.put(url, endIndex.get(url)); + endIndex.put(url, endIndex.get(url) + agentParamsize); + } else { + taskBean.getParams().put(url, param); + } + } + } + taskBean.getUrls().add(url); + taskBean.getRequestTypes().put(url, requestTypes.get(url)); + taskBean.getProtocolTypes().put(url, protocolTypes.get(url)); + taskBean.getContentTypes().put(url, contentTypes.get(url)); + taskBean.getCharsets().put(url, charsets.get(url)); + }); + taskMap.put(znodes.get(i), taskBean); + } + return taskMap; + } + + @Override + public void stopPerformanceTest(Integer senceId) { + /* 获取当前场景状态,如果指定场景的状态非1则不允许停止压测 */ + if (!checkStatus(1, senceId)) { + throw new ResourceException("场景状态非启动中不允许停止压测", ErrorCode.SCENE_TYPE_FAIL); + } + String key = String.valueOf(senceId); + if (!jedisCluster.exists(key)) { + throw new StopPerformanceTestException("redis中不包含场景ID[" + senceId + "]的相关znode节点", + ErrorCode.STOP_PERFORMANCE_TEST_FAIL); + } + Set znodes = jedisCluster.smembers(key); + if (!znodes.isEmpty()) { + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + try { + znodes.stream().forEach(znode -> { + try { + String value = new String(zkClient.getData(znode, false, null)); + if (null != value) { + Properties properties = new Properties(); + properties.load(new StringReader(value)); + String agentStateKey = "task"; + String interruptedKey = "interrupted"; + /* 忙碌状态才可停止task=true\interrupted=false */ + if (Boolean.parseBoolean(properties.getProperty(agentStateKey)) + && !Boolean.parseBoolean(properties.getProperty(interruptedKey))) { + ChangeAgentState.change(agentStateContext, new StopState(), zkClient, znode); + } else { + throw new ResourceException("agent状态不对", ErrorCode.AGENT_TYPE_ERROR); + } + } + } catch (Exception e) { + log.error("error", e); + throw new StopPerformanceTestException("停止压测失败", ErrorCode.STOP_PERFORMANCE_TEST_FAIL); + } + }); + } finally { + jedisCluster.del(key); + } + } + } + + /** + * 状态检查 + * + * @author gaoxianglong + */ + private boolean checkStatus(int status, int senceId) { + boolean result = false; + List scenePOs = sceneDao.getSceneStatus(senceId); + if (!scenePOs.isEmpty()) { + int sceneStatus = scenePOs.get(0).getSceneStatus(); + if (status == sceneStatus) { + result = true; + } + } + return result; + } + + /** + * 为每一个agent分配的相应数量的动态参数 + * + * @author gaoxianglong + * + * @param params + * 一个url包含的完整动态参数 + * + * @param startIndex + * 开始索引位置 + * + * @param endIndex + * 结束索引位置 + * + * @return List 返回指定agent可分配的动态参数 + */ + private List paramAllocation(List params, int startIndex, int endIndex) { + List list = null; + if (params.isEmpty()) { + return list; + } + list = new ArrayList(); + for (int i = startIndex; i < (endIndex > params.size() ? params.size() : endIndex); i++) { + list.add(params.get(i)); + } + return list; + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/service/info/AgentInfoService.java b/titan-task/src/main/java/com/yunji/titan/task/service/info/AgentInfoService.java new file mode 100644 index 0000000..1dc2047 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/service/info/AgentInfoService.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.service.info; + +import java.util.List; + +/** + * 注册中心agent状态信息接口 + * + * @author gaoxianglong + */ +public interface AgentInfoService { + /** + * 获取注册中心内当前的agent总节点数 + * + * @author gaoxianglong + * + * @return int + */ + public int getAgentSize(); + + /** + * 获取注册中心内当前空闲的agent节点数 + * + * @author gaoxianglong + * + * @return int + */ + public int getFreeAgentSize(); + + /** + * 获取注册中心内当前空闲的agent的znode信息 + * + * @author gaoxianglong + * + * @return List + */ + public List getFreeAgents(); + + /** + * 获取注册中心所有的agent的hostAddress信息 + * + * @author gaoxianglong + * + * @return String agent信息bean + */ + public String getAgentsHostAddress(); +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/service/info/AgentInfoServiceImpl.java b/titan-task/src/main/java/com/yunji/titan/task/service/info/AgentInfoServiceImpl.java new file mode 100644 index 0000000..b3eac97 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/service/info/AgentInfoServiceImpl.java @@ -0,0 +1,177 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.service.info; + +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.atomic.LongAdder; +import java.util.stream.Collectors; + +import javax.annotation.Resource; + +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSON; +import com.yunji.titan.task.bean.bo.AgentInfoBO; +import com.yunji.titan.task.exception.ResourceException; +import com.yunji.titan.task.watch.WatchAgents; +import com.yunji.titan.utils.ErrorCode; +import com.yunji.titan.utils.NodePath; +import com.yunji.titan.utils.ZookeeperConnManager; + +/** + * 注册中心agent状态信息接口实现 + * + * @author gaoxianglong + */ +@Service +public class AgentInfoServiceImpl implements AgentInfoService { + @Resource + private ZookeeperConnManager zookeeperConnManager; + @Resource + private WatchAgents watchAgents; + private String nodePath = NodePath.ROOT_NODEPATH; + private Logger log = LoggerFactory.getLogger(AgentInfoService.class); + + @Override + public int getAgentSize() { + int agentSize = 0; + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + if (null == zkClient) { + return agentSize; + } + try { + agentSize = agentFilter(zkClient.getChildren(nodePath, false)).size(); + } catch (KeeperException | InterruptedException e) { + log.error("error", e); + } + return agentSize; + } + + @Override + public int getFreeAgentSize() { + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + if (null == zkClient) { + return 0; + } + LongAdder freeAgentSize = new LongAdder(); + List childrens = null; + try { + childrens = agentFilter(zkClient.getChildren(nodePath, false)); + } catch (KeeperException | InterruptedException e) { + log.error("error", e); + } + childrens.stream().forEach(children -> { + Properties properties = new Properties(); + try { + properties.load(new StringReader(new String(zkClient.getData(nodePath + "/" + children, false, null)))); + String agentStateKey = "task"; + String agentState = "false"; + if (properties.getProperty(agentStateKey).equals(agentState)) { + freeAgentSize.increment(); + } + } catch (IOException | KeeperException | InterruptedException e) { + log.error("error", e); + } + }); + return freeAgentSize.intValue(); + } + + @Override + public List getFreeAgents() { + List nodes = new ArrayList(); + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + if (null == zkClient) { + return nodes; + } + List childrens = null; + try { + childrens = agentFilter(zkClient.getChildren(nodePath, false)); + } catch (KeeperException | InterruptedException e) { + log.error("error", e); + } + childrens.stream().forEach(children -> { + try { + Properties properties = new Properties(); + properties.load(new StringReader(new String(zkClient.getData(nodePath + "/" + children, false, null)))); + String agentStateKey = "task"; + String agentState = "false"; + if (properties.getProperty(agentStateKey).equals(agentState)) { + nodes.add(nodePath + "/" + children); + } + } catch (IOException | KeeperException | InterruptedException e) { + log.error("error", e); + } + }); + return nodes; + } + + @Override + public String getAgentsHostAddress() { + String agentInfo = null; + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + if (null == zkClient) { + return agentInfo; + } + AgentInfoBO agentInfoBO = new AgentInfoBO(); + List childrens = null; + try { + childrens = agentFilter(zkClient.getChildren(nodePath, false)); + } catch (KeeperException | InterruptedException e) { + throw new ResourceException(e.getMessage(), ErrorCode.GET_AGENT_HOST_ADDRESS_FAILS); + } + childrens.stream().forEach(children -> { + try { + Properties properties = new Properties(); + properties.load(new StringReader(new String(zkClient.getData(nodePath + "/" + children, false, null)))); + String hostAddress = children + "/" + properties.getProperty("hostAddress"); + String agentStateKey = "task"; + if (!Boolean.parseBoolean(properties.getProperty(agentStateKey))) { + if (null == agentInfoBO.getFreeAgents()) { + agentInfoBO.setFreeAgents(new ArrayList()); + } + agentInfoBO.getFreeAgents().add(hostAddress); + } else { + if (null == agentInfoBO.getBusynessAgents()) { + agentInfoBO.setBusynessAgents(new ArrayList()); + } + agentInfoBO.getBusynessAgents().add(hostAddress); + } + } catch (IOException | KeeperException | InterruptedException e) { + throw new ResourceException(e.getMessage(), ErrorCode.GET_AGENT_HOST_ADDRESS_FAILS); + } + }); + agentInfo = JSON.toJSONString(agentInfoBO); + return agentInfo; + } + + /** + * 过滤注册中心根目录下的非agent节点 + * + * @author gaoxianglong + */ + private List agentFilter(List childrens) { + return childrens.stream().filter(children -> children.startsWith("agent")).collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/template/GetAgentsHostAddress.java b/titan-task/src/main/java/com/yunji/titan/task/template/GetAgentsHostAddress.java new file mode 100644 index 0000000..aa7369d --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/template/GetAgentsHostAddress.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.template; + +import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import com.yunji.titan.task.service.info.AgentInfoService; +import com.yunji.titan.utils.ErrorCode; +import com.yunji.titan.utils.Result; + +/** + * RPC接口出参模板类实现,获取获取注册中心所有的agent的hostAddress信息 + * + * @author gaoxianglong + */ +@Component("getAgentsHostAddress") +public class GetAgentsHostAddress implements ResultTemplate { + @Resource + private AgentInfoService agentInfoService; + + @Override + public Result invoke(Object param) { + String hostAddressJson = agentInfoService.getAgentsHostAddress(); + return new Result().getResult(true, ErrorCode.GET_AGENT_HOST_ADDRESS_SUCCESS, hostAddressJson); + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/template/PullTask.java b/titan-task/src/main/java/com/yunji/titan/task/template/PullTask.java new file mode 100644 index 0000000..ac66f66 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/template/PullTask.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.template; + +import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import com.yunji.titan.task.service.assign.TaskService; +import com.yunji.titan.utils.ErrorCode; +import com.yunji.titan.utils.Result; + +/** + * RPC接口出参模板类实现,下发压测指令后,agent领取压测任务 + * + * @author gaoxianglong + */ +@Component("pullTask") +public class PullTask implements ResultTemplate { + @Resource + private TaskService taskService; + + @Override + public Result invoke(String zNode) { + String taskInfo = taskService.pullTask(zNode); + return new Result().getResult(true, ErrorCode.PULL_TASK_SUCCESS, taskInfo); + } +} diff --git a/titan-task/src/main/java/com/yunji/titan/task/template/ResultTemplate.java b/titan-task/src/main/java/com/yunji/titan/task/template/ResultTemplate.java new file mode 100644 index 0000000..8784a2b --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/template/ResultTemplate.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.template; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.yunji.titan.task.exception.PerformanceTestException; +import com.yunji.titan.task.exception.PullTaskException; +import com.yunji.titan.task.exception.ResourceException; +import com.yunji.titan.task.exception.StartPerformanceTestException; +import com.yunji.titan.task.exception.StopPerformanceTestException; +import com.yunji.titan.task.exception.TaskException; +import com.yunji.titan.utils.ErrorCode; +import com.yunji.titan.utils.Result; + +/** + * RPC接口出参模板类 + * + * @author gaoxianglong + */ +public interface ResultTemplate { + Logger log = LoggerFactory.getLogger(ResultTemplate.class); + + /** + * 封装RPC接口出参 + * + * @author gaoxianglong + * + * @param param + * + * @return Result + */ + default Result getResult(E param) { + Result result = null; + try { + result = invoke(param); + } catch (ResourceException e) { + result.getResult(false, e.getErrorCode()); + log.error("error", e); + } catch (StartPerformanceTestException e) { + result.getResult(false, e.getErrorCode()); + log.error("error", e); + } catch (StopPerformanceTestException e) { + result.getResult(false, e.getErrorCode()); + log.error("error", e); + } catch (PullTaskException e) { + result.getResult(false, e.getErrorCode()); + log.error("error", e); + } catch (PerformanceTestException e) { + result.getResult(false, ErrorCode.FAIL); + log.error("error", e); + } catch (TaskException e) { + result.getResult(false, ErrorCode.FAIL); + log.error("error", e); + } catch (Exception e) { + result.getResult(false, ErrorCode.FAIL); + log.error("error", e); + } catch (Throwable e) { + result.getResult(false, ErrorCode.FAIL); + log.error("error", e); + } + return result; + } + + /** + * 执行目标方法调用 + * + * @author gaoxianglong + * + * @param param + * + * @return Result + */ + public abstract Result invoke(E param); +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/template/StartPerformanceTest.java b/titan-task/src/main/java/com/yunji/titan/task/template/StartPerformanceTest.java new file mode 100644 index 0000000..a59652d --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/template/StartPerformanceTest.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.template; + +import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import com.yunji.titan.task.service.assign.TaskService; +import com.yunji.titan.utils.ErrorCode; +import com.yunji.titan.utils.Result; +import com.yunji.titan.utils.TaskIssuedBean; + +/** + * RPC接口出参模板类实现,启动压测 + * + * @author gaoxianglong + */ +@Component("startPerformanceTest") +public class StartPerformanceTest implements ResultTemplate { + @Resource + private TaskService taskService; + + @Override + public Result invoke(TaskIssuedBean taskIssuedBean) { + taskService.startPerformanceTest(taskIssuedBean); + return new Result().getResult(true, ErrorCode.START_PERFORMANCE_TEST_SUCCESS); + } +} \ No newline at end of file diff --git a/titan-task/src/main/java/com/yunji/titan/task/template/StopPerformanceTest.java b/titan-task/src/main/java/com/yunji/titan/task/template/StopPerformanceTest.java new file mode 100644 index 0000000..8b28548 --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/template/StopPerformanceTest.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.template; + +import javax.annotation.Resource; +import org.springframework.stereotype.Component; +import com.yunji.titan.task.service.assign.TaskService; +import com.yunji.titan.utils.ErrorCode; +import com.yunji.titan.utils.Result; + +/** + * RPC接口出参模板类实现,停止压测 + * + * @author gaoxianglong + */ +@Component("stopPerformanceTest") +public class StopPerformanceTest implements ResultTemplate { + @Resource + private TaskService taskService; + + @Override + public Result invoke(Integer senceId) { + taskService.stopPerformanceTest(senceId); + return new Result().getResult(true, ErrorCode.STOP_PERFORMANCE_TEST_SUCCESS); + } +} diff --git a/titan-task/src/main/java/com/yunji/titan/task/watch/WatchAgents.java b/titan-task/src/main/java/com/yunji/titan/task/watch/WatchAgents.java new file mode 100644 index 0000000..4cca2ae --- /dev/null +++ b/titan-task/src/main/java/com/yunji/titan/task/watch/WatchAgents.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.task.watch; + +import java.util.List; +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import org.apache.zookeeper.CreateMode; +import org.apache.zookeeper.KeeperException; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.Watcher.Event.EventType; +import org.apache.zookeeper.ZooDefs.Ids; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import com.yunji.titan.utils.NodePath; +import com.yunji.titan.utils.ZookeeperConnManager; + +/** + * 监听注册中心agent的变化 + * + * @author gaoxianglong + */ +@Component +public class WatchAgents implements Watcher { + @Resource + private ZookeeperConnManager zookeeperConnManager; + private String nodePath = NodePath.ROOT_NODEPATH; + private Logger log = LoggerFactory.getLogger(WatchAgents.class); + + @PostConstruct + public void init() { + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + try { + /* 如果根节点不存在则创建 */ + if (null == zkClient.exists(nodePath, false)) { + zkClient.create(nodePath, new byte[] {}, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); + } + /* 注册节点 */ + zkClient.getChildren(nodePath, this); + } catch (KeeperException | InterruptedException e) { + log.error("error", e); + } + } + + @Override + public void process(WatchedEvent event) { + ZooKeeper zkClient = zookeeperConnManager.getZkClient(); + try { + /* 重新注册节点 */ + List childrens = zkClient.getChildren(nodePath, this); + EventType eventType = event.getType(); + switch (eventType) { + case NodeChildrenChanged: + log.info("当前注册中心内的成功注册的agent数量-->" + + childrens.stream().filter(children -> children.startsWith("agent")).count()); + break; + default: + break; + } + } catch (Exception e) { + log.error("error", e); + } + } +} \ No newline at end of file diff --git a/titan-task/src/main/resources/dao-context.xml b/titan-task/src/main/resources/dao-context.xml new file mode 100644 index 0000000..8389dab --- /dev/null +++ b/titan-task/src/main/resources/dao-context.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-task/src/main/resources/dubbo-context.xml b/titan-task/src/main/resources/dubbo-context.xml new file mode 100644 index 0000000..baa3af3 --- /dev/null +++ b/titan-task/src/main/resources/dubbo-context.xml @@ -0,0 +1,20 @@ + + + + + + + + \ No newline at end of file diff --git a/titan-task/src/main/resources/ftp-context.xml b/titan-task/src/main/resources/ftp-context.xml new file mode 100644 index 0000000..ae98868 --- /dev/null +++ b/titan-task/src/main/resources/ftp-context.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-task/src/main/resources/log4j.xml b/titan-task/src/main/resources/log4j.xml new file mode 100644 index 0000000..f7b831b --- /dev/null +++ b/titan-task/src/main/resources/log4j.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/titan-task/src/main/resources/properties/task.properties b/titan-task/src/main/resources/properties/task.properties new file mode 100644 index 0000000..d69e932 --- /dev/null +++ b/titan-task/src/main/resources/properties/task.properties @@ -0,0 +1,44 @@ +#mysql +name= +passWord= +url= +initialSize=10 +minIdle=10 +maxActive=50 +maxWait=6000 +poolPreparedStatements=false +maxOpenPreparedStatements=-1 +testOnBorrow=false +testOnReturn=false +testWhileIdle=true +filters=mergeStat,log4j,config +connectionProperties=config.decrypt=false +useGlobalDataSourceStat=false +timeBetweenLogStatsMillis=300000 + +#ftp +ftp.hostname= +ftp.userName= +ftp.passWord= +ftp.encoding=UTF-8 +ftp.bufferSize=1024 +ftp.connectTimeout=10000 +ftp.soTimeout=30000 + +#redis +redis.host= +redis.port= +redis.pool.maxTotal=100 +redis.pool.minIdle=10 +redis.pool.maxIdle=50 +redis.pool.maxWait=5000 +redis.pool.testOnBorrow=true +redis.pool.testOnReturn=true + +#dubbo +address= +port= + +#zk +zk_address= +zk_session_timeout=5000 \ No newline at end of file diff --git a/titan-task/src/main/resources/redis-context.xml b/titan-task/src/main/resources/redis-context.xml new file mode 100644 index 0000000..19ac0fb --- /dev/null +++ b/titan-task/src/main/resources/redis-context.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/titan-task/src/main/resources/root-context.xml b/titan-task/src/main/resources/root-context.xml new file mode 100644 index 0000000..3c28a57 --- /dev/null +++ b/titan-task/src/main/resources/root-context.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/titan-task/src/main/resources/shutdown.sh b/titan-task/src/main/resources/shutdown.sh new file mode 100644 index 0000000..2c19cb0 --- /dev/null +++ b/titan-task/src/main/resources/shutdown.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +source /etc/profile + +#获取本机task的PID +pid=`ps -ef | grep "titan-task" | grep -v "grep" | awk '{print $2}'` +echo $pid + +#kill本机的所有task节点 +kill -9 $pid +echo "titan-task进程已经全部kill" diff --git a/titan-task/src/main/resources/start.sh b/titan-task/src/main/resources/start.sh new file mode 100644 index 0000000..4527511 --- /dev/null +++ b/titan-task/src/main/resources/start.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +source /etc/profile + +java -server -Xms4g -Xmx4g -Xmn1g -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -XX:ParallelGCThreads=3 -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/yunji/titan-task/logs/gc.log -jar titan-task.jar & + diff --git a/titan-task/src/main/resources/zk-context.xml b/titan-task/src/main/resources/zk-context.xml new file mode 100644 index 0000000..b5ec890 --- /dev/null +++ b/titan-task/src/main/resources/zk-context.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/titan-utils/pom.xml b/titan-utils/pom.xml new file mode 100644 index 0000000..ea9994d --- /dev/null +++ b/titan-utils/pom.xml @@ -0,0 +1,203 @@ + + + 4.0.0 + + com.yunji + titan + 2.0.0-SNAPSHOT + + com.yunji + titan-utils + 2.0.0-SNAPSHOT + titan-utils + http://maven.apache.org + + 1.8 + 2.9.0 + 4.8.2 + 1.7.12 + 3.4.6 + 0.1 + 1.2.5 + 3.2.6 + 3.5 + 3.2.13.RELEASE + UTF-8 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + UTF-8 + ${java-version} + ${java-version} + + + ${env.JAVA_HOME}/jre/lib/rt.jar + ${project.basedir}/lib + + + + + + + + commons-net + commons-net + ${commons-net-version} + + + com.alibaba.rocketmq + rocketmq-client + ${rocketmq-version} + + + com.alibaba.rocketmq + rocketmq-common + ${rocketmq-version} + + + com.alibaba.rocketmq + rocketmq-store + ${rocketmq-version} + + + com.alibaba.rocketmq + rocketmq-filtersrv + ${rocketmq-version} + + + ch.qos.logback + logback-classic + + + ch.qos.logback + logback-core + + + + + com.alibaba + fastjson + ${fastjson-version} + + + com.github.sgroschupf + zkclient + ${sgroschupf-version} + + + org.springframework + spring-context + ${org.springframework-version} + + + commons-logging + commons-logging + + + + + org.springframework + spring-core + ${org.springframework-version} + + + org.springframework + spring-beans + ${org.springframework-version} + + + org.springframework + spring-jdbc + ${org.springframework-version} + + + org.springframework + spring-aop + ${org.springframework-version} + + + org.springframework + spring-test + ${org.springframework-version} + + + org.springframework + spring-context-support + ${org.springframework-version} + + + org.springframework + spring-web + ${org.springframework-version} + + + org.springframework + spring-webmvc + ${org.springframework-version} + + + org.apache.zookeeper + zookeeper + ${zookeeper-version} + + + org.slf4j + slf4j-api + ${org.slf4j-version} + + + org.slf4j + jcl-over-slf4j + ${org.slf4j-version} + runtime + + + org.slf4j + slf4j-log4j12 + ${org.slf4j-version} + runtime + + + log4j + log4j + 1.2.15 + + + javax.mail + mail + + + javax.jms + jms + + + com.sun.jdmk + jmxtools + + + com.sun.jmx + jmxri + + + runtime + + + junit + junit + ${junit-version} + test + + + redis.clients + jedis + ${jedis-version} + + + diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/AgentTaskBean.java b/titan-utils/src/main/java/com/yunji/titan/utils/AgentTaskBean.java new file mode 100644 index 0000000..e04a88e --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/AgentTaskBean.java @@ -0,0 +1,176 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * 压测任务Bean + * + * @author gaoxianglong + */ +public class AgentTaskBean { + private String taskId; + private String znode; + private int senceId; + private String senceName; + private int initConcurrentUsersSize; + private int concurrentUsersSize; + private long taskSize; + private int agentSize; + private int expectThroughput; + private long continuedTime; + private List urls = new ArrayList(); + private Map requestTypes = new ConcurrentHashMap<>(); + private Map protocolTypes = new ConcurrentHashMap<>(); + private Map> params = new ConcurrentHashMap<>(); + private Map contentTypes = new ConcurrentHashMap<>(); + private Map charsets = new ConcurrentHashMap<>(); + + public Map getContentTypes() { + return contentTypes; + } + + public void setContentTypes(Map contentTypes) { + this.contentTypes = contentTypes; + } + + public Map getCharsets() { + return charsets; + } + + public void setCharsets(Map charsets) { + this.charsets = charsets; + } + + public int getInitConcurrentUsersSize() { + return initConcurrentUsersSize; + } + + public void setInitConcurrentUsersSize(int initConcurrentUsersSize) { + this.initConcurrentUsersSize = initConcurrentUsersSize; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getSenceName() { + return senceName; + } + + public void setSenceName(String senceName) { + this.senceName = senceName; + } + + public long getContinuedTime() { + return continuedTime; + } + + public void setContinuedTime(long continuedTime) { + this.continuedTime = continuedTime; + } + + public int getExpectThroughput() { + return expectThroughput; + } + + public void setExpectThroughput(int expectThroughput) { + this.expectThroughput = expectThroughput; + } + + public String getZnode() { + return znode; + } + + public void setZnode(String znode) { + this.znode = znode; + } + + public int getSenceId() { + return senceId; + } + + public void setSenceId(int senceId) { + this.senceId = senceId; + } + + public int getConcurrentUsersSize() { + return concurrentUsersSize; + } + + public void setConcurrentUsersSize(int concurrentUsersSize) { + this.concurrentUsersSize = concurrentUsersSize; + } + + public long getTaskSize() { + return taskSize; + } + + public void setTaskSize(long taskSize) { + this.taskSize = taskSize; + } + + public int getAgentSize() { + return agentSize; + } + + public void setAgentSize(int agentSize) { + this.agentSize = agentSize; + } + + public List getUrls() { + return urls; + } + + public void setUrls(List urls) { + this.urls = urls; + } + + public Map getRequestTypes() { + return requestTypes; + } + + public void setRequestTypes(Map requestTypes) { + this.requestTypes = requestTypes; + } + + public Map getProtocolTypes() { + return protocolTypes; + } + + public void setProtocolTypes(Map protocolTypes) { + this.protocolTypes = protocolTypes; + } + + public Map> getParams() { + return params; + } + + public void setParams(Map> params) { + this.params = params; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/AgentType.java b/titan-utils/src/main/java/com/yunji/titan/utils/AgentType.java new file mode 100644 index 0000000..e1a69b2 --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/AgentType.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +/** + * agent状态 + * + * @author gaoxianglong + */ +public class AgentType { + /** + * 空闲状态 + */ + public static final byte[] FREE = ("task=false" + "\n" + "interrupted=false" + "\n" + "hostAddress=" + + Localhost.getHostAddress()).getBytes(); + + /** + * 忙碌状态 + */ + public static final byte[] BUSYNESS = ("task=true" + "\n" + "interrupted=false" + "\n" + "hostAddress=" + + Localhost.getHostAddress()).getBytes(); + + /** + * 暂停状态 + */ + public static final byte[] STOP = ("task=true" + "\n" + "interrupted=true" + "\n" + "hostAddress=" + + Localhost.getHostAddress()).getBytes(); +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/ContentType.java b/titan-utils/src/main/java/com/yunji/titan/utils/ContentType.java new file mode 100644 index 0000000..83e8e68 --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/ContentType.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +/** + * 内容类型 + * + * @author gaoxianglong + */ +public enum ContentType { + /* ssss */ + APPLICATION_JSON("application/json"), APPLICATION_XML("application/xml"), TEXT_XML("text/xml"), TEXT_HTML( + "text/html"), APPLICATION_X_WWW_FORM_URLENCODED("application/x-www-form-urlencoded"); + public String type = null; + + ContentType(String type) { + this.type = type; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/ErrorCode.java b/titan-utils/src/main/java/com/yunji/titan/utils/ErrorCode.java new file mode 100644 index 0000000..50ea32f --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/ErrorCode.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +/** + * 错误码枚举 + * + * @author gaoxianglong + */ +public enum ErrorCode { + /* 启动压测成功 */ + START_PERFORMANCE_TEST_SUCCESS(100, "启动压测成功"), + /* 启动压测失败 */ + START_PERFORMANCE_TEST_FAIL(101, "启动压测失败"), + /* 可用agent资源不足 */ + FREE_AGENT_lACK(102,"可用agent资源不足"), + INTERRUPTED_SUCCESS(103, "压测任务中断成功"), + INTERRUPTED_FAIL(104, "压测任务中断失败"), + SUCCESS(1,"操作成功"), + FAIL(301,"操作失败"), + UNKNOWN_ERROR(302,"未知错误"), + REQUEST_PARA_ERROR(303,"请求参数错误"), + QUERY_DB_ERROR(304,"查询DB失败"), + UPDATE_DB_ERROR(305,"更新DB失败"), + LOGIN_ERROR(306,"用户名或密码错误"), + HAVE_RELATED_RECORD(307,"存在关联记录"), + PULL_TASK_SUCCESS(308,"领取任务成功"), + PULL_TASK_FAIL(309,"领取任务失败"), + SCENE_TYPE_FAIL(105,"场景状态不能满足当前操作"), + STOP_PERFORMANCE_TEST_SUCCESS(106, "停止压测成功"), + STOP_PERFORMANCE_TEST_FAIL(107, "停止压测失败"), + GET_TASK_STOCK_FAIL(108,"场景状态不能满足当前操作"), + GET_AGENT_HOST_ADDRESS_SUCCESS(109,"获取注册中心所有的agent的hostAddress信息成功"), + GET_AGENT_HOST_ADDRESS_FAILS(110,"获取注册中心所有的agent的hostAddress信息失败"), + AGENT_TYPE_ERROR(111,"agent状态不对"); + + public int code; + public String errorMsg; + + ErrorCode(int code, String errorInfo) { + this.code = code; + this.errorMsg = errorInfo; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/Localhost.java b/titan-utils/src/main/java/com/yunji/titan/utils/Localhost.java new file mode 100644 index 0000000..e32045d --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/Localhost.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 获取本地主机相关信息 + * + * @author gaoxianglong + */ +public class Localhost { + private static Logger log = LoggerFactory.getLogger(Localhost.class); + + public static String getHostAddress() { + String address = "未知IP"; + try { + address = InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + log.error("无法获取到本机IP地址", e); + } + return address; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/MonitorBean.java b/titan-utils/src/main/java/com/yunji/titan/utils/MonitorBean.java new file mode 100644 index 0000000..b9333a0 --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/MonitorBean.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + + +/** + * @desc monitor数据上报bean + * + * @author liuliang + * + */ +public class MonitorBean{ + + /** + * 服务机器类型(0:agent机器 1:目标机器) + */ + private Integer serverType; + /** + * 机器IP + */ + private String ip; + /** + * CPU使用率 + */ + private Double cpuUsage; + /** + * 内存使用率 + */ + private Double memoryUsage; + /** + * 磁盘IOPS + */ + private Double iops; + /** + * 记录创建时间 + */ + private Long createTime; + public Integer getServerType() { + return serverType; + } + public void setServerType(Integer serverType) { + this.serverType = serverType; + } + public String getIp() { + return ip; + } + public void setIp(String ip) { + this.ip = ip; + } + public Double getCpuUsage() { + return cpuUsage; + } + public void setCpuUsage(Double cpuUsage) { + this.cpuUsage = cpuUsage; + } + public Double getMemoryUsage() { + return memoryUsage; + } + public void setMemoryUsage(Double memoryUsage) { + this.memoryUsage = memoryUsage; + } + public Double getIops() { + return iops; + } + public void setIops(Double iops) { + this.iops = iops; + } + public Long getCreateTime() { + return createTime; + } + public void setCreateTime(Long createTime) { + this.createTime = createTime; + } + @Override + public String toString() { + return "MonitorBean [serverType=" + serverType + ", ip=" + ip + ", cpuUsage=" + cpuUsage + ", memoryUsage=" + + memoryUsage + ", iops=" + iops + ", createTime=" + createTime + "]"; + } +} diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/NodePath.java b/titan-utils/src/main/java/com/yunji/titan/utils/NodePath.java new file mode 100644 index 0000000..f82f960 --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/NodePath.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +/** + * Znode路径信息 + * + * @author gaoxianglong + */ +public class NodePath { + public static String ROOT_NODEPATH = "/titan"; + public static String TIMETASK_LOCK_NODEPATH = ROOT_NODEPATH + "/timerTaskLock"; + public static String TIMETASK_NODEPATH = ROOT_NODEPATH + "/timerTask"; + public static String AGENT_LOCK_NODEPATH = ROOT_NODEPATH + "/taskLock"; + public static String DATACOLLECT_LOCK_NODEPATH = ROOT_NODEPATH + "/datacollectLock"; +} diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/ProtocolType.java b/titan-utils/src/main/java/com/yunji/titan/utils/ProtocolType.java new file mode 100644 index 0000000..f7f3b3c --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/ProtocolType.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +/** + * 协议类型 + * + * @author gaoxianglong + */ +public enum ProtocolType { + /* HTTP协议 */ + HTTP, + /* HTTPS协议 */ + HTTPS; +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/RequestType.java b/titan-utils/src/main/java/com/yunji/titan/utils/RequestType.java new file mode 100644 index 0000000..0c333f9 --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/RequestType.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +/** + * 请求类型 + * + * @author gaoxianglong + */ +public enum RequestType { + /* POST请求类型 */ + POST, + /* GET请求类型 */ + GET; +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/Result.java b/titan-utils/src/main/java/com/yunji/titan/utils/Result.java new file mode 100644 index 0000000..15809cd --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/Result.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +import java.io.Serializable; + +/** + * RPC结果信息返回 + * + * @author gaoxianglong + */ +public class Result implements Serializable{ + private static final long serialVersionUID = 12505436322825303L; + private boolean success; + private int errorCode; + private String errorMsg; + private T data; + + public Result getResult(boolean success, ErrorCode errorCodeEnum) { + return getResult(success, errorCodeEnum, null); + } + + public Result getResult(boolean success, ErrorCode errorCodeEnum, T data) { + this.success = success; + this.errorCode = errorCodeEnum.code; + this.errorMsg = errorCodeEnum.errorMsg; + this.data = data; + return this; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public int getErrorCode() { + return errorCode; + } + + public void setErrorCode(int errorCode) { + this.errorCode = errorCode; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + @Override + public String toString() { + return "Result [success=" + success + ", errorCode=" + errorCode + ", errorMsg=" + errorMsg + ", data=" + data + + "]"; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/ResultBean.java b/titan-utils/src/main/java/com/yunji/titan/utils/ResultBean.java new file mode 100644 index 0000000..8420c0a --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/ResultBean.java @@ -0,0 +1,187 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +/** + * 压测结果Bean + * + * @author gaoxianglong + */ +public class ResultBean { + /** + * 任务ID + */ + private String taskId; + /** + * 场景ID + */ + private int senceId; + private String senceName; + private long startTime; + private long endTime; + /** + * 持续时间 + */ + private long continuedTime; + /** + * 期待吞吐量 + */ + private int expectThroughput; + private int throughput; + /** + * 并发用户数 + */ + private int concurrentUsers; + private long taskSize; + /** + * 用户平均请求等待时间 + */ + private double timePerRequestbyUser; + /** + * 服务器平均请求等待时间 + */ + private double timePerRequestbyServer; + /** + * HTTP200请求成功数 + */ + private int httpSuccessNum; + /** + * 业务成功数 + */ + private int serviceSuccessNum; + private int agentSize; + + public int getHttpSuccessNum() { + return httpSuccessNum; + } + + public void setHttpSuccessNum(int httpSuccessNum) { + this.httpSuccessNum = httpSuccessNum; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public int getServiceSuccessNum() { + return serviceSuccessNum; + } + + public void setServiceSuccessNum(int serviceSuccessNum) { + this.serviceSuccessNum = serviceSuccessNum; + } + + public String getSenceName() { + return senceName; + } + + public void setSenceName(String senceName) { + this.senceName = senceName; + } + + public int getAgentSize() { + return agentSize; + } + + public void setAgentSize(int agentSize) { + this.agentSize = agentSize; + } + + public int getSenceId() { + return senceId; + } + + public void setSenceId(int senceId) { + this.senceId = senceId; + } + + public long getStartTime() { + return startTime; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public long getEndTime() { + return endTime; + } + + public void setEndTime(long endTime) { + this.endTime = endTime; + } + + public long getContinuedTime() { + return continuedTime; + } + + public void setContinuedTime(long continuedTime) { + this.continuedTime = continuedTime; + } + + public int getExpectThroughput() { + return expectThroughput; + } + + public void setExpectThroughput(int expectThroughput) { + this.expectThroughput = expectThroughput; + } + + public int getThroughput() { + return throughput; + } + + public void setThroughput(int throughput) { + this.throughput = throughput; + } + + public int getConcurrentUsers() { + return concurrentUsers; + } + + public void setConcurrentUsers(int concurrentUsers) { + this.concurrentUsers = concurrentUsers; + } + + public long getTaskSize() { + return taskSize; + } + + public void setTaskSize(long taskSize) { + this.taskSize = taskSize; + } + + public double getTimePerRequestbyUser() { + return timePerRequestbyUser; + } + + public void setTimePerRequestbyUser(double timePerRequestbyUser) { + this.timePerRequestbyUser = timePerRequestbyUser; + } + + public double getTimePerRequestbyServer() { + return timePerRequestbyServer; + } + + public void setTimePerRequestbyServer(double timePerRequestbyServer) { + this.timePerRequestbyServer = timePerRequestbyServer; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/SerializableUtils.java b/titan-utils/src/main/java/com/yunji/titan/utils/SerializableUtils.java new file mode 100644 index 0000000..0787bb1 --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/SerializableUtils.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 序列化工具类 + * + * @author gaoxianglong + */ +public class SerializableUtils { + private static Logger log = LoggerFactory.getLogger(SerializableUtils.class); + + /** + * 将POJO执行序列化操作 + * + * @author gaoxianglong + */ + public static byte[] toByteArray(T t) { + byte[] value = null; + if (null == t) { + return value; + } + try (ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream outObj = new ObjectOutputStream(out)) { + outObj.writeObject(t); + value = out.toByteArray(); + } catch (Exception e) { + log.error("序列化失败", e); + } + return value; + } + + /** + * 反序列化操作 + * + * @author gaoxianglong + */ + public static T toObject(byte[] value) { + T t = null; + if (null == value) { + return t; + } + try (ObjectInputStream inObj = new ObjectInputStream(new ByteArrayInputStream(value))) { + t = (T) inObj.readObject(); + } catch (Exception e) { + log.error("反序列化失败", e); + } + return t; + } +} diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/TaskIssuedBean.java b/titan-utils/src/main/java/com/yunji/titan/utils/TaskIssuedBean.java new file mode 100644 index 0000000..902c206 --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/TaskIssuedBean.java @@ -0,0 +1,196 @@ +/* + * Copyright 2015-2101 yunjiweidian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yunji.titan.utils; + +import java.io.File; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +/** + * 任务下发Bean + * + * @author gaoxianglong + */ +public class TaskIssuedBean implements Serializable{ + private static final long serialVersionUID = 851937888975205301L; + private String taskId; + private String znode; + private int senceId; + private String senceName; + private int initConcurrentUsersSize; + private int concurrentUsersSize; + private long taskSize; + private int agentSize; + private int expectThroughput; + private long continuedTime; + private List urls = new ArrayList(); + private Map requestTypes = new ConcurrentHashMap<>(); + private Map protocolTypes = new ConcurrentHashMap<>(); + private Map params = new ConcurrentHashMap<>(); + private Map contentTypes = new ConcurrentHashMap<>(); + private Map charsets = new ConcurrentHashMap<>(); + private TimeUnit timeUnit; + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getZnode() { + return znode; + } + + public void setZnode(String znode) { + this.znode = znode; + } + + public int getSenceId() { + return senceId; + } + + public void setSenceId(int senceId) { + this.senceId = senceId; + } + + public String getSenceName() { + return senceName; + } + + public void setSenceName(String senceName) { + this.senceName = senceName; + } + + public int getInitConcurrentUsersSize() { + return initConcurrentUsersSize; + } + + public void setInitConcurrentUsersSize(int initConcurrentUsersSize) { + this.initConcurrentUsersSize = initConcurrentUsersSize; + } + + public int getConcurrentUsersSize() { + return concurrentUsersSize; + } + + public void setConcurrentUsersSize(int concurrentUsersSize) { + this.concurrentUsersSize = concurrentUsersSize; + } + + public long getTaskSize() { + return taskSize; + } + + public void setTaskSize(long taskSize) { + this.taskSize = taskSize; + } + + public int getAgentSize() { + return agentSize; + } + + public void setAgentSize(int agentSize) { + this.agentSize = agentSize; + } + + public int getExpectThroughput() { + return expectThroughput; + } + + public void setExpectThroughput(int expectThroughput) { + this.expectThroughput = expectThroughput; + } + + public long getContinuedTime() { + return continuedTime; + } + + public void setContinuedTime(long continuedTime) { + this.continuedTime = continuedTime; + } + + public List getUrls() { + return urls; + } + + public void setUrls(List urls) { + this.urls = urls; + } + + public Map getRequestTypes() { + return requestTypes; + } + + public void setRequestTypes(Map requestTypes) { + this.requestTypes = requestTypes; + } + + public Map getProtocolTypes() { + return protocolTypes; + } + + public void setProtocolTypes(Map protocolTypes) { + this.protocolTypes = protocolTypes; + } + + public Map getParams() { + return params; + } + + public void setParams(Map params) { + this.params = params; + } + + public Map getContentTypes() { + return contentTypes; + } + + public void setContentTypes(Map contentTypes) { + this.contentTypes = contentTypes; + } + + public Map getCharsets() { + return charsets; + } + + public void setCharsets(Map charsets) { + this.charsets = charsets; + } + + public TimeUnit getTimeUnit() { + return timeUnit; + } + + public void setTimeUnit(TimeUnit timeUnit) { + this.timeUnit = timeUnit; + } + + @Override + public String toString() { + return "TaskIssuedBean [taskId=" + taskId + ", znode=" + znode + ", senceId=" + senceId + ", senceName=" + + senceName + ", initConcurrentUsersSize=" + initConcurrentUsersSize + ", concurrentUsersSize=" + + concurrentUsersSize + ", taskSize=" + taskSize + ", agentSize=" + agentSize + ", expectThroughput=" + + expectThroughput + ", continuedTime=" + continuedTime + ", urls=" + urls + ", requestTypes=" + + requestTypes + ", protocolTypes=" + protocolTypes + ", params=" + params + ", contentTypes=" + + contentTypes + ", charsets=" + charsets + ", timeUnit=" + timeUnit + "]"; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/ThreadPoolManager.java b/titan-utils/src/main/java/com/yunji/titan/utils/ThreadPoolManager.java new file mode 100644 index 0000000..e78074e --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/ThreadPoolManager.java @@ -0,0 +1,63 @@ +package com.yunji.titan.utils; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 线程池 + * + * @author gaoxianglong + */ +public class ThreadPoolManager { + private int corePoolSize; + private int maximumPoolSize; + private int keepAliveTime; + private int capacity; + private ThreadPoolExecutor threadPool; + + public void init() { + threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, + new ArrayBlockingQueue(capacity), new ThreadPoolExecutor.CallerRunsPolicy()); + } + + public ThreadPoolExecutor getThreadPool() { + return threadPool; + } + + public int getCorePoolSize() { + return corePoolSize; + } + + public void setCorePoolSize(int corePoolSize) { + this.corePoolSize = corePoolSize; + } + + public int getMaximumPoolSize() { + return maximumPoolSize; + } + + public void setMaximumPoolSize(int maximumPoolSize) { + this.maximumPoolSize = maximumPoolSize; + } + + public int getKeepAliveTime() { + return keepAliveTime; + } + + public void setKeepAliveTime(int keepAliveTime) { + this.keepAliveTime = keepAliveTime; + } + + public int getCapacity() { + return capacity; + } + + public void setCapacity(int capacity) { + this.capacity = capacity; + } + + public void setThreadPool(ThreadPoolExecutor threadPool) { + this.threadPool = threadPool; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/UrlEncoder.java b/titan-utils/src/main/java/com/yunji/titan/utils/UrlEncoder.java new file mode 100644 index 0000000..d16f5f1 --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/UrlEncoder.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +/** + * URL特殊字符传唤处理 + * + * @author gaoxianglong + */ +public class UrlEncoder { + /** + * 对url请求进行特殊字符转换 + * + * @author gaoxianglong + * + * @return String 转换后的URL + */ + public static String encode(String url) { + return url.replaceAll("\\|", "%7C").replaceAll("\\{", "%7b").replaceAll("\\}", "%7d"); + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/ZookeeperConnManager.java b/titan-utils/src/main/java/com/yunji/titan/utils/ZookeeperConnManager.java new file mode 100644 index 0000000..420403b --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/ZookeeperConnManager.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils; + +import java.util.concurrent.CountDownLatch; +import org.apache.zookeeper.WatchedEvent; +import org.apache.zookeeper.Watcher; +import org.apache.zookeeper.Watcher.Event.KeeperState; +import org.apache.zookeeper.ZooKeeper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * zookeeper连接管理类 + * + * @author gaoxianglong + */ +public class ZookeeperConnManager { + private ZooKeeper zkClient; + private String zkAddress; + private int zkSessionTimeout = 5000; + private CountDownLatch countDownLatch; + private Logger logger = LoggerFactory.getLogger(ZookeeperConnManager.class); + + public ZookeeperConnManager() { + countDownLatch = new CountDownLatch(1); + } + + /** + * 连接zookeeper + * + * @author gaoxianglong + */ + public void init() { + try { + zkClient = new ZooKeeper(zkAddress, zkSessionTimeout, new Watcher() { + @Override + public void process(WatchedEvent event) { + KeeperState state = event.getState(); + switch (state) { + case SyncConnected: + countDownLatch.countDown(); + logger.info("connection zookeeper success"); + break; + case Disconnected: + logger.warn("zookeeper connection is disconnected"); + break; + case Expired: + logger.error("zookeeper session expired"); + break; + case AuthFailed: + logger.error("authentication failure"); + break; + default: + break; + } + } + }); + countDownLatch.await(); + } catch (Exception e) { + logger.error("error", e); + } + } + + public String getZkAddress() { + return zkAddress; + } + + public void setZkAddress(String zkAddress) { + this.zkAddress = zkAddress; + } + + public int getZkSessionTimeout() { + return zkSessionTimeout; + } + + public void setZkSessionTimeout(int zkSessionTimeout) { + this.zkSessionTimeout = zkSessionTimeout; + } + + public ZooKeeper getZkClient() { + return zkClient; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/config/DefaultMqFactory.java b/titan-utils/src/main/java/com/yunji/titan/utils/config/DefaultMqFactory.java new file mode 100644 index 0000000..f42c83b --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/config/DefaultMqFactory.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils.config; + +import com.alibaba.rocketmq.client.consumer.DefaultMQPullConsumer; +import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer; +import com.alibaba.rocketmq.client.producer.DefaultMQProducer; + +/** + * 可以从 DefaultMQFactory中获取producter和comsunmer实例 + * + * @author gaoxianglong + */ +public class DefaultMqFactory { + private String namesrvAddr; + + /** + * 获取DefaultMQProducer实例 + * + * @author gaoxianglong + * + * @param producerGroup + * + * @return DefaultMQProducer + */ + public DefaultMQProducer getDefaultMQProducer(String producerGroup) { + DefaultMQProducer defaultMQProducer = new DefaultMQProducer(producerGroup); + defaultMQProducer.setNamesrvAddr(namesrvAddr); + return defaultMQProducer; + } + + /** + * 获取DefaultMQPushConsumer实例 + * + * @author gaoxianglong + * + * @param producerGroup + * + * @return DefaultMQProducer + */ + public DefaultMQPushConsumer getDefaultMQPushConsumer(String producerGroup) { + DefaultMQPushConsumer defaultMQPushConsumer = new DefaultMQPushConsumer(producerGroup); + defaultMQPushConsumer.setNamesrvAddr(namesrvAddr); + return defaultMQPushConsumer; + } + + /** + * 获取DefaultMQPullConsumer实例 + * + * @author gaoxianglong + * + * @param producerGroup + * + * @return DefaultMQProducer + */ + public DefaultMQPullConsumer getDefaultMQPullConsumer(String producerGroup) { + DefaultMQPullConsumer defaultMQPullConsumer = new DefaultMQPullConsumer(producerGroup); + defaultMQPullConsumer.setNamesrvAddr(namesrvAddr); + return defaultMQPullConsumer; + } + + public String getNamesrvAddr() { + return namesrvAddr; + } + + public void setNamesrvAddr(String namesrvAddr) { + this.namesrvAddr = namesrvAddr; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/config/RocketMqDataSource.java b/titan-utils/src/main/java/com/yunji/titan/utils/config/RocketMqDataSource.java new file mode 100644 index 0000000..24de020 --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/config/RocketMqDataSource.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.alibaba.rocketmq.client.consumer.DefaultMQPushConsumer; +import com.alibaba.rocketmq.client.exception.MQClientException; +import com.alibaba.rocketmq.client.producer.DefaultMQProducer; +import com.alibaba.rocketmq.common.protocol.heartbeat.MessageModel; + +/** + * RcoketMQ数据源 + * + * @author gaoxianglong + */ +public class RocketMqDataSource { + private String rocketTopic; + private String namesrvAddr; + private DefaultMqFactory defaultMQFactory; + private DefaultMQProducer producer; + private DefaultMQPushConsumer consumer; + private Logger log = LoggerFactory.getLogger(RocketMqDataSource.class); + + public String getRocketTopic() { + return rocketTopic; + } + + public void setRocketTopic(String rocketTopic) { + this.rocketTopic = rocketTopic; + } + + public String getNamesrvAddr() { + return namesrvAddr; + } + + public void setNamesrvAddr(String namesrvAddr) { + this.namesrvAddr = namesrvAddr; + } + + /** + * 初始化Producer + * + * @author gaoxianglong + */ + public void initProducer() { + if (null != producer) { + producer.shutdown(); + } + defaultMQFactory = new DefaultMqFactory(); + defaultMQFactory.setNamesrvAddr(namesrvAddr); + producer = defaultMQFactory.getDefaultMQProducer("titan-agent"); + try { + producer.start(); + } catch (MQClientException e) { + log.error("error", e); + } + log.info("RocketMQ Producer初始化完成..."); + } + + /** + * 初始化Consumer + * + * @author gaoxianglong + */ + public void initConsumer() { + defaultMQFactory = new DefaultMqFactory(); + defaultMQFactory.setNamesrvAddr(namesrvAddr); + consumer = defaultMQFactory.getDefaultMQPushConsumer("titan-datacollect-" + rocketTopic); + /* 设置MQ的工作线程数 */ + consumer.setConsumeThreadMax(100); + consumer.setConsumeThreadMin(50); + consumer.setMessageModel(MessageModel.CLUSTERING); + } + + public DefaultMQProducer getProducer() { + return producer; + } + + public DefaultMQPushConsumer getConsumer() { + return consumer; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/ftp/FtpConnManager.java b/titan-utils/src/main/java/com/yunji/titan/utils/ftp/FtpConnManager.java new file mode 100644 index 0000000..1ef171b --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/ftp/FtpConnManager.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils.ftp; + +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPReply; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * FTP连接管理类 + * + * @author gaoxianglong + */ +public class FtpConnManager { + private int bufferSize = 1024; + private int connectTimeout = 1000; + private int soTimeout = 1000; + private String hostname; + private String userName; + private String passWord; + private String encoding = "UTF-8"; + private Logger log = LoggerFactory.getLogger(FtpConnManager.class); + + protected FTPClient getFTPClient() { + FTPClient ftpClient = new FTPClient(); + try { + ftpClient.setConnectTimeout(connectTimeout); + ftpClient.connect(hostname); + ftpClient.login(userName, passWord); + int replyCode = ftpClient.getReplyCode(); + if (!FTPReply.isPositiveCompletion(replyCode)) { + FtpUtils.disconnect(ftpClient); + log.warn("FTP登陆失败,账号或者密码有误"); + } else { + ftpClient.setSoTimeout(soTimeout); + /* 设置缓冲区大小 */ + ftpClient.setBufferSize(bufferSize); + /* 设置服务器编码 */ + ftpClient.setControlEncoding(encoding); + /* 设置以二进制方式传输 */ + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); + /* 设置服务器目录 */ + // ftpClient.changeWorkingDirectory(directory); + ftpClient.enterLocalPassiveMode(); + log.debug("成功连接并登录FTP服务器。。。"); + } + } catch (Exception e) { + FtpUtils.disconnect(ftpClient); + log.error("error", e); + } + return ftpClient; + } + + public int getBufferSize() { + return bufferSize; + } + + public void setBufferSize(int bufferSize) { + this.bufferSize = bufferSize; + } + + public int getConnectTimeout() { + return connectTimeout; + } + + public void setConnectTimeout(int connectTimeout) { + this.connectTimeout = connectTimeout; + } + + public int getSoTimeout() { + return soTimeout; + } + + public void setSoTimeout(int soTimeout) { + this.soTimeout = soTimeout; + } + + public String getEncoding() { + return encoding; + } + + public void setEncoding(String encoding) { + this.encoding = encoding; + } + + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassWord() { + return passWord; + } + + public void setPassWord(String passWord) { + this.passWord = passWord; + } +} \ No newline at end of file diff --git a/titan-utils/src/main/java/com/yunji/titan/utils/ftp/FtpUtils.java b/titan-utils/src/main/java/com/yunji/titan/utils/ftp/FtpUtils.java new file mode 100644 index 0000000..6f65473 --- /dev/null +++ b/titan-utils/src/main/java/com/yunji/titan/utils/ftp/FtpUtils.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2015-2020 yunjiweidian + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.yunji.titan.utils.ftp; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.apache.commons.net.ftp.FTPClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * FTP工具类 + * + * @author gaoxianglong + */ +public class FtpUtils { + private FtpConnManager ftpConnManager; + private static Logger log = LoggerFactory.getLogger(FtpUtils.class); + + public FtpUtils(FtpConnManager ftpConnManager) { + this.ftpConnManager = ftpConnManager; + } + + /** + * 上传文件至FTP服务器 + * + * @author gaoxianglong + */ + public boolean uploadFile(File file) { + boolean result = false; + FTPClient ftpClient = ftpConnManager.getFTPClient(); + if (null == ftpClient || !ftpClient.isConnected()) { + return result; + } + try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(file.getPath()))) { + boolean storeFile = ftpClient.storeFile(file.getName(), in); + if (storeFile) { + result = true; + log.info("file-->" + file.getPath() + "成功上传至FTP服务器"); + } + } catch (Exception e) { + log.error("error", e); + } finally { + disconnect(ftpClient); + } + return result; + } + + public boolean uploadFile(File file, byte[] value) { + boolean result = false; + if (null == value) { + return result; + } + FTPClient ftpClient = ftpConnManager.getFTPClient(); + if (null == ftpClient || !ftpClient.isConnected()) { + return result; + } + try (BufferedInputStream in = new BufferedInputStream(new ByteArrayInputStream(value))) { + boolean storeFile = ftpClient.storeFile(file.getName(), in); + if (storeFile) { + result = true; + log.info("file-->" + file.getPath() + "成功上传至FTP服务器"); + } + } catch (Exception e) { + log.error("error", e); + } finally { + disconnect(ftpClient); + } + return result; + } + + /** + * 从FTP服务器下载指定的文件至本地 + * + * @author gaoxianglong + */ + public boolean downloadFile(File file) { + boolean result = false; + FTPClient ftpClient = ftpConnManager.getFTPClient(); + if (null == ftpClient || !ftpClient.isConnected()) { + return result; + } + try (BufferedOutputStream out = new BufferedOutputStream( + new FileOutputStream(System.getProperty("user.home") + "/" + file.getName()))) { + result = ftpClient.retrieveFile(file.getName(), out); + if (result) { + result = true; + log.info("file-->" + file.getPath() + "成功从FTP服务器下载"); + } + } catch (Exception e) { + log.error("error", e); + } finally { + disconnect(ftpClient); + } + return result; + } + + /** + * @desc 根据文件名下载文件 + * + * @author liuliang + * + * @param filename + * 文件名 + * @return boolean下载结果 + */ + public byte[] downloadFile(String filename) { + FTPClient ftpClient = ftpConnManager.getFTPClient(); + if (null == ftpClient || !ftpClient.isConnected()) { + log.error("根据文件名下载文件失败,获取ftpClient失败,filename:{}", filename); + return null; + } + try { + ftpClient.enterLocalPassiveMode(); + InputStream ins = ftpClient.retrieveFileStream(new String(filename.getBytes("UTF-8"), "iso-8859-1")); + if (null == ins) { + return null; + } + ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); + byte[] buff = new byte[100]; + int rc = 0; + int value =100; + while ((rc = ins.read(buff, 0, value)) > 0) { + swapStream.write(buff, 0, rc); + } + byte[] fileByte = swapStream.toByteArray(); + // ftpClient.getReply(); + return fileByte; + } catch (IOException e) { + log.error("根据文件名下载文件异常,filename:{}", filename, e); + } finally { + disconnect(ftpClient); + } + return null; + } + + /** + * 删除服务器上指定的文件 + * + * @author gaoxianglong + */ + public boolean deleteFile(File file) { + boolean result = false; + FTPClient ftpClient = ftpConnManager.getFTPClient(); + if (null == ftpClient || !ftpClient.isConnected()) { + return result; + } + try { + result = ftpClient.deleteFile(file.getName()); + if (result) { + result = true; + log.info("file-->" + file.getPath() + "成功从FTP服务器删除"); + } + } catch (Exception e) { + log.error("error", e); + } finally { + disconnect(ftpClient); + } + return result; + } + + /** + * 断开FTP连接 + * + * @author gaoxianglong + */ + protected static void disconnect(FTPClient ftpClient) { + if (null != ftpClient) { + try { + ftpClient.disconnect(); + } catch (IOException e1) { + log.error("断开FTP会话连接异常", e1); + } + } + } +} \ No newline at end of file diff --git a/titan-utils/src/test/java/com/yunji/titan/test/utils/ftp/FtpTest.java b/titan-utils/src/test/java/com/yunji/titan/test/utils/ftp/FtpTest.java new file mode 100644 index 0000000..7509151 --- /dev/null +++ b/titan-utils/src/test/java/com/yunji/titan/test/utils/ftp/FtpTest.java @@ -0,0 +1,46 @@ +package com.yunji.titan.test.utils.ftp; + +import java.io.File; +import java.io.IOException; +import org.junit.BeforeClass; +import org.junit.Test; +import com.yunji.titan.utils.ftp.FtpConnManager; +import com.yunji.titan.utils.ftp.FtpUtils; + +/** + * FTP测试类 + * + * @author liuliang + */ +public class FtpTest { + private static FtpConnManager ftpConnManager; + + public @BeforeClass static void testConnFTP() { + ftpConnManager = new FtpConnManager(); + ftpConnManager.setHostname("172.16.0.2"); + ftpConnManager.setUserName("titan-ftp"); + ftpConnManager.setPassWord("fj39sl20"); + ftpConnManager.setEncoding("UTF-8"); + ftpConnManager.setBufferSize(1024); + ftpConnManager.setConnectTimeout(2000); + ftpConnManager.setSoTimeout(30000); + } + + public @Test void testUpload() { + FtpUtils ftpUtils = new FtpUtils(ftpConnManager); + ftpUtils.uploadFile(new File("d:/test.txt")); + } + + public @Test void testDelete() { + FtpUtils ftpUtils = new FtpUtils(ftpConnManager); + ftpUtils.deleteFile(new File("test.txt")); + } + + public @Test void testDownLoad() { + FtpUtils ftpUtils = new FtpUtils(ftpConnManager); + int size = 10; + for (int i = 0; i < size; i++) { + ftpUtils.downloadFile(new File("test.txt")); + } + } +} diff --git a/titan-utils/src/test/resources/log4j.xml b/titan-utils/src/test/resources/log4j.xml new file mode 100644 index 0000000..ea0ce5f --- /dev/null +++ b/titan-utils/src/test/resources/log4j.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

        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¬MKQvCZ}ik$u~aBrSJYAz1>}Z7N1#o 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 literal 0 HcmV?d00001 diff --git a/titan-manager/src/main/webapp/images/bad.png b/titan-manager/src/main/webapp/images/bad.png new file mode 100644 index 0000000000000000000000000000000000000000..026628200cc775bcbf12188c5596960195494741 GIT binary patch literal 39477 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 literal 0 HcmV?d00001 diff --git a/titan-manager/src/main/webapp/images/logo.png b/titan-manager/src/main/webapp/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f459d1bc17db158b4ce39fc4749af220d76e4dca GIT binary patch literal 10043 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 literal 0 HcmV?d00001 diff --git a/titan-manager/src/main/webapp/images/logo2.png b/titan-manager/src/main/webapp/images/logo2.png new file mode 100644 index 0000000000000000000000000000000000000000..928da95d4bbadb5d0989812dffece283137edd95 GIT binary patch literal 4350 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 KY1V2uJo_&w1t{MD literal 0 HcmV?d00001 diff --git a/titan-manager/src/main/webapp/images/qq.png b/titan-manager/src/main/webapp/images/qq.png new file mode 100644 index 0000000000000000000000000000000000000000..80a4781e86713ceacac95c7ebd4b316b757731a3 GIT binary patch literal 16414 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 BxD5aR literal 0 HcmV?d00001 diff --git a/titan-manager/src/main/webapp/images/well.png b/titan-manager/src/main/webapp/images/well.png new file mode 100644 index 0000000000000000000000000000000000000000..cf2ddfcc0f758af818a0af8896ec835de4df25ea GIT binary patch literal 32144 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 X3+rcX2QKNi00000NkvXXu0mjfM`bV- literal 0 HcmV?d00001 diff --git a/titan-manager/src/main/webapp/index.html b/titan-manager/src/main/webapp/index.html new file mode 100644 index 0000000..a4fea02 --- /dev/null +++ b/titan-manager/src/main/webapp/index.html @@ -0,0 +1,110 @@ + + + + +TITAN-首页 + + + + + +

        cIMf<{yuKF_8QimcnZ%v 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