├── .gitignore ├── JMETER_HOME.config ├── LICENSE ├── pom.xml ├── readme.md └── src └── main ├── java └── com │ └── wangc │ ├── AppInitialization.java │ ├── Application.java │ ├── SpringUtils.java │ ├── StaticResourceConfiguration.java │ ├── comm │ ├── GenerateClass.java │ ├── Param.java │ ├── StringUtils.java │ ├── UpdateJmx.java │ └── XmlPares.java │ └── test_plan │ ├── bean │ ├── GlobalConfig.java │ ├── LogResultBean.java │ ├── RunPlanBean.java │ └── TestPlanBean.java │ ├── controler │ ├── RPController.java │ ├── TPController.java │ └── UploadJmxController.java │ ├── jmeter │ ├── GenerateJmx.java │ ├── RunJmx.java │ └── Tools.java │ ├── mapper │ ├── RPMapper.java │ └── TPMapper.java │ └── service │ ├── RPService.java │ └── TPService.java └── resources ├── application.properties ├── beetl.properties ├── beetl └── http_request.jmx ├── mapper ├── RPMapper.xml └── TPMapper.xml ├── static ├── css │ └── bootstrap │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 ├── js │ ├── bootstrap │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ └── npm.js │ └── jquery-1.12.3.min.js ├── layer │ ├── layer.js │ └── skin │ │ └── default │ │ ├── icon-ext.png │ │ ├── icon.png │ │ ├── layer.css │ │ ├── loading-0.gif │ │ ├── loading-1.gif │ │ └── loading-2.gif └── layui │ ├── css │ ├── layui.css │ ├── layui.mobile.css │ └── modules │ │ ├── code.css │ │ ├── laydate │ │ ├── icon.png │ │ └── laydate.css │ │ └── layer │ │ └── default │ │ ├── icon-ext.png │ │ ├── icon.png │ │ ├── layer.css │ │ ├── loading-0.gif │ │ ├── loading-1.gif │ │ └── loading-2.gif │ ├── font │ ├── iconfont.eot │ ├── iconfont.svg │ ├── iconfont.ttf │ └── iconfont.woff │ ├── images │ └── face │ │ ├── 0.gif │ │ ├── 1.gif │ │ ├── 10.gif │ │ ├── 11.gif │ │ ├── 12.gif │ │ ├── 13.gif │ │ ├── 14.gif │ │ ├── 15.gif │ │ ├── 16.gif │ │ ├── 17.gif │ │ ├── 18.gif │ │ ├── 19.gif │ │ ├── 2.gif │ │ ├── 20.gif │ │ ├── 21.gif │ │ ├── 22.gif │ │ ├── 23.gif │ │ ├── 24.gif │ │ ├── 25.gif │ │ ├── 26.gif │ │ ├── 27.gif │ │ ├── 28.gif │ │ ├── 29.gif │ │ ├── 3.gif │ │ ├── 30.gif │ │ ├── 31.gif │ │ ├── 32.gif │ │ ├── 33.gif │ │ ├── 34.gif │ │ ├── 35.gif │ │ ├── 36.gif │ │ ├── 37.gif │ │ ├── 38.gif │ │ ├── 39.gif │ │ ├── 4.gif │ │ ├── 40.gif │ │ ├── 41.gif │ │ ├── 42.gif │ │ ├── 43.gif │ │ ├── 44.gif │ │ ├── 45.gif │ │ ├── 46.gif │ │ ├── 47.gif │ │ ├── 48.gif │ │ ├── 49.gif │ │ ├── 5.gif │ │ ├── 50.gif │ │ ├── 51.gif │ │ ├── 52.gif │ │ ├── 53.gif │ │ ├── 54.gif │ │ ├── 55.gif │ │ ├── 56.gif │ │ ├── 57.gif │ │ ├── 58.gif │ │ ├── 59.gif │ │ ├── 6.gif │ │ ├── 60.gif │ │ ├── 61.gif │ │ ├── 62.gif │ │ ├── 63.gif │ │ ├── 64.gif │ │ ├── 65.gif │ │ ├── 66.gif │ │ ├── 67.gif │ │ ├── 68.gif │ │ ├── 69.gif │ │ ├── 7.gif │ │ ├── 70.gif │ │ ├── 71.gif │ │ ├── 8.gif │ │ └── 9.gif │ ├── lay │ ├── dest │ │ └── layui.all.js │ └── modules │ │ ├── code.js │ │ ├── element.js │ │ ├── flow.js │ │ ├── form.js │ │ ├── jquery.js │ │ ├── laydate.js │ │ ├── layedit.js │ │ ├── layer.js │ │ ├── laypage.js │ │ ├── laytpl.js │ │ ├── mobile.js │ │ ├── tree.js │ │ ├── upload.js │ │ └── util.js │ └── layui.js └── templates ├── footer.html ├── header.html ├── index.html ├── run_plan ├── report_list.html └── run_log.html └── test_plan ├── add.html ├── list.html └── modify.html /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Mobile Tools for Java (J2ME) 4 | .mtj.tmp/ 5 | 6 | # Package Files # 7 | *.jar 8 | *.war 9 | *.ear 10 | 11 | .idea 12 | .ideaDataSources 13 | *.iml 14 | *.ipr 15 | *.iws 16 | target/* 17 | jmeter/* 18 | 19 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 20 | hs_err_pid* 21 | -------------------------------------------------------------------------------- /JMETER_HOME.config: -------------------------------------------------------------------------------- 1 | /usr/local/apache-jmeter-3.2 -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.wangc 8 | testing_platform 9 | 0.2-SNAPSHOT 10 | 11 | jar 12 | 13 | 14 | org.springframework.boot 15 | spring-boot-starter-parent 16 | 1.5.1.RELEASE 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | org.springframework.boot 25 | spring-boot-starter-web 26 | 27 | 28 | 29 | org.springframework.boot 30 | spring-boot-starter-thymeleaf 31 | 32 | 33 | 34 | org.mybatis.spring.boot 35 | mybatis-spring-boot-starter 36 | 1.2.0 37 | 38 | 39 | 40 | 41 | com.alibaba 42 | druid 43 | 1.0.18 44 | 45 | 46 | 47 | 48 | org.beetl 49 | beetl-core 50 | 2.2.3 51 | 52 | 53 | 54 | 55 | dom4j 56 | dom4j 57 | 1.4 58 | 59 | 60 | 61 | 62 | org.xerial 63 | sqlite-jdbc 64 | 3.19.3 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | org.springframework.boot 74 | spring-boot-maven-plugin 75 | 76 | 77 | 78 | org.apache.maven.plugins 79 | maven-compiler-plugin 80 | 3.3 81 | 82 | 1.8 83 | 1.8 84 | 85 | 86 | 87 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | [下载](https://github.com/wang153723482/testing_platform/releases) 2 | 3 | ### 环境 4 | 1. windows 7 或 ubuntu 16.04-10 5 | 2. 安装jdk 1.8,并配置环境变量。 6 | 3. 安装jmeter 3.2。对于windows操作系统,必须配置环境变量;对于linux操作系统,需要新建配置文件 `JMETER_HOME.config` ,填入jmeter安装目录,例如`/usr/local/apache-jmeter-3.2`,跟jar文件放在同一目录下。 7 | 8 | ### 运行 9 | 10 | java -jar testing_platform-0.1-SNAPSHOT.jar 11 | 12 | 如果在本机运行,浏览器访问 http://本机ip:20302 13 | 14 | 如果在远程服务器上运行,则需要将ip改为对应服务器ip即可。 15 | 16 | 17 | 指定端口运行 18 | 19 | java -jar testing_platform-0.1-SNAPSHOT.jar --server.port=9999 20 | 21 | ### 原理 22 | 上传/新建jmx脚本,通过java执行 `jmeter -n -t xxx.jmx -o -p dir` 来运行脚本并生成html报告。 23 | 24 | web框架基于springboot,数据库使用了轻量级的SQLite。 25 | 26 | 27 | 123 28 | 29 | 30 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/AppInitialization.java: -------------------------------------------------------------------------------- 1 | package com.wangc; 2 | 3 | import com.wangc.test_plan.bean.GlobalConfig; 4 | import org.springframework.boot.ApplicationArguments; 5 | import org.springframework.boot.ApplicationRunner; 6 | import org.springframework.stereotype.Component; 7 | 8 | import java.io.File; 9 | import java.sql.Connection; 10 | import java.sql.DriverManager; 11 | import java.sql.SQLException; 12 | import java.sql.Statement; 13 | 14 | /** 15 | * Created by wangchao on 2017/7/26. 16 | */ 17 | 18 | @Component 19 | public class AppInitialization implements ApplicationRunner { 20 | 21 | private final String SQL_CREATE_TEST_PLAN = "CREATE TABLE `test_plan` (\n" + " `id` INTEGER PRIMARY KEY ,\n" + " `tp_name` text ,\n" + " `url` text ,\n" + " `description` text ,\n" + " `generater` text ,\n" + " `protocol` text ,\n" + " `server_name_ip` text ,\n" + " `port_num` text ,\n" + " `path` text ,\n" + " `default_vu` INTEGER ,\n" + " `default_duration` INTEGER ,\n" + " `jmx_save_path` text ,\n" + " `create_time` text ,\n"+ " `csv_data_xpath` text \n" + ") "; 22 | private final String SQL_CREATE_RUN_PLAN = "CREATE TABLE `run_plan` (\n" + " `id` INTEGER PRIMARY KEY ,\n" + " `tp_id` INTEGER ,\n" + " `duration` INTEGER ,\n" + " `users_num` INTEGER ,\n" + " `ramp_up` INTEGER ,\n" + " `jmx_path` TEXT ,\n" + " `jtl_path` TEXT ,\n" + " `log_path` TEXT ,\n" + " `html_path` TEXT ,\n" + " `create_time` TEXT \n" + ")"; 23 | private Connection conn = null; 24 | Statement stmt = null; 25 | private final String dbName = "testing_platform.db"; 26 | private GlobalConfig globalConfig = GlobalConfig.getInstance(); 27 | 28 | static{ 29 | // System.out.println("========1"); 30 | } 31 | 32 | @Override 33 | public void run(ApplicationArguments applicationArguments) throws Exception { 34 | checkJmeterHome();//检测jmeter运行环境 35 | checkDB();//检测数据库 36 | } 37 | 38 | //检测jmeter运行环境,尝试运行jmeter -v ,返回内容中包含 The Apache Software Foundation 即可。 39 | public void checkJmeterHome(){ 40 | System.out.println( globalConfig.getJmeterHome() ); 41 | } 42 | 43 | private void checkDB() throws SQLException { 44 | if(!haveDB()){ 45 | createDB(); 46 | createTables(); 47 | close(); 48 | } 49 | } 50 | 51 | //检测是否有sqlite数据库,如果没有返回false 52 | private boolean haveDB(){ 53 | File f = new File(dbName); 54 | return f.exists(); 55 | } 56 | 57 | private void createDB() throws SQLException { 58 | conn = DriverManager.getConnection("jdbc:sqlite:"+dbName); 59 | } 60 | 61 | private void createTables() throws SQLException { 62 | stmt = conn.createStatement(); 63 | stmt.execute(SQL_CREATE_TEST_PLAN); 64 | stmt.execute(SQL_CREATE_RUN_PLAN); 65 | } 66 | 67 | private void close() throws SQLException { 68 | stmt.close(); 69 | conn.close(); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/Application.java: -------------------------------------------------------------------------------- 1 | package com.wangc; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.boot.SpringApplication; 6 | import org.springframework.boot.autoconfigure.SpringBootApplication; 7 | import org.springframework.stereotype.Controller; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RequestMethod; 10 | 11 | import java.net.UnknownHostException; 12 | 13 | /** 14 | * Created by wangchao on 2017/2/10. 15 | */ 16 | 17 | @SpringBootApplication 18 | 19 | @Controller 20 | public class Application { 21 | 22 | private static final Logger logger = LoggerFactory.getLogger(Application.class); 23 | 24 | @RequestMapping(value = "/",method = RequestMethod.GET) 25 | public String test(){ 26 | return "index"; 27 | } 28 | 29 | public static void main(String[] args) throws UnknownHostException { 30 | SpringApplication.run(Application.class,args); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/SpringUtils.java: -------------------------------------------------------------------------------- 1 | package com.wangc; 2 | 3 | 4 | import org.springframework.beans.BeansException; 5 | import org.springframework.context.ApplicationContext; 6 | import org.springframework.context.ApplicationContextAware; 7 | import org.springframework.stereotype.Component; 8 | 9 | @Component 10 | public class SpringUtils implements ApplicationContextAware { 11 | private static ApplicationContext applicationContext = null; 12 | 13 | @Override 14 | public void setApplicationContext(ApplicationContext arg0) throws BeansException { 15 | if (SpringUtils.applicationContext == null) { 16 | SpringUtils.applicationContext = arg0; 17 | } 18 | } 19 | 20 | // 获取applicationContext 21 | public static ApplicationContext getApplicationContext() { 22 | return applicationContext; 23 | } 24 | 25 | // 通过name获取 Bean. 26 | public static Object getBean(String name) { 27 | return getApplicationContext().getBean(name); 28 | } 29 | 30 | // 通过class获取Bean. 31 | public static T getBean(Class clazz) { 32 | return getApplicationContext().getBean(clazz); 33 | } 34 | 35 | // 通过name,以及Clazz返回指定的Bean 36 | public static T getBean(String name, Class clazz) { 37 | return getApplicationContext().getBean(name, clazz); 38 | } 39 | 40 | } -------------------------------------------------------------------------------- /src/main/java/com/wangc/StaticResourceConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.wangc; 2 | 3 | import com.wangc.comm.Param; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | import org.springframework.context.annotation.Configuration; 7 | import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 8 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 9 | 10 | import java.io.File; 11 | 12 | /** 13 | * Created by wangchao on 2017/3/15. 14 | */ 15 | 16 | @Configuration 17 | public class StaticResourceConfiguration extends WebMvcConfigurerAdapter { 18 | 19 | private final String FILE_PREX = "file://"; 20 | private static String os = System.getProperty("os.name"); 21 | 22 | private static final Logger logger = LoggerFactory.getLogger(StaticResourceConfiguration.class); 23 | 24 | 25 | @Override 26 | public void addResourceHandlers(ResourceHandlerRegistry registry) { 27 | // TODO: wangc@2017/3/15 这里可能需要根据OS不同配置不同的路径,win:file后有3个/,linux:file后有2个/,因为linux的目录本身就是/开头 28 | 29 | 30 | String separator = "/"; 31 | if( os.contains("Linux") ){//如果是linux // TODO: wangc@2017/3/15 app_init 中判断OS 32 | separator = ""; 33 | } 34 | //win: file:///c:dir_name 35 | //linux: file:///home/wangc/dir_name 36 | // String reportResLocations = FILE_PREX+separator+ Param.USER_DIR+Param.HTML_PATH; 37 | //将所有的/report/请求至html报告的本地路径 38 | // registry.addResourceHandler("/report/**").addResourceLocations(reportResLocations); 39 | 40 | String reportResLocations = FILE_PREX+separator+ Param.USER_DIR+Param.HTML_PATH+File.separator; 41 | 42 | // reportResLocations = "file:///D:/workspace_HelloWorld/testing_platform/jmeter/html/"; 43 | registry.addResourceHandler("/report/**").addResourceLocations(reportResLocations); 44 | //file:///D:/workspace_HelloWorld/testing_platform/jmeter/html 45 | super.addResourceHandlers(registry); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/comm/GenerateClass.java: -------------------------------------------------------------------------------- 1 | package com.wangc.comm; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Created by wangchao on 2016/12/28. 7 | */ 8 | public class GenerateClass { 9 | 10 | // TODO: wangc@2016/12/28 查询实现生成数据接口的所有实现类,显示在页面的下拉框中 11 | public List getAllGenerateClass(){ 12 | return null; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/comm/Param.java: -------------------------------------------------------------------------------- 1 | package com.wangc.comm; 2 | 3 | import java.io.File; 4 | 5 | /** 6 | * Created by wangchao on 2017/3/9. 7 | */ 8 | public class Param { 9 | 10 | // TODO: wangc@2017/3/14 读取配置 tp.jmeter.jtl.path 11 | public static String JTL_PATH = File.separator + "jmeter" + File.separator + "jtl"; 12 | public static String LOG_PATH = File.separator + "jmeter" + File.separator + "log"; 13 | public static String HTML_PATH = File.separator + "jmeter" + File.separator + "html"; 14 | public static String JMX_PATH = File.separator + "jmeter" + File.separator + "jmx"; 15 | public static String DATA_PATH = File.separator + "jmeter" + File.separator + "data"; 16 | public static String JTL_SUFFIX = ".jtl"; 17 | public static String LOG_SUFFIX = ".log"; 18 | public static String SEPARATOR_MY = "_"; 19 | public static String USER_DIR = System.getProperty("user.dir"); 20 | public static String UPLOAD_DIR= "upload"; 21 | // public static String UPLOAD_JMX_PATH = File.separator+UPLOAD_DIR+File.separator+"jmx"; 22 | 23 | 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/comm/StringUtils.java: -------------------------------------------------------------------------------- 1 | package com.wangc.comm; 2 | 3 | import java.io.File; 4 | import java.text.SimpleDateFormat; 5 | import java.util.Date; 6 | 7 | /** 8 | * Created by wangchao on 2017/3/10. 9 | */ 10 | public class StringUtils { 11 | 12 | public static String dd(int d,int n){ 13 | // 0 代表前面补充0 14 | // n 代表补0后的总长度 15 | // d 代表参数为正数型 16 | return String.format("%0"+n+"d", d); 17 | } 18 | 19 | /** 20 | * @param root 创建目录的父路径 21 | * @return 当前时间的文件夹路径,结果无斜杠。返回的结果应该是:/2017/03 22 | * 涉及的3个路径:1.项目路径(获取) 2.配置中的类别路径(配置) 3.临时生成的文件路径(动态) 23 | * 用到的地方:1.生成jmx 2.运行jmeter时,生成jtl、log、html的路径 24 | */ 25 | public static String creAndGetDir(String root){ 26 | String path = new StringBuilder(File.separator) 27 | .append(getDate("yyyy")) 28 | .append(File.separator) 29 | .append(getDate("MM")) 30 | .toString(); 31 | String fullPath = root+path; 32 | File file = new File(fullPath); 33 | file.mkdirs(); 34 | return path; 35 | } 36 | 37 | /*如不存在则创建目录*/ 38 | public static boolean creDir(String path){ 39 | boolean flag = false; 40 | try{ 41 | File file = new File(path); 42 | file.mkdirs(); 43 | flag = file.exists(); 44 | }catch (Exception e){ 45 | e.printStackTrace(); 46 | } 47 | 48 | return flag; 49 | } 50 | 51 | /** 52 | * @return 返回 20170313 这样格式的字符串 53 | */ 54 | public static String getDate(){ 55 | return getDate("yyyyMMdd"); 56 | } 57 | 58 | /** 59 | * @param format yyyy MM dd HH hh mm ss 60 | * @return 返回对应格式的字符串 61 | */ 62 | public static String getDate(String format){ 63 | SimpleDateFormat sdf = new SimpleDateFormat(format); 64 | return sdf.format(new Date()); 65 | } 66 | 67 | /* 68 | * 如果为null或者空字符串则返回false,否则返回true 69 | * */ 70 | public static boolean isEmpty(String s) { 71 | return null != s && !"".equals(s); 72 | } 73 | 74 | /* 75 | * 创建对应的路径,并返回文件在项目中的相对路径 76 | * */ 77 | public static String getJmxSavePath(String fileName){ 78 | String filePath = Param.USER_DIR + Param.JMX_PATH; 79 | StringUtils.creDir(filePath); 80 | String tmpFileName = "tp_" + StringUtils.getDate("yyyyMMddHHmmss"); 81 | return File.separator + tmpFileName + fileName; //完整路径 82 | } 83 | 84 | public static void main(String[] args){ 85 | 86 | System.out.println( getJmxSavePath("sss") ); 87 | 88 | System.out.println( dd(1,9) ); 89 | System.out.println(getDate("yyyyMMddHHmmssSSS")); 90 | System.out.println(getDate("yyyyMMddHHmmssSSS")); 91 | 92 | System.out.println( creAndGetDir("z:/") ); 93 | 94 | System.out.println( Math.random()*100000 ); 95 | 96 | System.out.println( creDir("d://axx//xx/xx") ); 97 | 98 | 99 | } 100 | 101 | } 102 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/comm/UpdateJmx.java: -------------------------------------------------------------------------------- 1 | package com.wangc.comm; 2 | 3 | import com.wangc.test_plan.bean.RunPlanBean; 4 | 5 | /** 6 | * Created by wangchao on 2017/7/10. 7 | */ 8 | public class UpdateJmx { 9 | 10 | 11 | public static void updateDataFilePath(RunPlanBean rpb){ 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/comm/XmlPares.java: -------------------------------------------------------------------------------- 1 | package com.wangc.comm; 2 | 3 | import org.w3c.dom.Document; 4 | import org.w3c.dom.Element; 5 | import org.w3c.dom.NodeList; 6 | import org.xml.sax.SAXException; 7 | 8 | import javax.xml.parsers.DocumentBuilder; 9 | import javax.xml.parsers.DocumentBuilderFactory; 10 | import javax.xml.parsers.ParserConfigurationException; 11 | import java.io.File; 12 | import java.io.IOException; 13 | import java.util.ArrayList; 14 | import java.util.HashMap; 15 | import java.util.List; 16 | import java.util.Map; 17 | 18 | /** 19 | * Created by wangchao on 2017/5/3. 20 | */ 21 | public class XmlPares { 22 | 23 | Element element = null; 24 | static DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); 25 | 26 | public XmlPares(String filePath) throws IOException, SAXException, ParserConfigurationException { 27 | DocumentBuilder builder = builderFactory.newDocumentBuilder(); 28 | //parse an XML file into a DOM tree 29 | Document document = builder.parse(new File(filePath)); 30 | //get root element 31 | this.element = document.getDocumentElement(); 32 | } 33 | 34 | //获取某个标签的值 35 | public String getValueByTagAttr(String tagAttrName) { 36 | ArrayList list = new ArrayList(); 37 | list.add(tagAttrName); 38 | return getValueByTagAttrs(list).get(tagAttrName); 39 | } 40 | 41 | //获取一组标签的值 42 | public Map getValueByTagAttrs(List tagAttrNames) { 43 | Map resultMap = new HashMap<>(); 44 | try { 45 | NodeList nodeList = element.getElementsByTagName("stringProp"); 46 | if (nodeList != null) { 47 | for (int i = 0; i < nodeList.getLength(); i++) { 48 | Element element = (Element) nodeList.item(i); 49 | for(int j=0; j list = rpService.list(tpId); 85 | model.addAttribute("rp_list", list); 86 | // model.addAttribute("html_path",list.get(0).getHtmlPath()); //未处理空异常 87 | return "run_plan/report_list"; 88 | } 89 | 90 | /* 91 | * 根据test_plan id 查询并显示当前正在执行的jmeter.log 92 | * */ 93 | @RequestMapping(value = "runlog_list", method = RequestMethod.GET) 94 | public String runlogList(Model model, @RequestParam String tpId,@RequestParam(defaultValue = "0") long lastModified) { 95 | List list = rpService.list(tpId); 96 | String logPath = list.get(0).getLogPath();//todo 未处理异常 97 | model.addAttribute("log_result",rpService.runlogList(logPath,lastModified)); 98 | return "run_plan/run_log"; 99 | } 100 | 101 | //todo 移到工具类 102 | public String saveFile(MultipartFile file) { 103 | String typePath = Param.DATA_PATH; 104 | String dir = StringUtils.creAndGetDir(Param.USER_DIR+typePath);//动态生成的路径 /yyyy/MM 105 | String tmpFileName = StringUtils.getDate("yyyyMMddHHmmss"); 106 | String filePath = typePath+dir + File.separator + tmpFileName + file.getOriginalFilename();//相对路径 107 | String fileAllPath = Param.USER_DIR + filePath; //完整路径 108 | 109 | if (!file.isEmpty()) { 110 | try { 111 | BufferedOutputStream out = new BufferedOutputStream( 112 | new FileOutputStream( 113 | new File(fileAllPath))); 114 | out.write(file.getBytes()); 115 | out.flush(); 116 | out.close(); 117 | logger.info(SUCCESS); 118 | return filePath; 119 | } catch (FileNotFoundException e) { 120 | e.printStackTrace(); 121 | logger.error(FAILURE_NOT_FOUND); 122 | } catch (IOException e) { 123 | e.printStackTrace(); 124 | logger.error(FAILURE_IO); 125 | } 126 | } else { 127 | logger.error(FAILURE_FILE_EMPTY); 128 | } 129 | return null;//todo 异常处理 130 | } 131 | 132 | 133 | } 134 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/test_plan/controler/TPController.java: -------------------------------------------------------------------------------- 1 | package com.wangc.test_plan.controler; 2 | 3 | import com.wangc.test_plan.bean.TestPlanBean; 4 | import com.wangc.test_plan.service.TPService; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Controller; 7 | import org.springframework.ui.Model; 8 | import org.springframework.web.bind.annotation.*; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * Created by wangchao on 2017/2/10. 14 | */ 15 | @Controller 16 | @RequestMapping(value = "/tp") 17 | public class TPController { 18 | 19 | @Autowired 20 | TPService tpService; 21 | 22 | @RequestMapping(value = "/list",method = RequestMethod.GET) 23 | public String list(Model model,@ModelAttribute TestPlanBean tp){ 24 | 25 | List list = tpService.select(null); 26 | model.addAttribute("tp_list",list); 27 | return "test_plan/list"; 28 | } 29 | 30 | @RequestMapping(value = "/add",method = RequestMethod.GET) 31 | public String add(Model model){ 32 | return "test_plan/add"; 33 | } 34 | 35 | @RequestMapping(value = "/add",method = RequestMethod.POST) 36 | public String add(Model model, TestPlanBean tp){ 37 | tpService.insert(tp); 38 | return "redirect:/tp/list?sName=qwe"; 39 | } 40 | 41 | @RequestMapping(value = "/modify",method = RequestMethod.GET) 42 | public String modify(Model model,@RequestParam String id){ 43 | model.addAttribute( "tp",tpService.selectById(id)); 44 | return "test_plan/modify"; 45 | } 46 | 47 | @RequestMapping(value = "/modify",method = RequestMethod.POST) 48 | public String modify(Model model,@ModelAttribute TestPlanBean tp){ 49 | System.out.println(tp); 50 | tpService.update(tp); 51 | return "redirect:/tp/list"; 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/test_plan/controler/UploadJmxController.java: -------------------------------------------------------------------------------- 1 | package com.wangc.test_plan.controler; 2 | 3 | import com.wangc.comm.Param; 4 | import com.wangc.comm.StringUtils; 5 | import com.wangc.test_plan.bean.TestPlanBean; 6 | import com.wangc.test_plan.jmeter.Tools; 7 | import com.wangc.test_plan.service.TPService; 8 | import org.dom4j.DocumentException; 9 | import org.slf4j.Logger; 10 | import org.slf4j.LoggerFactory; 11 | import org.springframework.beans.factory.annotation.Autowired; 12 | import org.springframework.stereotype.Controller; 13 | import org.springframework.ui.Model; 14 | import org.springframework.web.bind.annotation.*; 15 | import org.springframework.web.multipart.MultipartFile; 16 | 17 | import java.io.*; 18 | 19 | /** 20 | * Created by wangchao on 2017/4/25. 21 | */ 22 | 23 | @Controller 24 | @RequestMapping(value = "/tp") 25 | public class UploadJmxController { 26 | private static final Logger logger = LoggerFactory.getLogger(UploadJmxController.class); 27 | private final String SUCCESS = "上传成功"; 28 | private final String FAILURE_NOT_FOUND = "上传失败(FileNotFoundException)"; 29 | private final String FAILURE_IO = "上传失败(IOException)"; 30 | private final String FAILURE_FILE_EMPTY = "上传失败(File is empty)"; 31 | 32 | @Autowired 33 | TPService tpService; 34 | 35 | /*跳转到上传页面*/ 36 | @RequestMapping(value = "/upload", method = RequestMethod.GET) 37 | public String upload() { 38 | return ""; 39 | } 40 | 41 | /*上传*/ 42 | @RequestMapping(value = "/upload", method = RequestMethod.POST) 43 | public String upload(Model model, @RequestParam MultipartFile file, 44 | @RequestParam String tpName, @ModelAttribute TestPlanBean tp) { 45 | // TODO: wangc@2017/6/6 关于路径的部分,太混乱!!! 46 | String msg = ""; 47 | String dir = StringUtils.creAndGetDir(Param.USER_DIR+Param.JMX_PATH);//动态生成的路径 /yyyy/MM 48 | String tmpFileName = "tp_" + StringUtils.getDate("yyyyMMddHHmmss"); 49 | String filePath = Param.JMX_PATH+dir +File.separator + tmpFileName + file.getOriginalFilename();//相对路径 50 | String fileAllPath = Param.USER_DIR + filePath; //完整路径 51 | 52 | if (!file.isEmpty()) { 53 | try { 54 | BufferedOutputStream out = new BufferedOutputStream( 55 | new FileOutputStream( 56 | new File(fileAllPath))); 57 | out.write(file.getBytes()); 58 | out.flush(); 59 | out.close(); 60 | 61 | msg = SUCCESS; 62 | logger.info(SUCCESS); 63 | 64 | tp.setJmxSavePath(filePath); 65 | try { 66 | tp.setCsvDataXpath(Tools.getCsvDataXPath(fileAllPath) ); 67 | } catch (DocumentException e) { 68 | e.printStackTrace(); // TODO: wangc@2017/8/2 处理异常 69 | } 70 | tpService.insert(tp); 71 | 72 | /// todo 解析 脚本,获取参数,保存至数据库,或传递给下一个页面 73 | 74 | } catch (FileNotFoundException e) { 75 | e.printStackTrace(); 76 | msg = FAILURE_NOT_FOUND; 77 | logger.error(FAILURE_NOT_FOUND); 78 | } catch (IOException e) { 79 | e.printStackTrace(); 80 | msg = FAILURE_IO; 81 | logger.error(FAILURE_IO); 82 | } 83 | } else { 84 | msg = FAILURE_FILE_EMPTY; 85 | logger.error(FAILURE_FILE_EMPTY); 86 | } 87 | model.addAttribute("msg", msg); 88 | return "redirect:/tp/list"; 89 | } 90 | 91 | } 92 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/test_plan/jmeter/GenerateJmx.java: -------------------------------------------------------------------------------- 1 | package com.wangc.test_plan.jmeter; 2 | 3 | import com.wangc.comm.StringUtils; 4 | import com.wangc.test_plan.bean.RunPlanBean; 5 | import com.wangc.test_plan.bean.TestPlanBean; 6 | import com.wangc.test_plan.controler.TPController; 7 | import org.beetl.core.Configuration; 8 | import org.beetl.core.GroupTemplate; 9 | import org.beetl.core.Template; 10 | import org.beetl.core.resource.FileResourceLoader; 11 | import org.springframework.stereotype.Component; 12 | 13 | import java.io.File; 14 | import java.io.FileOutputStream; 15 | import java.io.OutputStream; 16 | 17 | /** 18 | * Created by wangchao on 2017/3/9. 19 | */ 20 | @Component 21 | public class GenerateJmx { 22 | 23 | // TODO: wangc@2017/3/13 读取配置 tp.jmeter.jmx .path 24 | private static String JMX_PATH = File.separator+"jmeter"+File.separator+"jmx"; 25 | private static String JMX_NAME_PREFIX = "tp_"; 26 | private static String JMX_NAME_SUFFIX = ".jmx"; 27 | 28 | 29 | public static void main(String[] args) { 30 | new GenerateJmx().generate(null); 31 | } 32 | 33 | public static void generate(RunPlanBean rpb) { 34 | try { 35 | System.out.println(rpb.toString()); 36 | 37 | String root = TPController.class.getClassLoader().getResource("").getPath() + "beetl"; 38 | 39 | FileResourceLoader resourceLoader = new FileResourceLoader(root, "utf-8"); 40 | Configuration cfg = Configuration.defaultConfiguration(); 41 | GroupTemplate gt = new GroupTemplate(resourceLoader, cfg); 42 | Template t = gt.getTemplate("/http_request.jmx"); 43 | 44 | t.binding("v_duration", rpb.getDuration()); 45 | t.binding("v_users_num", rpb.getUsersNum()); 46 | t.binding("v_ramp_up", rpb.getRampUp()); 47 | TestPlanBean tpb = rpb.getTestPlanBean(); // TODO: wangc@2017/3/13 不够优雅,改成解析成map,直接binding map 48 | if (null != tpb) { 49 | t.binding("v_server_name", tpb.getServerNameIp()); 50 | t.binding("v_port", tpb.getPortNum()); 51 | t.binding("v_prol", tpb.getProtocol()); 52 | t.binding("v_path", tpb.getPath()); 53 | } else { 54 | t.binding("v_server_name", "111"); 55 | t.binding("v_port", "222"); 56 | t.binding("v_prol", "333"); 57 | t.binding("v_path", "444"); 58 | } 59 | 60 | String jmxRoot = System.getProperty("user.dir")+JMX_PATH;//系统(项目)路径,结尾无斜杠 61 | //jmx在系统(项目)中的存在路径,斜杠开头,结尾无斜杠 62 | 63 | String fullPath = jmxRoot+StringUtils.creAndGetDir(jmxRoot); //返回的应该是 c:/jmx/2017/03 ,并创建这个目录 64 | 65 | //文件名,斜杠开头 66 | String fileName = new StringBuilder(File.separator) 67 | .append(JMX_NAME_PREFIX) 68 | .append(StringUtils.getDate("yyyyMMddHHmmssSSS")) 69 | .append(JMX_NAME_SUFFIX) 70 | .toString(); 71 | 72 | String jmxFilePath = fullPath+fileName; 73 | rpb.setJmxPath(jmxFilePath); 74 | OutputStream ops = new FileOutputStream(jmxFilePath); 75 | t.renderTo(ops); 76 | 77 | } catch (Exception e) { 78 | e.printStackTrace(); 79 | } 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/test_plan/jmeter/RunJmx.java: -------------------------------------------------------------------------------- 1 | package com.wangc.test_plan.jmeter; 2 | 3 | import com.wangc.comm.Param; 4 | import com.wangc.comm.StringUtils; 5 | import com.wangc.test_plan.bean.GlobalConfig; 6 | import com.wangc.test_plan.bean.RunPlanBean; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | 10 | import java.io.File; 11 | import java.util.Arrays; 12 | 13 | /** 14 | * Created by wangchao on 2017/3/13. 15 | * 运行jmx脚本 16 | */ 17 | public class RunJmx { 18 | 19 | private static String FORMAT_1 = "ddHHmmssSSS"; 20 | private static String JMETER_COMMOND = "jmeter -n -t ${jmx} -l ${jtl} -j ${log} -e -o ${html}"; 21 | 22 | private static String[] JMETER_RUN_COMMOND = new String[]{"", "", ""}; 23 | private static String WIN_COMMOND = "cmd"; 24 | private static String WIN_COMMOND_PARAM = "/c"; 25 | 26 | private static final Logger logger = LoggerFactory.getLogger(RunJmx.class); 27 | 28 | public static void run(RunPlanBean rpb) { 29 | String jmxPath = Param.USER_DIR + rpb.getTestPlanBean().getJmxSavePath(); 30 | // TODO: wangc@2017/6/6 路径混乱,jtl、log、html的路径,都是给机器看的,使用随机或uuid即可。 31 | String jtlPath = 32 | StringUtils.creAndGetDir(Param.USER_DIR + Param.JTL_PATH) + 33 | File.separator + 34 | System.currentTimeMillis() + 35 | Param.SEPARATOR_MY + 36 | StringUtils.getDate(FORMAT_1) + 37 | Param.JTL_SUFFIX; 38 | 39 | String logPath = 40 | StringUtils.creAndGetDir(Param.USER_DIR + Param.LOG_PATH) + 41 | File.separator + 42 | System.currentTimeMillis() + 43 | Param.SEPARATOR_MY + 44 | StringUtils.getDate(FORMAT_1) + 45 | Param.LOG_SUFFIX; 46 | 47 | String htmlPath = 48 | StringUtils.creAndGetDir(Param.USER_DIR + Param.HTML_PATH) + 49 | File.separator + 50 | System.currentTimeMillis() + 51 | Param.SEPARATOR_MY + 52 | StringUtils.getDate(FORMAT_1); 53 | rpb.setJtlPath(jtlPath); 54 | rpb.setLogPath(logPath); 55 | rpb.setHtmlPath(htmlPath + File.separator + "index.html"); 56 | String myCmd = JMETER_COMMOND.replace("${jmx}", jmxPath) 57 | .replace("${jtl}", Param.USER_DIR + Param.JTL_PATH + jtlPath) 58 | .replace("${log}", Param.USER_DIR + Param.LOG_PATH + logPath) 59 | .replace("${html}", Param.USER_DIR + Param.HTML_PATH + htmlPath); 60 | 61 | logger.info(myCmd); 62 | Runtime runtime = Runtime.getRuntime(); 63 | try { 64 | // TODO: wangc@2017/3/14 执行exec方法改成异步 65 | if (GlobalConfig.getInstance().getOsFlag()) { 66 | runtime.exec(getCommandStrWin(myCmd)); 67 | } else { 68 | runtime.exec(getCommandStrLinux(myCmd)); 69 | } 70 | } catch (Exception e) { 71 | e.printStackTrace(); 72 | System.out.println("Error!"); 73 | } 74 | } 75 | 76 | 77 | private static String getCommandStrLinux(String myCmd) { 78 | myCmd = GlobalConfig.getInstance().getJmeterHome() + 79 | File.separator + 80 | "bin" + 81 | File.separator + 82 | myCmd; 83 | logger.info(myCmd); 84 | return myCmd; 85 | } 86 | 87 | 88 | private static String[] getCommandStrWin(String myCmd) { 89 | JMETER_RUN_COMMOND[0] = WIN_COMMOND; 90 | JMETER_RUN_COMMOND[1] = WIN_COMMOND_PARAM; 91 | 92 | JMETER_RUN_COMMOND[2] = myCmd; 93 | logger.info(Arrays.toString(JMETER_RUN_COMMOND) ); 94 | return JMETER_RUN_COMMOND; 95 | } 96 | 97 | } 98 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/test_plan/jmeter/Tools.java: -------------------------------------------------------------------------------- 1 | package com.wangc.test_plan.jmeter; 2 | 3 | import org.dom4j.Document; 4 | import org.dom4j.DocumentException; 5 | import org.dom4j.Element; 6 | import org.dom4j.io.SAXReader; 7 | import org.dom4j.io.XMLWriter; 8 | 9 | import java.io.File; 10 | import java.io.FileWriter; 11 | import java.io.IOException; 12 | import java.net.MalformedURLException; 13 | import java.util.Iterator; 14 | import java.util.List; 15 | 16 | public class Tools { 17 | 18 | // TODO: wangc@2017/8/2 全局变量的线程同步问题 19 | static String targetPath = ""; 20 | 21 | //返回CSVData的xpath 22 | public static String getCsvDataXPath(String jmxPath) throws MalformedURLException, DocumentException { 23 | SAXReader reader = new SAXReader(); 24 | Document document = reader.read(new File(jmxPath)); 25 | Element root = document.getRootElement(); 26 | 27 | try{ 28 | read(root); 29 | }catch (Exception e){ 30 | e.printStackTrace(); 31 | } 32 | return targetPath; 33 | } 34 | private static void read(Element e) { 35 | String result = ""; 36 | if( !"".equals(targetPath) ){ 37 | return ; 38 | } 39 | if (e.nodeCount() > 0) { 40 | Iterator it = e.elementIterator(); 41 | while (it.hasNext()) { 42 | Element ele = it.next(); 43 | if( "CSVDataSet".equals(ele.getName()) ){ 44 | /*if("".equals(targetPath)){ //查到的第一个 CSVDataSet 保存到参数中, 45 | targetPath = ele.getUniquePath(); 46 | }*/ 47 | targetPath = ele.getUniquePath(); 48 | } 49 | read(ele); 50 | } 51 | } 52 | 53 | } 54 | 55 | 56 | //修改jmx 57 | public static void updateJmx(String jmxFilePath,String csvFilePath,String csvDataXpath) throws IOException, DocumentException { 58 | SAXReader reader = new SAXReader(); 59 | Document documentNew = reader.read(new File(jmxFilePath)); 60 | List list = documentNew.selectNodes(csvDataXpath); 61 | if( list.size()>1 ){ 62 | System.out.println("报错"); 63 | }else{ 64 | Element e = list.get(0); 65 | List eList = e.elements("stringProp"); 66 | for(Element eStringProp:eList){ 67 | if( "filename".equals( eStringProp.attributeValue("name") ) ){ 68 | System.out.println("=========="); 69 | System.out.println( eStringProp.getText() ); 70 | eStringProp.setText(csvFilePath); 71 | break; 72 | } 73 | } 74 | } 75 | 76 | XMLWriter writer = new XMLWriter(new FileWriter(new File( jmxFilePath ))); 77 | writer.write(documentNew); 78 | writer.close(); 79 | 80 | } 81 | 82 | public static void main(String[] args) throws MalformedURLException, DocumentException { 83 | System.out.println( getCsvDataXPath("G:\\MyDesktop\\TestPlan.jmx") ); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/test_plan/mapper/RPMapper.java: -------------------------------------------------------------------------------- 1 | package com.wangc.test_plan.mapper; 2 | 3 | import com.wangc.test_plan.bean.RunPlanBean; 4 | import org.apache.ibatis.annotations.Mapper; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Created by wangchao on 2017/3/10. 10 | */ 11 | @Mapper 12 | public interface RPMapper { 13 | 14 | 15 | List select(RunPlanBean rpb); 16 | 17 | 18 | 19 | int deleteByPrimaryKey(Integer id); 20 | 21 | int insert(RunPlanBean record); 22 | 23 | int insertSelective(RunPlanBean record); 24 | 25 | RunPlanBean selectByPrimaryKey(Integer id); 26 | 27 | int updateByPrimaryKeySelective(RunPlanBean record); 28 | 29 | int updateByPrimaryKey(RunPlanBean record); 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/test_plan/mapper/TPMapper.java: -------------------------------------------------------------------------------- 1 | package com.wangc.test_plan.mapper; 2 | 3 | import com.wangc.test_plan.bean.TestPlanBean; 4 | import org.apache.ibatis.annotations.Mapper; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Created by wangchao on 2017/2/10. 10 | */ 11 | 12 | @Mapper 13 | public interface TPMapper { 14 | 15 | Integer insert(TestPlanBean testPlanBean); 16 | 17 | List select(TestPlanBean testPlanBean); 18 | 19 | Integer update(TestPlanBean testPlanBean); 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/test_plan/service/RPService.java: -------------------------------------------------------------------------------- 1 | package com.wangc.test_plan.service; 2 | 3 | import com.wangc.comm.Param; 4 | import com.wangc.test_plan.bean.LogResultBean; 5 | import com.wangc.test_plan.bean.RunPlanBean; 6 | import com.wangc.test_plan.mapper.RPMapper; 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.io.*; 11 | import java.util.List; 12 | 13 | /** 14 | * Created by wangchao on 2017/3/10. 15 | */ 16 | 17 | 18 | @Service 19 | public class RPService { 20 | 21 | @Autowired 22 | RPMapper rpMapper; 23 | 24 | public void insert(RunPlanBean rpb){ 25 | rpMapper.insertSelective(rpb); 26 | } 27 | 28 | public List list(String tId){ 29 | RunPlanBean rpb = new RunPlanBean(); 30 | rpb.setTpId(tId); 31 | return rpMapper.select(rpb); 32 | } 33 | 34 | public static void main(String[] args){ 35 | RPService rps = new RPService(); 36 | String p = "D:\\workspace_HelloWorld\\testing_platform\\jmeter\\log\\2017\\07\\1500886505219_24165505219.log"; 37 | long l = 0L; 38 | LogResultBean s = rps.runlogList(p,l); 39 | Long aa = s.getModifiedTime(); 40 | System.out.println( s.getContent() ); 41 | try{ 42 | Thread.sleep(10000); 43 | }catch (Exception e){ 44 | e.printStackTrace(); 45 | } 46 | 47 | System.out.println( rps.runlogList(p,aa).getContent() ); 48 | } 49 | 50 | /* 51 | * @logPath 日志文件的路径 52 | * @oldLastModified 上次读取日志时的文件 modified 属性,要做对比用 53 | * */ 54 | public LogResultBean runlogList(String logPath, long lastModified){ 55 | 56 | String result = ""; 57 | long modifiedTime = 0L; 58 | try { 59 | File file = new File(Param.USER_DIR+Param.LOG_PATH+logPath); 60 | modifiedTime = file.lastModified(); 61 | if (modifiedTime != lastModified) { // 文件内容有修改时再重新读取 62 | System.out.println("文件内容修改,重新加载。。。"); 63 | result = readFile(file); 64 | } 65 | } catch (Exception e) { 66 | e.printStackTrace(); 67 | } 68 | 69 | return new LogResultBean(logPath,modifiedTime,result); //这里是result可能为空,因为文件没有发生变化 70 | } 71 | 72 | 73 | private String readFile(File file) { 74 | 75 | String content = ""; 76 | try { 77 | BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); 78 | StringBuffer buffer = new StringBuffer(); 79 | String temp; 80 | while ((temp = reader.readLine()) != null) { 81 | if(temp.contains("o.a.j.r.Summariser")){ //todo 判断条件太草率 82 | buffer.append(temp.replace("INFO o.a.j.r.Summariser","")).append("##@"); //##@ 代表换行,前端处理 83 | } 84 | } 85 | reader.close(); 86 | content = buffer.toString(); 87 | } catch (FileNotFoundException e) { 88 | System.out.println("文件不存在"); 89 | } catch (IOException e) { 90 | System.err.println("读取文件出错"); 91 | } 92 | return content; 93 | } 94 | 95 | } 96 | -------------------------------------------------------------------------------- /src/main/java/com/wangc/test_plan/service/TPService.java: -------------------------------------------------------------------------------- 1 | package com.wangc.test_plan.service; 2 | 3 | import com.wangc.test_plan.bean.TestPlanBean; 4 | import com.wangc.test_plan.mapper.TPMapper; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Service; 7 | 8 | import java.util.List; 9 | 10 | 11 | /** 12 | * Created by wangchao on 2017/2/10. 13 | */ 14 | 15 | @Service 16 | public class TPService { 17 | 18 | @Autowired 19 | TPMapper tpMapper; 20 | 21 | // @Autowired 22 | // TestPlanBean tp; 23 | 24 | public void insert(TestPlanBean tp) { 25 | tpMapper.insert(tp); 26 | } 27 | 28 | public List select(TestPlanBean tp) { 29 | return tpMapper.select(tp); 30 | } 31 | 32 | public List selectAll() { 33 | TestPlanBean tp = new TestPlanBean(); 34 | return tpMapper.select(tp); 35 | } 36 | 37 | public TestPlanBean selectById(String id) { 38 | TestPlanBean tp = new TestPlanBean(); 39 | tp.setId(id); 40 | List list = tpMapper.select(tp); 41 | if (null != list && !list.isEmpty()) { 42 | return list.get(0); 43 | } else { 44 | return null; 45 | } 46 | } 47 | 48 | public void update(TestPlanBean tp) { 49 | tpMapper.update(tp); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/application.properties -------------------------------------------------------------------------------- /src/main/resources/beetl.properties: -------------------------------------------------------------------------------- 1 | DELIMITER_PLACEHOLDER_START=#{ 2 | DELIMITER_PLACEHOLDER_END=} -------------------------------------------------------------------------------- /src/main/resources/beetl/http_request.jmx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | false 7 | false 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | users_num 18 | #{v_users_num} 19 | = 20 | 21 | 22 | ramp_up 23 | #{v_ramp_up} 24 | = 25 | 26 | 27 | duration 28 | #{v_duration} 29 | = 30 | 31 | 32 | server_name 33 | #{v_server_name} 34 | = 35 | 36 | 37 | port 38 | #{v_port} 39 | = 40 | 41 | 42 | prol 43 | #{v_prol} 44 | = 45 | 46 | 47 | path 48 | #{v_path} 49 | = 50 | 51 | 52 | 53 | 54 | 55 | continue 56 | 57 | false 58 | -1 59 | 60 | ${users_num} 61 | ${ramp_up} 62 | 1489108356000 63 | 1489108356000 64 | true 65 | ${duration} 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | ${server_name} 74 | ${port} 75 | 76 | 77 | ${prol} 78 | 79 | ${path} 80 | GET 81 | true 82 | false 83 | true 84 | false 85 | false 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /src/main/resources/mapper/RPMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | id, tp_id, duration, users_num, ramp_up, jmx_path, jtl_path, log_path, html_path, 19 | create_time 20 | 21 | 22 | 23 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | delete from run_plan 52 | where id = #{id,jdbcType=INTEGER} 53 | 54 | 55 | insert into run_plan (id, tp_id, duration, 56 | users_num, ramp_up, jmx_path, 57 | jtl_path, log_path, html_path, 58 | create_time) 59 | values (#{id,jdbcType=INTEGER}, #{tpId,jdbcType=INTEGER}, #{duration,jdbcType=INTEGER}, 60 | #{usersNum,jdbcType=INTEGER}, #{rampUp,jdbcType=INTEGER}, #{jmxPath,jdbcType=VARCHAR}, 61 | #{jtlPath,jdbcType=VARCHAR}, #{logPath,jdbcType=VARCHAR}, #{htmlPath,jdbcType=VARCHAR}, 62 | #{createTime,jdbcType=DATE}) 63 | 64 | 65 | insert into run_plan 66 | 67 | 68 | id, 69 | 70 | 71 | tp_id, 72 | 73 | 74 | duration, 75 | 76 | 77 | users_num, 78 | 79 | 80 | ramp_up, 81 | 82 | 83 | jmx_path, 84 | 85 | 86 | jtl_path, 87 | 88 | 89 | log_path, 90 | 91 | 92 | html_path, 93 | 94 | 95 | create_time, 96 | 97 | 98 | create_time, 99 | 100 | 101 | 102 | 103 | 104 | #{id,jdbcType=INTEGER}, 105 | 106 | 107 | #{tpId,jdbcType=INTEGER}, 108 | 109 | 110 | #{duration,jdbcType=INTEGER}, 111 | 112 | 113 | #{usersNum,jdbcType=INTEGER}, 114 | 115 | 116 | #{rampUp,jdbcType=INTEGER}, 117 | 118 | 119 | #{jmxPath,jdbcType=VARCHAR}, 120 | 121 | 122 | #{jtlPath,jdbcType=VARCHAR}, 123 | 124 | 125 | #{logPath,jdbcType=VARCHAR}, 126 | 127 | 128 | #{htmlPath,jdbcType=VARCHAR}, 129 | 130 | 131 | #{createTime,jdbcType=DATE}, 132 | 133 | 134 | datetime(CURRENT_TIMESTAMP,'localtime'), 135 | 136 | 137 | 138 | 139 | update run_plan 140 | 141 | 142 | tp_id = #{tpId,jdbcType=INTEGER}, 143 | 144 | 145 | duration = #{duration,jdbcType=INTEGER}, 146 | 147 | 148 | users_num = #{usersNum,jdbcType=INTEGER}, 149 | 150 | 151 | ramp_up = #{rampUp,jdbcType=INTEGER}, 152 | 153 | 154 | jmx_path = #{jmxPath,jdbcType=VARCHAR}, 155 | 156 | 157 | jtl_path = #{jtlPath,jdbcType=VARCHAR}, 158 | 159 | 160 | log_path = #{logPath,jdbcType=VARCHAR}, 161 | 162 | 163 | html_path = #{htmlPath,jdbcType=VARCHAR}, 164 | 165 | 166 | create_time = #{createTime,jdbcType=DATE}, 167 | 168 | 169 | where id = #{id,jdbcType=INTEGER} 170 | 171 | 172 | update run_plan 173 | set tp_id = #{tpId,jdbcType=INTEGER}, 174 | duration = #{duration,jdbcType=INTEGER}, 175 | users_num = #{usersNum,jdbcType=INTEGER}, 176 | ramp_up = #{rampUp,jdbcType=INTEGER}, 177 | jmx_path = #{jmxPath,jdbcType=VARCHAR}, 178 | jtl_path = #{jtlPath,jdbcType=VARCHAR}, 179 | log_path = #{logPath,jdbcType=VARCHAR}, 180 | html_path = #{htmlPath,jdbcType=VARCHAR}, 181 | create_time = #{createTime,jdbcType=DATE} 182 | where id = #{id,jdbcType=INTEGER} 183 | 184 | 185 | -------------------------------------------------------------------------------- /src/main/resources/mapper/TPMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | insert into test_plan(tp_name,url,description,generater,protocol,server_name_ip,port_num,path,jmx_save_path,create_time,csv_data_xpath) 22 | values(#{tpName},#{url},#{description},#{generater},#{protocol},#{serverNameIp},#{portNum},#{path},#{jmxSavePath},datetime(CURRENT_TIMESTAMP,'localtime'),#{csvDataXpath}) 23 | 24 | 25 | 59 | 60 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/js/bootstrap/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /src/main/resources/static/layer/skin/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layer/skin/default/icon-ext.png -------------------------------------------------------------------------------- /src/main/resources/static/layer/skin/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layer/skin/default/icon.png -------------------------------------------------------------------------------- /src/main/resources/static/layer/skin/default/layer.css: -------------------------------------------------------------------------------- 1 | .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}*html{background-image:url(about:blank);background-attachment:fixed}html #layuicss-skinlayercss{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layui-layer{border-radius:2px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 10px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:6px 6px 0;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:5px 10px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:1px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#BBB5B5;border:none}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}} -------------------------------------------------------------------------------- /src/main/resources/static/layer/skin/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layer/skin/default/loading-0.gif -------------------------------------------------------------------------------- /src/main/resources/static/layer/skin/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layer/skin/default/loading-1.gif -------------------------------------------------------------------------------- /src/main/resources/static/layer/skin/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layer/skin/default/loading-2.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/css/layui.mobile.css: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px} -------------------------------------------------------------------------------- /src/main/resources/static/layui/css/modules/code.css: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:30px;line-height:30px;border-bottom:1px solid #ddd}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #ddd;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none} -------------------------------------------------------------------------------- /src/main/resources/static/layui/css/modules/laydate/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/css/modules/laydate/icon.png -------------------------------------------------------------------------------- /src/main/resources/static/layui/css/modules/laydate/laydate.css: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | #layuicss-laydatecss{display:none;position:absolute;width:1989px}.laydate_body .laydate_box,.laydate_body .laydate_box *{margin:0;padding:0;box-sizing:content-box}.laydate-icon,.laydate-icon-dahong,.laydate-icon-danlan,.laydate-icon-default,.laydate-icon-molv{height:22px;line-height:22px;padding-right:20px;border:1px solid #C6C6C6;background-repeat:no-repeat;background-position:right center;background-color:#fff;outline:0}.laydate-icon-default{background-image:url(../skins/default/icon.png)}.laydate-icon-danlan{border:1px solid #B1D2EC;background-image:url(../skins/danlan/icon.png)}.laydate-icon-dahong{background-image:url(../skins/dahong/icon.png)}.laydate-icon-molv{background-image:url(../skins/molv/icon.png)}.laydate_body .laydate_box{width:240px;font:12px '\5B8B\4F53';z-index:99999999;*overflow:hidden;_margin:0;_position:absolute!important}.laydate_body .laydate_box li{list-style:none}.laydate_body .laydate_box .laydate_void{cursor:text!important}.laydate_body .laydate_box cite,.laydate_body .laydate_box label{position:absolute;width:0;height:0;border-width:5px;border-style:dashed;border-color:transparent;overflow:hidden;cursor:pointer}.laydate_body .laydate_box .laydate_time,.laydate_body .laydate_box .laydate_yms{display:none}.laydate_body .laydate_box .laydate_show{display:block}.laydate_body .laydate_box input{outline:0;font-size:14px;background-color:#fff;color:#333}.laydate_body .laydate_top{position:relative;height:26px;padding:5px;*width:100%;z-index:99}.laydate_body .laydate_ym{position:relative;float:left;height:24px;cursor:pointer}.laydate_body .laydate_ym input{float:left;height:24px;line-height:24px;text-align:center;border:none;cursor:pointer}.laydate_body .laydate_ym .laydate_yms{position:absolute;left:-1px;top:24px;height:181px}.laydate_body .laydate_y{width:121px;margin-right:6px}.laydate_body .laydate_y input{width:64px;margin-right:15px}.laydate_body .laydate_y .laydate_yms{width:121px;text-align:center}.laydate_body .laydate_y .laydate_yms a{position:relative;display:block;height:20px}.laydate_body .laydate_y .laydate_yms ul{height:139px;padding:0;*overflow:hidden}.laydate_body .laydate_y .laydate_yms ul li{float:left;width:60px;height:20px;line-height:20px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate_body .laydate_m{width:99px}.laydate_body .laydate_m .laydate_yms{width:99px;padding:0}.laydate_body .laydate_m input{width:42px;margin-right:15px}.laydate_body .laydate_m .laydate_yms span{display:block;float:left;width:42px;margin:5px 0 0 5px;line-height:24px;text-align:center;_display:inline}.laydate_body .laydate_choose{display:block;float:left;position:relative;width:20px;height:24px}.laydate_body .laydate_choose cite,.laydate_body .laydate_tab cite{left:50%;top:50%}.laydate_body .laydate_chtop cite{margin:-7px 0 0 -5px;border-bottom-style:solid}.laydate_body .laydate_chdown cite,.laydate_body .laydate_ym label{top:50%;margin:-2px 0 0 -5px;border-top-style:solid}.laydate_body .laydate_chprev cite{margin:-5px 0 0 -7px}.laydate_body .laydate_chnext cite{margin:-5px 0 0 -2px}.laydate_body .laydate_ym label{right:28px}.laydate_body .laydate_table{width:230px;margin:0 5px;border-collapse:collapse;border-spacing:0}.laydate_body .laydate_table td{width:31px;text-align:center;cursor:pointer;font-size:12px}.laydate_body .laydate_table thead th{font-weight:400;font-size:12px;text-align:center}.laydate_body .laydate_bottom{position:relative;height:22px;line-height:20px;padding:5px;font-size:12px}.laydate_body .laydate_bottom #laydate_hms{position:relative;z-index:1;float:left}.laydate_body .laydate_time{position:absolute;left:5px;bottom:26px;width:129px;height:125px;*overflow:hidden}.laydate_body .laydate_time .laydate_hmsno{padding:5px 0 0 5px}.laydate_body .laydate_time .laydate_hmsno span{display:block;float:left;width:24px;height:19px;line-height:19px;text-align:center;cursor:pointer;*margin-bottom:-5px}.laydate_body .laydate_time1{width:228px;height:154px}.laydate_body .laydate_time1 .laydate_hmsno{padding:6px 0 0 8px}.laydate_body .laydate_time1 .laydate_hmsno span{width:21px;height:20px;line-height:20px}.laydate_body .laydate_msg{left:49px;bottom:67px;width:141px;height:auto;overflow:hidden}.laydate_body .laydate_msg p{padding:5px 10px}.laydate_body .laydate_bottom li{float:left;height:20px;line-height:20px;border-right:none;font-weight:900}.laydate_body .laydate_bottom .laydate_sj{width:33px;text-align:center;font-weight:400}.laydate_body .laydate_bottom input{float:left;width:21px;height:20px;line-height:20px;border:none;text-align:center;cursor:pointer;font-size:12px;font-weight:400}.laydate_body .laydate_bottom .laydte_hsmtex{height:20px;line-height:20px;text-align:center}.laydate_body .laydate_bottom .laydte_hsmtex span{position:absolute;width:20px;top:0;right:0;cursor:pointer}.laydate_body .laydate_bottom .laydte_hsmtex span:hover{font-size:14px}.laydate_body .laydate_bottom .laydate_btn{position:absolute;right:5px;top:5px}.laydate_body .laydate_bottom .laydate_btn a{float:left;height:20px;padding:0 6px;_padding:0 5px}.laydate_body .laydate_table td,.laydate_body .laydate_table thead{height:21px!important;line-height:21px!important}.laydate-icon{border:1px solid #C6C6C6;background-image:url(icon.png)}.laydate_body .laydate_bottom #laydate_hms,.laydate_body .laydate_bottom .laydate_btn a,.laydate_body .laydate_box,.laydate_body .laydate_table,.laydate_body .laydate_table td,.laydate_body .laydate_time,.laydate_body .laydate_ym,.laydate_body .laydate_ym .laydate_yms{border:1px solid #ccc}.laydate_body .laydate_bottom .laydte_hsmtex,.laydate_body .laydate_choose,.laydate_body .laydate_table thead,.laydate_body .laydate_y .laydate_yms a{background-color:#F6F6F6}.laydate_body .laydate_box,.laydate_body .laydate_time,.laydate_body .laydate_ym .laydate_yms{box-shadow:2px 2px 5px rgba(0,0,0,.1)}.laydate_body .laydate_box{border-top:none;border-bottom:none;background-color:#fff;color:#333}.laydate_body .laydate_box .laydate_void{color:#ccc!important}.laydate_body .laydate_box .laydate_void:hover{background-color:#fff!important}.laydate_body .laydate_box a,.laydate_body .laydate_box a:hover{text-decoration:none;blr:expression(this.onFocus=this.blur());cursor:pointer;color:#333}.laydate_body .laydate_box a:hover{text-decoration:none;color:#666}.laydate_body .laydate_click{background-color:#eee!important}.laydate_body .laydate_bottom #laydate_hms,.laydate_body .laydate_choose:hover,.laydate_body .laydate_table td,.laydate_body .laydate_time,.laydate_body .laydate_y .laydate_yms a:hover{background-color:#fff}.laydate_body .laydate_top{border-top:1px solid #C6C6C6}.laydate_body .laydate_ym .laydate_yms{border:1px solid #C6C6C6;background-color:#fff}.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #C6C6C6}.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #C6C6C6;border-bottom:none}.laydate_body .laydate_choose{border-left:1px solid #C6C6C6}.laydate_body .laydate_chprev{border-left:none;border-right:1px solid #C6C6C6}.laydate_body .laydate_chtop cite{border-bottom-color:#666}.laydate_body .laydate_chdown cite,.laydate_body .laydate_ym label{border-top-color:#666}.laydate_body .laydate_chprev cite{border-right-style:solid;border-right-color:#666}.laydate_body .laydate_chnext cite{border-left-style:solid;border-left-color:#666}.laydate_body .laydate_table td{border:none}.laydate_body .laydate_table .laydate_nothis{color:#999}.laydate_body .laydate_table thead th{border-bottom:1px solid #ccc}.laydate_body .laydate_bottom,.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #C6C6C6}.laydate_body .laydate_bottom .laydate_sj{border-right:1px solid #C6C6C6;background-color:#F6F6F6}.laydate_body .laydate_bottom input{background-color:#fff}.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #C6C6C6}.laydate_body .laydate_bottom .laydate_v{position:absolute;left:10px;top:6px;font-family:Courier;z-index:0;color:#999}.laydate_body .laydate_bottom .laydate_btn a{border-right:none;background-color:#F6F6F6}.laydate_body .laydate_bottom .laydate_btn a:hover{color:#000;background-color:#fff}.laydate_body .laydate_m .laydate_yms span:hover,.laydate_body .laydate_table td:hover,.laydate_body .laydate_time .laydate_hmsno span:hover,.laydate_body .laydate_y .laydate_yms ul li:hover{background-color:#F3F3F3} -------------------------------------------------------------------------------- /src/main/resources/static/layui/css/modules/layer/default/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/css/modules/layer/default/icon-ext.png -------------------------------------------------------------------------------- /src/main/resources/static/layui/css/modules/layer/default/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/css/modules/layer/default/icon.png -------------------------------------------------------------------------------- /src/main/resources/static/layui/css/modules/layer/default/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/css/modules/layer/default/loading-0.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/css/modules/layer/default/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/css/modules/layer/default/loading-1.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/css/modules/layer/default/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/css/modules/layer/default/loading-2.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/font/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/font/iconfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/layui/font/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/font/iconfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/layui/font/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/font/iconfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/0.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/1.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/10.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/11.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/11.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/12.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/12.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/13.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/13.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/14.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/14.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/15.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/15.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/16.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/17.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/17.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/18.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/18.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/19.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/19.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/2.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/20.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/20.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/21.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/21.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/22.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/22.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/23.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/23.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/24.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/24.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/25.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/25.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/26.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/26.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/27.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/27.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/28.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/29.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/29.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/3.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/30.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/30.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/31.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/31.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/32.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/32.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/33.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/33.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/34.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/34.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/35.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/35.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/36.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/36.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/37.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/37.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/38.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/38.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/39.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/39.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/4.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/40.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/40.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/41.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/41.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/42.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/42.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/43.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/43.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/44.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/44.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/45.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/45.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/46.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/46.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/47.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/47.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/48.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/48.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/49.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/49.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/5.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/50.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/50.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/51.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/51.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/52.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/52.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/53.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/53.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/54.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/54.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/55.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/55.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/56.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/56.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/57.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/57.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/58.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/58.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/59.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/59.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/6.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/60.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/60.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/61.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/61.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/62.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/62.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/63.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/63.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/64.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/64.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/65.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/65.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/66.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/66.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/67.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/67.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/68.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/68.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/69.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/69.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/7.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/70.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/70.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/71.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/71.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/8.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/images/face/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wang153723482/testing_platform/37977903eff578375da71d3b0d70ff5b05f3a5da/src/main/resources/static/layui/images/face/9.gif -------------------------------------------------------------------------------- /src/main/resources/static/layui/lay/modules/code.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,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"); -------------------------------------------------------------------------------- /src/main/resources/static/layui/lay/modules/element.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(i){"use strict";var a=layui.jquery,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(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=e.children(".layui-tab-content");return n.append('
  • '+(t.title||"unnaming")+"
  • "),s.append('
    '+(t.content||"")+"
    "),f.hideTabMore(!0),f.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 f.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 f.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",y="layui-anim layui-anim-upbit",f={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=c.attr("lay-filter");o.addClass(e).siblings().removeClass(e),r.eq(t).addClass(n).siblings().removeClass(n),layui.event.call(this,l,"tab("+u+")",{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]?f.tabClick.call(l.next()[0],null,n+1):l.prev()[0]&&f.tabClick.call(l.prev()[0],null,n-1)),l.remove(),o.eq(n).remove(),setTimeout(function(){f.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&&f.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",f.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");i.find("."+d)[0]||(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(y),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(){f.tabAuto.call({})},nav:function(){var i,l,e,s=200,p=function(o,c){var r=a(this),f=r.find("."+d);c.hasClass(u)?o.css({top:r.position().top,height:r.children("a").height(),opacity:1}):(f.addClass(y),o.css({left:r.position().left+parseFloat(r.css("marginLeft")),top:r.position().top+r.height()-5}),i=setTimeout(function(){o.css({width:r.width(),opacity:1})},t.ie&&t.ie<10?0:s),clearTimeout(e),"block"===f.css("display")&&clearTimeout(l),l=setTimeout(function(){f.addClass(n),r.find("."+h).addClass(h+"d")},300))};a(o).each(function(){var t=a(this),o=a(''),y=t.find("."+c);t.find("."+r)[0]||(t.append(o),y.on("mouseenter",function(){p.call(this,o,t)}).on("mouseleave",function(){t.hasClass(u)||(clearTimeout(l),l=setTimeout(function(){t.find("."+d).removeClass(n),t.find("."+h).removeClass(h+"d")},300))}),t.on("mouseleave",function(){clearTimeout(i),e=setTimeout(function(){t.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},s)})),y.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",f.clickThis).on("click",f.clickThis),i.children("a").off("click",f.showChild).on("click",f.showChild),t.children("dd").off("click",f.clickChild).on("click",f.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",f.collapse).on("click",f.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,f.tabClick),v.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),i(l,function(i){return p.set(i)})}); -------------------------------------------------------------------------------- /src/main/resources/static/layui/lay/modules/flow.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var l=layui.jquery,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var u=l(e.elem);if(u[0]){var f=l(e.scrollElem||document),m=e.mb||50,s=!("isAuto"in e)||e.isAuto,y=e.end||"没有更多了",v=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");u.find(".layui-flow-more")[0]||u.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(y):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?(f.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=v?e.height():l(window).height(),n=v?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=m&&(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 f=e.attr("lay-src");layui.img(f,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",f).removeAttr("lay-src"),l[0]&&u(l),i++})}},u=function(e,o){var u=a?(o||n).height():l(window).height(),f=n.scrollTop(),m=f+u;if(t.lazyimg.elem=l(r),e)c(e,u);else for(var s=0;sm)break}};if(u(),!o){var f;n.on("scroll",function(){var e=l(this);f&&clearTimeout(f),f=setTimeout(function(){u(null,e)},50)}),o=!0}return u},e("flow",new o)}); -------------------------------------------------------------------------------- /src/main/resources/static/layui/lay/modules/form.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;layui.define("layer",function(e){"use strict";var i=layui.jquery,t=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=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:[/^\d+$/,"只能填写数字"],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)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var t=this;return i.extend(!0,t.config,e),t},u.prototype.verify=function(e){var t=this;return i.extend(!0,t.config.verify,e),t},u.prototype.on=function(e,i){return layui.onevent(l,e,i)},u.prototype.render=function(e){var t=this,n={select:function(){var e,t="请选择",a="layui-form-select",n="layui-select-title",u="layui-select-none",d="",f=i(r).find("select"),y=function(t,l){i(t.target).parent().hasClass(n)&&!l||(i("."+a).removeClass(a+"ed"),e&&d&&e.val(d)),e=null},v=function(t,r,f){var v=i(this),h=t.find("."+n),p=h.find("input"),m=t.find("dl"),k=m.children("dd");if(!r){var b=function(){t.addClass(a+"ed"),k.removeClass(o)},x=function(){t.removeClass(a+"ed"),p.blur(),g(p.val(),function(e){e&&(d=m.find("."+s).html(),p&&p.val(d))})};h.on("click",function(e){t.hasClass(a+"ed")?x():(y(e,!0),b()),m.find("."+u).remove()}),h.find(".layui-edge").on("click",function(){p.focus()}),p.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 g=function(e,t,a){var n=0;layui.each(k,function(){var t=i(this),l=t.text(),r=l.indexOf(e)===-1;(""===e||"blur"===a?e!==l:r)&&n++,"keyup"===a&&t[r?"addClass":"removeClass"](o)});var l=n===k.length;return t(l),l},C=function(e){var i=this.value,t=e.keyCode;return 9!==t&&13!==t&&37!==t&&38!==t&&39!==t&&40!==t&&(g(i,function(e){e?m.find("."+u)[0]||m.append('

    无匹配项

    '):m.find("."+u).remove()},"keyup"),void(""===i&&m.find("."+u).remove()))};f&&p.on("keyup",C).on("blur",function(i){e=p,d=m.find("."+s).html(),setTimeout(function(){g(p.val(),function(e){e&&!d&&p.val("")},"blur")},200)}),k.on("click",function(){var e=i(this),a=e.attr("lay-value"),n=v.attr("lay-filter");return!e.hasClass(c)&&(v.val(a).removeClass("layui-form-danger"),p.val(e.text()),e.addClass(s).siblings().removeClass(s),layui.event.call(this,l,"select("+n+")",{elem:v[0],value:a,othis:t}),x(),!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 r=i(this),o=r.next("."+a),u=this.disabled,d=l.value,f=i(l.options[l.selectedIndex]);if("string"==typeof r.attr("lay-ignore"))return r.show();var y="string"==typeof r.attr("lay-search"),h=i(['
    ','
    ','
    ','
    '+function(e){var i=[];return layui.each(e,function(e,t){(0!==e||t.value)&&("optgroup"===t.tagName.toLowerCase()?i.push("
    "+t.label+"
    "):i.push('
    '+t.innerHTML+"
    "))}),i.join("")}(r.find("*"))+"
    ","
    "].join(""));o[0]&&o.remove(),r.after(h),v.call(this,h,u,y)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},t=i(r).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),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=i(['
    ',{_switch:""+((n.checked?s[0]:s[1])||"")+""}[r]||(n.title.replace(/\s/g,"")?""+n.title+"":"")+''+(r?"":"")+"","
    "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",t=["",""],a=i(r).find("input[type=radio]"),n=function(a){var n=i(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.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(s).html(t[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(t[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=i(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();var u=i(['
    ',''+t[l.checked?0:1]+"",""+(l.title||"未命名")+"","
    "].join(""));s[0]&&s.remove(),r.after(u),n.call(this,u)})}};return e?n[e]?n[e]():a.error("不支持的"+e+"表单渲染"):layui.each(n,function(e,i){i()}),t};var d=function(){var e=i(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),y=e.parents("form")[0],v=u.find("input,select,textarea"),h=e.attr("lay-filter");return layui.each(d,function(e,l){var r=i(this),c=r.attr("lay-verify").split("|"),u="",d=r.val();if(r.removeClass(o),layui.each(c,function(e,i){var c="function"==typeof a[i];if(a[i]&&(c?u=a[i](d,l):!a[i][0].test(d)))return t.msg(u||a[i][1],{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}),s)return s}),!s&&(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 u,y=i(document);f.render(),y.on("reset",r,function(){setTimeout(function(){f.render()},50)}),y.on("submit",r,d).on("click","*[lay-submit]",d),e(l,function(e){return f.set(e)})}); -------------------------------------------------------------------------------- /src/main/resources/static/layui/lay/modules/laydate.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;layui.define(function(e){"use strict";var t=window,a={path:"",skin:"default",format:"YYYY-MM-DD",min:"1900-01-01 00:00:00",max:"2099-12-31 23:59:59",isv:!1,init:!0},n={},s=document,i="createElement",o="getElementById",l="getElementsByTagName",d=["laydate_box","laydate_void","laydate_click","LayDateSkin","skins/","/laydate.css"];t.laydate=function(e){return e=e||{},n.run(e),laydate},laydate.v="1.1",n.trim=function(e){return e=e||"",e.replace(/^\s|\s$/g,"").replace(/\s+/g," ")},n.digit=function(e){return e<10?"0"+(0|e):e},n.stopmp=function(e){return e=e||t.event,e.stopPropagation?e.stopPropagation():e.cancelBubble=!0,this},n.each=function(e,t){for(var a=0,n=e.length;an.maxs[0]?s=["y",1]:e>=n.mins[0]&&e<=n.maxs[0]&&(e==n.mins[0]&&(tn.maxs[1]?s=["m",1]:t==n.maxs[1]&&a>n.maxs[2]&&(s=["d",1]))),s},n.timeVoid=function(e,t){if(n.ymd[1]+1==n.mins[1]&&n.ymd[2]==n.mins[2]){if(0===t&&en.maxs[3])return 1;if(1===t&&e>n.maxs[4])return 1;if(2===t&&e>n.maxs[5])return 1}if(e>(t?59:23))return 1},n.check=function(){var e=n.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g,"\\d+\\").replace(/\\$/g,""),t=new RegExp(e),a=n.elem[d.elemv],s=a.match(/\d+/g)||[],i=n.checkVoid(s[0],s[1],s[2]);if(""!==a.replace(/\s/g,"")){if(!t.test(a))return n.elem[d.elemv]="",n.msg("日期不符合格式,请重新选择。"),1;if(i[0])return n.elem[d.elemv]="",n.msg("日期不在有效期内,请重新选择。"),1;i.value=n.elem[d.elemv].match(t).join(),s=i.value.match(/\d+/g),s[1]<1?(s[1]=1,i.auto=1):s[1]>12?(s[1]=12,i.auto=1):s[1].length<2&&(i.auto=1),s[2]<1?(s[2]=1,i.auto=1):s[2]>n.months[(0|s[1])-1]?(s[2]=31,i.auto=1):s[2].length<2&&(i.auto=1),s.length>3&&(n.timeVoid(s[3],0)&&(i.auto=1),n.timeVoid(s[4],1)&&(i.auto=1),n.timeVoid(s[5],2)&&(i.auto=1)),i.auto?n.creation([s[0],0|s[1],0|s[2]],1):i.value!==n.elem[d.elemv]&&(n.elem[d.elemv]=i.value)}},n.months=[31,null,31,30,31,30,31,31,30,31,30,31],n.viewDate=function(e,t,a){var s=(n.query,{}),i=new Date;e<(0|n.mins[0])&&(e=0|n.mins[0]),e>(0|n.maxs[0])&&(e=0|n.maxs[0]),i.setFullYear(e,t,a),s.ymd=[i.getFullYear(),i.getMonth(),i.getDate()],n.months[1]=n.isleap(s.ymd[0])?29:28,i.setFullYear(s.ymd[0],s.ymd[1],1),s.FDay=i.getDay(),s.PDay=n.months[0===t?11:t-1]-s.FDay+1,s.NDay=1,n.each(d.tds,function(e,t){var a,i=s.ymd[0],o=s.ymd[1]+1;t.className="",e=s.FDay&&e'+e+"年":'
  • '+(e-7+t)+"年
  • "}),t("#laydate_ys").innerHTML=a,n.each(t("#laydate_ys li"),function(e,t){"y"===n.checkVoid(t.getAttribute("y"))[0]?n.addClass(t,d[1]):n.on(t,"click",function(e){n.stopmp(e).reshow(),n.viewDate(0|this.getAttribute("y"),n.ymd[1],n.ymd[2])})})},n.initDate=function(){var e=(n.query,new Date),t=n.elem[d.elemv].match(/\d+/g)||[];t.length<3&&(t=n.options.start.match(/\d+/g)||[],t.length<3&&(t=[e.getFullYear(),e.getMonth()+1,e.getDate()])),n.inymd=t,n.viewDate(t[0],t[1]-1,t[2])},n.iswrite=function(){var e=n.query,t={time:e("#laydate_hms")};n.shde(t.time,!n.options.istime),n.shde(d.oclear,!("isclear"in n.options?n.options.isclear:1)),n.shde(d.otoday,!("istoday"in n.options?n.options.istoday:1)),n.shde(d.ok,!("issure"in n.options?n.options.issure:1))},n.orien=function(e,t){var a,s=n.elem.getBoundingClientRect();e.style.left=s.left+(t?0:n.scroll(1))+"px",a=s.bottom+e.offsetHeight/1.5<=n.winarea()?s.bottom-1:s.top>e.offsetHeight/1.5?s.top-e.offsetHeight+1:n.winarea()-e.offsetHeight,e.style.top=Math.max(a+(t?0:n.scroll()),1)+"px"},n.follow=function(e){n.options.fixed?(e.style.position="fixed",n.orien(e,1)):(e.style.position="absolute",n.orien(e))},n.viewtb=function(){var e,t=[],a=["日","一","二","三","四","五","六"],o={},d=s[i]("table"),r=s[i]("thead");return r.appendChild(s[i]("tr")),o.creath=function(e){var t=s[i]("th");t.innerHTML=a[e],r[l]("tr")[0].appendChild(t),t=null},n.each(new Array(6),function(a){t.push([]),e=d.insertRow(0),n.each(new Array(7),function(n){t[a][n]=0,0===a&&o.creath(n),e.insertCell(n)})}),d.insertBefore(r,d.children[0]),d.id=d.className="laydate_table",e=t=null,d.outerHTML.toLowerCase()}(),n.view=function(e,t){var o,l=n.query,r={};t=t||e,n.elem=e,n.options=t,n.options.format||(n.options.format=a.format),n.options.start=n.options.start||"",n.mm=r.mm=[n.options.min||a.min,n.options.max||a.max],n.mins=r.mm[0].match(/\d+/g),n.maxs=r.mm[1].match(/\d+/g),n.box?n.shde(n.box):(o=s[i]("div"),o.id=d[0],o.className=d[0],o.style.cssText="position: absolute;",o.setAttribute("name","laydate-v"+laydate.v),o.innerHTML=r.html='
      '+function(){var e="";return n.each(new Array(12),function(t){e+=''+n.digit(t+1)+"月"}),e}()+"
      "+n.viewtb+'",s.body.appendChild(o),n.box=l("#"+d[0]),n.events(),o=null),n.follow(n.box),t.zIndex?n.box.style.zIndex=t.zIndex:n.removeCssAttr(n.box,"z-index"),n.stopMosup("click",n.box),n.initDate(),n.iswrite(),n.check()},n.reshow=function(){return n.each(n.query("#"+d[0]+" .laydate_show"),function(e,t){n.removeClass(t,"laydate_show")}),this},n.close=function(){n.reshow(),n.shde(n.query("#"+d[0]),1),n.elem=null},n.parse=function(e,t,s){return e=e.concat(t),s=s||(n.options?n.options.format:a.format),s.replace(/YYYY|MM|DD|hh|mm|ss/g,function(t,a){return e.index=0|++e.index,n.digit(e[e.index])})},n.creation=function(e,t){var a=(n.query,n.hmsin),s=n.parse(e,[a[0].value,a[1].value,a[2].value]);n.elem[d.elemv]=s,t||(n.close(),"function"==typeof n.options.choose&&n.options.choose(s))},n.events=function(){var e=n.query,a={box:"#"+d[0]};n.addClass(s.body,"laydate_body"),d.tds=e("#laydate_table td"),d.mms=e("#laydate_ms span"),d.year=e("#laydate_y"),d.month=e("#laydate_m"),n.each(e(a.box+" .laydate_ym"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.addClass(this[l]("div")[0],"laydate_show"),e||(a.YY=parseInt(d.year.value),n.viewYears(a.YY))})}),n.on(e(a.box),"click",function(){n.reshow()}),a.tabYear=function(e){0===e?n.ymd[0]--:1===e?n.ymd[0]++:2===e?a.YY-=14:a.YY+=14,e<2?(n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2]),n.reshow()):n.viewYears(a.YY)},n.each(e("#laydate_YY .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t),a.tabYear(e)})}),a.tabMonth=function(e){e?(n.ymd[1]++,12===n.ymd[1]&&(n.ymd[0]++,n.ymd[1]=0)):(n.ymd[1]--,n.ymd[1]===-1&&(n.ymd[0]--,n.ymd[1]=11)),n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2])},n.each(e("#laydate_MM .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),a.tabMonth(e)})}),n.each(e("#laydate_ms span"),function(e,t){n.on(t,"click",function(e){n.stopmp(e).reshow(),n.hasClass(this,d[1])||n.viewDate(n.ymd[0],0|this.getAttribute("m"),n.ymd[2])})}),n.each(e("#laydate_table td"),function(e,t){n.on(t,"click",function(e){n.hasClass(this,d[1])||(n.stopmp(e),n.creation([0|this.getAttribute("y"),0|this.getAttribute("m"),0|this.getAttribute("d")]))})}),d.oclear=e("#laydate_clear"),n.on(d.oclear,"click",function(){n.elem[d.elemv]="",n.close()}),d.otoday=e("#laydate_today"),n.on(d.otoday,"click",function(){var e=new Date;n.creation([e.getFullYear(),e.getMonth()+1,e.getDate()])}),d.ok=e("#laydate_ok"),n.on(d.ok,"click",function(){n.valid&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])}),a.times=e("#laydate_time"),n.hmsin=a.hmsin=e("#laydate_hms input"),a.hmss=["小时","分钟","秒数"],a.hmsarr=[],n.msg=function(t,s){var i='
      '+(s||"提示")+"×
      ";"string"==typeof t?(i+="

      "+t+"

      ",n.shde(e("#"+d[0])),n.removeClass(a.times,"laydate_time1").addClass(a.times,"laydate_msg")):(a.hmsarr[t]?i=a.hmsarr[t]:(i+='
      ',n.each(new Array(0===t?24:60),function(e){i+=""+e+""}),i+="
      ",a.hmsarr[t]=i),n.removeClass(a.times,"laydate_msg"),n[0===t?"removeClass":"addClass"](a.times,"laydate_time1")),n.addClass(a.times,"laydate_show"),a.times.innerHTML=i},a.hmson=function(t,a){var s=e("#laydate_hmsno span"),i=n.valid?null:1;n.each(s,function(e,s){i?n.addClass(s,d[1]):n.timeVoid(e,a)?n.addClass(s,d[1]):n.on(s,"click",function(e){n.hasClass(this,d[1])||(t.value=n.digit(0|this.innerHTML))})}),n.addClass(s[0|t.value],"laydate_click")},n.each(a.hmsin,function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.msg(e,a.hmss[e]),a.hmson(this,e)})}),n.on(s,"mouseup",function(){var t=e("#"+d[0]);t&&"none"!==t.style.display&&(n.check()||n.close())}).on(s,"keydown",function(e){e=e||t.event;var a=e.keyCode;13===a&&n.elem&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])})},laydate.reset=function(){n.box&&n.elem&&n.follow(n.box)},laydate.now=function(e,t){var a=new Date(0|e?function(e){return e<864e5?+new Date+864e5*e:e}(parseInt(e)):+new Date);return n.parse([a.getFullYear(),a.getMonth()+1,a.getDate()],[a.getHours(),a.getMinutes(),a.getSeconds()],t)},layui.addcss("modules/laydate/laydate.css",function(){},"laydatecss"),e("laydate",laydate)}); -------------------------------------------------------------------------------- /src/main/resources/static/layui/lay/modules/layedit.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;layui.define(["layer","form"],function(t){"use strict";var e=layui.jquery,i=layui.layer,a=layui.form(),l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",s=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};s.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},s.prototype.on=function(t,e){return layui.onevent(n,t,e)},s.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",s=e("#"+t),u="LAY_layedit_"+ ++a.index,d=s.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?s.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),c.call(a,m,s[0],y),s.addClass("layui-hide").after(m),a.index)},s.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},s.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},s.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))}},s.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 c=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"),s=o.find("head"),c=e([""].join("")),u=o.find("body");s.append(c),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,s=e(r.body);s.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=s.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),s.on("paste",function(e){r.execCommand("formatBlock",!1,"

      "),setTimeout(function(){f.call(t,s),n.value=s.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),s={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({url:r.url,method:r.type,elem:e(n).find("input")[0],unwrap:!0,success: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"]})}},c=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)):s[a]&&s[a].call(this,u),h.call(t,c,i)}},d=/image/;c.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,c),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 s;t(n,w)}); -------------------------------------------------------------------------------- /src/main/resources/static/layui/lay/modules/laypage.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;layui.define(function(a){"use strict";function t(a){new p(a)}var e=document,r="getElementById",n="getElementsByTagName",s=0,p=function(a){var t=this,e=t.config=a||{};e.item=s++,t.render(!0)};p.on=function(a,t,e){return a.attachEvent?a.attachEvent("on"+t,function(){e.call(a,window.even)}):a.addEventListener(t,e,!1),p},p.prototype.type=function(){var a=this.config;if("object"==typeof a.cont)return void 0===a.cont.length?2:3},p.prototype.view=function(){var a=this,t=a.config,e=[],r={};if(t.pages=0|t.pages,t.curr=0|t.curr||1,t.groups="groups"in t?0|t.groups:5,t.first="first"in t?t.first:"首页",t.last="last"in t?t.last:"末页",t.prev="prev"in t?t.prev:"上一页",t.next="next"in t?t.next:"下一页",t.pages<=1)return"";for(t.groups>t.pages&&(t.groups=t.pages),r.index=Math.ceil((t.curr+(t.groups>1&&t.groups!==t.pages?1:0))/(0===t.groups?1:t.groups)),t.curr>1&&t.prev&&e.push(''+t.prev+""),r.index>1&&t.first&&0!==t.groups&&e.push(''+t.first+""),r.poor=Math.floor((t.groups-1)/2),r.start=r.index>1?t.curr-r.poor:1,r.end=r.index>1?function(){var a=t.curr+(t.groups-r.poor-1);return a>t.pages?t.pages:a}():t.groups,r.end-r.start"+r.start+""):e.push(''+r.start+"");return t.pages>t.groups&&r.end'+t.last+""),r.flow=!t.prev&&0===t.groups,(t.curr!==t.pages&&t.next||r.flow)&&e.push(function(){return r.flow&&t.curr===t.pages?''+t.next+"":''+t.next+""}()),'
      '+e.join("")+function(){return t.skip?'到第 ':""}()+"
      "},p.prototype.jump=function(a){if(a){for(var t=this,e=t.config,r=a.children,s=a[n]("button")[0],i=a[n]("input")[0],u=0,o=r.length;u/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)}); -------------------------------------------------------------------------------- /src/main/resources/static/layui/lay/modules/tree.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(e){"use strict";var o=layui.jquery,a=layui.hint(),r="layui-tree-enter",i=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};i.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)},i.prototype.tree=function(e,a){var r=this,i=r.options,n=a||i.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 i.check?''+("checkbox"===i.check?t.checkbox[0]:"radio"===i.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
      • "].join(""));l&&(s.append(c),r.tree(c,n.children)),e.append(s),"function"==typeof i.click&&r.click(s,n),r.spread(s,n),i.drag&&r.drag(s,n)})},i.prototype.click=function(e,o){var a=this,r=a.options;e.children("a").on("click",function(e){layui.stope(e),r.click(o)})},i.prototype.spread=function(e,o){var a=this,r=(a.options,e.children(".layui-tree-spread")),i=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),i.removeClass("layui-show"),r.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),i.addClass("layui-show"),r.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};i[0]&&(r.on("click",l),n.on("dblclick",l))},i.prototype.on=function(e){var a=this,i=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),i.drag&&o(document).on("mousemove",function(e){var r=a.move;if(r.from){var i=(r.to,o('
        '));e.preventDefault(),o("."+t)[0]||o("body").append(i);var n=o("."+t)[0]?o("."+t):i;n.addClass("layui-show").html(r.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(r),e.to&&e.to.elem.children("a").removeClass(r),a.move={},o("."+t).remove())})},i.prototype.move={},i.prototype.drag=function(e,a){var i=this,t=(i.options,e.children("a")),n=function(){var t=o(this),n=i.move;n.from&&(n.to={item:a,elem:e},t.addClass(r))};t.on("mousedown",function(){var o=i.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=i.move;a.from&&(delete a.to,e.removeClass(r))})},e("tree",function(e){var r=new i(e=e||{}),t=o(e.elem);return t[0]?void r.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); -------------------------------------------------------------------------------- /src/main/resources/static/layui/lay/modules/upload.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;layui.define("layer",function(e){"use strict";var a=layui.jquery,t=layui.layer,i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"},s=function(e){this.options=e};s.prototype.init=function(){var e=this,t=e.options,r=a("body"),s=a(t.elem||".layui-upload-file"),u=a('');return a("#"+n)[0]||r.append(u),s.each(function(r,s){s=a(s);var u='
        ',l=s.attr("lay-type")||t.type;t.unwrap||(u='
        '+u+''+(s.attr("lay-title")||t.title||"上传"+(o[l]||"图片"))+"
        "),u=a(u),t.unwrap||u.on("dragover",function(e){e.preventDefault(),a(this).addClass(i)}).on("dragleave",function(){a(this).removeClass(i)}).on("drop",function(){a(this).removeClass(i)}),s.parent("form").attr("target")===n&&(t.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=a(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return t.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return t.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return t.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return t.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=a("#"+n),f=setInterval(function(){var a;try{a=c.contents().find("body").text()}catch(i){t.msg("上传接口存在跨域",r),clearInterval(f)}if(a){clearInterval(f),c.contents().find("body").html("");try{a=JSON.parse(a)}catch(i){return a={},t.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(a,e)}},30);e.value=""}},e("upload",function(e){var a=new s(e=e||{});a.init()})}); -------------------------------------------------------------------------------- /src/main/resources/static/layui/lay/modules/util.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;layui.define("jquery",function(l){"use strict";var o=layui.jquery,i={fixbar:function(l){l=l||{},l.bgcolor=l.bgcolor?"background-color:"+l.bgcolor:"";var i,a,c="layui-fixbar-top",t=[l.bar1===!0?"":l.bar1,l.bar2===!0?"":l.bar2,""],r=o(['
          ',l.bar1?'
        • '+t[0]+"
        • ":"",l.bar2?'
        • '+t[1]+"
        • ":"",'
        • '+t[2]+"
        • ","
        "].join("")),e=r.find("."+c),s=function(){var i=o(document).scrollTop();i>=(l.showHeight||200)?a||(e.show(),a=1):a&&(e.hide(),a=0)};o(".layui-fixbar")[0]||("object"==typeof l.css&&r.css(l.css),o("body").append(r),s(),r.find("li").on("click",function(){var i=o(this),a=i.attr("lay-type");"top"===a&&o("html,body").animate({scrollTop:0},200),l.click&&l.click.call(this,a)}),o(document).on("scroll",function(){i&&clearTimeout(i),i=setTimeout(function(){s()},100)}))}};l("util",i)}); -------------------------------------------------------------------------------- /src/main/resources/static/layui/layui.js: -------------------------------------------------------------------------------- 1 | /** layui-v1.0.9_rls MIT License By http://www.layui.com */ 2 | ;!function(e){"use strict";var t=function(){this.v="1.0.9_rls"};t.fn=t.prototype;var n=document,o=t.fn.cache={},i=function(){var e=n.scripts,t=e[e.length-1].src;return t.substring(0,t.lastIndexOf("/")+1)}(),r=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},l="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),a={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":"dest/layui.all"};o.modules={},o.status={},o.timeout=10,o.event={},t.fn.define=function(e,t){var n=this,i="function"==typeof e,r=function(){return"function"==typeof t&&t(function(e,t){layui[e]=t,o.status[e]=!0}),this};return i&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?r.call(n):(n.use(e,r),n)},t.fn.use=function(e,t,u){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[m]=t,y.removeChild(p),function i(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void(o.status[m]?c():setTimeout(i,4))}())}function c(){u.push(layui[m]),e.length>1?f.use(e.slice(1),t,u):"function"==typeof t&&t.apply(layui,u)}var f=this,d=o.dir=o.dir?o.dir:i,y=n.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(f.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=jQuery);var m=e[0],v=0;if(u=u||[],o.host=o.host||(d.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&a[m]||!layui["layui.all"]&&layui["layui.mobile"]&&a[m])return c(),f;var p=n.createElement("script"),h=(a[m]?d+"lay/":o.base||"")+(f.modules[m]||m)+".js";return p.async=!0,p.charset="utf-8",p.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),o.modules[m]?!function g(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void("string"==typeof o.modules[m]&&o.status[m]?c():setTimeout(g,4))}():(y.appendChild(p),!p.attachEvent||p.attachEvent.toString&&p.attachEvent.toString().indexOf("[native code")<0||l?p.addEventListener("load",function(e){s(e,h)},!1):p.attachEvent("onreadystatechange",function(e){s(e,h)})),o.modules[m]=h,f},t.fn.getStyle=function(t,n){var o=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return o[o.getPropertyValue?"getPropertyValue":"getAttribute"](n)},t.fn.link=function(e,t,i){var l=this,a=n.createElement("link"),u=n.getElementsByTagName("head")[0];"string"==typeof t&&(i=t);var s=(i||e).replace(/\.|\//g,""),c=a.id="layuicss-"+s,f=0;a.rel="stylesheet",a.href=e+(o.debug?"?v="+(new Date).getTime():""),a.media="all",n.getElementById(c)||u.appendChild(a),"function"==typeof t&&!function d(){return++f>1e3*o.timeout/100?r(e+" timeout"):void(1989===parseInt(l.getStyle(n.getElementById(c),"width"))?function(){t()}():setTimeout(d,100))}()},t.fn.addcss=function(e,t,n){layui.link(o.dir+"css/"+e,t,n)},t.fn.img=function(e,t,n){var o=new Image;return o.src=e,o.complete?t(o):(o.onload=function(){o.onload=null,t(o)},void(o.onerror=function(e){o.onerror=null,n(e)}))},t.fn.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},t.fn.modules=function(){var e={};for(var t in a)e[t]=a[t];return e}(),t.fn.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?r("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},t.fn.router=function(e){for(var t,n=(e||location.hash).replace(/^#/,"").split("/")||[],o={dir:[]},i=0;i 2 | 3 | 4 | 5 | 6 |
        7 | 8 | 9 | 10 | 11 | 17 | 18 |
        19 | 20 | -------------------------------------------------------------------------------- /src/main/resources/templates/header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
        9 | 10 |
        11 | 性能测试平台 12 |
        13 | 14 | 27 |
        28 | 29 |
        30 | 31 | 32 | 33 | 39 |
        40 | 41 | 42 | -------------------------------------------------------------------------------- /src/main/resources/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | testing platform 6 | 7 | 8 | 9 |
        10 |
        11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
        1.请安装 JMETER 3.2 版本
        2.请配置 JMETER_HOME 环境变量
        20 | 21 | -------------------------------------------------------------------------------- /src/main/resources/templates/run_plan/report_list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 测试报告列表 6 | 8 | 9 | 10 | 11 |
        12 |
        13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 27 | 28 | 29 | 30 |
        报告创建时间
        23 | 24 | 25 | 26 |
        31 | 32 | 33 | 38 | 39 | -------------------------------------------------------------------------------- /src/main/resources/templates/run_plan/run_log.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 执行日志 6 | 9 | 10 | 11 | 12 |
        13 |
        14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 30 | 31 |
        执行日志
        27 | 28 |
        32 | 33 | 34 | 43 | 44 | -------------------------------------------------------------------------------- /src/main/resources/templates/test_plan/add.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 添加测试计划 6 | 7 | 15 | 16 | 17 |
        18 |
        19 |
        20 | 21 |
        23 |
        24 | 25 |
        26 | 28 |
        29 |
        30 |
        31 | 32 |
        33 | 35 |
        36 |
        37 |
        38 | 39 |
        40 | 41 |
        42 |
        43 |
        44 |
        45 | 46 |
        47 |
        48 | 49 |
        50 |
        51 | 52 | 53 | 54 | 55 | 56 | 57 | 79 | 80 | -------------------------------------------------------------------------------- /src/main/resources/templates/test_plan/list.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 测试计划列表 6 | 7 | 8 | 9 |
        10 |
        11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 35 | 36 | 37 |
        测试计划名称测试描述操作
        27 | 28 | 29 | 30 | 执行 31 | 报表 32 | 运行日志 33 | 34 |
        38 | 39 | 65 | 66 | 67 | 68 | 89 | 90 | -------------------------------------------------------------------------------- /src/main/resources/templates/test_plan/modify.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | TP_LIST_ADD 6 | 7 | 8 | 9 | 10 |
        11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
        测试计划名称
        url
        测试描述
        测试数据生成类
        35 | 36 |
        37 | 38 | --------------------------------------------------------------------------------