├── .gitignore ├── LICENSE ├── README.md ├── oauth2.sql ├── pom.xml ├── src └── main │ ├── java │ └── com │ │ └── fcz │ │ └── oauth │ │ ├── Application.java │ │ ├── config │ │ ├── DataSourceConfig.java │ │ ├── Swagger2Config.java │ │ └── security │ │ │ ├── AuthenticationFailureHandler.java │ │ │ ├── AuthenticationSuccessHandler.java │ │ │ ├── AuthorizationServerConfiguration.java │ │ │ ├── ResourceServerConfiguration.java │ │ │ ├── WebSecurityConfiguration.java │ │ │ ├── encrypt │ │ │ └── SecurityPasswordEncoder.java │ │ │ ├── exception │ │ │ ├── SystemAccessDeniedHandler.java │ │ │ └── SystemAuthenticationEntryPoint.java │ │ │ ├── token │ │ │ ├── SystemJdbcTokenStore.java │ │ │ └── SystemTokenServices.java │ │ │ └── user │ │ │ ├── SystemUserDetails.java │ │ │ └── SystemUserDetailsService.java │ │ ├── controller │ │ ├── api │ │ │ ├── BusTestController.java │ │ │ ├── SaleTestController.java │ │ │ ├── TestController.java │ │ │ └── TokenController.java │ │ └── page │ │ │ ├── LoginPageController.java │ │ │ └── TestPageController.java │ │ ├── mapper │ │ └── UserMapper.java │ │ ├── model │ │ ├── constant │ │ │ ├── GlobalConstant.java │ │ │ └── ResponseConstant.java │ │ └── domain │ │ │ └── User.java │ │ ├── utils │ │ ├── EncryptUtiles.java │ │ └── SecurityUtils.java │ │ └── wrapper │ │ └── Wrapper.java │ └── resources │ ├── application.yml │ ├── mapper │ └── userMapper.xml │ ├── static │ ├── css │ │ ├── common │ │ │ ├── common.css │ │ │ ├── moonRangePicker.css │ │ │ ├── moonRangePicker.css.map │ │ │ └── moonRangePicker.scss │ │ ├── pages │ │ │ ├── dataMappingForProduct.css │ │ │ ├── directStateDetail.css │ │ │ ├── flowDirectionCollect.css │ │ │ ├── login.css │ │ │ ├── qaPage.css │ │ │ ├── report.css │ │ │ ├── searchChangeRecord.css │ │ │ └── searchSalesVolumeForSalesRepresentative.css │ │ └── plug │ │ │ ├── ace-ie.min.css │ │ │ ├── ace-part2.min.css │ │ │ ├── ace-rtl.min.css │ │ │ ├── ace-skins.min.css │ │ │ ├── ace.min.css │ │ │ ├── bootstrap-colorpicker.min.css │ │ │ ├── bootstrap-datepicker3.min.css │ │ │ ├── bootstrap-datetimepicker.min.css │ │ │ ├── bootstrap-duallistbox.min.css │ │ │ ├── bootstrap-editable.min.css │ │ │ ├── bootstrap-multiselect.min.css │ │ │ ├── bootstrap-timepicker.min.css │ │ │ ├── bootstrap.min.css │ │ │ ├── chosen.min.css │ │ │ ├── colorbox.min.css │ │ │ ├── daterangepicker.min.css │ │ │ ├── dropzone.min.css │ │ │ ├── font-awesome.min.css │ │ │ ├── fonts.googleapis.com.css │ │ │ ├── fullcalendar.min.css │ │ │ ├── jquery-ui.custom.min.css │ │ │ ├── jquery-ui.min.css │ │ │ ├── jquery.gritter.min.css │ │ │ ├── layer.css │ │ │ ├── prettify.min.css │ │ │ ├── select2.min.css │ │ │ ├── ui.jqgrid-bootstrap-ui.css │ │ │ ├── ui.jqgrid-bootstrap4.css │ │ │ ├── ui.jqgrid.min.css │ │ │ └── zTreeStyle.css │ ├── font-awesome │ │ ├── 4.5.0 │ │ │ ├── css │ │ │ │ └── font-awesome.min.css │ │ │ └── fonts │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ ├── fontawesome-webfont.svg │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ └── fontawesome-webfont.woff2 │ │ └── 4.7.0 │ │ │ ├── css │ │ │ └── font-awesome.min.css │ │ │ └── font │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── images │ │ ├── avatars │ │ │ ├── avatar.png │ │ │ ├── avatar1.png │ │ │ ├── avatar2.png │ │ │ ├── avatar3.png │ │ │ ├── avatar4.png │ │ │ ├── avatar5.png │ │ │ ├── profile-pic.jpg │ │ │ └── user.jpg │ │ ├── bootstrap-colorpicker │ │ │ ├── alpha-horizontal.png │ │ │ ├── alpha.png │ │ │ ├── hue-horizontal.png │ │ │ ├── hue.png │ │ │ └── saturation.png │ │ ├── change-icon.png │ │ ├── chosen-sprite.png │ │ ├── ddi │ │ │ ├── DTQ_logo.png │ │ │ ├── favicon.ico │ │ │ ├── qiluLoginBK.jpg │ │ │ └── qilu_white.png │ │ ├── email │ │ │ ├── email1.png │ │ │ ├── email2.png │ │ │ ├── email3.png │ │ │ └── email4.png │ │ ├── gallery │ │ │ ├── image-1.jpg │ │ │ ├── image-2.jpg │ │ │ ├── image-3.jpg │ │ │ ├── image-4.jpg │ │ │ ├── image-5.jpg │ │ │ ├── image-6.jpg │ │ │ ├── thumb-1.jpg │ │ │ ├── thumb-2.jpg │ │ │ ├── thumb-3.jpg │ │ │ ├── thumb-4.jpg │ │ │ ├── thumb-5.jpg │ │ │ └── thumb-6.jpg │ │ ├── layer │ │ │ ├── icon-ext.png │ │ │ ├── icon.png │ │ │ ├── loading-0.gif │ │ │ ├── loading-1.gif │ │ │ └── loading-2.gif │ │ ├── placeholder │ │ │ ├── 165x90.png │ │ │ ├── 255x150.png │ │ │ ├── 530x270.png │ │ │ └── 550x280.png │ │ ├── plug │ │ │ └── chosen-sprite.png │ │ ├── qilu_logo.png │ │ └── zTreeStyle │ │ │ └── img │ │ │ ├── line_conn.png │ │ │ ├── loading.gif │ │ │ ├── metro.gif │ │ │ └── metro.png │ ├── js │ │ ├── common │ │ │ ├── common.js │ │ │ └── moonrangepicker.js │ │ ├── pages │ │ │ ├── authManage.js │ │ │ ├── customerGridList.js │ │ │ ├── customerMapping.js │ │ │ ├── dealerGridList.js │ │ │ ├── demo.js │ │ │ ├── masterDataModal.js │ │ │ ├── priceCustomerList.js │ │ │ ├── priceProductList.js │ │ │ └── productMapping.js │ │ └── plug │ │ │ ├── ace-editable.min.js │ │ │ ├── ace-elements.min.js │ │ │ ├── ace-extra.min.js │ │ │ ├── ace.min.js │ │ │ ├── autosize.min.js │ │ │ ├── bootbox.js │ │ │ ├── bootstrap-colorpicker.min.js │ │ │ ├── bootstrap-datepicker.min.js │ │ │ ├── bootstrap-datetimepicker.min.js │ │ │ ├── bootstrap-editable.min.js │ │ │ ├── bootstrap-markdown.min.js │ │ │ ├── bootstrap-multiselect.min.js │ │ │ ├── bootstrap-tag.min.js │ │ │ ├── bootstrap-timepicker.min.js │ │ │ ├── bootstrap-wysiwyg.min.js │ │ │ ├── bootstrap.min.js │ │ │ ├── buttons.colVis.min.js │ │ │ ├── buttons.flash.min.js │ │ │ ├── buttons.html5.min.js │ │ │ ├── buttons.print.min.js │ │ │ ├── canvas2image.js │ │ │ ├── chosen.jquery.min.js │ │ │ ├── dataTables.buttons.min.js │ │ │ ├── dataTables.select.min.js │ │ │ ├── daterangepicker.min.js │ │ │ ├── dropzone.min.js │ │ │ ├── echarts-all.js │ │ │ ├── echarts.common.min.js │ │ │ ├── excanvas.min.js │ │ │ ├── fullcalendar.min.js │ │ │ ├── grid.locale-en.js │ │ │ ├── holder.min.js │ │ │ ├── html2canvas.min.js │ │ │ ├── html5shiv.min.js │ │ │ ├── jqpaginator.min.js │ │ │ ├── jquery-1.11.3.min.js │ │ │ ├── jquery-2.1.4.min.js │ │ │ ├── jquery-additional-methods.min.js │ │ │ ├── jquery-typeahead.js │ │ │ ├── jquery-ui.custom.min.js │ │ │ ├── jquery-ui.min.js │ │ │ ├── jquery.bootstrap-duallistbox.min.js │ │ │ ├── jquery.colorbox.min.js │ │ │ ├── jquery.dataTables.bootstrap.min.js │ │ │ ├── jquery.dataTables.min.js │ │ │ ├── jquery.easypiechart.min.js │ │ │ ├── jquery.flot.min.js │ │ │ ├── jquery.flot.pie.min.js │ │ │ ├── jquery.flot.resize.min.js │ │ │ ├── jquery.gritter.min.js │ │ │ ├── jquery.hotkeys.index.min.js │ │ │ ├── jquery.hotkeys.js │ │ │ ├── jquery.inputlimiter.min.js │ │ │ ├── jquery.jqGrid.min.js │ │ │ ├── jquery.knob.min.js │ │ │ ├── jquery.maskedinput.min.js │ │ │ ├── jquery.mobile.custom.min.js │ │ │ ├── jquery.nestable.min.js │ │ │ ├── jquery.raty.min.js │ │ │ ├── jquery.sparkline.index.min.js │ │ │ ├── jquery.ui.touch-punch.min.js │ │ │ ├── jquery.validate.min.js │ │ │ ├── jquery.ztree.core.js │ │ │ ├── jquery.ztree.excheck.js │ │ │ ├── layer.js │ │ │ ├── macarons.js │ │ │ ├── markdown.min.js │ │ │ ├── moment.min.js │ │ │ ├── prettify.min.js │ │ │ ├── respond.min.js │ │ │ ├── select2.min.js │ │ │ ├── spin.js │ │ │ ├── spinbox.min.js │ │ │ ├── tree.min.js │ │ │ └── wizard.min.js │ └── swf │ │ └── flashExport.swf │ └── templates │ ├── login.html │ └── test.html └── 权限注解说明.md /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | pom.xml.tag 3 | pom.xml.releaseBackup 4 | pom.xml.versionsBackup 5 | pom.xml.next 6 | release.properties 7 | dependency-reduced-pom.xml 8 | buildNumber.properties 9 | .mvn/timing.properties 10 | 11 | # Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) 12 | !/.mvn/wrapper/maven-wrapper.jar 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # spring-security-oauth2 2 | 基于SpringSecurity实现的Oauth2协议 实现用户权限控制,自定义异常处理,多用户同时登录,Swagger2 3 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | spring-security-oauth2 8 | spring-security-oauth2 9 | 0.0.0-SNAPSHOT 10 | jar 11 | 12 | 13 | org.springframework.boot 14 | spring-boot-starter-parent 15 | 2.0.9.RELEASE 16 | 17 | 18 | 19 | UTF-8 20 | UTF-8 21 | 1.8 22 | 23 | 24 | 25 | 26 | 27 | org.springframework.boot 28 | spring-boot-starter-web 29 | 30 | 31 | 32 | org.springframework.boot 33 | spring-boot-starter-test 34 | test 35 | 36 | 37 | 38 | org.springframework.boot 39 | spring-boot-starter-security 40 | 41 | 42 | 43 | 44 | org.springframework.security.oauth 45 | spring-security-oauth2 46 | 2.3.6.RELEASE 47 | 48 | 49 | 50 | org.springframework.security.oauth.boot 51 | spring-security-oauth2-autoconfigure 52 | 2.0.9.RELEASE 53 | 54 | 55 | 56 | mysql 57 | mysql-connector-java 58 | 59 | 60 | 61 | com.alibaba 62 | druid 63 | 1.1.16 64 | 65 | 66 | 67 | 72 | 73 | 74 | com.ibeetl 75 | beetl 76 | 2.7.27 77 | 78 | 79 | 80 | org.projectlombok 81 | lombok 82 | true 83 | 84 | 85 | 86 | 87 | 88 | com.baomidou 89 | mybatis-plus-boot-starter 90 | 3.1.2 91 | 92 | 93 | 94 | com.alibaba 95 | fastjson 96 | 1.2.58 97 | 98 | 99 | 100 | io.springfox 101 | springfox-swagger2 102 | 2.9.2 103 | 104 | 105 | io.springfox 106 | springfox-swagger-ui 107 | 2.9.2 108 | 109 | 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/Application.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth; 2 | 3 | import org.beetl.core.resource.ClasspathResourceLoader; 4 | import org.beetl.ext.spring.BeetlGroupUtilConfiguration; 5 | import org.beetl.ext.spring.BeetlSpringViewResolver; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.beans.factory.annotation.Qualifier; 8 | import org.springframework.boot.SpringApplication; 9 | import org.springframework.boot.autoconfigure.SpringBootApplication; 10 | import org.springframework.boot.web.client.RestTemplateBuilder; 11 | import org.springframework.context.annotation.Bean; 12 | import org.springframework.web.client.RestTemplate; 13 | 14 | /** 15 | * @author Mr.F 16 | * @since 2019/7/5 14:11 17 | **/ 18 | @SpringBootApplication 19 | public class Application { // WebMvcConfigurationSupport 20 | 21 | public static void main(String[] args) { 22 | SpringApplication.run(Application.class, args); 23 | } 24 | 25 | @Autowired 26 | RestTemplateBuilder builder; 27 | 28 | @Bean 29 | public RestTemplate restTemplate(){ 30 | return builder.build(); 31 | } 32 | 33 | // beetl 配置 34 | @Bean(initMethod = "init", name = "beetlConfig") 35 | public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration() { 36 | 37 | BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration(); 38 | ClasspathResourceLoader classpathResourceLoader = new ClasspathResourceLoader(); 39 | beetlGroupUtilConfiguration.setResourceLoader(classpathResourceLoader); 40 | beetlGroupUtilConfiguration.init(); 41 | return beetlGroupUtilConfiguration; 42 | } 43 | 44 | @Bean(name = "beetlViewResolver") 45 | public BeetlSpringViewResolver getBeetlSpringViewResolver(@Qualifier("beetlConfig") BeetlGroupUtilConfiguration beetlGroupUtilConfiguration) { 46 | BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver(); 47 | beetlSpringViewResolver.setPrefix("/templates/"); 48 | beetlSpringViewResolver.setSuffix(".html"); 49 | beetlSpringViewResolver.setContentType("text/html;charset=UTF-8"); 50 | beetlSpringViewResolver.setOrder(0); 51 | beetlSpringViewResolver.setConfig(beetlGroupUtilConfiguration); 52 | return beetlSpringViewResolver; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/DataSourceConfig.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config; 2 | 3 | import com.alibaba.druid.pool.DruidDataSource; 4 | import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; 5 | import org.mybatis.spring.annotation.MapperScan; 6 | import org.springframework.boot.context.properties.ConfigurationProperties; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.jdbc.datasource.DataSourceTransactionManager; 10 | import org.springframework.transaction.PlatformTransactionManager; 11 | 12 | import javax.sql.DataSource; 13 | 14 | /** 15 | * @author Mr.F 16 | * @since 2019/7/10 16:55 17 | **/ 18 | @Configuration 19 | @MapperScan(basePackages = "com.fcz.oauth.mapper") 20 | public class DataSourceConfig { 21 | 22 | @ConfigurationProperties(prefix = "spring.datasource") 23 | @Bean 24 | public DataSource dataSource() { 25 | return new DruidDataSource(); 26 | } 27 | // 分页配置 28 | @Bean 29 | public PaginationInterceptor paginationInterceptor() { 30 | PaginationInterceptor page = new PaginationInterceptor(); 31 | page.setDialectType("mysql"); 32 | return page; 33 | } 34 | // 事务配置 35 | @Bean 36 | public PlatformTransactionManager transactionManager(DataSource dataSource) { 37 | return new DataSourceTransactionManager(dataSource); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/Swagger2Config.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config; 2 | 3 | import org.springframework.beans.factory.annotation.Value; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import springfox.documentation.builders.ApiInfoBuilder; 7 | import springfox.documentation.builders.OAuthBuilder; 8 | import springfox.documentation.builders.PathSelectors; 9 | import springfox.documentation.builders.RequestHandlerSelectors; 10 | import springfox.documentation.service.*; 11 | import springfox.documentation.spi.DocumentationType; 12 | import springfox.documentation.spi.service.contexts.SecurityContext; 13 | import springfox.documentation.spring.web.plugins.Docket; 14 | import springfox.documentation.swagger.web.SecurityConfiguration; 15 | import springfox.documentation.swagger.web.SecurityConfigurationBuilder; 16 | import springfox.documentation.swagger2.annotations.EnableSwagger2; 17 | 18 | import java.util.Arrays; 19 | import java.util.Collections; 20 | 21 | 22 | /** 23 | * @ Api:修饰整个类,描述Controller的作用 24 | * @ ApiOperation:描述一个类的一个方法,或者说一个接口 25 | * @ ApiParam:单个参数描述 26 | * 27 | * @ ApiModel:用对象来接收参数 28 | * @ ApiProperty:用对象接收参数时,描述对象的一个字段 29 | * 30 | * @ ApiResponse:HTTP响应其中1个描述 31 | * @ ApiResponses:HTTP响应整体描述 32 | * 33 | * @ ApiIgnore:使用该注解忽略这个API 34 | * @ ApiError :发生错误返回的信息 35 | * 36 | * @ ApiImplicitParam:一个请求参数 37 | * @ ApiImplicitParams:多个请求参数 38 | */ 39 | @Configuration 40 | @EnableSwagger2 41 | public class Swagger2Config { 42 | 43 | @Value("${authorization.uri}") 44 | private String authorizationUri; 45 | 46 | @Bean 47 | public Docket api() { 48 | return new Docket(DocumentationType.SWAGGER_2) 49 | .apiInfo(apiInfo()) 50 | .select() 51 | .apis(RequestHandlerSelectors.basePackage("com.fcz.oauth.controller.api")) 52 | .paths(PathSelectors.any()) 53 | .build() 54 | .securitySchemes(Collections.singletonList(securityScheme())) 55 | .securityContexts(Collections.singletonList(securityContext())); 56 | } 57 | 58 | private ApiInfo apiInfo() { 59 | return new ApiInfoBuilder() 60 | .title("") 61 | .version("0.0.1") 62 | .build(); 63 | } 64 | 65 | /** 66 | * 使用密码模式认证方式 67 | */ 68 | private SecurityScheme securityScheme() { 69 | GrantType grantType = new ResourceOwnerPasswordCredentialsGrant(authorizationUri + "/oauth/token"); 70 | 71 | return new OAuthBuilder() 72 | .name("oauth2") 73 | .grantTypes(Collections.singletonList(grantType)) 74 | .scopes(Arrays.asList(scopes())) 75 | .build(); 76 | } 77 | 78 | /** 79 | * swagger2 认证安全上下文 80 | */ 81 | 82 | private SecurityContext securityContext() { 83 | return SecurityContext.builder() 84 | .securityReferences(Collections.singletonList(new SecurityReference("oauth2", scopes()))) 85 | .forPaths(PathSelectors.any()) 86 | .build(); 87 | } 88 | 89 | /** 90 | * 允许认证的scope 91 | */ 92 | private AuthorizationScope[] scopes() { 93 | return new AuthorizationScope[]{ 94 | new AuthorizationScope("all", "All scope is trusted!") 95 | }; 96 | } 97 | 98 | 99 | @Bean 100 | SecurityConfiguration security() { 101 | return SecurityConfigurationBuilder.builder() 102 | .clientId("client") 103 | .clientSecret("123456") 104 | .realm("*") 105 | .appName("") 106 | .scopeSeparator(",") 107 | .additionalQueryStringParams(null) 108 | .useBasicAuthenticationWithAccessCodeGrant(false) 109 | .build(); 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/security/AuthenticationFailureHandler.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config.security; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | import org.springframework.security.core.AuthenticationException; 6 | import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; 7 | import org.springframework.stereotype.Component; 8 | 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | 13 | /** 14 | * 登录失败处理 15 | * @author Mr.F 16 | * @since 2019/7/8 09:27 17 | **/ 18 | @Component 19 | public class AuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { 20 | 21 | private static Logger logger = LogManager.getLogger(AuthenticationSuccessHandler.class); 22 | 23 | @Override 24 | public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, 25 | AuthenticationException exception) throws IOException { 26 | // 跳转到登录失败处理 27 | response.sendRedirect("/loginFail"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/security/AuthenticationSuccessHandler.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config.security; 2 | 3 | import com.fcz.oauth.config.security.encrypt.SecurityPasswordEncoder; 4 | import com.fcz.oauth.controller.api.TokenController; 5 | import com.fcz.oauth.model.constant.ResponseConstant; 6 | import com.fcz.oauth.utils.EncryptUtiles; 7 | import com.fcz.oauth.wrapper.Wrapper; 8 | import org.apache.logging.log4j.LogManager; 9 | import org.apache.logging.log4j.Logger; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.beans.factory.annotation.Value; 12 | import org.springframework.http.HttpHeaders; 13 | import org.springframework.http.HttpStatus; 14 | import org.springframework.security.core.Authentication; 15 | import org.springframework.security.crypto.password.PasswordEncoder; 16 | import org.springframework.security.oauth2.common.OAuth2AccessToken; 17 | import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException; 18 | import org.springframework.security.oauth2.provider.*; 19 | import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; 20 | import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; 21 | import org.springframework.stereotype.Component; 22 | 23 | import javax.annotation.Resource; 24 | import javax.servlet.http.HttpServletRequest; 25 | import javax.servlet.http.HttpServletResponse; 26 | import java.io.IOException; 27 | import java.util.HashMap; 28 | 29 | /** 30 | * 登录成功处理 31 | * @author Mr.F 32 | * @since 2019/7/8 09:19 33 | **/ 34 | @Component 35 | public class AuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { 36 | 37 | private static Logger logger = LogManager.getLogger(AuthenticationSuccessHandler.class.getName()); 38 | 39 | @Value("${authorization.client-id}") 40 | private String clientId; 41 | 42 | @Value("${authorization.client-secret}") 43 | private String clientSecret; 44 | 45 | @Resource 46 | private ClientDetailsService clientDetailsService; 47 | 48 | @Resource 49 | private AuthorizationServerTokenServices systemTokenServices; 50 | 51 | @Resource 52 | private PasswordEncoder securityPasswordEncoder; 53 | 54 | @Resource 55 | private TokenController tokenController; 56 | 57 | @Override 58 | public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, 59 | Authentication authentication) throws IOException { 60 | ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId); 61 | 62 | if (clientDetails == null) { 63 | throw new UnapprovedClientAuthenticationException("clientId 对应的客户端不存在:" + clientId); 64 | } else if (!securityPasswordEncoder.matches(clientSecret, clientDetails.getClientSecret())) { 65 | throw new UnapprovedClientAuthenticationException("clientSecret 错误:" + clientId); 66 | } 67 | TokenRequest tokenRequest = new TokenRequest(new HashMap<>(1), clientId, clientDetails.getScope(), "password"); 68 | 69 | OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails); 70 | 71 | OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication); 72 | 73 | OAuth2AccessToken token = systemTokenServices.createAccessToken(oAuth2Authentication); 74 | 75 | // 跳转到首页 76 | response.sendRedirect("/page/test/test?token=" + token.getValue()); 77 | 78 | /* String username = request.getParameter("username"); 79 | String password = request.getParameter("password"); 80 | // username = getURLEncoderString(username); 81 | 82 | Wrapper result = tokenController.loadToken(username,password); 83 | response.setStatus(HttpStatus.OK.value()); 84 | response.setHeader("Content-Type", "application/json;charset=UTF-8"); 85 | if (result == null) { 86 | response.getWriter().println(Wrapper.error().toJsonString()); 87 | return; 88 | } 89 | if (result.getCode() != ResponseConstant.SUCCESS_CODE) { 90 | response.getWriter().println(Wrapper.error().toJsonString()); 91 | return; 92 | } 93 | 94 | response.sendRedirect("/page/test/test?token=" + result.getResult());*/ 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/security/AuthorizationServerConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config.security; 2 | 3 | 4 | import com.fcz.oauth.config.security.token.SystemJdbcTokenStore; 5 | import com.fcz.oauth.config.security.token.SystemTokenServices; 6 | import com.fcz.oauth.config.security.user.SystemUserDetailsService; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.security.authentication.AuthenticationManager; 10 | import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; 11 | import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; 12 | import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; 13 | import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; 14 | import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; 15 | import org.springframework.security.oauth2.provider.ClientDetailsService; 16 | import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; 17 | import org.springframework.security.oauth2.provider.token.TokenStore; 18 | 19 | import javax.annotation.Resource; 20 | import javax.sql.DataSource; 21 | import java.util.concurrent.TimeUnit; 22 | 23 | /** 24 | * description 认证授权服务 25 | * @author Mr.F 26 | * @since 2019/7/5 27 | **/ 28 | @Configuration 29 | @EnableAuthorizationServer 30 | public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter { 31 | 32 | @Resource 33 | private AuthenticationManager authenticationManager; 34 | 35 | @Resource 36 | private SystemUserDetailsService systemUserDetailsService; 37 | 38 | @Resource 39 | private DataSource dataSource; 40 | 41 | // 初始化JdbcTokenStore 42 | @Bean 43 | public TokenStore jdbcTokenStore() { 44 | return new SystemJdbcTokenStore(dataSource); 45 | } 46 | 47 | @Bean 48 | public ClientDetailsService clientDetails() { 49 | return new JdbcClientDetailsService(dataSource); 50 | } 51 | 52 | // 定义客户端 53 | @Override 54 | public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 55 | // 配置客户端, 用于client认证 56 | clients.withClientDetails(clientDetails()); 57 | } 58 | 59 | // 定义令牌token 60 | @Override 61 | public void configure(AuthorizationServerEndpointsConfigurer endpoints) { 62 | endpoints.tokenStore(jdbcTokenStore()) // 数据库保存token 63 | .authenticationManager(authenticationManager) 64 | .userDetailsService(systemUserDetailsService); 65 | 66 | // 配置TokenServices参数 SystemTokenServices为自定义的Token策略 默认实现 DefaultTokenServices 67 | // 如果不需要直接替换为DefaultTokenServices 即可 68 | SystemTokenServices tokenServices = new SystemTokenServices(); 69 | tokenServices.setTokenStore(endpoints.getTokenStore()); 70 | tokenServices.setSupportRefreshToken(true); 71 | tokenServices.setClientDetailsService(endpoints.getClientDetailsService()); 72 | tokenServices.setTokenEnhancer(endpoints.getTokenEnhancer()); 73 | tokenServices.setReuseRefreshToken(false); // 每次刷新token 都会重新生成新的refresh token 74 | // tokenServices.setRefreshTokenValiditySeconds((int) TimeUnit.DAYS.toSeconds(7)); // 刷新token有效时(天) 75 | // tokenServices.setAccessTokenValiditySeconds((int) TimeUnit.HOURS.toSeconds(2)); //token有效时间(小时) 76 | tokenServices.setRefreshTokenValiditySeconds((int) TimeUnit.SECONDS.toSeconds(600)); // 刷新token有效时 测试 77 | tokenServices.setAccessTokenValiditySeconds((int) TimeUnit.SECONDS.toSeconds(60)); //token有效时间 测试 78 | endpoints.tokenServices(tokenServices); 79 | } 80 | 81 | // 定义令牌端点上的安全性约束 82 | @Override 83 | public void configure(AuthorizationServerSecurityConfigurer oauthServer) { 84 | // oauthServer.tokenKeyAccess("permitAll()"); 85 | // oauthServer.tokenKeyAccess("isAuthenticated()").checkTokenAccess("permitAll()"); 86 | oauthServer.allowFormAuthenticationForClients(); 87 | } 88 | 89 | } 90 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/security/ResourceServerConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config.security; 2 | 3 | import com.fcz.oauth.config.security.exception.SystemAccessDeniedHandler; 4 | import com.fcz.oauth.config.security.exception.SystemAuthenticationEntryPoint; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 7 | import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; 8 | import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; 9 | import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; 10 | import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices; 11 | 12 | import javax.annotation.Resource; 13 | 14 | /** 15 | * description 资源服务器 16 | * @author Mr.F 17 | * @since 2019/7/5 18 | **/ 19 | @Configuration 20 | @EnableResourceServer 21 | public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter { 22 | 23 | private static final String DEMO_RESOURCE_ID = "*"; 24 | 25 | @Resource 26 | private SystemAuthenticationEntryPoint systemAuthenticationEntryPoint; 27 | @Resource 28 | private SystemAccessDeniedHandler systemAccessDeniedHandler; 29 | @Resource 30 | 31 | private ResourceServerTokenServices systemTokenServices; 32 | 33 | @Override 34 | public void configure(ResourceServerSecurityConfigurer resources) { 35 | resources.resourceId(DEMO_RESOURCE_ID).stateless(true); 36 | resources.tokenServices(systemTokenServices) 37 | .authenticationEntryPoint(systemAuthenticationEntryPoint) 38 | .accessDeniedHandler(systemAccessDeniedHandler); 39 | } 40 | 41 | @Override 42 | public void configure(HttpSecurity http) throws Exception { 43 | 44 | http.requestMatchers() 45 | .antMatchers("/api/**") 46 | .and() 47 | .authorizeRequests() 48 | .antMatchers("/login","/api/token/**").permitAll() // for login 49 | //.permitAll() // swagger2 50 | // .antMatchers( "/webjars/**", "/resources/**", "/swagger-ui.html", 51 | // "/swagger-resources/**", "/v2/api-docs").permitAll() 52 | .anyRequest() 53 | .authenticated(); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/security/WebSecurityConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config.security; 2 | 3 | 4 | import com.fcz.oauth.config.security.encrypt.SecurityPasswordEncoder; 5 | import com.fcz.oauth.config.security.user.SystemUserDetailsService; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.context.annotation.Bean; 8 | import org.springframework.context.annotation.Configuration; 9 | import org.springframework.security.authentication.AuthenticationManager; 10 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 11 | import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 12 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 13 | import org.springframework.security.config.annotation.web.builders.WebSecurity; 14 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 15 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 16 | import org.springframework.security.config.http.SessionCreationPolicy; 17 | import org.springframework.security.web.util.matcher.AntPathRequestMatcher; 18 | 19 | 20 | /** 21 | * description 端点配置 22 | * @author Mr.F 23 | * @since 2019/7/5 24 | **/ 25 | @Configuration 26 | @EnableWebSecurity 27 | @EnableGlobalMethodSecurity(securedEnabled = true) // 开启注解权限配置 28 | public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter { 29 | 30 | @Autowired 31 | private SystemUserDetailsService systemUserDetailsService; 32 | 33 | @Autowired 34 | private AuthenticationSuccessHandler authenticationSuccessHandler; 35 | 36 | @Autowired 37 | private AuthenticationFailureHandler authenticationFailureHandler; 38 | 39 | @Override 40 | protected void configure(AuthenticationManagerBuilder auth) throws Exception { 41 | auth.userDetailsService(systemUserDetailsService).passwordEncoder(new SecurityPasswordEncoder()); 42 | } 43 | 44 | // 对password授权模式的支持 45 | @Bean 46 | @Override 47 | public AuthenticationManager authenticationManagerBean() throws Exception { 48 | return super.authenticationManagerBean(); 49 | } 50 | 51 | // 静态资源不拦截配置 52 | @Override 53 | public void configure(WebSecurity web) { 54 | web.ignoring().antMatchers("/static/**"); 55 | } 56 | 57 | @Override 58 | protected void configure(HttpSecurity http) throws Exception { 59 | // http.csrf(); 60 | http.csrf().disable(); 61 | 62 | // session 无状态 不使用 63 | http.sessionManagement() 64 | .sessionCreationPolicy(SessionCreationPolicy.STATELESS); 65 | 66 | http.formLogin() 67 | .loginPage("/") 68 | .loginProcessingUrl("/login") 69 | .usernameParameter("username").passwordParameter("password") 70 | .successHandler(authenticationSuccessHandler) 71 | .failureHandler(authenticationFailureHandler); 72 | 73 | http.logout() 74 | .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) 75 | .deleteCookies("remember-me") 76 | .invalidateHttpSession(true); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/security/encrypt/SecurityPasswordEncoder.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config.security.encrypt; 2 | 3 | import com.fcz.oauth.utils.EncryptUtiles; 4 | import org.springframework.security.crypto.password.PasswordEncoder; 5 | import org.springframework.stereotype.Component; 6 | 7 | /** 8 | * 用户密码加密 9 | * @author Mr.F 10 | * @since 2019/7/5 15:41 11 | **/ 12 | @Component 13 | public class SecurityPasswordEncoder implements PasswordEncoder { 14 | @Override 15 | public String encode(CharSequence charSequence) { 16 | return EncryptUtiles.MD5(charSequence.toString()); 17 | } 18 | 19 | @Override 20 | public boolean matches(CharSequence charSequence, String s) { 21 | return s.equals(EncryptUtiles.MD5(charSequence.toString())); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/security/exception/SystemAccessDeniedHandler.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config.security.exception; 2 | 3 | import com.fcz.oauth.model.constant.ResponseConstant; 4 | import com.fcz.oauth.wrapper.Wrapper; 5 | import org.apache.logging.log4j.LogManager; 6 | import org.apache.logging.log4j.Logger; 7 | import org.springframework.http.HttpStatus; 8 | import org.springframework.security.access.AccessDeniedException; 9 | import org.springframework.security.web.access.AccessDeniedHandler; 10 | import org.springframework.stereotype.Component; 11 | 12 | import javax.servlet.http.HttpServletRequest; 13 | import javax.servlet.http.HttpServletResponse; 14 | import java.io.IOException; 15 | 16 | /** 17 | * 权限异常类 18 | * @author Mr.F 19 | * @since 2019/7/10 10:07 20 | **/ 21 | @Component 22 | public class SystemAccessDeniedHandler implements AccessDeniedHandler { 23 | 24 | private static Logger logger = LogManager.getLogger(SystemAccessDeniedHandler.class.getName()); 25 | 26 | @Override 27 | public void handle(HttpServletRequest httpServletRequest, HttpServletResponse response, 28 | AccessDeniedException ae){ 29 | logger.info("用户访问 权限异常", ae); 30 | response.setStatus(HttpStatus.OK.value()); 31 | response.setHeader("Content-Type", "application/json;charset=UTF-8"); 32 | try { 33 | // 用户无权限异常 34 | response.getWriter().println( 35 | Wrapper.info(ResponseConstant.USER_NO_ACCESS_CODE,ResponseConstant.USER_NO_ACCESS_MESSAGE).toJsonString() 36 | ); 37 | } catch (IOException e) { 38 | e.printStackTrace(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/security/exception/SystemAuthenticationEntryPoint.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config.security.exception; 2 | 3 | import com.fcz.oauth.controller.api.TokenController; 4 | import com.fcz.oauth.model.constant.ResponseConstant; 5 | import com.fcz.oauth.wrapper.Wrapper; 6 | import org.apache.logging.log4j.LogManager; 7 | import org.apache.logging.log4j.Logger; 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.http.HttpStatus; 10 | import org.springframework.security.core.AuthenticationException; 11 | import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; 12 | import org.springframework.security.oauth2.provider.token.TokenStore; 13 | import org.springframework.security.web.AuthenticationEntryPoint; 14 | import org.springframework.stereotype.Component; 15 | 16 | import javax.servlet.http.HttpServletRequest; 17 | import javax.servlet.http.HttpServletResponse; 18 | import java.io.IOException; 19 | 20 | /** 21 | * 自定义认证异常处理 22 | * @author Mr.F 23 | * @since 2019/7/10 10:00 24 | **/ 25 | @Component 26 | public class SystemAuthenticationEntryPoint implements AuthenticationEntryPoint { 27 | 28 | private static Logger logger = LogManager.getLogger(SystemAuthenticationEntryPoint.class.getName()); 29 | 30 | @Autowired 31 | private TokenStore jdbcTokenStore; 32 | 33 | @Autowired 34 | private TokenController tokenController; 35 | 36 | @Override 37 | public void commence(HttpServletRequest httpServletRequest, HttpServletResponse response, 38 | AuthenticationException authException) { 39 | 40 | Throwable cause = authException.getCause(); 41 | response.setStatus(HttpStatus.OK.value()); 42 | response.setHeader("Content-Type", "application/json;charset=UTF-8"); 43 | try { 44 | if(cause instanceof InvalidTokenException) { 45 | // TOKEN 验证失败异常 46 | tokenThrowableHandle(cause,response); 47 | }else{ 48 | logger.info("TOKEN 解析失败 请求头无TOKEN"); 49 | response.getWriter().println(Wrapper.error().toJsonString()); 50 | } 51 | } catch (IOException e) { 52 | e.printStackTrace(); 53 | } 54 | } 55 | /** 56 | * description 对异常类型进行判断 进行不同的处理 57 | * @param cause 异常 58 | * @author Mr.F 59 | * @since 2019/7/10 60 | **/ 61 | private static final String TOKEN_EXPIRED = "Access token expired"; // token 过期 62 | private static final String TOKEN_INVALID = "Invalid access token"; // token 无效 63 | 64 | private void tokenThrowableHandle(Throwable cause, HttpServletResponse response) throws IOException { 65 | String errorMessage = cause.getMessage(); 66 | if (errorMessage.contains(TOKEN_INVALID)) { 67 | response.getWriter().println( 68 | Wrapper.info(ResponseConstant.TOKEN_INVALID_CODE, ResponseConstant.TOKEN_INVALID_MESSAGE).toJsonString()); 69 | } else if (errorMessage.contains(TOKEN_EXPIRED)) { 70 | // token 过期 刷新token 71 | String token = errorMessage.substring(errorMessage.indexOf(":") + 2); 72 | Wrapper wrapper = tokenController.refreshToken(token); 73 | // 判断刷新token是否成功 74 | if (wrapper.getCode() != ResponseConstant.TOKEN_EXPIRED_CODE) { 75 | response.getWriter().println(Wrapper.error().toJsonString()); 76 | return; 77 | } 78 | response.getWriter().println(wrapper.toJsonString()); 79 | } else { 80 | // 没有token 需要登录 81 | response.getWriter().println( 82 | Wrapper.info(ResponseConstant.USER_LOGIN_EXPIRED_CODE, ResponseConstant.USER_LOGIN_EXPIRED_MESSAGE).toJsonString() 83 | ); 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/security/user/SystemUserDetails.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config.security.user; 2 | 3 | import com.fcz.oauth.model.domain.User; 4 | import org.springframework.security.core.GrantedAuthority; 5 | import org.springframework.security.core.userdetails.UserDetails; 6 | 7 | import java.util.Collection; 8 | import java.util.Set; 9 | 10 | /** 11 | * @author Mr.F 12 | * @since 2019/7/5 17:01 13 | **/ 14 | public class SystemUserDetails implements UserDetails{ 15 | 16 | private User user; 17 | 18 | private Set authorityList; 19 | 20 | public SystemUserDetails(User user, Set authorityList) { 21 | this.user = user; 22 | this.authorityList = authorityList; 23 | } 24 | @Override 25 | public Collection getAuthorities() { 26 | return authorityList; 27 | } 28 | 29 | @Override 30 | public String getPassword() { 31 | return user.getPassword(); 32 | } 33 | 34 | @Override 35 | public String getUsername() { 36 | return user.getUsername(); 37 | } 38 | 39 | // 账号到期 40 | @Override 41 | public boolean isAccountNonExpired() { 42 | return true; 43 | } 44 | 45 | // 账号锁定 46 | @Override 47 | public boolean isAccountNonLocked() { 48 | return true; 49 | } 50 | 51 | @Override 52 | public boolean isCredentialsNonExpired() { 53 | return true; 54 | } 55 | 56 | // 账号启用 57 | @Override 58 | public boolean isEnabled() { 59 | return true; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/config/security/user/SystemUserDetailsService.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.config.security.user; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 4 | import com.fcz.oauth.mapper.UserMapper; 5 | import com.fcz.oauth.model.domain.User; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.security.authentication.BadCredentialsException; 8 | import org.springframework.security.core.GrantedAuthority; 9 | import org.springframework.security.core.authority.SimpleGrantedAuthority; 10 | import org.springframework.security.core.userdetails.UserDetails; 11 | import org.springframework.security.core.userdetails.UserDetailsService; 12 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 13 | import org.springframework.stereotype.Service; 14 | 15 | import java.util.List; 16 | import java.util.Set; 17 | import java.util.stream.Collectors; 18 | 19 | /** 20 | * @author Mr.F 21 | * @since 2019/7/5 16:59 22 | **/ 23 | // own system 24 | @Service 25 | public class SystemUserDetailsService implements UserDetailsService { 26 | 27 | @Autowired 28 | private UserMapper userMapper; 29 | 30 | @Override 31 | public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException { 32 | User user = userMapper.selectOne(new QueryWrapper().eq("username",userName)); 33 | if (user == null) { 34 | throw new BadCredentialsException("user: " + userName + " not found."); 35 | } 36 | List roleCodeList = userMapper.queryUserOwnedRoleCodes(userName); 37 | 38 | Set authorities = 39 | roleCodeList.stream().map(e -> new SimpleGrantedAuthority(e)).collect(Collectors.toSet()); 40 | 41 | return new SystemUserDetails(user,authorities); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/controller/api/BusTestController.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.controller.api; 2 | 3 | import com.fcz.oauth.utils.SecurityUtils; 4 | import com.fcz.oauth.wrapper.Wrapper; 5 | import io.swagger.annotations.Api; 6 | import io.swagger.annotations.ApiOperation; 7 | import org.springframework.security.access.annotation.Secured; 8 | import org.springframework.web.bind.annotation.GetMapping; 9 | import org.springframework.web.bind.annotation.RequestMapping; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | /** 13 | * @author Mr.F 14 | * @since 2019/7/12 14:27 15 | **/ 16 | @Api(value="/api/bus", tags="商务角色测试接口") 17 | @RestController 18 | @RequestMapping(value = "/api/bus") 19 | public class BusTestController { 20 | 21 | @ApiOperation(value = "测试接口1",notes = "商务角色") 22 | @Secured({"ROLE_BUS"}) 23 | @GetMapping(value = "/test01", produces = "application/json") 24 | public Wrapper test01() { 25 | return Wrapper.success(SecurityUtils.getCurrentLoginName()); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/controller/api/SaleTestController.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.controller.api; 2 | 3 | import com.fcz.oauth.utils.SecurityUtils; 4 | import com.fcz.oauth.wrapper.Wrapper; 5 | import io.swagger.annotations.Api; 6 | import io.swagger.annotations.ApiOperation; 7 | import org.springframework.web.bind.annotation.GetMapping; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | /** 12 | * @author Mr.F 13 | * @since 2019/7/12 14:27 14 | **/ 15 | @Api(value="/api/bus", tags="销售角色测试接口") 16 | @RestController 17 | @RequestMapping(value = "/api/sale") 18 | public class SaleTestController { 19 | 20 | @ApiOperation(value = "测试接口1",notes = "销售角色") 21 | @GetMapping(value = "/test01", produces = "application/json") 22 | public Wrapper test01() { 23 | return Wrapper.success(SecurityUtils.getCurrentLoginName()); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/controller/api/TestController.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.controller.api; 2 | 3 | import com.fcz.oauth.utils.SecurityUtils; 4 | import com.fcz.oauth.wrapper.Wrapper; 5 | import io.swagger.annotations.Api; 6 | import org.springframework.security.access.annotation.Secured; 7 | import org.springframework.web.bind.annotation.GetMapping; 8 | import org.springframework.web.bind.annotation.RequestMapping; 9 | import org.springframework.web.bind.annotation.RestController; 10 | 11 | /** 12 | * @author Mr.F 13 | * @since 2019/7/8 15:51 14 | **/ 15 | @Api(value="/api/bus", tags="通用测试接口") 16 | @RestController 17 | @RequestMapping(value = "/api/test") 18 | public class TestController { 19 | 20 | @Secured({"ROLE_SFE"}) 21 | @GetMapping(value = "/test01", produces = "application/json") 22 | public Wrapper test01() { 23 | return Wrapper.success(SecurityUtils.getCurrentLoginName()); 24 | } 25 | 26 | @Secured({"ROLE_BUS"}) 27 | @GetMapping(value = "/test02", produces = "application/json") 28 | public Wrapper test02() { 29 | return Wrapper.success(SecurityUtils.getCurrentLoginName()); 30 | } 31 | 32 | @Secured({"ROLE_BUS","ROLE_SFE"}) 33 | @GetMapping(value = "/test03", produces = "application/json") 34 | public Wrapper test03() { 35 | return Wrapper.success(SecurityUtils.getCurrentLoginName()); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/controller/api/TokenController.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.controller.api; 2 | 3 | import com.alibaba.fastjson.JSONObject; 4 | import com.fcz.oauth.config.security.exception.SystemAuthenticationEntryPoint; 5 | import com.fcz.oauth.model.constant.ResponseConstant; 6 | import com.fcz.oauth.wrapper.Wrapper; 7 | import io.swagger.annotations.Api; 8 | import io.swagger.annotations.ApiImplicitParam; 9 | import io.swagger.annotations.ApiImplicitParams; 10 | import org.apache.logging.log4j.LogManager; 11 | import org.apache.logging.log4j.Logger; 12 | import org.springframework.beans.factory.annotation.Autowired; 13 | import org.springframework.beans.factory.annotation.Value; 14 | import org.springframework.http.*; 15 | import org.springframework.security.oauth2.common.OAuth2AccessToken; 16 | import org.springframework.security.oauth2.common.OAuth2RefreshToken; 17 | import org.springframework.security.oauth2.provider.token.TokenStore; 18 | import org.springframework.web.bind.annotation.*; 19 | import org.springframework.web.client.RestTemplate; 20 | 21 | /** 22 | * @author Mr.F 23 | * @since 2019/7/8 14:36 24 | **/ 25 | @Api(value="/api/bus", tags="TOKEN接口") 26 | @RestController 27 | @RequestMapping(value = "/api/token") 28 | public class TokenController { 29 | 30 | private static Logger logger = LogManager.getLogger(SystemAuthenticationEntryPoint.class); 31 | 32 | @Value("${authorization.uri}") 33 | private String authorizationUri; 34 | 35 | @Value("${authorization.client-id}") 36 | private String clientId; 37 | 38 | @Value("${authorization.client-secret}") 39 | private String clientSecret; 40 | 41 | @Autowired 42 | private RestTemplate restTemplate; 43 | 44 | @Autowired 45 | private TokenStore jdbcTokenStore; 46 | 47 | 48 | /** 49 | * description 根据用户名与密码获取用户的token 50 | * @author Mr.F 51 | * @since 2019/7/9 52 | **/ 53 | @ApiImplicitParams({ 54 | @ApiImplicitParam(name = "username", value = "用户名", required = true, dataType = "String", defaultValue = ""), 55 | @ApiImplicitParam(name = "password", value = "密码", required = true, dataType = "String", defaultValue = "") 56 | }) 57 | @GetMapping(value = "/loadToken/{username}/{password}", produces = "application/json") 58 | public Wrapper loadToken(@PathVariable("username") String username, @PathVariable("password") String password) { 59 | String url = authorizationUri + "/oauth/token?grant_type=password&username=" + username + "&password=" 60 | + password + "&client_id=" + clientId + "&client_secret=" + clientSecret; 61 | try { 62 | String token = requestToken(url); 63 | return Wrapper.success(token); 64 | } catch (Exception e) { 65 | logger.error("申请Token失败 ", e); 66 | return Wrapper.error(); 67 | } 68 | } 69 | 70 | /** 71 | * description 通过refreshToken刷新新的token 72 | * @param token 刷新token 73 | * @author Mr.F 74 | * @since 2019/7/9 75 | **/ 76 | @ApiImplicitParam(name = "token", value = "刷新TOKEN", required = true, dataType = "String", defaultValue = "") 77 | @GetMapping(value = "/refreshToken/{token}", produces = "application/json") 78 | public Wrapper refreshToken(@PathVariable("token") String token) { 79 | // 获取token信息 80 | OAuth2AccessToken oAuth2AccessToken = jdbcTokenStore.readAccessToken(token); 81 | OAuth2RefreshToken oAuth2RefreshToken = oAuth2AccessToken.getRefreshToken(); 82 | String refreshToken = oAuth2RefreshToken.getValue(); 83 | String url = authorizationUri + "/oauth/token?grant_type=refresh_token&refresh_token=" + refreshToken 84 | + "&client_id=" + clientId + "&client_secret=" + clientSecret; 85 | try { 86 | String newToken = requestToken(url); 87 | return Wrapper.info(ResponseConstant.TOKEN_EXPIRED_CODE, ResponseConstant.TOKEN_EXPIRED_MESSAGE, newToken); 88 | } catch (Exception e) { 89 | logger.debug("access_token 和 refresh_token 都失效,需要重新登录 access_token:[{}], refresh_token: [{}]", token, refreshToken); 90 | return Wrapper.info(ResponseConstant.USER_LOGIN_EXPIRED_CODE, ResponseConstant.USER_LOGIN_EXPIRED_MESSAGE); 91 | } 92 | } 93 | 94 | /** 95 | * description 请求url获取token 96 | * @param url 97 | * @author Mr.F 98 | * @since 2019/7/9 99 | **/ 100 | private String requestToken(String url) { 101 | String token; 102 | HttpHeaders headers = new HttpHeaders(); 103 | headers.setContentType(MediaType.APPLICATION_JSON_UTF8); 104 | HttpEntity entity = new HttpEntity<>("", headers); 105 | ResponseEntity response = null; 106 | response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class); 107 | JSONObject tokenJson = JSONObject.parseObject(response.getBody()); 108 | token = tokenJson.getString("access_token"); 109 | return token; 110 | } 111 | 112 | } 113 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/controller/page/LoginPageController.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.controller.page; 2 | 3 | import com.fcz.oauth.model.constant.ResponseConstant; 4 | import org.springframework.stereotype.Controller; 5 | import org.springframework.web.bind.annotation.RequestMapping; 6 | 7 | import java.util.Map; 8 | 9 | 10 | /** 11 | * Created by hp on 2018/3/14. 12 | */ 13 | @Controller 14 | public class LoginPageController { 15 | 16 | @RequestMapping("/") 17 | public String rootFile() { 18 | return "login"; 19 | } 20 | 21 | @RequestMapping("/loginFail") 22 | public String loginFail(Map map) { 23 | map.put("code",ResponseConstant.USER_LOGIN_ERROR_CODE); 24 | map.put("message",ResponseConstant.USER_LOGIN_ERROR_MESSAGE); 25 | return "login"; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/controller/page/TestPageController.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.controller.page; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | import org.springframework.web.bind.annotation.RequestParam; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author Mr.F 11 | * @since 2019/7/11 10:40 12 | **/ 13 | @Controller 14 | @RequestMapping("/page/test") 15 | public class TestPageController { 16 | 17 | @RequestMapping("/test") 18 | public String test(@RequestParam("token") String token, Map map){ 19 | map.put("token", token); 20 | return "test"; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.fcz.oauth.model.domain.User; 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author Mr.F 11 | * @since 2019/7/8 10:26 12 | **/ 13 | public interface UserMapper extends BaseMapper { 14 | 15 | List queryUserOwnedRoleCodes(@Param("userName") String userName); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/model/constant/GlobalConstant.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.model.constant; 2 | 3 | /** 4 | * 全局常量 5 | */ 6 | public class GlobalConstant { 7 | 8 | public static final long FILE_MAX_SIZE = 5 * 1024 * 1024; 9 | 10 | public static final String DEV_PROFILE = "dev"; 11 | public static final String TEST_PROFILE = "test"; 12 | public static final String PRO_PROFILE = "pro"; 13 | 14 | public interface Number { 15 | int THOUSAND_INT = 1000; 16 | int HUNDRED_INT = 100; 17 | int ONE_INT = 1; 18 | int TWO_INT = 2; 19 | int THREE_INT = 3; 20 | int FOUR_INT = 4; 21 | int FIVE_INT = 5; 22 | int SIX_INT = 6; 23 | int SEVEN_INT = 7; 24 | int EIGHT_INT = 8; 25 | int NINE_INT = 9; 26 | int TEN_INT = 10; 27 | } 28 | 29 | /** 30 | * 符号常量 31 | */ 32 | public static final class Symbol { 33 | private Symbol() { 34 | } 35 | 36 | public static final String COMMA = ","; 37 | 38 | public static final String SPOT = "."; 39 | 40 | public final static String UNDER_LINE = "_"; 41 | 42 | public final static String PER_CENT = "%"; 43 | 44 | public final static String AT = "@"; 45 | 46 | public final static String PIPE = "||"; 47 | 48 | public final static String SHORT_LINE = "-"; 49 | 50 | public final static String SPACE = " "; 51 | 52 | public final static String SLASH = "/"; 53 | 54 | public final static String MH = ":"; 55 | } 56 | 57 | /** 58 | * 用户角色 59 | */ 60 | public static final class UserRole { 61 | 62 | // SFE 63 | public final static String USER_ROLE_SFE = "SFE"; 64 | 65 | // 商务 66 | public final static String USER_ROLE_BUSINESS = "BUS"; 67 | 68 | // 销售 69 | public final static String USER_ROLE_SALE = "SALE"; 70 | 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/model/constant/ResponseConstant.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.model.constant; 2 | 3 | /** 4 | * 返回信息 编码 常量 5 | * @author Mr.F 6 | * @since 2019/7/10 10:38 7 | **/ 8 | public class ResponseConstant { 9 | 10 | // 成功码 11 | public static final int SUCCESS_CODE = 200; 12 | // 成功信息 13 | public static final String SUCCESS_MESSAGE = "操作成功"; 14 | 15 | // 通用 错误码 16 | public static final int ERROR_CODE = 500; 17 | 18 | // 通用 错误信息 19 | public static final String ERROR_MESSAGE = "系统异常"; 20 | /** 21 | * 50X Token异常 22 | */ 23 | // TOKEN无效 错误码 24 | public static final int TOKEN_INVALID_CODE = 501; 25 | 26 | // TOKEN无效 错误信息 27 | public static final String TOKEN_INVALID_MESSAGE = "TOKEN 无效"; 28 | 29 | // TOKEN过期 错误码 30 | public static final int TOKEN_EXPIRED_CODE = 502; 31 | 32 | // TOKEN过期 错误信息 33 | public static final String TOKEN_EXPIRED_MESSAGE = "TOKEN 过期"; 34 | /** 35 | * 51X 用户异常编码 36 | */ 37 | // 用户登录失败 错误码 38 | public static final int USER_LOGIN_ERROR_CODE = 510; 39 | 40 | // 用户登录失败 错误信息 41 | public static final String USER_LOGIN_ERROR_MESSAGE = "用户名或者密码错误 请重新登录"; 42 | 43 | // TOKEN无效 错误码 44 | public static final int USER_LOGIN_EXPIRED_CODE = 511; 45 | 46 | // TOKEN无效 错误信息 47 | public static final String USER_LOGIN_EXPIRED_MESSAGE = "用户未登录,请重新登录"; 48 | 49 | // 用户无权限 错误码. 50 | public static final int USER_NO_ACCESS_CODE = 512; 51 | 52 | // 用户无权限 错误信息 53 | public static final String USER_NO_ACCESS_MESSAGE = "无权限访问"; 54 | 55 | // 错误码:参数非法 56 | public static final int ILLEGAL_ARGUMENT_CODE_ = 100; 57 | 58 | // 错误信息:参数非法 59 | public static final String ILLEGAL_ARGUMENT_MESSAGE = "参数错误"; 60 | 61 | 62 | 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/model/domain/User.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.model.domain; 2 | 3 | import java.io.Serializable; 4 | 5 | /** 6 | * @author Mr.F 7 | * @since 2019/7/5 16:57 8 | **/ 9 | 10 | public class User implements Serializable { 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | public User(int user_id, String username, String password) { 15 | this.user_id = user_id; 16 | this.username = username; 17 | this.password = password; 18 | } 19 | 20 | private int user_id; 21 | 22 | private String username; 23 | 24 | private String password; 25 | 26 | public static long getSerialVersionUID() { 27 | return serialVersionUID; 28 | } 29 | 30 | public String getUsername() { 31 | return username; 32 | } 33 | 34 | public void setUsername(String username) { 35 | this.username = username; 36 | } 37 | 38 | public String getPassword() { 39 | return password; 40 | } 41 | 42 | public void setPassword(String password) { 43 | this.password = password; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/utils/EncryptUtiles.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.utils; 2 | 3 | import java.security.MessageDigest; 4 | import java.security.NoSuchAlgorithmException; 5 | 6 | /** 7 | * @author Mr.F 8 | * @since 2019/7/12 09:39 9 | **/ 10 | public class EncryptUtiles { 11 | 12 | public static String MD5(String str) {//项目中的 13 | try { 14 | MessageDigest md5 = MessageDigest.getInstance("MD5"); 15 | md5.update(str.getBytes()); 16 | byte b[] = md5.digest(); 17 | 18 | StringBuffer sb = new StringBuffer(""); 19 | for (int n = 0; n < b.length; n++) { 20 | int i = b[n]; 21 | if (i < 0) i += 256; 22 | if (i < 16) sb.append("0"); 23 | sb.append(Integer.toHexString(i)); 24 | } 25 | return sb.toString().toUpperCase(); //32位加密 26 | } catch (NoSuchAlgorithmException e) { 27 | e.printStackTrace(); 28 | return ""; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/utils/SecurityUtils.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.utils; 2 | 3 | import com.fcz.oauth.config.security.user.SystemUserDetails; 4 | import org.springframework.security.core.context.SecurityContextHolder; 5 | 6 | 7 | /** 8 | * 9 | */ 10 | public final class SecurityUtils { 11 | 12 | /** 13 | * 当前登录用户 14 | * @return the current login name 15 | */ 16 | public static SystemUserDetails getCurrentLoginName() { 17 | 18 | Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 19 | 20 | if (principal instanceof SystemUserDetails) { 21 | 22 | return ((SystemUserDetails) principal); 23 | 24 | } 25 | return null; 26 | 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/com/fcz/oauth/wrapper/Wrapper.java: -------------------------------------------------------------------------------- 1 | package com.fcz.oauth.wrapper; 2 | 3 | import com.alibaba.fastjson.JSONObject; 4 | import com.fcz.oauth.model.constant.ResponseConstant; 5 | import lombok.Data; 6 | import org.codehaus.jackson.map.annotate.JsonSerialize; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * description 包装类 返回结果进行统一封装 12 | * @author Mr.F 13 | * @since 2019/7/9 14 | **/ 15 | @Data 16 | @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 17 | public class Wrapper implements Serializable { 18 | 19 | private static final long serialVersionUID = 4893280118017319089L; 20 | // 编码 21 | private int code; 22 | 23 | // 信息 24 | private String message; 25 | 26 | // 数据 27 | private T result; 28 | 29 | 30 | Wrapper(int code, String message) { 31 | this(code, message, null); 32 | } 33 | 34 | Wrapper(int code, String message, T result) { 35 | super(); 36 | this.code(code).message(message).result(result); 37 | } 38 | 39 | /** 40 | * 返回成功消息 41 | * @return 42 | */ 43 | public static Wrapper success(E o) { 44 | return new Wrapper<>(ResponseConstant.SUCCESS_CODE, ResponseConstant.SUCCESS_MESSAGE, o); 45 | } 46 | 47 | /** 48 | * 返回系统异常消息 49 | * @return 50 | */ 51 | public static Wrapper error() { 52 | return new Wrapper<>(ResponseConstant.ERROR_CODE, ResponseConstant.ERROR_MESSAGE); 53 | } 54 | 55 | public static Wrapper info(int code, String message) { 56 | return new Wrapper<>(code, message); 57 | } 58 | 59 | public static Wrapper info(int code, String message, E result) { 60 | return new Wrapper<>(code, message, result); 61 | } 62 | 63 | private Wrapper code(int code) { 64 | this.setCode(code); 65 | return this; 66 | } 67 | 68 | private Wrapper message(String message) { 69 | this.setMessage(message); 70 | return this; 71 | } 72 | 73 | private Wrapper result(T result) { 74 | this.setResult(result); 75 | return this; 76 | } 77 | 78 | public String toJsonString() { 79 | JSONObject json = new JSONObject(); 80 | json.put("code", code); 81 | json.put("message", message); 82 | json.put("result", result); 83 | return json.toString(); 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8081 3 | 4 | spring: 5 | datasource: 6 | driver-class-name: com.mysql.jdbc.Driver 7 | url: jdbc:mysql://127.0.0.1:3306/bln?useUnicode=true&characterEncoding=utf-8&useSSL=false 8 | username: root 9 | password: 123456 10 | 11 | 12 | authorization: 13 | uri: http://localhost:${server.port} 14 | client-id: client 15 | client-secret: 123456 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/resources/mapper/userMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /src/main/resources/static/css/common/moonRangePicker.css: -------------------------------------------------------------------------------- 1 | .moonrangepicker { 2 | position: absolute; 3 | background: #fff; 4 | top: 100px; 5 | left: 20px; 6 | padding: 4px; 7 | margin-top: 1px; 8 | border-radius: 4px; 9 | width: 500px; 10 | height: auto; } 11 | .moonrangepicker .calendar.left, .moonrangepicker .calendar.right { 12 | clear: none; 13 | width: 46%; 14 | display: inline-block; 15 | margin: 0 2%; } 16 | .moonrangepicker .calendar.left .header .hdBtn, .moonrangepicker .calendar.right .header .hdBtn { 17 | display: inline-block; 18 | padding: 0 13px; 19 | cursor: pointer; } 20 | .moonrangepicker .calendar.left .header .hdBtn:hover, .moonrangepicker .calendar.right .header .hdBtn:hover { 21 | background: #ececec; 22 | border-radius: 3px; } 23 | .moonrangepicker .calendar.left .header .yearBox, .moonrangepicker .calendar.right .header .yearBox { 24 | display: inline-block; 25 | text-align: center; 26 | width: 83.5%; 27 | font-weight: 600; 28 | cursor: default; 29 | user-select: none; } 30 | .moonrangepicker .calendar.left .cbody .moonBox, .moonrangepicker .calendar.right .cbody .moonBox { 31 | display: inline-block; 32 | width: 23%; 33 | height: 50px; 34 | line-height: 54px; 35 | float: left; 36 | margin: 1%; 37 | cursor: pointer; 38 | text-align: center; 39 | user-select: none; } 40 | .moonrangepicker .calendar.left .cbody .moonBox span, .moonrangepicker .calendar.right .cbody .moonBox span { 41 | pointer-events: none; } 42 | .moonrangepicker .calendar.left .cbody .moonBox:hover, .moonrangepicker .calendar.right .cbody .moonBox:hover { 43 | background: #108ee9; 44 | color: #fff; } 45 | .moonrangepicker .calendar.left .cbody .focused, .moonrangepicker .calendar.right .cbody .focused { 46 | background: #e6f0ff; 47 | color: #fff; } 48 | .moonrangepicker .calendar.left .cbody .in-range, .moonrangepicker .calendar.right .cbody .in-range { 49 | background: #b7ddf8; 50 | color: #fff; } 51 | .moonrangepicker .calendar.left .cbody .active, .moonrangepicker .calendar.right .cbody .active { 52 | background: #108ee9; 53 | color: #fff; } 54 | .moonrangepicker .calendar.left .cbody .disable, .moonrangepicker .calendar.right .cbody .disable { 55 | color: #E0E0E0; 56 | background: #f7f7f7; } 57 | .moonrangepicker .calendar.left .cbody .disable:hover, .moonrangepicker .calendar.right .cbody .disable:hover { 58 | color: #E0E0E0; 59 | background: #f7f7f7; } 60 | .moonrangepicker .clearBtn { 61 | text-align: center; 62 | font-weight: 600; 63 | cursor: pointer; 64 | padding: 4px 6px; 65 | border: 1px solid #ececec; 66 | border-radius: 3px; 67 | user-select: none; } 68 | .moonrangepicker .clearBtn:hover { 69 | background: #108ee9; 70 | color: #fff; } 71 | 72 | .moonrangepicker-dropdown { 73 | padding: 8px; 74 | z-index: 11000; } 75 | 76 | .moonrangepicker-dropdown:before { 77 | position: absolute; 78 | top: -7px; 79 | left: 9px; 80 | display: inline-block; 81 | border-right: 7px solid transparent; 82 | border-bottom: 7px solid #ccc; 83 | border-left: 7px solid transparent; 84 | border-bottom-color: rgba(0, 0, 0, 0.2); 85 | content: ''; } 86 | 87 | .moonrangepicker-dropdown:after { 88 | position: absolute; 89 | top: -6px; 90 | left: 10px; 91 | display: inline-block; 92 | border-right: 6px solid transparent; 93 | border-bottom: 6px solid #fff; 94 | border-left: 6px solid transparent; 95 | content: ''; } 96 | 97 | /*# sourceMappingURL=moonRangePicker.css.map */ 98 | -------------------------------------------------------------------------------- /src/main/resources/static/css/common/moonRangePicker.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "AAGA,gBAAiB;EACf,QAAQ,EAAE,QAAQ;EAClB,UAAU,EAAE,IAAI;EAChB,GAAG,EAAE,KAAK;EACV,IAAI,EAAE,IAAI;EACV,OAAO,EAAE,GAAG;EACZ,UAAU,EAAE,GAAG;EACf,aAAa,EAAE,GAAG;EAClB,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,IAAI;EAEZ,iEAAgC;IAC9B,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,YAAY;IACrB,MAAM,EAAE,IAAI;IAEV,+FAAO;MACL,OAAO,EAAE,YAAY;MACrB,OAAO,EAAE,MAAM;MACf,MAAM,EAAE,OAAO;MACf,2GAAQ;QACN,UAAU,EAAE,OAAO;QACnB,aAAa,EAAE,GAAG;IAGtB,mGAAS;MACP,OAAO,EAAE,YAAY;MACrB,UAAU,EAAE,MAAM;MAClB,KAAK,EAAE,KAAK;MACZ,WAAW,EAAE,GAAG;MAChB,MAAM,EAAE,OAAO;MACf,WAAW,EAAE,IAAI;IAInB,iGAAS;MACP,OAAO,EAAE,YAAY;MACrB,KAAK,EAAE,GAAG;MACV,MAAM,EAAE,IAAI;MACZ,WAAW,EAAE,IAAI;MACjB,KAAK,EAAE,IAAI;MACX,MAAM,EAAE,EAAE;MACV,MAAM,EAAE,OAAO;MACf,UAAU,EAAE,MAAM;MAClB,WAAW,EAAE,IAAI;MACjB,2GAAK;QACH,cAAc,EAAE,IAAI;IAGxB,6GAAe;MACb,UAAU,EAtDA,OAAO;MAuDjB,KAAK,EAAE,IAAI;IAEb,iGAAS;MACP,UAAU,EAAE,OAAO;MACnB,KAAK,EAAE,IAAI;IAEb,mGAAU;MACR,UAAU,EA5DQ,OAA0C;MA6D5D,KAAK,EAAE,IAAI;IAEb,+FAAQ;MACN,UAAU,EAlEA,OAAO;MAmEjB,KAAK,EAAE,IAAI;IAEb,iGAAS;MACP,KAAK,EAAE,OAAO;MACd,UAAU,EAAE,OAAO;IAErB,6GAAe;MACb,KAAK,EAAE,OAAO;MACd,UAAU,EAAE,OAAO;EAIzB,0BAAU;IACR,UAAU,EAAE,MAAM;IAClB,WAAW,EAAE,GAAG;IAChB,MAAM,EAAE,OAAO;IACf,OAAO,EAAE,OAAO;IAChB,MAAM,EAAE,iBAAiB;IACzB,aAAa,EAAE,GAAG;IAClB,WAAW,EAAE,IAAI;EAEnB,gCAAgB;IACd,UAAU,EAzFI,OAAO;IA0FrB,KAAK,EAAE,IAAI;;AAIf,yBAA0B;EACxB,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,KAAK;;AAGhB,gCAAiC;EAC/B,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,GAAG;EACT,OAAO,EAAE,YAAY;EACrB,YAAY,EAAE,qBAAqB;EACnC,aAAa,EAAE,cAAc;EAC7B,WAAW,EAAE,qBAAqB;EAClC,mBAAmB,EAAE,kBAAiB;EACtC,OAAO,EAAE,EAAE;;AAGb,+BAAgC;EAC9B,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,IAAI;EACV,OAAO,EAAE,YAAY;EACrB,YAAY,EAAE,qBAAqB;EACnC,aAAa,EAAE,cAAc;EAC7B,WAAW,EAAE,qBAAqB;EAClC,OAAO,EAAE,EAAE", 4 | "sources": ["moonRangePicker.scss"], 5 | "names": [], 6 | "file": "moonRangePicker.css" 7 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/common/moonRangePicker.scss: -------------------------------------------------------------------------------- 1 | $--color-primary: #108ee9 !default; // build 2 | $--color-white: #fff !default; 3 | $--color-primary-light-7: mix($--color-white, $--color-primary, 70%) !default; 4 | .moonrangepicker { 5 | position: absolute; 6 | background: #fff; 7 | top: 100px; 8 | left: 20px; 9 | padding: 4px; 10 | margin-top: 1px; 11 | border-radius: 4px; 12 | width: 500px; 13 | height: auto; 14 | //display: block; 15 | .calendar.left, .calendar.right { 16 | clear: none; 17 | width: 46%; 18 | display: inline-block; 19 | margin: 0 2%; 20 | .header { 21 | .hdBtn { 22 | display: inline-block; 23 | padding: 0 13px; 24 | cursor: pointer; 25 | &:hover { 26 | background: #ececec; 27 | border-radius: 3px; 28 | } 29 | } 30 | .yearBox { 31 | display: inline-block; 32 | text-align: center; 33 | width: 83.5%; 34 | font-weight: 600; 35 | cursor: default; 36 | user-select: none; 37 | } 38 | } 39 | .cbody { 40 | .moonBox { 41 | display: inline-block; 42 | width: 23%; 43 | height: 50px; 44 | line-height: 54px; 45 | float: left; 46 | margin: 1%; 47 | cursor: pointer; 48 | text-align: center; 49 | user-select: none; 50 | span { 51 | pointer-events: none; 52 | } 53 | } 54 | .moonBox:hover { 55 | background: $--color-primary; 56 | color: #fff; 57 | } 58 | .focused { 59 | background: #e6f0ff; 60 | color: #fff; 61 | } 62 | .in-range { 63 | background: $--color-primary-light-7; 64 | color: #fff; 65 | } 66 | .active { 67 | background: $--color-primary; 68 | color: #fff; 69 | } 70 | .disable { 71 | color: #E0E0E0; 72 | background: #f7f7f7; 73 | } 74 | .disable:hover { 75 | color: #E0E0E0; 76 | background: #f7f7f7; 77 | } 78 | } 79 | } 80 | .clearBtn { 81 | text-align: center; 82 | font-weight: 600; 83 | cursor: pointer; 84 | padding: 4px 6px; 85 | border: 1px solid #ececec; 86 | border-radius: 3px; 87 | user-select: none; 88 | } 89 | .clearBtn:hover { 90 | background: $--color-primary; 91 | color: #fff; 92 | } 93 | } 94 | 95 | .moonrangepicker-dropdown { 96 | padding: 8px; 97 | z-index: 11000; 98 | } 99 | 100 | .moonrangepicker-dropdown:before { 101 | position: absolute; 102 | top: -7px; 103 | left: 9px; 104 | display: inline-block; 105 | border-right: 7px solid transparent; 106 | border-bottom: 7px solid #ccc; 107 | border-left: 7px solid transparent; 108 | border-bottom-color: rgba(0, 0, 0, .2); 109 | content: ''; 110 | } 111 | 112 | .moonrangepicker-dropdown:after { 113 | position: absolute; 114 | top: -6px; 115 | left: 10px; 116 | display: inline-block; 117 | border-right: 6px solid transparent; 118 | border-bottom: 6px solid #fff; 119 | border-left: 6px solid transparent; 120 | content: ''; 121 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/pages/dataMappingForProduct.css: -------------------------------------------------------------------------------- 1 | #tab2_right search_result_box{ 2 | padding-top: 10px; 3 | padding-bottom: 10px; 4 | } 5 | .table_left{ 6 | padding-top: 10px; 7 | } 8 | #tableBoxModle{padding-bottom: 15px} 9 | .form-horizontal .form-group{ 10 | min-height: 26px; 11 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/pages/directStateDetail.css: -------------------------------------------------------------------------------- 1 | .btn-update,.btn-setting{ 2 | background: none!important; 3 | border-width: 0; 4 | color: #777777!important; 5 | } 6 | .btn-update:hover,.btn-setting:hover,.btn-update:focus,.btn-setting:focus,.btn-update:active,.btn-setting:active,.btn-update:hover:active,.btn-setting:hover:active,.btn-update:focus:hover,.btn-setting:focus:hover{ 7 | background: none!important; 8 | } 9 | .errTag,.successTag{ 10 | color: #fff; 11 | padding: 4px 20px; 12 | border-radius: 4px; 13 | } 14 | .errTag{ 15 | background: #d9d9d9; 16 | cursor: pointer; 17 | } 18 | .successTag{ 19 | background: #a9d08c; 20 | } 21 | .daterangepicker{ 22 | z-index: 1070; 23 | } 24 | .search_Condition_box{ 25 | margin-top: 64px; 26 | } 27 | .btn-update{ 28 | color: #7caa17!important; 29 | } 30 | .return_btn{ 31 | color: #7caa17 !important; 32 | border-width: 0px!important; 33 | background: none!important; 34 | width: 30px; 35 | height: 30px; 36 | border-radius: 50%; 37 | } 38 | .return_btn:hover{ 39 | color: #ffffff !important; 40 | background: #7caa17!important; 41 | } 42 | .chartsBox{ 43 | background: white; 44 | margin-bottom: 30px; 45 | border: 1px solid #dcdfe6; 46 | border-radius: 3px; 47 | } 48 | .barBox{ 49 | background: white; 50 | } 51 | .pageTitle{ 52 | font-size: 24px; 53 | line-height: 64px; 54 | padding-left: 25px; 55 | } 56 | .chartsBox .chartsTitle{ 57 | height: 47px; 58 | line-height: 47px; 59 | /* border-bottom: 1px dashed #d6d6d6; */ 60 | font-size: 16px; 61 | /* font-weight: bold; */ 62 | color: #5f5f5f; 63 | padding-left: 10px; 64 | position: relative; 65 | } 66 | .innerBox{ 67 | position: relative; 68 | } 69 | .goDetail{ 70 | position: absolute; 71 | right: 10px; 72 | /*bottom: 10px;*/ 73 | font-size: 16px; 74 | font-weight: bold; 75 | letter-spacing:1px; 76 | cursor: pointer; 77 | padding-left: 10px; 78 | color: #7caa17; 79 | } 80 | .chartsItem{ 81 | height: 300px; 82 | width: 100%; 83 | } 84 | #chooseRange{ 85 | position: absolute; 86 | right: 0; 87 | font-size: 22px; 88 | font-weight: bold; 89 | color: #333333; 90 | padding: 0 20px; 91 | cursor: pointer; 92 | letter-spacing: 1px; 93 | } 94 | #rangeChooseBox{ 95 | position: fixed; 96 | z-index: 101; 97 | background: white; 98 | width: 300px; 99 | border-radius: 4px; 100 | display: none; 101 | bottom: 280px; 102 | padding: 15px; 103 | left: 345px; 104 | box-shadow: -2px 1px 18px rgba(4, 0, 0, 0.07); 105 | border: 1px solid #ececec; 106 | } 107 | 108 | /*红绿灯弹出框用*/ 109 | .greenC,.redC{ 110 | display: inline-block; 111 | width: 20px; 112 | height: 20px; 113 | border-radius: 50%; 114 | vertical-align: middle; 115 | } 116 | .redC{ 117 | background: #97928e99; 118 | } 119 | .greenC{ 120 | background: #8dc314; 121 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/pages/flowDirectionCollect.css: -------------------------------------------------------------------------------- 1 | .setting_box ul { 2 | margin: 0 0 15px; 3 | } 4 | 5 | .setting_box .title { 6 | border-bottom: 1px solid #ececec; 7 | width: 100%; 8 | padding: 4px 10px 10px; 9 | font-size: 16px; 10 | color: #2697ec; 11 | } 12 | 13 | .setting_box li { 14 | list-style-type: none; 15 | cursor: pointer; 16 | width: 50%; 17 | padding: 2px 10px; 18 | border-bottom: 1px dashed #ececec; 19 | height: 30px; 20 | color: #7b7b7b; 21 | display: inline-block; 22 | position: relative; 23 | } 24 | 25 | .setting_box .isSetting { 26 | border: 1px solid #2cb1ff; 27 | border-radius: 3px; 28 | color: #0286d4; 29 | box-shadow: 0 0 1px 0; 30 | } 31 | 32 | .setting_box li span, .setting_box li label { 33 | cursor: pointer; 34 | margin: 0; 35 | } 36 | 37 | .setting_box li .key { 38 | display: inline-block; 39 | width: 160px; 40 | text-align: right; 41 | } 42 | .setting_box li .key .settingText{ 43 | color: #7b7b7b; 44 | } 45 | 46 | .setting_box li .tipMes { 47 | color: #999; 48 | } 49 | .setting_box [isrequired='1']:before{ 50 | content: '*'; 51 | display: block; 52 | color: red; 53 | vertical-align: middle; 54 | position: absolute; 55 | top: 6px; 56 | left: 5px; 57 | } 58 | #setting_btn label,#setting_btn span{pointer-events: none;} 59 | #grid-step1_table td{cursor: pointer} 60 | #setting_btn li .value span{color: #118ee9;} 61 | #step2Main .chosen-container { 62 | min-width: 100%; 63 | } 64 | .ui-tabs{padding: 0} 65 | .ui-tabs .ui-tabs-nav{ 66 | border-bottom:none; 67 | padding: 0; 68 | } 69 | .ui-tabs .ui-tabs-panel{ 70 | border: none; 71 | padding: 0; 72 | } 73 | .search_Condition_box:first-child{ 74 | margin-top: 0; 75 | } 76 | /*#selectDealerBox{*/ 77 | /*display: none;*/ 78 | /*}*/ 79 | .steps>li{ 80 | pointer-events: none; 81 | } 82 | #chart-panel{height: 300px;} 83 | #chartsShow { 84 | text-align: center; 85 | } 86 | #chartsShow label{ 87 | color: #78b9e8; 88 | line-height: 24px; 89 | box-sizing: content-box; 90 | vertical-align: middle; 91 | } 92 | #chartsShow span{ 93 | padding: 3px 12px; 94 | border-left: 1px solid #d5e3ef; 95 | font-size: 12px; 96 | border-top: 1px solid #d5e3ef; 97 | border-bottom: 1px solid #d5e3ef; 98 | } 99 | #chartsShow span:last-child{ 100 | border-right: 1px solid #d5e3ef; 101 | border-radius: 0 4px 4px 0; 102 | } 103 | #chartsShow span:first-child{ 104 | border-radius: 4px 0 0 4px; 105 | } 106 | #chartsShow .active_span{ 107 | background: #49acf8; 108 | color: #fff; 109 | } 110 | #my-modal .wizard-actions .btn-prev:not([disabled]){ 111 | background-color: #9ecce8!important; 112 | border-color: #9ecce8; 113 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/pages/login.css: -------------------------------------------------------------------------------- 1 | body{ 2 | background: url("../../images/ddi/qiluLoginBK.jpg") center center no-repeat!important; 3 | background-size: cover!important; 4 | font-family: Arial, “Microsoft YaHei”, “微软雅黑”, sans-serif; 5 | min-height: 800px; 6 | } 7 | .main-container{ 8 | /*background: url("../../images/ddi/qiluLoginBK.jpg") center center;*/ 9 | /*background-size: cover;*/ 10 | height: 89%; 11 | /*min-height: 650px;*/ 12 | display: inline-block; 13 | width: 100%; 14 | overflow: hidden; 15 | position: absolute; 16 | top:11%; 17 | } 18 | .main-content>.row{ 19 | position: absolute; 20 | height: 100%; 21 | } 22 | .main-content>.row>div,.login-container,.login-container .position-relative{ 23 | height: inherit; 24 | } 25 | .login-container{ 26 | width: 390px; 27 | } 28 | .login_title,.login_foot{ 29 | color: #fff; 30 | background: rgba(27,34,49,.2); 31 | } 32 | .login_foot{ 33 | position: absolute; 34 | bottom: 0; 35 | width: 100%; 36 | } 37 | .login_foot #allName{ 38 | position: absolute; 39 | right: 16px; 40 | font-size: 16px; 41 | display: inline-block; 42 | font-weight: 800; 43 | line-height: 30px; 44 | bottom: 10px; 45 | } 46 | .login_title{ 47 | padding-bottom: 15px; 48 | padding-top: 15px; 49 | position: absolute; 50 | width: 100%; 51 | height: 11%; 52 | } 53 | .login_title .lgT-left,.login_title .lgT-right{ 54 | display: inline-block; 55 | } 56 | .login_title .lgT-right{ 57 | padding-left: 15px; 58 | } 59 | .login_title .big_title{ 60 | font-size: 26px; 61 | /*padding-left: 36px;*/ 62 | letter-spacing: 7.5px; 63 | } 64 | #DTQ_logo{ 65 | background: url("../../images/ddi/DTQ_logo.png") top center no-repeat; 66 | background-size: contain; 67 | display: inline-block; 68 | width: 50px; 69 | height: 50px; 70 | vertical-align: top; 71 | margin-left: 15px; 72 | margin-top: 5px; 73 | } 74 | .login_title .small_title{ 75 | /*padding-left: 38px;*/ 76 | letter-spacing: 6px; 77 | color: #72bdea; 78 | font-weight: 800; 79 | font-size: 12px; 80 | } 81 | .white_logo{ 82 | background: url("../../images/ddi/qilu_white.png") top center; 83 | /*background: url("../../images/ddi/qilu_blue.png") top center;*/ 84 | background-size: cover; 85 | width: 280px; 86 | height: 54px; 87 | margin-left: 25px; 88 | /* margin-top: -3px; */ 89 | } 90 | .login-layout .widget-box .widget-main{ 91 | background: none; 92 | } 93 | .widget-body{ 94 | background-color: rgba(255,255,255,.6); 95 | height: 100%; 96 | } 97 | .login-layout .widget-box{ 98 | background: none; 99 | } 100 | .qilu_title_cn,.qilu_title_en{ 101 | text-align: center; 102 | color: #0a042c; 103 | font-weight: 800; 104 | } 105 | .qilu_title_cn{ 106 | font-size: 23px; 107 | color: #1e82be; 108 | letter-spacing: 7px; 109 | padding-top: 25px; 110 | } 111 | .qilu_title_en{ 112 | font-size: 15px; 113 | padding-bottom: 15px; 114 | } 115 | #login-box{ 116 | height: inherit; 117 | } 118 | #loginForm{ 119 | padding: 15px 0; 120 | } 121 | #loginForm label{ 122 | font-size: 15px; 123 | margin-bottom:6px ; 124 | color: #636363; 125 | } 126 | #loginForm input{ 127 | border-radius: 6px 6px 6px 6px!important; 128 | border: 2px solid #9E9E9E; 129 | height: 40px; 130 | } 131 | #loginForm .btn-primary{ 132 | background-color: #cc4d64!important; 133 | border-color: #cc4d64; 134 | border-radius: 6px; 135 | font-size: 15px; 136 | font-weight: 800; 137 | margin-top: 15px; 138 | } 139 | -------------------------------------------------------------------------------- /src/main/resources/static/css/pages/qaPage.css: -------------------------------------------------------------------------------- 1 | .qaSearchBox { 2 | padding: 20px; 3 | position: relative; 4 | } 5 | .qaSearchBox .title { 6 | position: absolute; 7 | top: 20px; 8 | left: 20px; 9 | width: 150px; 10 | text-align: center; 11 | padding: 15px 0; 12 | z-index: 1; 13 | } 14 | .qaSearchBox .nav { 15 | width: 150px; 16 | background: #F9F9F9; 17 | border-left: 1px solid #C5D0DC; 18 | border-top: 1px solid #C5D0DC; 19 | /*overflow: hidden;*/ 20 | /*overflow-y: auto;*/ 21 | } 22 | .qaSearchBox .nav.nav-tabs>li { 23 | margin-left: -1px; 24 | } 25 | .qaSearchBox .nav.nav-tabs>li:first-child { 26 | margin-top: 90px; 27 | } 28 | .qaSearchBox .tab-content { 29 | padding: 0; 30 | /*background: green;*/ 31 | } 32 | .qaSearchBox .tab-content .form-horizontal { 33 | margin: 20px 20px 0; 34 | } 35 | .qaSearchBox .tab-content .tab-pane { 36 | margin: 0 20px; 37 | } 38 | .qaSearchBox .tab-pane ol { 39 | list-style-type:none; 40 | padding: 0; 41 | margin: 30px 0 40px 20px; 42 | font-size: 14px; 43 | line-height: 30px; 44 | } 45 | .qaSearchBox .tab-pane ol a { 46 | color: inherit; 47 | cursor: pointer; 48 | } 49 | 50 | .qaSearchBox .pagination>li>span { 51 | margin-right: -1px; 52 | margin-left: 0; 53 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/pages/searchChangeRecord.css: -------------------------------------------------------------------------------- 1 | .table_box{ 2 | padding: 0 0 20px; 3 | } 4 | #modle_table{ 5 | width: 94%; 6 | margin: 0 1% 0 5%; 7 | } 8 | #modle_table thead{ 9 | background-color: #EFF3F8; 10 | line-height: 35px; 11 | font-weight: 700; 12 | color: #777; 13 | text-shadow: none; 14 | } 15 | #modle_table thead th{ 16 | text-align: center; 17 | height: 27px; 18 | padding: 0 2px; 19 | border-bottom: 1px; 20 | } 21 | #modle_table thead th:first-child{ 22 | width: 100px; 23 | } 24 | #modle_table tbody{ 25 | text-align: center; 26 | color: #777; 27 | } 28 | #modle_table tbody td input{ 29 | text-align: center; 30 | border: none; 31 | } 32 | #modle_table .chosen-container-single .chosen-single{ 33 | border: none; 34 | } 35 | #convertChoose_chosen{ 36 | border: 0; 37 | width: 50%!important; 38 | float: left; 39 | } 40 | #modle_table tbody td #correctSaleNum_match{ 41 | border-radius: 0!important; 42 | border-left: 1px solid #d9d9d9; 43 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/pages/searchSalesVolumeForSalesRepresentative.css: -------------------------------------------------------------------------------- 1 | .table_box{ 2 | padding: 0 0 20px; 3 | } 4 | #modle_table{ 5 | width: 94%; 6 | margin: 0 1% 0 5%; 7 | } 8 | #modle_table thead{ 9 | background-color: #EFF3F8; 10 | line-height: 35px; 11 | font-weight: 700; 12 | color: #777; 13 | text-shadow: none; 14 | } 15 | #modle_table thead th{ 16 | text-align: center; 17 | height: 27px; 18 | padding: 0 2px; 19 | border-bottom: 1px; 20 | } 21 | #modle_table thead th:first-child{ 22 | width: 100px; 23 | } 24 | #modle_table tbody{ 25 | text-align: center; 26 | color: #777; 27 | } 28 | #modle_table tbody td input{ 29 | text-align: center; 30 | border: none; 31 | } 32 | #modle_table .chosen-container-single .chosen-single{ 33 | border: none; 34 | } 35 | #convertChoose_chosen{ 36 | border: 0; 37 | width: 50%!important; 38 | float: left; 39 | } 40 | #modle_table tbody td #correctSaleNum_match{ 41 | border-radius: 0!important; 42 | border-left: 1px solid #d9d9d9; 43 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/bootstrap-colorpicker.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap Colorpicker 3 | * http://mjolnic.github.io/bootstrap-colorpicker/ 4 | * 5 | * Originally written by (c) 2012 Stefan Petre 6 | * Licensed under the Apache License v2.0 7 | * http://www.apache.org/licenses/LICENSE-2.0.txt 8 | * 9 | */.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url(../../images/bootstrap-colorpicker/saturation.png)}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-alpha,.colorpicker-hue{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-alpha i,.colorpicker-hue i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url(../../images/bootstrap-colorpicker/hue.png)}.colorpicker-alpha,.colorpicker-color{background-image:url(../../images/bootstrap-colorpicker/alpha.png)}.colorpicker-alpha{display:none}.colorpicker:after,.colorpicker:before{position:absolute;display:inline-block;content:''}.colorpicker-alpha,.colorpicker-hue,.colorpicker-saturation{background-size:contain}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:after,.colorpicker:before{line-height:0}.colorpicker:before{top:-7px;left:6px;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2)}.colorpicker:after{clear:both;top:-6px;left:7px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px;clear:both}.colorpicker-selectors i{float:left;width:10px;height:10px;cursor:pointer}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .add-on i,.colorpicker-element .input-group-addon i{display:inline-block;width:16px;height:16px;vertical-align:text-top;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;z-index:auto;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-alpha,.colorpicker.colorpicker-horizontal .colorpicker-hue{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-alpha i,.colorpicker.colorpicker-horizontal .colorpicker-hue i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:none}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url(../../images/bootstrap-colorpicker/hue-horizontal.png)}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url(../../images/bootstrap-colorpicker/alpha-horizontal.png)}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}.colorpicker-right:before{right:6px;left:auto}.colorpicker-right:after{right:7px;left:auto} -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/bootstrap-duallistbox.min.css: -------------------------------------------------------------------------------- 1 | .bootstrap-duallistbox-container .buttons{width:100%;margin-bottom:-1px}.bootstrap-duallistbox-container label{display:block}.bootstrap-duallistbox-container .info{display:inline-block;margin-bottom:5px;font-size:11px}.bootstrap-duallistbox-container .clear1,.bootstrap-duallistbox-container .clear2{display:none;font-size:10px}.bootstrap-duallistbox-container .box1.filtered .clear1,.bootstrap-duallistbox-container .box2.filtered .clear2{display:inline-block}.bootstrap-duallistbox-container .move,.bootstrap-duallistbox-container .remove{width:60%}.bootstrap-duallistbox-container .btn-group .btn{border-bottom-left-radius:0;border-bottom-right-radius:0}.bootstrap-duallistbox-container .moveall,.bootstrap-duallistbox-container .removeall{width:40%}.bootstrap-duallistbox-container.bs2compatible .btn-group>.btn+.btn{margin-left:0}.bootstrap-duallistbox-container select{border-top-left-radius:0;border-top-right-radius:0;width:100%;height:300px;padding:0}.bootstrap-duallistbox-container .filter{display:inline-block;width:100%;height:31px;margin:0 0 5px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-duallistbox-container .filter.placeholder{color:#aaa}.bootstrap-duallistbox-container.moveonselect .move,.bootstrap-duallistbox-container.moveonselect .remove{display:none}.bootstrap-duallistbox-container.moveonselect .moveall,.bootstrap-duallistbox-container.moveonselect .removeall{width:100%} -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/bootstrap-multiselect.min.css: -------------------------------------------------------------------------------- 1 | .multiselect-container{position:absolute;list-style-type:none;margin:0;padding:0}.multiselect-container .input-group{margin:5px}.multiselect-container>li{padding:0}.multiselect-container>li>a.multiselect-all label{font-weight:700}.multiselect-container>li.multiselect-group label{margin:0;padding:3px 20px;height:100%;font-weight:700}.multiselect-container>li.multiselect-group-clickable label{cursor:pointer}.multiselect-container>li>a{padding:0}.multiselect-container>li>a>label{margin:0;height:100%;cursor:pointer;font-weight:400;padding:3px 20px 3px 40px}.multiselect-container>li>a>label.checkbox,.multiselect-container>li>a>label.radio{margin:0}.multiselect-container>li>a>label>input[type=checkbox]{margin-bottom:5px}.btn-group>.btn-group:nth-child(2)>.multiselect.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.form-inline .multiselect-container label.checkbox,.form-inline .multiselect-container label.radio{padding:3px 20px 3px 40px}.form-inline .multiselect-container li a label.checkbox input[type=checkbox],.form-inline .multiselect-container li a label.radio input[type=radio]{margin-left:-20px;margin-right:0} -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/bootstrap-timepicker.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Timepicker Component for Twitter Bootstrap 3 | * 4 | * Copyright 2013 Joris de Wit 5 | * 6 | * Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */.bootstrap-timepicker{position:relative}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu{left:auto;right:0}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before{left:auto;right:12px}.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after{left:auto;right:13px}.bootstrap-timepicker .input-group-addon{cursor:pointer}.bootstrap-timepicker .input-group-addon i{display:inline-block;width:16px;height:16px}.bootstrap-timepicker-widget.dropdown-menu{padding:4px}.bootstrap-timepicker-widget.dropdown-menu.open{display:inline-block}.bootstrap-timepicker-widget.dropdown-menu:before{border-bottom:7px solid rgba(0,0,0,.2);border-left:7px solid transparent;border-right:7px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.dropdown-menu:after{border-bottom:6px solid #FFF;border-left:6px solid transparent;border-right:6px solid transparent;content:"";display:inline-block;position:absolute}.bootstrap-timepicker-widget.timepicker-orient-left:before{left:6px}.bootstrap-timepicker-widget.timepicker-orient-left:after{left:7px}.bootstrap-timepicker-widget.timepicker-orient-right:before{right:6px}.bootstrap-timepicker-widget.timepicker-orient-right:after{right:7px}.bootstrap-timepicker-widget.timepicker-orient-top:before{top:-7px}.bootstrap-timepicker-widget.timepicker-orient-top:after{top:-6px}.bootstrap-timepicker-widget.timepicker-orient-bottom:before{bottom:-7px;border-bottom:0;border-top:7px solid #999}.bootstrap-timepicker-widget.timepicker-orient-bottom:after{bottom:-6px;border-bottom:0;border-top:6px solid #fff}.bootstrap-timepicker-widget a.btn,.bootstrap-timepicker-widget input{border-radius:4px}.bootstrap-timepicker-widget table{width:100%;margin:0}.bootstrap-timepicker-widget table td{text-align:center;height:30px;margin:0;padding:2px}.bootstrap-timepicker-widget table td:not(.separator){min-width:30px}.bootstrap-timepicker-widget table td span{width:100%}.bootstrap-timepicker-widget table td a{border:1px solid transparent;width:100%;display:inline-block;margin:0;padding:8px 0;outline:0;color:#333}.bootstrap-timepicker-widget table td a:hover{text-decoration:none;background-color:#eee;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-color:#ddd}.bootstrap-timepicker-widget table td a i{margin-top:2px;font-size:18px}.bootstrap-timepicker-widget table td input{width:25px;margin:0;text-align:center}.bootstrap-timepicker-widget .modal-content{padding:4px}@media (min-width:767px){.bootstrap-timepicker-widget.modal{width:200px;margin-left:-100px}}@media (max-width:767px){.bootstrap-timepicker,.bootstrap-timepicker .dropdown-menu{width:100%}} -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/colorbox.min.css: -------------------------------------------------------------------------------- 1 | #cboxWrapper,.cboxPhoto{max-width:none}.cboxIframe,.cboxPhoto{display:block;border:0}#cboxCurrent,#cboxTitle{position:absolute;color:#949494;bottom:4px}#cboxClose:active,#cboxNext:active,#cboxPrevious:active,#cboxSlideshow:active,#colorbox{outline:0}#cboxOverlay,#cboxWrapper,#colorbox{position:absolute;top:0;left:0;z-index:9999;overflow:hidden}#cboxOverlay{position:fixed;width:100%;height:100%;background:url(images/overlay.png);opacity:.9;filter:alpha(opacity=90)}#cboxBottomLeft,#cboxMiddleLeft{clear:left}#cboxContent{position:relative;background:#fff;overflow:hidden}#cboxTitle{margin:0;left:0;text-align:center;width:100%}#cboxLoadingGraphic,#cboxLoadingOverlay{position:absolute;top:0;left:0;width:100%;height:100%}.cboxPhoto{float:left;margin:auto;-ms-interpolation-mode:bicubic}.cboxIframe{width:100%;height:100%;padding:0;margin:0}#cboxContent,#cboxLoadedContent,#colorbox{box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box}#cboxTopLeft{width:21px;height:21px;background:url(images/controls.png) -101px 0 no-repeat}#cboxTopRight{width:21px;height:21px;background:url(images/controls.png) -130px 0 no-repeat}#cboxBottomLeft{width:21px;height:21px;background:url(images/controls.png) -101px -29px no-repeat}#cboxBottomRight{width:21px;height:21px;background:url(images/controls.png) -130px -29px no-repeat}#cboxMiddleLeft{width:21px;background:url(images/controls.png) left top repeat-y}#cboxMiddleRight{width:21px;background:url(images/controls.png) right top repeat-y}#cboxTopCenter{height:21px;background:url(images/border.png) repeat-x}#cboxBottomCenter{height:21px;background:url(images/border.png) 0 -29px repeat-x}.cboxIframe{background:#fff}#cboxError{padding:50px;border:1px solid #ccc}#cboxLoadedContent{overflow:auto;-webkit-overflow-scrolling:touch;margin-bottom:28px}#cboxCurrent{left:58px}#cboxLoadingOverlay{background:url(images/loading_background.png) center center no-repeat}#cboxLoadingGraphic{background:url(images/loading.gif) center center no-repeat}#cboxClose,#cboxNext,#cboxPrevious,#cboxSlideshow{cursor:pointer;border:0;padding:0;margin:0;overflow:visible;width:auto;background:0 0}#cboxClose,#cboxNext,#cboxPrevious{position:absolute;bottom:0;width:25px;height:25px;text-indent:-9999px}#cboxSlideshow{position:absolute;bottom:4px;right:30px;color:#0092ef}#cboxPrevious{left:0;background:url(images/controls.png) -75px 0 no-repeat}#cboxPrevious:hover{background-position:-75px -25px}#cboxNext{left:27px;background:url(images/controls.png) -50px 0 no-repeat}#cboxNext:hover{background-position:-50px -25px}#cboxClose{right:0;background:url(images/controls.png) -25px 0 no-repeat}#cboxClose:hover{background-position:-25px -25px}.cboxIE #cboxBottomCenter,.cboxIE #cboxBottomLeft,.cboxIE #cboxBottomRight,.cboxIE #cboxMiddleLeft,.cboxIE #cboxMiddleRight,.cboxIE #cboxTopCenter,.cboxIE #cboxTopLeft,.cboxIE #cboxTopRight{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF, endColorstr=#00FFFFFF)} -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/daterangepicker.min.css: -------------------------------------------------------------------------------- 1 | .daterangepicker{position:absolute;background:#fff;top:100px;left:20px;padding:4px;margin-top:1px;border-radius:4px;width:278px}.daterangepicker.opensleft:before{position:absolute;top:-7px;right:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2);content:''}.daterangepicker.opensleft:after{position:absolute;top:-6px;right:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.daterangepicker.openscenter:after,.daterangepicker.openscenter:before{left:0;right:0;width:0;margin-left:auto;margin-right:auto;display:inline-block;content:'';position:absolute}.daterangepicker.openscenter:before{top:-7px;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2)}.daterangepicker.openscenter:after{top:-6px;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent}.daterangepicker.opensright:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,.2);content:''}.daterangepicker.opensright:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.daterangepicker.dropup{margin-top:-5px}.daterangepicker.dropup:before{top:initial;bottom:-7px;border-bottom:initial;border-top:7px solid #ccc}.daterangepicker.dropup:after{top:initial;bottom:-6px;border-bottom:initial;border-top:6px solid #fff}.daterangepicker.dropdown-menu{max-width:none;z-index:3000}.daterangepicker.single .calendar,.daterangepicker.single .ranges{float:none}.daterangepicker .calendar{display:none;max-width:270px;margin:4px}.daterangepicker.show-calendar .calendar{display:block}.daterangepicker .calendar.single .calendar-table{border:none}.daterangepicker .calendar td,.daterangepicker .calendar th{white-space:nowrap;text-align:center;min-width:32px}.daterangepicker .calendar-table{border:1px solid #ddd;padding:4px;border-radius:4px;background:#fff}.daterangepicker table{width:100%;margin:0}.daterangepicker td,.daterangepicker th{text-align:center;width:20px;height:20px;border-radius:4px;white-space:nowrap;cursor:pointer}.daterangepicker td.off,.daterangepicker td.off.end-date,.daterangepicker td.off.in-range,.daterangepicker td.off.start-date{color:#999;background:#fff}.daterangepicker option.disabled,.daterangepicker td.disabled{color:#999;cursor:not-allowed;text-decoration:line-through}.daterangepicker td.available:hover,.daterangepicker th.available:hover{background:#eee}.daterangepicker td.in-range{background:#ebf4f8;border-radius:0}.daterangepicker td.start-date{border-radius:4px 0 0 4px}.daterangepicker td.end-date{border-radius:0 4px 4px 0}.daterangepicker td.start-date.end-date{border-radius:4px}.daterangepicker td.active,.daterangepicker td.active:hover{background-color:#357ebd;border-color:#3071a9;color:#fff}.daterangepicker td.week,.daterangepicker th.week{font-size:80%;color:#ccc}.daterangepicker select.monthselect,.daterangepicker select.yearselect{font-size:12px;padding:1px;height:auto;margin:0;cursor:default}.daterangepicker select.monthselect{margin-right:2%;width:56%}.daterangepicker select.yearselect{width:40%}.daterangepicker select.ampmselect,.daterangepicker select.hourselect,.daterangepicker select.minuteselect,.daterangepicker select.secondselect{width:50px;margin-bottom:0}.daterangepicker th.month{width:auto}.daterangepicker .input-mini{border:1px solid #ccc;border-radius:4px;color:#555;display:block;height:30px;line-height:30px;vertical-align:middle;margin:0 0 5px;padding:0 6px 0 28px;width:100%}.daterangepicker .input-mini.active{border:1px solid #357ebd}.daterangepicker .daterangepicker_input i{position:absolute;left:8px;top:8px}.daterangepicker .daterangepicker_input{position:relative}.daterangepicker .calendar-time{text-align:center;margin:5px auto;line-height:30px;position:relative;padding-left:28px}.daterangepicker .calendar-time select.disabled{color:#ccc;cursor:not-allowed}.daterangepicker .ranges{font-size:11px;float:none;margin:4px;text-align:left}.daterangepicker .ranges ul{list-style:none;margin:0 auto;padding:0;width:100%}.daterangepicker .ranges li{font-size:13px;background:#f5f5f5;border:1px solid #f5f5f5;color:#08c;padding:3px 12px;margin-bottom:8px;border-radius:5px;cursor:pointer}.daterangepicker .ranges li.active,.daterangepicker .ranges li:hover{background:#08c;border:1px solid #08c;color:#fff}@media (min-width:564px){.daterangepicker .calendar,.daterangepicker .ranges,.daterangepicker.single .calendar,.daterangepicker.single .ranges{float:left}.daterangepicker{width:auto}.daterangepicker .ranges ul{width:160px}.daterangepicker.single .ranges ul{width:100%}.daterangepicker .calendar.left .calendar-table{border-right:none;border-top-right-radius:0;border-bottom-right-radius:0}.daterangepicker .calendar.right .calendar-table{border-left:none;border-top-left-radius:0;border-bottom-left-radius:0}.daterangepicker .calendar.left{clear:left;margin-right:0}.daterangepicker.single .calendar.left{clear:none}.daterangepicker .calendar.right{margin-left:0}.daterangepicker .calendar.left .calendar-table,.daterangepicker .left .daterangepicker_input{padding-right:12px}}@media (min-width:730px){.daterangepicker .ranges{width:auto;float:left}.daterangepicker .calendar.left{clear:none}} -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/fonts.googleapis.com.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Open Sans'; 3 | font-style: normal; 4 | font-weight: 300; 5 | src: local('Open Sans Light'), local('OpenSans-Light'), url(http://fonts.gstatic.com/s/opensans/v13/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff) format('woff'); 6 | } 7 | @font-face { 8 | font-family: 'Open Sans'; 9 | font-style: normal; 10 | font-weight: 400; 11 | src: local('Open Sans'), local('OpenSans'), url(http://fonts.gstatic.com/s/opensans/v13/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff) format('woff'); 12 | } 13 | -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/jquery-ui.custom.min.css: -------------------------------------------------------------------------------- 1 | /*! jQuery UI - v1.11.4 - 2015-09-20 2 | * http://jqueryui.com 3 | * Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, slider.css 4 | * Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:after,.ui-helper-clearfix:before{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-autohide .ui-resizable-handle,.ui-resizable-disabled .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0} -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/jquery.gritter.min.css: -------------------------------------------------------------------------------- 1 | #gritter-notice-wrapper{position:fixed;top:20px;right:20px;width:301px;z-index:9999}#gritter-notice-wrapper.top-left{left:20px;right:auto}#gritter-notice-wrapper.bottom-right{top:auto;left:auto;bottom:20px;right:20px}#gritter-notice-wrapper.bottom-left{top:auto;right:auto;bottom:20px;left:20px}.gritter-item-wrapper{position:relative;margin:0 0 10px;background:url(../images/ie-spacer.gif)}.gritter-top{background:url(../images/gritter.png) left -30px no-repeat;height:10px}.hover .gritter-top{background-position:right -30px}.gritter-bottom{background:url(../images/gritter.png) left bottom no-repeat;height:8px;margin:0}.hover .gritter-bottom{background-position:bottom right}.gritter-item{display:block;background:url(../images/gritter.png) left -40px no-repeat;color:#eee;padding:2px 11px 8px;font-size:11px;font-family:verdana}.hover .gritter-item{background-position:right -40px}.gritter-item p{padding:0;margin:0;word-wrap:break-word}.gritter-close{display:none;position:absolute;top:5px;left:3px;background:url(../images/gritter.png) left top no-repeat;cursor:pointer;width:30px;height:30px;text-indent:-9999em}.gritter-title{font-size:14px;font-weight:700;padding:0 0 7px;display:block;text-shadow:1px 1px 0 #000}.gritter-image{width:48px;height:48px;float:left}.gritter-with-image,.gritter-without-image{padding:0}.gritter-with-image{width:220px;float:right}.gritter-light .gritter-bottom,.gritter-light .gritter-close,.gritter-light .gritter-item,.gritter-light .gritter-top{background-image:url(../images/gritter-light.png);color:#222}.gritter-light .gritter-title{text-shadow:none} -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/prettify.min.css: -------------------------------------------------------------------------------- 1 | .com{color:#93a1a1}.lit{color:#195f91}.clo,.opn,.pun{color:#93a1a1}.fun{color:#dc322f}.atv,.str{color:#D14}.kwd,.prettyprint .tag{color:#1e347b}.atn,.dec,.typ,.var{color:teal}.pln{color:#48484c}.prettyprint{padding:8px;background-color:#f7f7f9;border:1px solid #e1e1e8}.prettyprint.linenums{-webkit-box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0;box-shadow:inset 40px 0 0 #fbfbfc,inset 41px 0 0 #ececf0}ol.linenums{margin:0 0 0 33px}ol.linenums li{padding-left:12px;color:#bebec5;line-height:20px;text-shadow:0 1px 0 #fff} -------------------------------------------------------------------------------- /src/main/resources/static/css/plug/ui.jqgrid-bootstrap-ui.css: -------------------------------------------------------------------------------- 1 | /* 2 | To change this license header, choose License Headers in Project Properties. 3 | To change this template file, choose Tools | Templates 4 | and open the template in the editor. 5 | */ 6 | /* 7 | Created on : Mar 16, 2015, 10:24:01 AM 8 | Author : tony 9 | */ 10 | 11 | .ui-jqgrid tr.jqgrow td { height: 26px;} 12 | .ui-jqgrid .ui-pg-input,.ui-jqgrid .ui-jqgrid-toppager .ui-pg-input { height:20px } 13 | .ui-state-hover 14 | { 15 | border: .15em solid; 16 | border-color: inherit; 17 | 18 | } 19 | .ui-jqdialog .ui-jqdialog-titlebar { 20 | height:29px; 21 | border-color: inherit; 22 | } 23 | 24 | .ui-jqdialog-content input.FormElement { 25 | padding: 0.25em; 26 | } 27 | 28 | .fm-button { 29 | height:30px; 30 | } 31 | #nData, #pData { height:20px; width:18px; } -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome/4.5.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/font-awesome/4.5.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome/4.5.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/font-awesome/4.5.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome/4.5.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/font-awesome/4.5.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/font-awesome/4.5.0/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome/4.7.0/font/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/font-awesome/4.7.0/font/FontAwesome.otf -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome/4.7.0/font/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/font-awesome/4.7.0/font/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome/4.7.0/font/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/font-awesome/4.7.0/font/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome/4.7.0/font/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/font-awesome/4.7.0/font/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/resources/static/font-awesome/4.7.0/font/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/font-awesome/4.7.0/font/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /src/main/resources/static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /src/main/resources/static/images/avatars/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/avatars/avatar.png -------------------------------------------------------------------------------- /src/main/resources/static/images/avatars/avatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/avatars/avatar1.png -------------------------------------------------------------------------------- /src/main/resources/static/images/avatars/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/avatars/avatar2.png -------------------------------------------------------------------------------- /src/main/resources/static/images/avatars/avatar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/avatars/avatar3.png -------------------------------------------------------------------------------- /src/main/resources/static/images/avatars/avatar4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/avatars/avatar4.png -------------------------------------------------------------------------------- /src/main/resources/static/images/avatars/avatar5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/avatars/avatar5.png -------------------------------------------------------------------------------- /src/main/resources/static/images/avatars/profile-pic.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/avatars/profile-pic.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/avatars/user.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/avatars/user.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/bootstrap-colorpicker/alpha-horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/bootstrap-colorpicker/alpha-horizontal.png -------------------------------------------------------------------------------- /src/main/resources/static/images/bootstrap-colorpicker/alpha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/bootstrap-colorpicker/alpha.png -------------------------------------------------------------------------------- /src/main/resources/static/images/bootstrap-colorpicker/hue-horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/bootstrap-colorpicker/hue-horizontal.png -------------------------------------------------------------------------------- /src/main/resources/static/images/bootstrap-colorpicker/hue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/bootstrap-colorpicker/hue.png -------------------------------------------------------------------------------- /src/main/resources/static/images/bootstrap-colorpicker/saturation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/bootstrap-colorpicker/saturation.png -------------------------------------------------------------------------------- /src/main/resources/static/images/change-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/change-icon.png -------------------------------------------------------------------------------- /src/main/resources/static/images/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/chosen-sprite.png -------------------------------------------------------------------------------- /src/main/resources/static/images/ddi/DTQ_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/ddi/DTQ_logo.png -------------------------------------------------------------------------------- /src/main/resources/static/images/ddi/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/ddi/favicon.ico -------------------------------------------------------------------------------- /src/main/resources/static/images/ddi/qiluLoginBK.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/ddi/qiluLoginBK.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/ddi/qilu_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/ddi/qilu_white.png -------------------------------------------------------------------------------- /src/main/resources/static/images/email/email1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/email/email1.png -------------------------------------------------------------------------------- /src/main/resources/static/images/email/email2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/email/email2.png -------------------------------------------------------------------------------- /src/main/resources/static/images/email/email3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/email/email3.png -------------------------------------------------------------------------------- /src/main/resources/static/images/email/email4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/email/email4.png -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/image-1.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/image-2.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/image-3.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/image-4.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/image-5.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/image-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/image-6.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/thumb-1.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/thumb-2.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/thumb-3.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/thumb-4.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/thumb-5.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/gallery/thumb-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/gallery/thumb-6.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/layer/icon-ext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/layer/icon-ext.png -------------------------------------------------------------------------------- /src/main/resources/static/images/layer/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/layer/icon.png -------------------------------------------------------------------------------- /src/main/resources/static/images/layer/loading-0.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/layer/loading-0.gif -------------------------------------------------------------------------------- /src/main/resources/static/images/layer/loading-1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/layer/loading-1.gif -------------------------------------------------------------------------------- /src/main/resources/static/images/layer/loading-2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/layer/loading-2.gif -------------------------------------------------------------------------------- /src/main/resources/static/images/placeholder/165x90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/placeholder/165x90.png -------------------------------------------------------------------------------- /src/main/resources/static/images/placeholder/255x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/placeholder/255x150.png -------------------------------------------------------------------------------- /src/main/resources/static/images/placeholder/530x270.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/placeholder/530x270.png -------------------------------------------------------------------------------- /src/main/resources/static/images/placeholder/550x280.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/placeholder/550x280.png -------------------------------------------------------------------------------- /src/main/resources/static/images/plug/chosen-sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/plug/chosen-sprite.png -------------------------------------------------------------------------------- /src/main/resources/static/images/qilu_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/qilu_logo.png -------------------------------------------------------------------------------- /src/main/resources/static/images/zTreeStyle/img/line_conn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/zTreeStyle/img/line_conn.png -------------------------------------------------------------------------------- /src/main/resources/static/images/zTreeStyle/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/zTreeStyle/img/loading.gif -------------------------------------------------------------------------------- /src/main/resources/static/images/zTreeStyle/img/metro.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/zTreeStyle/img/metro.gif -------------------------------------------------------------------------------- /src/main/resources/static/images/zTreeStyle/img/metro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fangchunzao/spring-security-oauth2/3113d28d7fb501dd694343199f11329076c906f4/src/main/resources/static/images/zTreeStyle/img/metro.png -------------------------------------------------------------------------------- /src/main/resources/static/js/common/common.js: -------------------------------------------------------------------------------- 1 | function tAjax(url, params, method) { 2 | // var tokenId = $("#fx").val(); 3 | var tokenId = 'Bearer ' + window.localStorage.getItem('token'); 4 | var successRequire; // 成功回调 5 | this.success = function (fn) { 6 | successRequire = fn; 7 | }; 8 | $.ajax({ 9 | type: method, 10 | contentType: "application/json; charset=utf-8", 11 | url: url, 12 | dataType: "json", 13 | async: true, 14 | beforeSend: function (request) { 15 | request.setRequestHeader("Authorization", tokenId); 16 | }, 17 | data: JSON.stringify(params), 18 | success: function (result) { 19 | var code = result.code; 20 | if (code === 501) { 21 | window.location.href="/"; 22 | } 23 | if (code === 502) { 24 | window.localStorage.setItem("token",result.result); 25 | tAjax(url,params); 26 | } else if(code === 511) { 27 | window.location.href="/"; 28 | } 29 | // console.log(code); 30 | successRequire(result); 31 | }, 32 | error: function (errorRes) { 33 | console.log('请求发生error' + errorRes.message); 34 | if (errorRes.readyState === 0) { 35 | console.log('请求地址初始化失败!请检查url是否正确'); 36 | } else if (errorRes.readyState === 4) { 37 | if (errorRes.status === 404) { 38 | console.log('404:找不到这个请求!') 39 | } else if (errorRes.status === 403) { 40 | layer.msg('权限错误!'); 41 | } else if (errorRes.status === 401) { 42 | layer.msg('登录超时或账号已在其他地方登录'); 43 | // logout(); 44 | } 45 | } 46 | } 47 | }); 48 | return this; 49 | } 50 | 51 | -------------------------------------------------------------------------------- /src/main/resources/static/js/pages/customerGridList.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $("#customerTable").tableResize(); 3 | loadCustomerGridList(); 4 | loadProvince('#sc_province'); 5 | // 修正第二个modle关闭引发的scroll表现不正确的Bug 6 | $('#showCustomerGridList').on('hide.bs.modal', function () { 7 | setTimeout(function () { 8 | $('body').addClass('modal-open'); 9 | }, 510); 10 | }); 11 | }); 12 | 13 | // modal的show处理 14 | function showCustomerModal(selector) { 15 | resetCustomerModlaSearch(); 16 | $("#showCustomerGridList").attr('selector', selector); // 暂存,用于关闭modal时的返回 17 | $("#customerTable").jqGrid('resetSelection'); // 重置表格选择状态 18 | $("#showCustomerGridList").modal('show'); 19 | setTimeout(function () { 20 | $("#showCustomerGridList").resize(); 21 | },250); 22 | $(".modal-backdrop").eq(1).css('z-index', 1059); 23 | } 24 | 25 | // 加载grid 26 | function loadCustomerGridList() { 27 | if ($("#customerTable").html() !== '') { 28 | $("#customerTable").jqGrid("clearGridData"); 29 | $("#customerTable").jqGrid('setGridParam', 30 | { 31 | postData: { 32 | provinceCode: $("#sc_province").val(), 33 | cityCode: $("#sc_city").val() 34 | } 35 | }).trigger('reloadGrid'); 36 | } else { 37 | var obj = { 38 | url: '/api/manu/searchCustomerForManu', 39 | colModel: [ 40 | {name: 'customerCode', index: 'customerCode', width: 160, label: '客户编码', frozen: true}, 41 | {name: 'customerName', index: 'customerName', width: 200, label: '客户名', frozen: true}, 42 | {name: 'provinceName', index: 'provinceName', width: 120, label: '客户省'}, 43 | {name: 'cityName', index: 'cityName', width: 120, label: '客户市'}, 44 | {name: 'address', index: 'address', width: 120, label: '地址'} 45 | ], 46 | pager: "#customerTable-pager", 47 | gridComplete: function () { // 隐藏全选 48 | $("#cb_customerTable").hide(); 49 | return (true); 50 | }, 51 | beforeSelectRow: function () { // hack成单选 52 | $("#customerTable").jqGrid('resetSelection'); 53 | return (true); 54 | } 55 | }; 56 | $("#customerTable").drawTable(obj); 57 | $("#customerTable").closest(".ui-jqgrid-bdiv").css({"overflow-x": "scroll"}); 58 | } 59 | } 60 | 61 | // 确认选择按钮 62 | function saveChooseCustomer() { 63 | var selector = $("#showCustomerGridList").attr('selector'); 64 | var id = $("#customerTable").jqGrid('getGridParam', 'selarrrow'); 65 | var rowData = $("#customerTable").jqGrid('getRowData', id); 66 | $(selector).val(rowData.customerName); 67 | $(selector).attr('title',rowData.customerName); 68 | $(selector).attr('customerCode',rowData.customerCode); 69 | $("#showCustomerGridList").modal('hide'); 70 | } 71 | 72 | //检索清空 73 | function resetCustomerModlaSearch() { 74 | $("#sc_province").val(''); 75 | $("#sc_city").val(''); 76 | $("#sc_province").trigger("chosen:updated"); 77 | $("#sc_city").trigger("chosen:updated"); 78 | } -------------------------------------------------------------------------------- /src/main/resources/static/js/pages/dealerGridList.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $("#dealerTable").tableResize(); 3 | loadDealerGridList(); 4 | loadProvince('#sd_province'); 5 | // 修正第二个modle关闭引发的scroll表现不正确的Bug 6 | $('#showDealerGridList').on('hide.bs.modal', function () { 7 | setTimeout(function () { 8 | $('body').addClass('modal-open'); 9 | }, 510); 10 | }); 11 | }); 12 | 13 | // modal的show处理 14 | function showDealerModal(selector) { 15 | // resetModlaSearch(); 16 | $("#showDealerGridList").attr('selector', selector); // 暂存,用于关闭modal时的返回 17 | $("#dealerTable").jqGrid('resetSelection'); // 重置表格选择状态 18 | $("#showDealerGridList").modal('show'); 19 | setTimeout(function () { 20 | $("#showDealerGridList").resize(); 21 | },250); 22 | $(".modal-backdrop").eq(1).css('z-index', 1059); 23 | } 24 | 25 | // 加载grid 26 | function loadDealerGridList() { 27 | if ($("#dealerTable").html() !== '') { 28 | $("#dealerTable").jqGrid("clearGridData"); 29 | $("#dealerTable").jqGrid('setGridParam', 30 | { 31 | postData: { 32 | dealerName:$('#sd_dealerName').val(), 33 | provinceCode: $("#sd_province").val(), 34 | cityCode: $("#sd_city").val() 35 | } 36 | }).trigger('reloadGrid'); 37 | } else { 38 | var obj = { 39 | url: '/api/appeal/searchCompanyDealerInfo', 40 | colModel: [ 41 | {name: 'dealerCode', index: 'dealerCode', width: 160, label: '经销商编码', frozen: true}, 42 | {name: 'dealerName', index: 'dealerName', width: 200, label: '经销商名称', frozen: true}, 43 | {name: 'provinceName', index: 'provinceName', width: 120, label: '经销商'}, 44 | {name: 'cityName', index: 'cityName', width: 120, label: '经销商市'}, 45 | {name: 'districtName', index: 'districtName', width: 120, label: '经销商区'}, 46 | {name: 'districtCode', index: 'districtCode', width: 120, label: '经销商区编码', hidden: true}, 47 | {name: 'provinceCode', index: 'provinceCode', width: 120, label: '经销商省编码', hidden: true}, 48 | {name: 'cityCode', index: 'cityCode', width: 120, label: '经销商市编码', hidden: true}, 49 | {name: 'mailAddress', index: 'mailAddress', width: 120, label: '经销商邮箱', hidden: true}, 50 | {name: 'telephoneNum', index: 'telephoneNum', width: 120, label: '经销商电话', hidden: true}, 51 | {name: 'detailAddress', index: 'detailAddress', width: 120, label: '经销商地址', hidden: true}, 52 | {name: 'dealerOrgCode', index: 'dealerOrgCode', width: 120, label: '经销商组织代码', hidden: true}, 53 | {name: 'connectUser', index: 'connectUser', width: 120, label: '经销商联系人', hidden: true} 54 | ], 55 | pager: "#dealerTable-pager", 56 | gridComplete: function () { // 隐藏全选 57 | $("#cb_dealerTable").hide(); 58 | return (true); 59 | }, 60 | beforeSelectRow: function () { // hack成单选 61 | $("#dealerTable").jqGrid('resetSelection'); 62 | return (true); 63 | } 64 | }; 65 | $("#dealerTable").drawTable(obj); 66 | $("#dealerTable").closest(".ui-jqgrid-bdiv").css({"overflow-x": "scroll"}); 67 | } 68 | } 69 | 70 | // 确认选择按钮 71 | function saveChoose() { 72 | var selector = $("#showDealerGridList").attr('selector'); 73 | var id = $("#dealerTable").jqGrid('getGridParam', 'selarrrow'); 74 | var rowData = $("#dealerTable").jqGrid('getRowData', id); 75 | $(selector).val(rowData.dealerName); 76 | $(selector).attr('dealerCode',rowData.dealerCode); 77 | $("#showDealerGridList").modal('hide'); 78 | } 79 | 80 | //检索清空 81 | function resetModlaSearch() { 82 | $("#sd_province").val(''); 83 | $("#sd_city").val(''); 84 | $("#sd_dealerName").val(''); 85 | $("#sd_province").trigger("chosen:updated"); 86 | $("#sd_city").trigger("chosen:updated"); 87 | } -------------------------------------------------------------------------------- /src/main/resources/static/js/pages/priceCustomerList.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $("#customerTable").tableResize(); 3 | loadProvince('#sc_province'); 4 | // 修正第二个modle关闭引发的scroll表现不正确的Bug 5 | $('#showCustomerGridList').on('hide.bs.modal', function () { 6 | setTimeout(function () { 7 | $('body').addClass('modal-open'); 8 | }, 510); 9 | }); 10 | }); 11 | 12 | // modal的show处理 13 | function showCustomerModal(selector,hospitalFlag) { 14 | resetCustomerModlaSearch(); 15 | $("#showCustomerGridList").attr('hospitalFlag',hospitalFlag);//区分 1 :非医院 2:医院 16 | $("#showCustomerGridList").attr('selector', selector); // 暂存,用于关闭modal时的返回 17 | loadCustomerGridList(); 18 | $("#customerTable").jqGrid('resetSelection'); // 重置表格选择状态 19 | $("#showCustomerGridList").modal('show'); 20 | setTimeout(function () { 21 | $("#showCustomerGridList").resize(); 22 | },250); 23 | $(".modal-backdrop").eq(1).css('z-index', 1059); 24 | } 25 | 26 | // 加载grid 27 | function loadCustomerGridList() { 28 | if ($("#customerTable").html() !== '') { 29 | $("#customerTable").jqGrid("clearGridData"); 30 | $("#customerTable").jqGrid('setGridParam', 31 | { 32 | postData: { 33 | cusName:$('#sc_cusName').val()?$('#sc_cusName').val():'', 34 | province: $("#sc_province").val()?$("#sc_province").val():'', 35 | city: $("#sc_city").val()?$("#sc_city").val():'', 36 | hospitalFlag:$("#showCustomerGridList").attr('hospitalFlag')?$("#showCustomerGridList").attr('hospitalFlag'):'' // 1 :非医院 2:医院 37 | } 38 | }).trigger('reloadGrid'); 39 | } else { 40 | var obj = { 41 | url: '/api/service/searchCustomerMasterStandard', 42 | colModel: [ 43 | {name: 'ysID', index: 'ysID', width: 160, label: '终端编码', frozen: true}, 44 | {name: 'medicalOrgName', index: 'medicalOrgName', width: 200, label: '终端名', frozen: true}, 45 | {name: 'provinceName', index: 'provinceName', width: 120, label: '终端省'}, 46 | {name: 'cityName', index: 'cityName', width: 120, label: '终端市'}, 47 | {name: 'address', index: 'address', width: 120, label: '地址'} 48 | ], 49 | pager: "#customerTable-pager", 50 | gridComplete: function () { // 隐藏全选 51 | $("#cb_customerTable").hide(); 52 | return (true); 53 | }, 54 | beforeSelectRow: function () { // hack成单选 55 | $("#customerTable").jqGrid('resetSelection'); 56 | return (true); 57 | }, 58 | postData: { 59 | hospitalFlag:$("#showCustomerGridList").attr('hospitalFlag') // 1 :非医院 2:医院 60 | } 61 | }; 62 | $("#customerTable").drawTable(obj); 63 | $("#customerTable").closest(".ui-jqgrid-bdiv").css({"overflow-x": "scroll"}); 64 | } 65 | } 66 | 67 | // 确认选择按钮 68 | function saveChooseCustomer() { 69 | var selector = $("#showCustomerGridList").attr('selector'); 70 | var id = $("#customerTable").jqGrid('getGridParam', 'selarrrow'); 71 | var rowData = $("#customerTable").jqGrid('getRowData', id); 72 | $(selector).val(rowData['medicalOrgName']); 73 | $(selector).attr('title',rowData['medicalOrgName']); 74 | $(selector).attr('customerCode',rowData['ysID']); 75 | $("#showCustomerGridList").modal('hide'); 76 | } 77 | 78 | //检索清空 79 | function resetCustomerModlaSearch() { 80 | $('#sc_cusName').val(''); 81 | $("#sc_province").val(''); 82 | $("#sc_city").val(''); 83 | $("#sc_city").html(''); 84 | $("#sc_province").trigger("chosen:updated"); 85 | $("#sc_city").trigger("chosen:updated"); 86 | } -------------------------------------------------------------------------------- /src/main/resources/static/js/pages/priceProductList.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | $("#product-table").tableResize(); 3 | // 修正第二个modle关闭引发的scroll表现不正确的Bug 4 | $('#showCustomerGridList').on('hide.bs.modal', function () { 5 | setTimeout(function () { 6 | $('body').addClass('modal-open'); 7 | }, 510); 8 | }); 9 | }); 10 | 11 | //加载产品信息 12 | function loadProductInfoTable(selector) { 13 | resetSearchProduct(); 14 | loadProductInfo(); 15 | $('#chooseProduct-Modle').modal('show'); 16 | $("#chooseProduct-Modle").attr('selector', selector); // 暂存,用于关闭modal时的返回 17 | setTimeout(function () { 18 | $("#product-table").resize() 19 | }, 250); 20 | } 21 | //清空产品Modle查询条件 22 | function resetSearchProduct() { 23 | $('#nc_productName').val(''); 24 | $('#nc_productFormat').val(''); 25 | $('#nc_productMetering').val(''); 26 | } 27 | 28 | //选择产品modal 产品table 29 | function loadProductInfo() { 30 | if ($("#product-table").html() !== '') { 31 | // 每次加载前清空 32 | $("#product-table").jqGrid("clearGridData"); 33 | $("#product-table").jqGrid('setGridParam', { 34 | postData: { 35 | productName: $('#nc_productName').val() ? $('#nc_productName').val() : '', 36 | productFormat: $('#nc_productFormat').val() ? $('#nc_productFormat').val() : '', 37 | productMetering: $('#nc_productMetering').val() ? $('#nc_productMetering').val() : '' 38 | } 39 | }).trigger('reloadGrid'); 40 | } else { 41 | var obj = { 42 | url: '/api/service/searchProductInfo', 43 | colModel: [ 44 | {name: 'productCode', index: 'productCode', width: 140, label: '品规编码'}, 45 | {name: 'productName', index: 'productName', width: 140, label: '品规'}, 46 | {name: 'productFormat', index: 'productFormat', width: 140, label: '规格'}, 47 | {name: 'productMetering', index: 'productMetering', width: 140, label: '计量单位'} 48 | ], 49 | pager: "#product-table-pager", 50 | gridComplete: function () { // 隐藏全选 51 | $("#cb_product-table").hide(); 52 | return (true); 53 | }, 54 | beforeSelectRow: function () { // hack成单选 55 | $("#product-table").jqGrid('resetSelection'); 56 | return (true); 57 | }, 58 | postData: { 59 | productName: $('#nc_productName').val() ? $('#nc_productName').val() : '', 60 | productFormat: $('#nc_productFormat').val() ? $('#nc_productFormat').val() : '', 61 | productMetering: $('#nc_productMetering').val() ? $('#nc_productMetering').val() : '' 62 | } 63 | }; 64 | $("#product-table").drawTable(obj); 65 | // jQuery("#dealer-table").jqGrid('setFrozenColumns'); 66 | } 67 | } 68 | //选择产品确认按钮 69 | function submitProductChoose(){ 70 | var id = $("#product-table").jqGrid('getGridParam', 'selarrrow'); 71 | var rowData = $("#product-table").jqGrid('getRowData', id); 72 | var selector = $("#chooseProduct-Modle").attr('selector'); 73 | $(selector).val(rowData.productName); 74 | $(selector).attr('productCode', rowData.productCode); 75 | $("#chooseProduct-Modle").modal('hide'); 76 | } -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/autosize.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | Autosize 3.0.15 3 | license: MIT 4 | http://www.jacklmoore.com/autosize 5 | */ 6 | !function(a,b){if("function"==typeof define&&define.amd)define(["exports","module"],b);else if("undefined"!=typeof exports&&"undefined"!=typeof module)b(exports,module);else{var c={exports:{}};b(c.exports,c),a.autosize=c.exports}}(this,function(a,b){"use strict";function c(a){function b(){var b=window.getComputedStyle(a,null);n=b.overflowY,"vertical"===b.resize?a.style.resize="none":"both"===b.resize&&(a.style.resize="horizontal"),m="content-box"===b.boxSizing?-(parseFloat(b.paddingTop)+parseFloat(b.paddingBottom)):parseFloat(b.borderTopWidth)+parseFloat(b.borderBottomWidth),isNaN(m)&&(m=0),e()}function c(b){var c=a.style.width;a.style.width="0px",a.offsetWidth,a.style.width=c,n=b,l&&(a.style.overflowY=b),d()}function d(){var b=window.pageYOffset,c=document.body.scrollTop,d=a.style.height;a.style.height="auto";var e=a.scrollHeight+m;return 0===a.scrollHeight?void(a.style.height=d):(a.style.height=e+"px",o=a.clientWidth,document.documentElement.scrollTop=b,void(document.body.scrollTop=c))}function e(){var b=a.style.height;d();var e=window.getComputedStyle(a,null);if(e.height!==a.style.height?"visible"!==n&&c("visible"):"hidden"!==n&&c("hidden"),b!==a.style.height){var f=g("autosize:resized");a.dispatchEvent(f)}}var h=void 0===arguments[1]?{}:arguments[1],i=h.setOverflowX,j=void 0===i?!0:i,k=h.setOverflowY,l=void 0===k?!0:k;if(a&&a.nodeName&&"TEXTAREA"===a.nodeName&&!f.has(a)){var m=null,n=null,o=a.clientWidth,p=function(){a.clientWidth!==o&&e()},q=function(b){window.removeEventListener("resize",p,!1),a.removeEventListener("input",e,!1),a.removeEventListener("keyup",e,!1),a.removeEventListener("autosize:destroy",q,!1),a.removeEventListener("autosize:update",e,!1),f["delete"](a),Object.keys(b).forEach(function(c){a.style[c]=b[c]})}.bind(a,{height:a.style.height,resize:a.style.resize,overflowY:a.style.overflowY,overflowX:a.style.overflowX,wordWrap:a.style.wordWrap});a.addEventListener("autosize:destroy",q,!1),"onpropertychange"in a&&"oninput"in a&&a.addEventListener("keyup",e,!1),window.addEventListener("resize",p,!1),a.addEventListener("input",e,!1),a.addEventListener("autosize:update",e,!1),f.add(a),j&&(a.style.overflowX="hidden",a.style.wordWrap="break-word"),b()}}function d(a){if(a&&a.nodeName&&"TEXTAREA"===a.nodeName){var b=g("autosize:destroy");a.dispatchEvent(b)}}function e(a){if(a&&a.nodeName&&"TEXTAREA"===a.nodeName){var b=g("autosize:update");a.dispatchEvent(b)}}var f="function"==typeof Set?new Set:function(){var a=[];return{has:function(b){return Boolean(a.indexOf(b)>-1)},add:function(b){a.push(b)},"delete":function(b){a.splice(a.indexOf(b),1)}}}(),g=function(a){return new Event(a)};try{new Event("test")}catch(h){g=function(a){var b=document.createEvent("Event");return b.initEvent(a,!0,!1),b}}var i=null;"undefined"==typeof window||"function"!=typeof window.getComputedStyle?(i=function(a){return a},i.destroy=function(a){return a},i.update=function(a){return a}):(i=function(a,b){return a&&Array.prototype.forEach.call(a.length?a:[a],function(a){return c(a,b)}),a},i.destroy=function(a){return a&&Array.prototype.forEach.call(a.length?a:[a],d),a},i.update=function(a){return a&&Array.prototype.forEach.call(a.length?a:[a],e),a}),b.exports=i}); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/bootstrap-tag.min.js: -------------------------------------------------------------------------------- 1 | /* ========================================================== 2 | * bootstrap-tag.js v2.3.0 3 | * https://github.com/fdeschenes/bootstrap-tag 4 | * ========================================================== 5 | * Copyright 2012 Francois Deschenes. 6 | * 7 | * Licensed under the Apache License, Version 2.0 (the "License"); 8 | * you may not use this file except in compliance with the License. 9 | * You may obtain a copy of the License at 10 | * 11 | * http://www.apache.org/licenses/LICENSE-2.0 12 | * 13 | * Unless required by applicable law or agreed to in writing, software 14 | * distributed under the License is distributed on an "AS IS" BASIS, 15 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 | * See the License for the specific language governing permissions and 17 | * limitations under the License. 18 | * ========================================================== */ 19 | !function(a){"use strict";var b=function(b,c){this.element=a(b),this.options=a.extend(!0,{},a.fn.tag.defaults,c),this.values=a.grep(a.map(this.element.val().split(","),a.trim),function(a){return a.length>0}),this.show()};b.prototype={constructor:b,show:function(){var b=this;b.element.parent().prepend(b.element.detach().hide()),b.element.wrap(a('
')).parent().on("click",function(){b.input.focus()}),b.values.length&&a.each(b.values,function(){b.createBadge(this)}),b.input=a('').attr("placeholder",b.options.placeholder).insertAfter(b.element).on("focus",function(){b.element.parent().addClass("tags-hover")}).on("blur",function(){b.skip||(b.process(),b.element.parent().removeClass("tags-hover"),b.element.siblings(".tag").removeClass("tag-important")),b.skip=!1}).on("keydown",function(c){if(188==c.keyCode||13==c.keyCode||9==c.keyCode)!a.trim(a(this).val())||b.element.siblings(".typeahead").length&&!b.element.siblings(".typeahead").is(":hidden")?188==c.keyCode&&(b.options.autocompleteOnComma?!b.element.siblings(".typeahead").length||b.element.siblings(".typeahead").is(":hidden")?c.preventDefault():(b.input.data("bs_typeahead").select(),c.stopPropagation(),c.preventDefault()):(c.preventDefault(),b.process())):(9!=c.keyCode&&c.preventDefault(),b.process());else if(a.trim(a(this).val())||8!=c.keyCode)b.element.siblings(".tag").removeClass("tag-important");else{var d=b.element.siblings(".tag").length;if(d){var e=b.element.siblings(".tag:eq("+(d-1)+")");e.hasClass("tag-important")?b.remove(d-1):e.addClass("tag-important")}}}).bs_typeahead({source:b.options.source,matcher:function(a){return~a.toLowerCase().indexOf(this.query.toLowerCase())&&(-1==b.inValues(a)||b.options.allowDuplicates)},updater:a.proxy(b.add,b)}),a(b.input.data("bs_typeahead").$menu).on("mousedown",function(){b.skip=!0}),this.element.trigger("shown")},inValues:function(b){if(this.options.caseInsensitive){var c=-1;return a.each(this.values,function(a,d){return d.toLowerCase()==b.toLowerCase()?(c=a,!1):void 0}),c}return a.inArray(b,this.values)},createBadge:function(b){var c=this;a("",{"class":"tag"}).text(b.toString()).append(a('').on("click",function(){c.remove(c.element.siblings(".tag").index(a(this).closest(".tag")))})).insertBefore(c.element)},add:function(b){var c=this;if(!c.options.allowDuplicates){var d=c.inValues(b);if(-1!=d){var e=c.element.siblings(".tag:eq("+d+")");return e.addClass("tag-warning"),void setTimeout(function(){a(e).removeClass("tag-warning")},500)}}this.values.push(b),this.createBadge(b),this.element.val(this.values.join(", ")),this.element.trigger("added",[b])},remove:function(a){if(a>=0){var b=this.values.splice(a,1);this.element.siblings(".tag:eq("+a+")").remove(),this.element.val(this.values.join(", ")),this.element.trigger("removed",[b])}},process:function(){var b=a.grep(a.map(this.input.val().split(","),a.trim),function(a){return a.length>0}),c=this;a.each(b,function(){c.add(this)}),this.input.val("")},skip:!1};var c=a.fn.tag;a.fn.tag=function(c){return this.each(function(){var d=a(this),e=d.data("tag"),f="object"==typeof c&&c;e||d.data("tag",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tag.defaults={allowDuplicates:!1,caseInsensitive:!0,autocompleteOnComma:!1,placeholder:"",source:[]},a.fn.tag.Constructor=b,a.fn.tag.noConflict=function(){return a.fn.tag=c,this},a(window).on("load",function(){a('[data-provide="tag"]').each(function(){var b=a(this);b.data("tag")||b.tag(b.data())})})}(window.jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/bootstrap-wysiwyg.min.js: -------------------------------------------------------------------------------- 1 | /* http://github.com/mindmup/bootstrap-wysiwyg */ 2 | !function(a){"use strict";var b=function(b){var c=a.Deferred(),d=new FileReader;return d.onload=function(a){c.resolve(a.target.result)},d.onerror=c.reject,d.onprogress=c.notify,d.readAsDataURL(b),c.promise()};a.fn.cleanHtml=function(){var b=a(this).html();return b&&b.replace(/(
|\s|

<\/div>| )*$/,"")},a.fn.wysiwyg=function(c){var d,e,f,g=this,h=function(){e.activeToolbarClass&&a(e.toolbarSelector).find(f).each(function(){try{var b=a(this).data(e.commandRole);document.queryCommandState(b)?a(this).addClass(e.activeToolbarClass):a(this).removeClass(e.activeToolbarClass)}catch(c){}})},i=function(a,b){var c=a.split(" "),d=c.shift(),e=c.join(" ")+(b||"");document.execCommand(d,0,e),h()},j=function(b){a.each(b,function(a,b){g.keydown(a,function(a){g.attr("contenteditable")&&g.is(":visible")&&(a.preventDefault(),a.stopPropagation(),i(b))}).keyup(a,function(a){g.attr("contenteditable")&&g.is(":visible")&&(a.preventDefault(),a.stopPropagation())})})},k=function(){try{var a=window.getSelection();if(a.getRangeAt&&a.rangeCount)return a.getRangeAt(0)}catch(b){}},l=function(){d=k()},m=function(){try{var a=window.getSelection();if(d){try{a.removeAllRanges()}catch(b){document.body.createTextRange().select(),document.selection.empty()}a.addRange(d)}}catch(c){}},n=function(c){g.focus(),a.each(c,function(c,d){/^image\//.test(d.type)?a.when(b(d)).done(function(a){i("insertimage",a)}).fail(function(a){e.fileUploadError("file-reader",a)}):e.fileUploadError("unsupported-file-type",d.type)})},o=function(a,b){m(),document.queryCommandSupported("hiliteColor")&&document.execCommand("hiliteColor",0,b||"transparent"),l(),a.data(e.selectionMarker,b)},p=function(b,c){b.find(f).click(function(){m(),g.focus(),i(a(this).data(c.commandRole)),l()}),b.find("[data-toggle=dropdown]").click(m);var d=!!window.navigator.msPointerEnabled||!!document.all&&!!document.addEventListener;b.find("input[type=text][data-"+c.commandRole+"]").on("webkitspeechchange change",function(){var b=this.value;this.value="",m(),b&&(g.focus(),i(a(this).data(c.commandRole),b)),l()}).on("focus",function(){if(!d){var b=a(this);b.data(c.selectionMarker)||(o(b,c.selectionColor),b.focus())}}).on("blur",function(){if(!d){var b=a(this);b.data(c.selectionMarker)&&o(b,!1)}}),b.find("input[type=file][data-"+c.commandRole+"]").change(function(){m(),"file"===this.type&&this.files&&this.files.length>0&&n(this.files),l(),this.value=""})},q=function(){g.on("dragenter dragover",!1).on("drop",function(a){var b=a.originalEvent.dataTransfer;a.stopPropagation(),a.preventDefault(),b&&b.files&&b.files.length>0&&n(b.files)})};return e=a.extend({},a.fn.wysiwyg.defaults,c),f="a[data-"+e.commandRole+"],button[data-"+e.commandRole+"],input[type=button][data-"+e.commandRole+"]",j(e.hotKeys),e.dragAndDropImages&&q(),p(a(e.toolbarSelector),e),g.attr("contenteditable",!0).on("mouseup keyup mouseout",function(){l(),h()}),a(window).bind("touchend",function(a){var b=g.is(a.target)||g.has(a.target).length>0,c=k(),d=c&&c.startContainer===c.endContainer&&c.startOffset===c.endOffset;d&&!b||(l(),h())}),this},a.fn.wysiwyg.defaults={hotKeys:{"ctrl+b meta+b":"bold","ctrl+i meta+i":"italic","ctrl+u meta+u":"underline","ctrl+z meta+z":"undo","ctrl+y meta+y meta+shift+z":"redo","ctrl+l meta+l":"justifyleft","ctrl+r meta+r":"justifyright","ctrl+e meta+e":"justifycenter","ctrl+j meta+j":"justifyfull","shift+tab":"outdent",tab:"indent"},toolbarSelector:"[data-role=editor-toolbar]",commandRole:"edit",activeToolbarClass:"btn-info",selectionMarker:"edit-focus-marker",selectionColor:"darkgrey",dragAndDropImages:!0,fileUploadError:function(a,b){console.log("File upload error",a,b)}}}(window.jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/buttons.colVis.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Column visibility buttons for Buttons and DataTables. 3 | * 2015 SpryMedia Ltd - datatables.net/license 4 | */ 5 | !function(a){"function"==typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(b){return a(b,window,document)}):"object"==typeof exports?module.exports=function(b,c){return b||(b=window),c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$),c.fn.dataTable.Buttons||require("datatables.net-buttons")(b,c),a(c,b,b.document)}:a(jQuery,window,document)}(function(a,b,c,d){"use strict";var e=a.fn.dataTable;return a.extend(e.ext.buttons,{colvis:function(a,b){return{extend:"collection",text:function(a){return a.i18n("buttons.colvis","Column visibility")},className:"buttons-colvis",buttons:[{extend:"columnsToggle",columns:b.columns}]}},columnsToggle:function(a,b){var c=a.columns(b.columns).indexes().map(function(a){return{extend:"columnToggle",columns:a}}).toArray();return c},columnToggle:function(a,b){return{extend:"columnVisibility",columns:b.columns}},columnsVisibility:function(a,b){var c=a.columns(b.columns).indexes().map(function(a){return{extend:"columnVisibility",columns:a,visibility:b.visibility}}).toArray();return c},columnVisibility:{columns:d,text:function(a,b,c){return c._columnText(a,c.columns)},className:"buttons-columnVisibility",action:function(a,b,c,e){var f=b.columns(e.columns),g=f.visible();f.visible(e.visibility!==d?e.visibility:!(g.length?g[0]:!1))},init:function(a,b,c){var d=this,e=a.column(c.columns);a.on("column-visibility.dt"+c.namespace,function(a,b,e,f){b.bDestroying||e!==c.columns||d.active(f)}).on("column-reorder.dt"+c.namespace,function(b,e,f){if(1===a.columns(c.columns).count()){"number"==typeof c.columns&&(c.columns=f.mapping[c.columns]);var g=a.column(c.columns);d.text(c._columnText(a,c.columns)),d.active(g.visible())}}),this.active(e.visible())},destroy:function(a,b,c){a.off("column-visibility.dt"+c.namespace).off("column-reorder.dt"+c.namespace)},_columnText:function(a,b){var c=a.column(b).index();return a.settings()[0].aoColumns[c].sTitle.replace(/\n/g," ").replace(/<.*?>/g,"").replace(/^\s+|\s+$/g,"")}},colvisRestore:{className:"buttons-colvisRestore",text:function(a){return a.i18n("buttons.colvisRestore","Restore visibility")},init:function(a,b,c){c._visOriginal=a.columns().indexes().map(function(b){return a.column(b).visible()}).toArray()},action:function(a,b,c,d){b.columns().every(function(a){var c=b.colReorder&&b.colReorder.transpose?b.colReorder.transpose(a,"toOriginal"):a;this.visible(d._visOriginal[c])})}},colvisGroup:{className:"buttons-colvisGroup",action:function(a,b,c,d){b.columns(d.show).visible(!0),b.columns(d.hide).visible(!1)},show:[],hide:[]}}),e.Buttons}); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/buttons.print.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Print button for Buttons and DataTables. 3 | * 2015 SpryMedia Ltd - datatables.net/license 4 | */ 5 | !function(a){"function"==typeof define&&define.amd?define(["jquery","datatables.net","datatables.net-buttons"],function(b){return a(b,window,document)}):"object"==typeof exports?module.exports=function(b,c){return b||(b=window),c&&c.fn.dataTable||(c=require("datatables.net")(b,c).$),c.fn.dataTable.Buttons||require("datatables.net-buttons")(b,c),a(c,b,b.document)}:a(jQuery,window,document)}(function(a,b,c,d){"use strict";var e=a.fn.dataTable,f=c.createElement("a"),g=function(b){var c,d=a(b).clone()[0];return"link"===d.nodeName.toLowerCase()&&(f.href=d.href,c=f.host,-1===c.indexOf("/")&&0!==f.pathname.indexOf("/")&&(c+="/"),d.href=f.protocol+"//"+c+f.pathname+f.search),d.outerHTML};return e.ext.buttons.print={className:"buttons-print",text:function(a){return a.i18n("buttons.print","Print")},action:function(c,d,e,f){var h=d.buttons.exportData(f.exportOptions),i=function(a,b){for(var c="",d=0,e=a.length;e>d;d++)c+="<"+b+">"+a[d]+"";return c+""},j='';f.header&&(j+=""+i(h.header,"th")+""),j+="";for(var k=0,l=h.body.length;l>k;k++)j+=i(h.body[k],"td");j+="",f.footer&&(j+=""+i(h.footer,"th")+"");var m=b.open("",""),n=f.title;"function"==typeof n&&(n=n()),-1!==n.indexOf("*")&&(n=n.replace("*",a("title").text())),m.document.close();var o=""+n+"";a("style, link").each(function(){o+=g(this)}),a(m.document.head).html(o),a(m.document.body).html("

"+n+"

"+f.message+"
"+j),f.customize&&f.customize(m),setTimeout(function(){f.autoPrint&&(m.print(),m.close())},250)},title:"*",message:"",exportOptions:{},header:!0,footer:!1,autoPrint:!0,customize:null},e.Buttons}); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/grid.locale-en.js: -------------------------------------------------------------------------------- 1 | !function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery","../grid.base"],a):a(jQuery)}(function(a){a.jgrid=a.jgrid||{},a.jgrid.hasOwnProperty("regional")||(a.jgrid.regional=[]),a.jgrid.regional.en={defaults:{recordtext:"View {0} - {1} of {2}",emptyrecords:"No records to view",loadtext:"Loading...",savetext:"Saving...",pgtext:"Page {0} of {1}",pgfirst:"First Page",pglast:"Last Page",pgnext:"Next Page",pgprev:"Previous Page",pgrecs:"Records per Page",showhide:"Toggle Expand Collapse Grid",pagerCaption:"Grid::Page Settings",pageText:"Page:",recordPage:"Records per Page",nomorerecs:"No more records...",scrollPullup:"Pull up to load more...",scrollPulldown:"Pull down to refresh...",scrollRefresh:"Release to refresh..."},search:{caption:"Search...",Find:"Find",Reset:"Reset",odata:[{oper:"eq",text:"equal"},{oper:"ne",text:"not equal"},{oper:"lt",text:"less"},{oper:"le",text:"less or equal"},{oper:"gt",text:"greater"},{oper:"ge",text:"greater or equal"},{oper:"bw",text:"begins with"},{oper:"bn",text:"does not begin with"},{oper:"in",text:"is in"},{oper:"ni",text:"is not in"},{oper:"ew",text:"ends with"},{oper:"en",text:"does not end with"},{oper:"cn",text:"contains"},{oper:"nc",text:"does not contain"},{oper:"nu",text:"is null"},{oper:"nn",text:"is not null"}],groupOps:[{op:"AND",text:"all"},{op:"OR",text:"any"}],operandTitle:"Click to select search operation.",resetTitle:"Reset Search Value"},edit:{addCaption:"Add Record",editCaption:"Edit Record",bSubmit:"Submit",bCancel:"Cancel",bClose:"Close",saveData:"Data has been changed! Save changes?",bYes:"Yes",bNo:"No",bExit:"Cancel",msg:{required:"Field is required",number:"Please, enter valid number",minValue:"value must be greater than or equal to ",maxValue:"value must be less than or equal to",email:"is not a valid e-mail",integer:"Please, enter valid integer value",date:"Please, enter valid date value",url:"is not a valid URL. Prefix required ('http://' or 'https://')",nodefined:" is not defined!",novalue:" return value is required!",customarray:"Custom function should return array!",customfcheck:"Custom function should be present in case of custom checking!"}},view:{caption:"View Record",bClose:"Close"},del:{caption:"Delete",msg:"Delete selected record(s)?",bSubmit:"Delete",bCancel:"Cancel"},nav:{edittext:"",edittitle:"Edit selected row",addtext:"",addtitle:"Add new row",deltext:"",deltitle:"Delete selected row",searchtext:"",searchtitle:"Find records",refreshtext:"",refreshtitle:"Reload Grid",alertcap:"Warning",alerttext:"Please, select row",viewtext:"",viewtitle:"View selected row",savetext:"",savetitle:"Save row",canceltext:"",canceltitle:"Cancel row editing",selectcaption:"Actions..."},col:{caption:"Select columns",bSubmit:"Ok",bCancel:"Cancel"},errors:{errcap:"Error",nourl:"No url is set",norecords:"No records to process",model:"Length of colNames <> colModel!"},formatter:{integer:{thousandsSeparator:",",defaultValue:"0"},number:{decimalSeparator:".",thousandsSeparator:",",decimalPlaces:2,defaultValue:"0.00"},currency:{decimalSeparator:".",thousandsSeparator:",",decimalPlaces:2,prefix:"",suffix:"",defaultValue:"0.00"},date:{dayNames:["Sun","Mon","Tue","Wed","Thr","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"],AmPm:["am","pm","AM","PM"],S:function(a){return 11>a||a>13?["st","nd","rd","th"][Math.min((a-1)%10,3)]:"th"},srcformat:"Y-m-d",newformat:"n/j/Y",parseRe:/[#%\\\/:_;.,\t\s-]/,masks:{ISO8601Long:"Y-m-d H:i:s",ISO8601Short:"Y-m-d",ShortDate:"n/j/Y",LongDate:"l, F d, Y",FullDateTime:"l, F d, Y g:i:s A",MonthDay:"F d",ShortTime:"g:i A",LongTime:"g:i:s A",SortableDateTime:"Y-m-d\\TH:i:s",UniversalSortableDateTime:"Y-m-d H:i:sO",YearMonth:"F, Y"},reformatAfterEdit:!1,userLocalTime:!1},baseLinkUrl:"",showAction:"",target:"",checkbox:{disabled:!0},idName:"id"}}}); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/html5shiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/jqpaginator.min.js: -------------------------------------------------------------------------------- 1 | /*! jqpaginator-1.2.1 2 | * http://jqPaginator.keenwon.com 3 | */ 4 | 5 | !function(a){"use strict";a.jqPaginator=function(b,c){if(!(this instanceof a.jqPaginator))return new a.jqPaginator(b,c);var d=this;return d.$container=a(b),d.$container.data("jqPaginator",d),d.init=function(){(c.first||c.prev||c.next||c.last||c.page)&&(c=a.extend({},{first:"",prev:"",next:"",last:"",page:""},c)),d.options=a.extend({},a.jqPaginator.defaultOptions,c),d.verify(),d.extendJquery(),d.render(),d.fireEvent(this.options.currentPage,"init")},d.verify=function(){var a=d.options;if(!d.isNumber(a.totalPages))throw new Error("[jqPaginator] type error: totalPages");if(!d.isNumber(a.totalCounts))throw new Error("[jqPaginator] type error: totalCounts");if(!d.isNumber(a.pageSize))throw new Error("[jqPaginator] type error: pageSize");if(!d.isNumber(a.currentPage))throw new Error("[jqPaginator] type error: currentPage");if(!d.isNumber(a.visiblePages))throw new Error("[jqPaginator] type error: visiblePages");if(!a.totalPages&&!a.totalCounts)throw new Error("[jqPaginator] totalCounts or totalPages is required");if(!a.totalPages&&a.totalCounts&&!a.pageSize)throw new Error("[jqPaginator] pageSize is required");if(a.totalCounts&&a.pageSize&&(a.totalPages=Math.ceil(a.totalCounts/a.pageSize)),a.currentPage<1||a.currentPage>a.totalPages)throw new Error("[jqPaginator] currentPage is incorrect");if(a.totalPages<1)throw new Error("[jqPaginator] totalPages cannot be less currentPage")},d.extendJquery=function(){a.fn.jqPaginatorHTML=function(b){return b?this.before(b).remove():a("

").append(this.eq(0).clone()).html()}},d.render=function(){d.renderHtml(),d.setStatus(),d.bindEvents()},d.renderHtml=function(){for(var b=[],c=d.getPages(),e=0,f=c.length;e=b.totalPages)&&a("[jp-role=next]",d.$container).addClass(b.disableClass),(!d.isEnable("last")||b.currentPage>=b.totalPages)&&a("[jp-role=last]",d.$container).addClass(b.disableClass),a("[jp-role=page]",d.$container).removeClass(b.activeClass),a("[jp-role=page][jp-data="+b.currentPage+"]",d.$container).addClass(b.activeClass)},d.getPages=function(){var a=[],b=d.options.visiblePages,c=d.options.currentPage,e=d.options.totalPages;b>e&&(b=e);var f=Math.floor(b/2),g=c-f+1-b%2,h=c+f;g<1&&(g=1,h=b),h>e&&(h=e,g=1+e-b);for(var i=g;i<=h;)a.push(i),i++;return a},d.isNumber=function(a){var b=typeof a;return"number"===b||"undefined"===b},d.isEnable=function(a){return d.options[a]&&"string"==typeof d.options[a]},d.switchPage=function(a){d.options.currentPage=a,d.render()},d.fireEvent=function(a,b){return"function"!=typeof d.options.onPageChange||!1!==d.options.onPageChange(a,b)},d.callMethod=function(b,c){switch(b){case"option":d.options=a.extend({},d.options,c),d.verify(),d.render();break;case"destroy":d.$container.empty(),d.$container.removeData("jqPaginator");break;default:throw new Error('[jqPaginator] method "'+b+'" does not exist')}return d.$container},d.bindEvents=function(){var b=d.options;d.$container.off(),d.$container.on("click","[jp-role]",function(){var c=a(this);if(!c.hasClass(b.disableClass)&&!c.hasClass(b.activeClass)){var e=+c.attr("jp-data");d.fireEvent(e,"change")&&d.switchPage(e)}})},d.init(),d.$container},a.jqPaginator.defaultOptions={wrapper:"",first:'

  • First
  • ',prev:'',next:'',last:'
  • Last
  • ',page:'
  • {{page}}
  • ',totalPages:0,totalCounts:0,pageSize:0,currentPage:1,visiblePages:7,disableClass:"disabled",activeClass:"active",onPageChange:null},a.fn.jqPaginator=function(){var b=this,c=Array.prototype.slice.call(arguments);if("string"==typeof c[0]){var d=a(b).data("jqPaginator");if(d)return d.callMethod(c[0],c[1]);throw new Error("[jqPaginator] the element is not instantiated")}return new a.jqPaginator(this,c[0])}}(jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/jquery.dataTables.bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /* Set the defaults for DataTables initialisation */ 2 | $.extend(!0,$.fn.dataTable.defaults,{sDom:"<'row'<'col-xs-6'l><'col-xs-6'f>r>t<'row'<'col-xs-6'i><'col-xs-6'p>>",oLanguage:{sLengthMenu:"Display _MENU_ records"}}),$.extend($.fn.dataTableExt.oStdClasses,{sWrapper:"dataTables_wrapper form-inline",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm"}),$.fn.dataTable.Api?($.fn.dataTable.defaults.renderer="bootstrap",$.fn.dataTable.ext.renderer.pageButton.bootstrap=function(a,b,c,d,e,f){var g,h,i=new $.fn.dataTable.Api(a),j=a.oClasses,k=a.oLanguage.oPaginate,l=function(b,d){var m,n,o,p,q=function(a){return a.preventDefault(),$(a.target).parent().hasClass("disabled")?!1:void("ellipsis"!==a.data.action&&i.page(a.data.action).draw(!1))};for(m=0,n=d.length;n>m;m++)if(p=d[m],$.isArray(p))l(b,p);else{switch(g="",h="",p){case"ellipsis":g="…",h="disabled";break;case"first":g=k.sFirst,h=p+(e>0?"":" disabled");break;case"previous":g=k.sPrevious,h=p+(e>0?"":" disabled");break;case"next":g=k.sNext,h=p+(f-1>e?"":" disabled");break;case"last":g=k.sLast,h=p+(f-1>e?"":" disabled");break;default:g=p+1,h=e===p?"active":""}g&&(o=$("
  • ",{"class":j.sPageButton+" "+h,"aria-controls":a.sTableId,tabindex:a.iTabIndex,id:0===c&&"string"==typeof p?a.sTableId+"_"+p:null}).append($("",{href:"#"}).html(g)).appendTo(b),a.oApi._fnBindAction(o,{action:p},q))}};l($(b).empty().html('
      ').children("ul"),d)}):($.fn.dataTable.defaults.sPaginationType="bootstrap",$.fn.dataTableExt.oApi.fnPagingInfo=function(a){return{iStart:a._iDisplayStart,iEnd:a.fnDisplayEnd(),iLength:a._iDisplayLength,iTotal:a.fnRecordsTotal(),iFilteredTotal:a.fnRecordsDisplay(),iPage:-1===a._iDisplayLength?0:Math.ceil(a._iDisplayStart/a._iDisplayLength),iTotalPages:-1===a._iDisplayLength?0:Math.ceil(a.fnRecordsDisplay()/a._iDisplayLength)}},$.extend($.fn.dataTableExt.oPagination,{bootstrap:{fnInit:function(a,b,c){var d=(a.oLanguage.oPaginate,function(b){alert(1),b.preventDefault(),a.oApi._fnPageChange(a,b.data.action)&&c(a)});$(b).append('
      ');var e=$("a",b);$(e[0]).bind("click.DT",{action:"first"},d),$(e[1]).bind("click.DT",{action:"previous"},d),$(e[2]).bind("click.DT",{action:"next"},d),$(e[3]).bind("click.DT",{action:"last"},d)},fnUpdate:function(a,b){var c,d,e,f,g,h,i=5,j=a.oInstance.fnPagingInfo(),k=a.aanFeatures.p,l=Math.floor(i/2);for(j.iTotalPages=j.iTotalPages-l?(g=j.iTotalPages-i+1,h=j.iTotalPages):(g=j.iPage-l+1,h=g+i-1),c=0,d=k.length;d>c;c++){for($("li:gt(0)",k[c]).filter(":not(.next,.prev)").remove(),e=g;h>=e;e++)f=e==j.iPage+1?'class="active"':"",$("
    • '+e+"
    • ").insertBefore($("li.next:eq(0)",k[c])[0]).bind("click",function(c){c.preventDefault(),a._iDisplayStart=(parseInt($("a",this).text(),10)-1)*j.iLength,b(a)});0===j.iPage?$("li.prev",k[c]).addClass("disabled"):$("li.prev",k[c]).removeClass("disabled"),j.iPage===j.iTotalPages-1||0===j.iTotalPages?$("li.next",k[c]).addClass("disabled"):$("li.next",k[c]).removeClass("disabled")}}}})),$.fn.DataTable.TableTools&&($.extend(!0,$.fn.DataTable.TableTools.classes,{container:"DTTT btn-group",buttons:{normal:"btn btn-default",disabled:"disabled"},collection:{container:"DTTT_dropdown dropdown-menu",buttons:{normal:"",disabled:"disabled"}},print:{info:"DTTT_print_info modal"},select:{row:"active"}}),$.extend(!0,$.fn.DataTable.TableTools.DEFAULTS.oTags,{collection:{container:"ul",button:"li",liner:"a"}})); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/jquery.easypiechart.min.js: -------------------------------------------------------------------------------- 1 | /**! 2 | * easy-pie-chart 3 | * Lightweight plugin to render simple, animated and retina optimized pie charts 4 | * 5 | * @license 6 | * @author Robert Fleischmann (http://robert-fleischmann.de) 7 | * @version 2.1.7 8 | **/ 9 | !function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){var b=function(a,b){var c,d=document.createElement("canvas");a.appendChild(d),"object"==typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(d);var e=d.getContext("2d");d.width=d.height=b.size;var f=1;window.devicePixelRatio>1&&(f=window.devicePixelRatio,d.style.width=d.style.height=[b.size,"px"].join(""),d.width=d.height=b.size*f,e.scale(f,f)),e.translate(b.size/2,b.size/2),e.rotate((-0.5+b.rotate/180)*Math.PI);var g=(b.size-b.lineWidth)/2;b.scaleColor&&b.scaleLength&&(g-=b.scaleLength+2),Date.now=Date.now||function(){return+new Date};var h=function(a,b,c){c=Math.min(Math.max(-1,c||0),1);var d=0>=c;e.beginPath(),e.arc(0,0,g,0,2*Math.PI*c,d),e.strokeStyle=a,e.lineWidth=b,e.stroke()},i=function(){var a,c;e.lineWidth=1,e.fillStyle=b.scaleColor,e.save();for(var d=24;d>0;--d)d%6===0?(c=b.scaleLength,a=0):(c=.6*b.scaleLength,a=b.scaleLength-c),e.fillRect(-b.size/2+a,0,c,1),e.rotate(Math.PI/12);e.restore()},j=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(a){window.setTimeout(a,1e3/60)}}(),k=function(){b.scaleColor&&i(),b.trackColor&&h(b.trackColor,b.trackWidth||b.lineWidth,1)};this.getCanvas=function(){return d},this.getCtx=function(){return e},this.clear=function(){e.clearRect(b.size/-2,b.size/-2,b.size,b.size)},this.draw=function(a){b.scaleColor||b.trackColor?e.getImageData&&e.putImageData?c?e.putImageData(c,0,0):(k(),c=e.getImageData(0,0,b.size*f,b.size*f)):(this.clear(),k()):this.clear(),e.lineCap=b.lineCap;var d;d="function"==typeof b.barColor?b.barColor(a):b.barColor,h(d,b.lineWidth,a/100)}.bind(this),this.animate=function(a,c){var d=Date.now();b.onStart(a,c);var e=function(){var f=Math.min(Date.now()-d,b.animate.duration),g=b.easing(this,f,a,c-a,b.animate.duration);this.draw(g),b.onStep(a,c,g),f>=b.animate.duration?b.onStop(a,c):j(e)}.bind(this);j(e)}.bind(this)},c=function(a,c){var d={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(a,b,c,d,e){return b/=e/2,1>b?d/2*b*b+c:-d/2*(--b*(b-2)-1)+c},onStart:function(a,b){},onStep:function(a,b,c){},onStop:function(a,b){}};if("undefined"!=typeof b)d.renderer=b;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");d.renderer=SVGRenderer}var e={},f=0,g=function(){this.el=a,this.options=e;for(var b in d)d.hasOwnProperty(b)&&(e[b]=c&&"undefined"!=typeof c[b]?c[b]:d[b],"function"==typeof e[b]&&(e[b]=e[b].bind(this)));"string"==typeof e.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[e.easing])?e.easing=jQuery.easing[e.easing]:e.easing=d.easing,"number"==typeof e.animate&&(e.animate={duration:e.animate,enabled:!0}),"boolean"!=typeof e.animate||e.animate||(e.animate={duration:1e3,enabled:e.animate}),this.renderer=new e.renderer(a,e),this.renderer.draw(f),a.dataset&&a.dataset.percent?this.update(parseFloat(a.dataset.percent)):a.getAttribute&&a.getAttribute("data-percent")&&this.update(parseFloat(a.getAttribute("data-percent"))),a.style.width=a.style.height=e.size+"px",a.style.lineHeight=e.size-1+"px"}.bind(this);this.update=function(a){return a=parseFloat(a),e.animate.enabled?this.renderer.animate(f,a):this.renderer.draw(a),f=a,this}.bind(this),this.disableAnimation=function(){return e.animate.enabled=!1,this},this.enableAnimation=function(){return e.animate.enabled=!0,this},g()};a.fn.easyPieChart=function(b){return this.each(function(){var d;a.data(this,"easyPieChart")||(d=a.extend({},b,a(this).data()),a.data(this,"easyPieChart",new c(this,d)))})}}); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/jquery.flot.resize.min.js: -------------------------------------------------------------------------------- 1 | /* Flot plugin for automatically redrawing plots as the placeholder resizes. 2 | 3 | Copyright (c) 2007-2014 IOLA and Ole Laursen. 4 | Licensed under the MIT license. 5 | 6 | It works by listening for changes on the placeholder div (through the jQuery 7 | resize event plugin) - if the size changes, it will redraw the plot. 8 | 9 | There are no options. If you need to disable the plugin for some plots, you 10 | can just fix the size of their placeholders. 11 | 12 | */ 13 | !function(a,b,c){"$:nomunge";function d(c){h===!0&&(h=c||1);for(var i=f.length-1;i>=0;i--){var m=a(f[i]);if(m[0]==b||m.is(":visible")){var n=m.width(),o=m.height(),p=m.data(k);!p||n===p.w&&o===p.h||(m.trigger(j,[p.w=n,p.h=o]),h=c||!0)}else p=m.data(k),p.w=0,p.h=0}null!==e&&(h&&(null==c||1e3>c-h)?e=b.requestAnimationFrame(d):(e=setTimeout(d,g[l]),h=!1))}var e,f=[],g=a.resize=a.extend(a.resize,{}),h=!1,i="setTimeout",j="resize",k=j+"-special-event",l="pendingDelay",m="activeDelay",n="throttleWindow";g[l]=200,g[m]=20,g[n]=!0,a.event.special[j]={setup:function(){if(!g[n]&&this[i])return!1;var b=a(this);f.push(this),b.data(k,{w:b.width(),h:b.height()}),1===f.length&&(e=c,d())},teardown:function(){if(!g[n]&&this[i])return!1;for(var b=a(this),c=f.length-1;c>=0;c--)if(f[c]==this){f.splice(c,1);break}b.removeData(k),f.length||(h?cancelAnimationFrame(e):clearTimeout(e),e=null)},add:function(b){function d(b,d,f){var g=a(this),h=g.data(k)||{};h.w=d!==c?d:g.width(),h.h=f!==c?f:g.height(),e.apply(this,arguments)}if(!g[n]&&this[i])return!1;var e;return a.isFunction(b)?(e=b,d):(e=b.handler,void(b.handler=d))}},b.requestAnimationFrame||(b.requestAnimationFrame=function(){return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||b.oRequestAnimationFrame||b.msRequestAnimationFrame||function(a,c){return b.setTimeout(function(){a((new Date).getTime())},g[m])}}()),b.cancelAnimationFrame||(b.cancelAnimationFrame=function(){return b.webkitCancelRequestAnimationFrame||b.mozCancelRequestAnimationFrame||b.oCancelRequestAnimationFrame||b.msCancelRequestAnimationFrame||clearTimeout}())}(jQuery,this),function(a){function b(a){function b(){var b=a.getPlaceholder();0!=b.width()&&0!=b.height()&&(a.resize(),a.setupGrid(),a.draw())}function c(a,c){a.getPlaceholder().resize(b)}function d(a,c){a.getPlaceholder().unbind("resize",b)}a.hooks.bindEvents.push(c),a.hooks.shutdown.push(d)}var c={};a.plot.plugins.push({init:b,options:c,name:"resize",version:"1.0"})}(jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/jquery.gritter.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Gritter for jQuery 3 | * http://www.boedesign.com/ 4 | * 5 | * Copyright (c) 2012 Jordan Boesch 6 | * Dual licensed under the MIT and GPL licenses. 7 | * 8 | * Date: February 24, 2012 9 | * Version: 1.7.4 10 | */ 11 | !function(a){a.gritter={},a.gritter.options={position:"",class_name:"",fade_in_speed:"medium",fade_out_speed:1e3,time:6e3},a.gritter.add=function(a){try{return b.add(a||{})}catch(c){var d="Gritter Error: "+c;"undefined"!=typeof console&&console.error?console.error(d,a):alert(d)}},a.gritter.remove=function(a,c){b.removeSpecific(a,c||{})},a.gritter.removeAll=function(a){b.stop(a||{})};var b={position:"",fade_in_speed:"",fade_out_speed:"",time:"",_custom_timer:0,_item_count:0,_is_setup:0,_tpl_close:'Close Notification',_tpl_title:'[[title]]',_tpl_item:'',_tpl_wrap:'
      ',add:function(c){if("string"==typeof c&&(c={text:c}),null===c.text)throw'You must supply "text" parameter.';this._is_setup||this._runSetup();var d=c.title,e=c.text,f=c.image||"",g=c.sticky||!1,h=c.class_name||a.gritter.options.class_name,i=a.gritter.options.position,j=c.time||"";this._verifyWrapper(),this._item_count++;var k=this._item_count,l=this._tpl_item;a(["before_open","after_open","before_close","after_close"]).each(function(d,e){b["_"+e+"_"+k]=a.isFunction(c[e])?c[e]:function(){}}),this._custom_timer=0,j&&(this._custom_timer=j);var m=""!=f?'':"",n=""!=f?"gritter-with-image":"gritter-without-image";if(d=d?this._str_replace("[[title]]",d,this._tpl_title):"",l=this._str_replace(["[[title]]","[[text]]","[[close]]","[[image]]","[[number]]","[[class_name]]","[[item_class]]"],[d,e,this._tpl_close,m,this._item_count,n,h],l),this["_before_open_"+k]()===!1)return!1;a("#gritter-notice-wrapper").addClass(i).append(l);var o=a("#gritter-item-"+this._item_count);return o.fadeIn(this.fade_in_speed,function(){b["_after_open_"+k](a(this))}),g||this._setFadeTimer(o,k),a(o).bind("mouseenter mouseleave",function(c){"mouseenter"==c.type?g||b._restoreItemIfFading(a(this),k):g||b._setFadeTimer(a(this),k),b._hoverState(a(this),c.type)}),a(o).find(".gritter-close").click(function(){return b.removeSpecific(k,{},null,!0),!1}),k},_countRemoveWrapper:function(b,c,d){c.remove(),this["_after_close_"+b](c,d),0==a(".gritter-item-wrapper").length&&a("#gritter-notice-wrapper").remove()},_fade:function(a,c,d,e){var d=d||{},f="undefined"!=typeof d.fade?d.fade:!0,g=d.speed||this.fade_out_speed,h=e;this["_before_close_"+c](a,h),e&&a.unbind("mouseenter mouseleave"),f?a.animate({opacity:0},g,function(){a.animate({height:0},300,function(){b._countRemoveWrapper(c,a,h)})}):this._countRemoveWrapper(c,a)},_hoverState:function(a,b){"mouseenter"==b?(a.addClass("hover"),a.find(".gritter-close").show()):(a.removeClass("hover"),a.find(".gritter-close").hide())},removeSpecific:function(b,c,d,e){if(!d)var d=a("#gritter-item-"+b);this._fade(d,b,c||{},e)},_restoreItemIfFading:function(a,b){clearTimeout(this["_int_id_"+b]),a.stop().css({opacity:"",height:""})},_runSetup:function(){for(opt in a.gritter.options)this[opt]=a.gritter.options[opt];this._is_setup=1},_setFadeTimer:function(a,c){var d=this._custom_timer?this._custom_timer:this.time;this["_int_id_"+c]=setTimeout(function(){b._fade(a,c)},d)},stop:function(b){var c=a.isFunction(b.before_close)?b.before_close:function(){},d=a.isFunction(b.after_close)?b.after_close:function(){},e=a("#gritter-notice-wrapper");c(e),e.fadeOut(function(){a(this).remove(),d()})},_str_replace:function(a,b,c,d){var e=0,f=0,g="",h="",i=0,j=0,k=[].concat(a),l=[].concat(b),m=c,n=l instanceof Array,o=m instanceof Array;for(m=[].concat(m),d&&(this.window[d]=0),e=0,i=m.length;i>e;e++)if(""!==m[e])for(f=0,j=k.length;j>f;f++)g=m[e]+"",h=n?void 0!==l[f]?l[f]:"":l[0],m[e]=g.split(k[f]).join(h),d&&m[e]!==g&&(this.window[d]+=(g.length-m[e].length)/k[f].length);return o?m:m[0]},_verifyWrapper:function(){0==a("#gritter-notice-wrapper").length&&a("body").append(this._tpl_wrap)}}}(jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/jquery.hotkeys.index.min.js: -------------------------------------------------------------------------------- 1 | /*jslint browser: true*/ 2 | /*jslint jquery: true*/ 3 | !function(a){function b(b){if("string"==typeof b.data&&(b.data={keys:b.data}),b.data&&b.data.keys&&"string"==typeof b.data.keys){var c=b.handler,d=b.data.keys.toLowerCase().split(" ");b.handler=function(b){if(this===b.target||!(a.hotkeys.options.filterInputAcceptingElements&&a.hotkeys.textInputTypes.test(b.target.nodeName)||a.hotkeys.options.filterContentEditable&&a(b.target).attr("contenteditable")||a.hotkeys.options.filterTextInputs&&a.inArray(b.target.type,a.hotkeys.textAcceptingInputTypes)>-1)){var e="keypress"!==b.type&&a.hotkeys.specialKeys[b.which],f=String.fromCharCode(b.which).toLowerCase(),g="",h={};a.each(["alt","ctrl","shift"],function(a,c){b[c+"Key"]&&e!==c&&(g+=c+"+")}),b.metaKey&&!b.ctrlKey&&"meta"!==e&&(g+="meta+"),b.metaKey&&"meta"!==e&&g.indexOf("alt+ctrl+shift+")>-1&&(g=g.replace("alt+ctrl+shift+","hyper+")),e?h[g+e]=!0:(h[g+f]=!0,h[g+a.hotkeys.shiftNums[f]]=!0,"shift+"===g&&(h[a.hotkeys.shiftNums[f]]=!0));for(var i=0,j=d.length;j>i;i++)if(h[d[i]])return c.apply(this,arguments)}}}}a.hotkeys={version:"0.2.0",specialKeys:{8:"backspace",9:"tab",10:"return",13:"return",16:"shift",17:"ctrl",18:"alt",19:"pause",20:"capslock",27:"esc",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down",45:"insert",46:"del",59:";",61:"=",96:"0",97:"1",98:"2",99:"3",100:"4",101:"5",102:"6",103:"7",104:"8",105:"9",106:"*",107:"+",109:"-",110:".",111:"/",112:"f1",113:"f2",114:"f3",115:"f4",116:"f5",117:"f6",118:"f7",119:"f8",120:"f9",121:"f10",122:"f11",123:"f12",144:"numlock",145:"scroll",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"},shiftNums:{"`":"~",1:"!",2:"@",3:"#",4:"$",5:"%",6:"^",7:"&",8:"*",9:"(",0:")","-":"_","=":"+",";":": ","'":'"',",":"<",".":">","/":"?","\\":"|"},textAcceptingInputTypes:["text","password","number","email","url","range","date","month","week","time","datetime","datetime-local","search","color","tel"],textInputTypes:/textarea|input|select/i,options:{filterInputAcceptingElements:!0,filterTextInputs:!0,filterContentEditable:!0}},a.each(["keydown","keyup","keypress"],function(){a.event.special[this]={add:b}})}(jQuery||this.jQuery||window.jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/jquery.hotkeys.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Hotkeys Plugin 3 | * Copyright 2010, John Resig 4 | * Dual licensed under the MIT or GPL Version 2 licenses. 5 | * 6 | * Based upon the plugin by Tzury Bar Yochay: 7 | * http://github.com/tzuryby/hotkeys 8 | * 9 | * Original idea by: 10 | * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/ 11 | */ 12 | 13 | (function(jQuery){ 14 | 15 | jQuery.hotkeys = { 16 | version: "0.8", 17 | 18 | specialKeys: { 19 | 8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause", 20 | 20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home", 21 | 37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del", 22 | 96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7", 23 | 104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/", 24 | 112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", 25 | 120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta" 26 | }, 27 | 28 | shiftNums: { 29 | "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", 30 | "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<", 31 | ".": ">", "/": "?", "\\": "|" 32 | } 33 | }; 34 | 35 | function keyHandler( handleObj ) { 36 | // Only care when a possible input has been specified 37 | if ( typeof handleObj.data !== "string" ) { 38 | return; 39 | } 40 | 41 | var origHandler = handleObj.handler, 42 | keys = handleObj.data.toLowerCase().split(" "), 43 | textAcceptingInputTypes = ["text", "password", "number", "email", "url", "range", "date", "month", "week", "time", "datetime", "datetime-local", "search", "color"]; 44 | 45 | handleObj.handler = function( event ) { 46 | // Don't fire in text-accepting inputs that we didn't directly bind to 47 | if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) || 48 | jQuery.inArray(event.target.type, textAcceptingInputTypes) > -1 ) ) { 49 | return; 50 | } 51 | 52 | // Keypress represents characters, not special keys 53 | var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ], 54 | character = String.fromCharCode( event.which ).toLowerCase(), 55 | key, modif = "", possible = {}; 56 | 57 | // check combinations (alt|ctrl|shift+anything) 58 | if ( event.altKey && special !== "alt" ) { 59 | modif += "alt+"; 60 | } 61 | 62 | if ( event.ctrlKey && special !== "ctrl" ) { 63 | modif += "ctrl+"; 64 | } 65 | 66 | // TODO: Need to make sure this works consistently across platforms 67 | if ( event.metaKey && !event.ctrlKey && special !== "meta" ) { 68 | modif += "meta+"; 69 | } 70 | 71 | if ( event.shiftKey && special !== "shift" ) { 72 | modif += "shift+"; 73 | } 74 | 75 | if ( special ) { 76 | possible[ modif + special ] = true; 77 | 78 | } else { 79 | possible[ modif + character ] = true; 80 | possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true; 81 | 82 | // "$" can be triggered as "Shift+4" or "Shift+$" or just "$" 83 | if ( modif === "shift+" ) { 84 | possible[ jQuery.hotkeys.shiftNums[ character ] ] = true; 85 | } 86 | } 87 | 88 | for ( var i = 0, l = keys.length; i < l; i++ ) { 89 | if ( possible[ keys[i] ] ) { 90 | return origHandler.apply( this, arguments ); 91 | } 92 | } 93 | }; 94 | } 95 | 96 | jQuery.each([ "keydown", "keyup", "keypress" ], function() { 97 | jQuery.event.special[ this ] = { add: keyHandler }; 98 | }); 99 | 100 | })( jQuery ); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/jquery.inputlimiter.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery Input Limiter plugin 1.3.1 3 | * http://rustyjeans.com/jquery-plugins/input-limiter/ 4 | * 5 | * Copyright (c) 2009 Russel Fones 6 | * 7 | * Permission is hereby granted, free of charge, to any person 8 | * obtaining a copy of this software and associated documentation 9 | * files (the "Software"), to deal in the Software without 10 | * restriction, including without limitation the rights to use, 11 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | * copies of the Software, and to permit persons to whom the 13 | * Software is furnished to do so, subject to the following 14 | * conditions: 15 | * 16 | * The above copyright notice and this permission notice shall be 17 | * included in all copies or substantial portions of the Software. 18 | * 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 21 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 | * OTHER DEALINGS IN THE SOFTWARE. 27 | */ 28 | !function(a){a.fn.inputlimiter=function(b){var c=a.extend({},a.fn.inputlimiter.defaults,b);a(this);c.boxAttach&&!a("#"+c.boxId).length&&(a("
      ").appendTo("body").attr({id:c.boxId,"class":c.boxClass}).css({position:"absolute"}).hide(),a.fn.bgiframe&&a("#"+c.boxId).bgiframe());var d=function(b){var d=a(this),e=g(d.val());!c.allowExceed&&e>c.limit&&d.val(h(d.val())),c.boxAttach&&a("#"+c.boxId).css({width:d.outerWidth()-(a("#"+c.boxId).outerWidth()-a("#"+c.boxId).width())+"px",left:d.offset().left+"px",top:d.offset().top+d.outerHeight()-1+"px","z-index":2e3});var f=c.limit-e>0?c.limit-e:0,i=c.remTextFilter(c,f),j=c.limitTextFilter(c);if(c.limitTextShow){a("#"+c.boxId).html(i+" "+j);var k=a("").appendTo("body").attr({id:"19cc9195583bfae1fad88e19d443be7a","class":c.boxClass}).html(i+" "+j).innerWidth();a("#19cc9195583bfae1fad88e19d443be7a").remove(),k>a("#"+c.boxId).innerWidth()&&a("#"+c.boxId).html(i+"
      "+j),a("#"+c.boxId).show()}else a("#"+c.boxId).html(i).show()},e=function(b){var d=g(a(this).val());if(!c.allowExceed&&d>c.limit){var e=b.ctrlKey||b.altKey||b.metaKey;if(!e&&b.which>=32&&b.which<=122&&this.selectionStart===this.selectionEnd)return!1}},f=function(){var b=a(this);if(count=g(b.val()),!c.allowExceed&&count>c.limit&&b.val(h(b.val())),c.boxAttach)a("#"+c.boxId).fadeOut("fast");else if(c.remTextHideOnBlur){var d=c.limitText;d=d.replace(/\%n/g,c.limit),d=d.replace(/\%s/g,1===c.limit?"":"s"),a("#"+c.boxId).html(d)}},g=function(b){if("words"===c.limitBy.toLowerCase())return b.length>0?a.trim(b).replace(/\ +(?= )/g,"").split(" ").length:0;var d=b.length,e=b.match(/\n/g);return e&&c.lineReturnCount>1&&(d+=e.length*(c.lineReturnCount-1)),d},h=function(b){return"words"===c.limitBy.toLowerCase()?a.trim(b).replace(/\ +(?= )/g,"").split(" ").splice(0,c.limit).join(" ")+" ":b.substring(0,c.limit)};a(this).each(function(g){var h=a(this);(!b||!b.limit)&&c.useMaxlength&&parseInt(h.attr("maxlength"))>0&&parseInt(h.attr("maxlength"))!=c.limit?h.inputlimiter(a.extend({},c,{limit:parseInt(h.attr("maxlength"))})):(!c.allowExceed&&c.useMaxlength&&"characters"===c.limitBy.toLowerCase()&&h.attr("maxlength",c.limit),h.unbind(".inputlimiter"),h.bind("keyup.inputlimiter",d),h.bind("keypress.inputlimiter",e),h.bind("blur.inputlimiter",f))})},a.fn.inputlimiter.remtextfilter=function(a,b){var c=a.remText;return 0===b&&null!==a.remFullText&&(c=a.remFullText),c=c.replace(/\%n/g,b),c=c.replace(/\%s/g,a.zeroPlural?1===b?"":"s":1>=b?"":"s")},a.fn.inputlimiter.limittextfilter=function(a){var b=a.limitText;return b=b.replace(/\%n/g,a.limit),b=b.replace(/\%s/g,a.limit<=1?"":"s")},a.fn.inputlimiter.defaults={limit:255,boxAttach:!0,boxId:"limiterBox",boxClass:"limiterBox",remText:"%n character%s remaining.",remTextFilter:a.fn.inputlimiter.remtextfilter,remTextHideOnBlur:!0,remFullText:null,limitTextShow:!0,limitText:"Field limited to %n character%s.",limitTextFilter:a.fn.inputlimiter.limittextfilter,zeroPlural:!0,allowExceed:!1,useMaxlength:!0,limitBy:"characters",lineReturnCount:1}}(jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/jquery.maskedinput.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | jQuery Masked Input Plugin 3 | Copyright (c) 2007 - 2015 Josh Bush (digitalbush.com) 4 | Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 5 | Version: 1.4.1 6 | */ 7 | !function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b,c=navigator.userAgent,d=/iphone/i.test(c),e=/chrome/i.test(c),f=/android/i.test(c);a.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},autoclear:!0,dataName:"rawMaskFn",placeholder:"_"},a.fn.extend({caret:function(a,b){var c;return 0===this.length||this.is(":hidden")?void 0:"number"==typeof a?(b="number"==typeof b?b:a,this.each(function(){this.setSelectionRange?this.setSelectionRange(a,b):this.createTextRange&&(c=this.createTextRange(),c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",a),c.select())})):(this[0].setSelectionRange?(a=this[0].selectionStart,b=this[0].selectionEnd):document.selection&&document.selection.createRange&&(c=document.selection.createRange(),a=0-c.duplicate().moveStart("character",-1e5),b=a+c.text.length),{begin:a,end:b})},unmask:function(){return this.trigger("unmask")},mask:function(c,g){var h,i,j,k,l,m,n,o;if(!c&&this.length>0){h=a(this[0]);var p=h.data(a.mask.dataName);return p?p():void 0}return g=a.extend({autoclear:a.mask.autoclear,placeholder:a.mask.placeholder,completed:null},g),i=a.mask.definitions,j=[],k=n=c.length,l=null,a.each(c.split(""),function(a,b){"?"==b?(n--,k=a):i[b]?(j.push(new RegExp(i[b])),null===l&&(l=j.length-1),k>a&&(m=j.length-1)):j.push(null)}),this.trigger("unmask").each(function(){function h(){if(g.completed){for(var a=l;m>=a;a++)if(j[a]&&C[a]===p(a))return;g.completed.call(B)}}function p(a){return g.placeholder.charAt(a=0&&!j[a];);return a}function s(a,b){var c,d;if(!(0>a)){for(c=a,d=q(b);n>c;c++)if(j[c]){if(!(n>d&&j[c].test(C[d])))break;C[c]=C[d],C[d]=p(d),d=q(d)}z(),B.caret(Math.max(l,a))}}function t(a){var b,c,d,e;for(b=a,c=p(a);n>b;b++)if(j[b]){if(d=q(b),e=C[b],C[b]=c,!(n>d&&j[d].test(e)))break;c=e}}function u(){var a=B.val(),b=B.caret();if(o&&o.length&&o.length>a.length){for(A(!0);b.begin>0&&!j[b.begin-1];)b.begin--;if(0===b.begin)for(;b.beging)&&g&&13!==g){if(i.end-i.begin!==0&&(y(i.begin,i.end),s(i.begin,i.end-1)),c=q(i.begin-1),n>c&&(d=String.fromCharCode(g),j[c].test(d))){if(t(c),C[c]=d,z(),e=q(c),f){var k=function(){a.proxy(a.fn.caret,B,e)()};setTimeout(k,0)}else B.caret(e);i.begin<=m&&h()}b.preventDefault()}}}function y(a,b){var c;for(c=a;b>c&&n>c;c++)j[c]&&(C[c]=p(c))}function z(){B.val(C.join(""))}function A(a){var b,c,d,e=B.val(),f=-1;for(b=0,d=0;n>b;b++)if(j[b]){for(C[b]=p(b);d++e.length){y(b+1,n);break}}else C[b]===e.charAt(d)&&d++,k>b&&(f=b);return a?z():k>f+1?g.autoclear||C.join("")===D?(B.val()&&B.val(""),y(0,n)):z():(z(),B.val(B.val().substring(0,f+1))),k?b:l}var B=a(this),C=a.map(c.split(""),function(a,b){return"?"!=a?i[a]?p(b):a:void 0}),D=C.join(""),E=B.val();B.data(a.mask.dataName,function(){return a.map(C,function(a,b){return j[b]&&a!=p(b)?a:null}).join("")}),B.one("unmask",function(){B.off(".mask").removeData(a.mask.dataName)}).on("focus.mask",function(){if(!B.prop("readonly")){clearTimeout(b);var a;E=B.val(),a=A(),b=setTimeout(function(){B.get(0)===document.activeElement&&(z(),a==c.replace("?","").length?B.caret(0,a):B.caret(a))},10)}}).on("blur.mask",v).on("keydown.mask",w).on("keypress.mask",x).on("input.mask paste.mask",function(){B.prop("readonly")||setTimeout(function(){var a=A(!0);B.caret(a),h()},0)}),e&&f&&B.off("input.mask").on("input.mask",u),A()})}})}); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/jquery.ui.touch-punch.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery UI Touch Punch 0.2.3 3 | * 4 | * Copyright 2011–2014, Dave Furfero 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * 7 | * Depends: 8 | * jquery.ui.widget.js 9 | * jquery.ui.mouse.js 10 | */ 11 | !function(a){function b(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var c,d=a.ui.mouse.prototype,e=d._mouseInit,f=d._mouseDestroy;d._touchStart=function(a){var d=this;!c&&d._mouseCapture(a.originalEvent.changedTouches[0])&&(c=!0,d._touchMoved=!1,b(a,"mouseover"),b(a,"mousemove"),b(a,"mousedown"))},d._touchMove=function(a){c&&(this._touchMoved=!0,b(a,"mousemove"))},d._touchEnd=function(a){c&&(b(a,"mouseup"),b(a,"mouseout"),this._touchMoved||b(a,"click"),c=!1)},d._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),e.call(b)},d._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),f.call(b)}}}(jQuery); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/macarons.js: -------------------------------------------------------------------------------- 1 | (function (root, factory) { 2 | if (typeof define === 'function' && define.amd) { 3 | // AMD. Register as an anonymous module. 4 | define(['exports', 'echarts'], factory); 5 | } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { 6 | // CommonJS 7 | factory(exports, require('echarts')); 8 | } else { 9 | // Browser globals 10 | factory({}, root.echarts); 11 | } 12 | }(this, function (exports, echarts) { 13 | var log = function (msg) { 14 | if (typeof console !== 'undefined') { 15 | console && console.error && console.error(msg); 16 | } 17 | }; 18 | if (!echarts) { 19 | log('ECharts is not Loaded'); 20 | return; 21 | } 22 | 23 | var colorPalette = [ 24 | '#2ec7c9','#b6a2de','#5ab1ef','#ffb980','#d87a80', 25 | '#8d98b3','#e5cf0d','#97b552','#95706d','#dc69aa', 26 | '#07a2a4','#9a7fd1','#588dd5','#f5994e','#c05050', 27 | '#59678c','#c9ab00','#7eb00a','#6f5553','#c14089' 28 | ]; 29 | 30 | 31 | var theme = { 32 | color: colorPalette, 33 | 34 | title: { 35 | textStyle: { 36 | fontWeight: 'normal', 37 | color: '#008acd' 38 | } 39 | }, 40 | 41 | visualMap: { 42 | itemWidth: 15, 43 | color: ['#5ab1ef','#e0ffff'] 44 | }, 45 | 46 | toolbox: { 47 | iconStyle: { 48 | normal: { 49 | borderColor: colorPalette[0] 50 | } 51 | } 52 | }, 53 | 54 | tooltip: { 55 | backgroundColor: 'rgba(50,50,50,0.5)', 56 | axisPointer : { 57 | type : 'line', 58 | lineStyle : { 59 | color: '#008acd' 60 | }, 61 | crossStyle: { 62 | color: '#008acd' 63 | }, 64 | shadowStyle : { 65 | color: 'rgba(200,200,200,0.2)' 66 | } 67 | } 68 | }, 69 | 70 | dataZoom: { 71 | dataBackgroundColor: '#efefff', 72 | fillerColor: 'rgba(182,162,222,0.2)', 73 | handleColor: '#008acd' 74 | }, 75 | 76 | grid: { 77 | borderColor: '#eee', 78 | height:'80%', 79 | top:'15%' 80 | }, 81 | 82 | categoryAxis: { 83 | axisLine: { 84 | lineStyle: { 85 | color: '#008acd' 86 | } 87 | }, 88 | splitLine: { 89 | lineStyle: { 90 | color: ['#eee'] 91 | } 92 | } 93 | }, 94 | 95 | valueAxis: { 96 | axisLine: { 97 | lineStyle: { 98 | color: '#008acd' 99 | } 100 | }, 101 | splitArea : { 102 | show : true, 103 | areaStyle : { 104 | color: ['rgba(250,250,250,0.1)','rgba(200,200,200,0.1)'] 105 | } 106 | }, 107 | splitLine: { 108 | lineStyle: { 109 | color: ['#eee'] 110 | } 111 | } 112 | }, 113 | 114 | timeline : { 115 | lineStyle : { 116 | color : '#008acd' 117 | }, 118 | controlStyle : { 119 | normal : { color : '#008acd'}, 120 | emphasis : { color : '#008acd'} 121 | }, 122 | symbol : 'emptyCircle', 123 | symbolSize : 3 124 | }, 125 | 126 | line: { 127 | smooth : false, 128 | symbol: 'emptyCircle', 129 | symbolSize: 3 130 | }, 131 | 132 | candlestick: { 133 | itemStyle: { 134 | normal: { 135 | color: '#d87a80', 136 | color0: '#2ec7c9', 137 | lineStyle: { 138 | color: '#d87a80', 139 | color0: '#2ec7c9' 140 | } 141 | } 142 | } 143 | }, 144 | 145 | scatter: { 146 | symbol: 'circle', 147 | symbolSize: 4 148 | }, 149 | 150 | map: { 151 | label: { 152 | normal: { 153 | textStyle: { 154 | color: '#d87a80' 155 | } 156 | } 157 | }, 158 | itemStyle: { 159 | normal: { 160 | borderColor: '#eee', 161 | areaColor: '#ddd' 162 | }, 163 | emphasis: { 164 | areaColor: '#fe994e' 165 | } 166 | } 167 | }, 168 | 169 | graph: { 170 | color: colorPalette 171 | }, 172 | 173 | gauge : { 174 | axisLine: { 175 | lineStyle: { 176 | color: [[0.2, '#2ec7c9'],[0.8, '#5ab1ef'],[1, '#d87a80']], 177 | width: 10 178 | } 179 | }, 180 | axisTick: { 181 | splitNumber: 10, 182 | length :15, 183 | lineStyle: { 184 | color: 'auto' 185 | } 186 | }, 187 | splitLine: { 188 | length :22, 189 | lineStyle: { 190 | color: 'auto' 191 | } 192 | }, 193 | pointer : { 194 | width : 5 195 | } 196 | } 197 | }; 198 | 199 | echarts.registerTheme('macarons', theme); 200 | })); -------------------------------------------------------------------------------- /src/main/resources/static/js/plug/respond.min.js: -------------------------------------------------------------------------------- 1 | /*! Respond.js v1.4.2: min/max-width media query polyfill * Copyright 2013 Scott Jehl 2 | * Licensed under https://github.com/scottjehl/Respond/blob/master/LICENSE-MIT 3 | * */ 4 | 5 | !function(a){"use strict";a.matchMedia=a.matchMedia||function(a){var b,c=a.documentElement,d=c.firstElementChild||c.firstChild,e=a.createElement("body"),f=a.createElement("div");return f.id="mq-test-1",f.style.cssText="position:absolute;top:-100em",e.style.background="none",e.appendChild(f),function(a){return f.innerHTML='­',c.insertBefore(e,d),b=42===f.offsetWidth,c.removeChild(e),{matches:b,media:a}}}(a.document)}(this),function(a){"use strict";function b(){u(!0)}var c={};a.respond=c,c.update=function(){};var d=[],e=function(){var b=!1;try{b=new a.XMLHttpRequest}catch(c){b=new a.ActiveXObject("Microsoft.XMLHTTP")}return function(){return b}}(),f=function(a,b){var c=e();c&&(c.open("GET",a,!0),c.onreadystatechange=function(){4!==c.readyState||200!==c.status&&304!==c.status||b(c.responseText)},4!==c.readyState&&c.send(null))};if(c.ajax=f,c.queue=d,c.regex={media:/@media[^\{]+\{([^\{\}]*\{[^\}\{]*\})+/gi,keyframes:/@(?:\-(?:o|moz|webkit)\-)?keyframes[^\{]+\{(?:[^\{\}]*\{[^\}\{]*\})+[^\}]*\}/gi,urls:/(url\()['"]?([^\/\)'"][^:\)'"]+)['"]?(\))/g,findStyles:/@media *([^\{]+)\{([\S\s]+?)$/,only:/(only\s+)?([a-zA-Z]+)\s?/,minw:/\([\s]*min\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/,maxw:/\([\s]*max\-width\s*:[\s]*([\s]*[0-9\.]+)(px|em)[\s]*\)/},c.mediaQueriesSupported=a.matchMedia&&null!==a.matchMedia("only all")&&a.matchMedia("only all").matches,!c.mediaQueriesSupported){var g,h,i,j=a.document,k=j.documentElement,l=[],m=[],n=[],o={},p=30,q=j.getElementsByTagName("head")[0]||k,r=j.getElementsByTagName("base")[0],s=q.getElementsByTagName("link"),t=function(){var a,b=j.createElement("div"),c=j.body,d=k.style.fontSize,e=c&&c.style.fontSize,f=!1;return b.style.cssText="position:absolute;font-size:1em;width:1em",c||(c=f=j.createElement("body"),c.style.background="none"),k.style.fontSize="100%",c.style.fontSize="100%",c.appendChild(b),f&&k.insertBefore(c,k.firstChild),a=b.offsetWidth,f?k.removeChild(c):c.removeChild(b),k.style.fontSize=d,e&&(c.style.fontSize=e),a=i=parseFloat(a)},u=function(b){var c="clientWidth",d=k[c],e="CSS1Compat"===j.compatMode&&d||j.body[c]||d,f={},o=s[s.length-1],r=(new Date).getTime();if(b&&g&&p>r-g)return a.clearTimeout(h),h=a.setTimeout(u,p),void 0;g=r;for(var v in l)if(l.hasOwnProperty(v)){var w=l[v],x=w.minw,y=w.maxw,z=null===x,A=null===y,B="em";x&&(x=parseFloat(x)*(x.indexOf(B)>-1?i||t():1)),y&&(y=parseFloat(y)*(y.indexOf(B)>-1?i||t():1)),w.hasquery&&(z&&A||!(z||e>=x)||!(A||y>=e))||(f[w.media]||(f[w.media]=[]),f[w.media].push(m[w.rules]))}for(var C in n)n.hasOwnProperty(C)&&n[C]&&n[C].parentNode===q&&q.removeChild(n[C]);n.length=0;for(var D in f)if(f.hasOwnProperty(D)){var E=j.createElement("style"),F=f[D].join("\n");E.type="text/css",E.media=D,q.insertBefore(E,o.nextSibling),E.styleSheet?E.styleSheet.cssText=F:E.appendChild(j.createTextNode(F)),n.push(E)}},v=function(a,b,d){var e=a.replace(c.regex.keyframes,"").match(c.regex.media),f=e&&e.length||0;b=b.substring(0,b.lastIndexOf("/"));var g=function(a){return a.replace(c.regex.urls,"$1"+b+"$2$3")},h=!f&&d;b.length&&(b+="/"),h&&(f=1);for(var i=0;f>i;i++){var j,k,n,o;h?(j=d,m.push(g(a))):(j=e[i].match(c.regex.findStyles)&&RegExp.$1,m.push(RegExp.$2&&g(RegExp.$2))),n=j.split(","),o=n.length;for(var p=0;o>p;p++)k=n[p],l.push({media:k.split("(")[0].match(c.regex.only)&&RegExp.$2||"all",rules:m.length-1,hasquery:k.indexOf("(")>-1,minw:k.match(c.regex.minw)&&parseFloat(RegExp.$1)+(RegExp.$2||""),maxw:k.match(c.regex.maxw)&&parseFloat(RegExp.$1)+(RegExp.$2||"")})}u()},w=function(){if(d.length){var b=d.shift();f(b.href,function(c){v(c,b.href,b.media),o[b.href]=!0,a.setTimeout(function(){w()},0)})}},x=function(){for(var b=0;bb;b++)a.appendChild(arguments[b]);return a}function c(a,b,c,d){var e=["opacity",b,~~(100*a),c,d].join("-"),f=.01+c/d*100,g=Math.max(1-(1-a)/b*(100-f),a),h=j.substring(0,j.indexOf("Animation")).toLowerCase(),i=h&&"-"+h+"-"||"";return m[e]||(k.insertRule("@"+i+"keyframes "+e+"{0%{opacity:"+g+"}"+f+"%{opacity:"+a+"}"+(f+.01)+"%{opacity:1}"+(f+b)%100+"%{opacity:"+a+"}100%{opacity:"+g+"}}",k.cssRules.length),m[e]=1),e}function d(a,b){var c,d,e=a.style;if(b=b.charAt(0).toUpperCase()+b.slice(1),void 0!==e[b])return b;for(d=0;d',c)}k.addRule(".spin-vml","behavior:url(#default#VML)"),h.prototype.lines=function(a,d){function f(){return e(c("group",{coordsize:k+" "+k,coordorigin:-j+" "+-j}),{width:k,height:k})}function h(a,h,i){b(m,b(e(f(),{rotation:360/d.lines*a+"deg",left:~~h}),b(e(c("roundrect",{arcsize:d.corners}),{width:j,height:d.scale*d.width,left:d.scale*d.radius,top:-d.scale*d.width>>1,filter:i}),c("fill",{color:g(d.color,a),opacity:d.opacity}),c("stroke",{opacity:0}))))}var i,j=d.scale*(d.length+d.width),k=2*d.scale*j,l=-(d.width+d.length)*d.scale*2+"px",m=e(f(),{position:"absolute",top:l,left:l});if(d.shadow)for(i=1;i<=d.lines;i++)h(i,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(i=1;i<=d.lines;i++)h(i);return b(a,m)},h.prototype.opacity=function(a,b,c,d){var e=a.firstChild;d=d.shadow&&d.lines||0,e&&b+d>1)+"px"})}for(var i,k=0,l=(f.lines-1)*(1-f.direction)/2;k 2 | 3 | 4 | 5 | 6 | BLN SYSTEM 7 | 8 | 9 | 10 | 11 | 12 | 13 |
      14 |
      15 |
      16 | 用户名 17 | 18 |
      19 |
      20 | 密码 21 | 22 |
      23 |
      24 | 27 |
      28 |
      29 |
      30 | 31 | 32 | 33 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /src/main/resources/templates/test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | 9 | 10 | this is test page 11 | 退出 12 | 13 |
      14 | 15 | 16 |
      17 | 18 |
      19 | 20 |
      21 | 22 | 23 |
      24 |
      25 |
      26 |
      27 |
      28 | 29 |
      30 | 31 |
      32 |
      33 |
      34 |
      35 | 36 | 37 | 38 |
      39 |
      40 |
      41 |
      42 | 43 | 44 | 62 | 63 | -------------------------------------------------------------------------------- /权限注解说明.md: -------------------------------------------------------------------------------- 1 | # 注解权限说明 2 | 使用注解配置权限的方式有三种 3 | - JSR-250注解 4 | - @DenyAll 拒绝所有访问 5 | - @RolesAllowed({"USER", "ADMIN"}) 该方法只要具有"USER", "ADMIN"任意一种权限就可以访问 6 | 经过测试 如果用户权限为USER,权限限制为U、US 均可通过测试。最好使用@Secured 7 | - @PermitAll 允许所有访问 8 | - prePostEnabled注解 ***不建议使用*** 9 | - @PreAuthorize 在方法执行之前执行 10 | - @PostAuthorize :在方法执行之后执行 11 | - @PreFilter 在方法执行之前执行,对参数进行过滤 12 | - securedEnabled 注解 13 | - @Secured认证是否有权限访问 @Secured({"ROLE_ADMIN","ROLE_USER"}) 有任一种访问权限即可 --------------------------------------------------------------------------------