chenweida hace 6 años
commit
6eca8beed6
Se han modificado 100 ficheros con 18105 adiciones y 0 borrados
  1. 80 0
      .gitignore
  2. 49 0
      admin/admin-client-starter/pom.xml
  3. 197 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/HttpAdvice.java
  4. 88 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/RequestToMethodItem.java
  5. 96 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/SQLTimeAdvice.java
  6. 27 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/config/ScheduledConfig.java
  7. 28 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/config/WebsocketConfig.java
  8. 51 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/properties/AdminClientProperties.java
  9. 64 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/util/MD5.java
  10. 58 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/util/NetworkUtil.java
  11. 64 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/util/SpringUtil.java
  12. 91 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/SocketClient.java
  13. 60 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/SocketEndPoint.java
  14. 40 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/SocketHeart.java
  15. 67 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/event/HttpEvent.java
  16. 133 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/event/IEvent.java
  17. 20 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/event/SQLTimeEvent.java
  18. 12 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/sender/EventSender.java
  19. 55 0
      admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/sender/SimpleEventSender.java
  20. 3 0
      admin/admin-client-starter/src/main/resources/META-INF/spring.factories
  21. 57 0
      admin/admin-server-starter/pom.xml
  22. 16 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/AdminServerApplication.java
  23. 97 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/config/AdminServerAutoConfig.java
  24. 41 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/config/WebsocketConfig.java
  25. 38 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/config/ZuulAutoConfig.java
  26. 121 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/eureka/DiscoveryController.java
  27. 66 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/eureka/DiscoveryService.java
  28. 98 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/manage/ServerHeart.java
  29. 102 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/manage/ServerManager.java
  30. 34 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/model/MicroService.java
  31. 113 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/model/RuleRoute.java
  32. 325 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/model/Server.java
  33. 42 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/properties/AdminServerProperties.java
  34. 1302 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/util/DateUtil.java
  35. 64 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/util/MD5.java
  36. 31 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/SocketEndPoint.java
  37. 139 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/WebSocketHandler.java
  38. 50 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/WebSocketHandlerInterceptor.java
  39. 41 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/store/ElasticSearchStore.java
  40. 67 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/store/EsEventBuffer.java
  41. 11 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/store/EventStore.java
  42. 44 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/zuul/RouterCreater.java
  43. 105 0
      admin/admin-server-starter/src/main/java/com/yihu/admin/server/zuul/SimplerRouter.java
  44. 4 0
      admin/admin-server-starter/src/main/resources/META-INF/spring.factories
  45. 57 0
      admin/admin-server-starter/src/main/resources/application.yml
  46. 5 0
      admin/admin-server-starter/src/main/resources/logback.xml
  47. 33 0
      admin/admin-server-ui-starter/pom.xml
  48. 19 0
      admin/admin-server-ui-starter/src/main/java/com.yihu.admin.server.ui/config/MVCConfig.java
  49. 2 0
      admin/admin-server-ui-starter/src/main/resources/META-INF/spring.factories
  50. 12 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/animate.min.css
  51. 5 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/bootstrap.min.css
  52. 358 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/demo/webuploader-demo.css
  53. 5 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/font-awesome.min.css
  54. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/patterns/header-profile-skin-1.png
  55. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/patterns/header-profile-skin-3.png
  56. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/patterns/header-profile.png
  57. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/patterns/shattered.png
  58. 251 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css
  59. 1 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/blueimp/css/blueimp-gallery.min.css
  60. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/chosen/chosen-sprite.png
  61. 423 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/chosen/chosen.css
  62. 168 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/clockpicker/clockpicker.css
  63. 77 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/codemirror/ambiance.css
  64. 309 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/codemirror/codemirror.css
  65. 9 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/colorpicker/css/bootstrap-colorpicker.min.css
  66. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/colorpicker/img/bootstrap-colorpicker/alpha.png
  67. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/colorpicker/img/bootstrap-colorpicker/hue.png
  68. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/colorpicker/img/bootstrap-colorpicker/saturation.png
  69. 9 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/cropper/cropper.min.css
  70. 232 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/dataTables/dataTables.bootstrap.css
  71. 789 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/datapicker/datepicker3.css
  72. 155 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/dropzone/basic.css
  73. 410 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/dropzone/dropzone.css
  74. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/footable/fonts/footable.woff
  75. 178 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/footable/footable.core.css
  76. 589 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/fullcalendar/fullcalendar.css
  77. 32 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/fullcalendar/fullcalendar.print.css
  78. 59 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/iCheck/custom.css
  79. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/iCheck/green.png
  80. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/images/sort_asc.png
  81. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/images/sprite-skin-flat.png
  82. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/images/spritemap.png
  83. 126 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/ionRangeSlider/ion.rangeSlider.css
  84. 89 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/ionRangeSlider/ion.rangeSlider.skinFlat.css
  85. 7 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/jasny/jasny-bootstrap.min.css
  86. 851 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/jqgrid/ui.jqgrid.css_0820
  87. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/jsTree/32px.png
  88. 1 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/jsTree/style.min.css
  89. BIN
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/jsTree/throbber.gif
  90. 1 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/markdown/bootstrap-markdown.min.css
  91. 2 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/morris/morris-0.4.3.min.css
  92. 165 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/nouslider/jquery.nouislider.css
  93. 620 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/simditor/simditor.css
  94. 380 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/steps/jquery.steps.css
  95. 5970 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/summernote/summernote-bs3.css
  96. 446 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/summernote/summernote.css
  97. 715 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/sweetalert/sweetalert.css
  98. 32 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/switchery/switchery.css
  99. 222 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/toastr/toastr.min.css
  100. 0 0
      admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/treeview/bootstrap-treeview.css

+ 80 - 0
.gitignore

@ -0,0 +1,80 @@
*~
*.#*
*#*#
*.swp
*.ipr
*.iml
*.iws
*.pyc
*.pyo
.idea/
.idea_modules/
build/*.jar
.settings
.cache
.generated-mima*
work/
out/
.DS_Store
third_party/libmesos.so
third_party/libmesos.dylib
build/apache-maven*
build/zinc*
build/scala*
conf/java-opts
conf/*.sh
conf/*.cmd
conf/*.properties
conf/*.conf
conf/*.xml
conf/slaves
docs/_site
docs/api
target/
reports/
.project
.classpath
.scala_dependencies
lib_managed/
src_managed/
project/boot/
project/plugins/project/build.properties
project/build/target/
project/plugins/target/
project/plugins/lib_managed/
project/plugins/src_managed/
logs/
log/
spark-tests.log
streaming-tests.log
dependency-reduced-pom.xml
.ensime
.ensime_cache/
.ensime_lucene
checkpoint
derby.log
dist/
dev/create-release/*txt
dev/create-release/*final
spark-*-bin-*.tgz
unit-tests.log
/lib/
ec2/lib/
rat-results.txt
scalastyle.txt
scalastyle-output.xml
R-unit-tests.log
R/unit-tests.out
python/lib/pyspark.zip
lint-r-report.log
# For Hive
metastore_db/
metastore/
warehouse/
TempStatsStore/
sql/hive-thriftserver/test_warehouses
# For R session data
.RHistory
.RData

+ 49 - 0
admin/admin-client-starter/pom.xml

@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.yihu</groupId>
        <artifactId>admin-parent</artifactId>
        <version>1.2.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <version>${verion.yihu.admin}</version>
    <artifactId>admin-client-starter</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator-docs</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-sleuth</artifactId>
        </dependency>
        <dependency>
            <groupId>org.java-websocket</groupId>
            <artifactId>Java-WebSocket</artifactId>
            <version>1.3.8</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
        </dependency>
    </dependencies>
</project>

+ 197 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/HttpAdvice.java

@ -0,0 +1,197 @@
package com.yihu.admin.client.advice;
import com.yihu.admin.client.properties.AdminClientProperties;
import com.yihu.admin.client.util.NetworkUtil;
import com.yihu.admin.client.util.SpringUtil;
import com.yihu.admin.client.websocket.event.HttpEvent;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import net.sf.json.JSONObject;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.condition.RequestMethodsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
/**
 * Created by chenweida on 2018/5/23 0023.1
 */
@Aspect
@Component
public class HttpAdvice {
    @Autowired
    private Tracer tracer;
    @Autowired
    private SimpleEventSender simpleEventSender;
    @Autowired
    private AdminClientProperties adminClientProperties;
    @Value("${spring.application.name}")
    private String spanrName;
    private Logger logger = LoggerFactory.getLogger(SQLTimeAdvice.class);
    private final String eventName = "sqlMonitor;";
    private List<RequestToMethodItem> getURL = new ArrayList<>();
    private List<RequestToMethodItem> postURL = new ArrayList<>();
    private List<RequestToMethodItem> putURL = new ArrayList<>();
    private List<RequestToMethodItem> deleteURL = new ArrayList<>();
    @Autowired
    private SpringUtil springUtill;
    private AntPathMatcher antPathMatcher = new AntPathMatcher();
    /**
     * 初始化路径
     */
    @PostConstruct
    public void initAllUrl() {
        RequestMappingHandlerMapping requestMappingHandlerMapping = springUtill.getBean(RequestMappingHandlerMapping.class);
        Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMappingHandlerMapping.getHandlerMethods();
        for (Map.Entry<RequestMappingInfo, HandlerMethod> requestMappingInfoHandlerMethodEntry : handlerMethods.entrySet()) {
            try {
                RequestMappingInfo requestMappingInfo = requestMappingInfoHandlerMethodEntry.getKey();
                HandlerMethod mappingInfoValue = requestMappingInfoHandlerMethodEntry.getValue();
                PatternsRequestCondition patternsCondition = requestMappingInfo.getPatternsCondition();
                List<String> requestUrlList = new ArrayList<>(patternsCondition.getPatterns());
                String requestUrl = requestUrlList.get(0);
                logger.info("requestUrl:" + requestUrl);
                RequestMethodsRequestCondition methodCondition = requestMappingInfo.getMethodsCondition();
                List<RequestMethod> requestTypeList = new ArrayList<>(methodCondition.getMethods());
                String requestType = requestTypeList.get(0).name();
                logger.info("requestType:" + requestType);
                String controllerName = mappingInfoValue.getBeanType().toString();
                String requestMethodName = mappingInfoValue.getMethod().getName();
                Class<?>[] methodParamTypes = mappingInfoValue.getMethod().getParameterTypes();
                RequestToMethodItem item = new RequestToMethodItem(requestUrl,requestType , controllerName, requestMethodName, methodParamTypes);
                if ("get".equals(requestType.toLowerCase())) {
                    getURL.add(item);
                }
                if ("post".equals(requestType.toLowerCase())) {
                    postURL.add(item);
                }
                if ("put".equals(requestType.toLowerCase())) {
                    putURL.add(item);
                }
                if ("delete".equals(requestType.toLowerCase())) {
                    deleteURL.add(item);
                }
            } catch (Exception e) {
                logger.error(e.getMessage());
            }
        }
    }
    //    @Around("within(@org.springframework.stereotype.Controller *) " +
//            "within(@org.springframework.web.bind.annotation.RestController *)")
    @Around("within(@org.springframework.web.bind.annotation.RestController *)")
    public Object process(ProceedingJoinPoint point) throws Throwable {
        if (!adminClientProperties.getHttp()) {
            return point.proceed();
        }
        HttpEvent event = new HttpEvent();
        event.setSpanName(spanrName);
        event.setEventName(eventName);
        HttpServletRequest request = null;
        if (RequestContextHolder.getRequestAttributes() != null) {
            request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            String ip = NetworkUtil.getIpAddress(request);
            event.setUri(matchURI(request));
            event.setIp(ip);
            event.setMethod(request.getMethod());
            try {
                JSONObject headerObj = new JSONObject();
                Enumeration<String> headers = request.getHeaderNames();
                while (headers.hasMoreElements()) {
                    String value = headers.nextElement();
                    headerObj.put(value, request.getHeader(value));
                }
                event.setHeader(headerObj.toString());
            } catch (Exception e) {
            }
        }
        //访问目标方法的参数:
        Object[] args = point.getArgs();
        event.setRequestParams(JSONObject.fromObject(request.getParameterMap()).toString());
        Long strartTime = System.currentTimeMillis();
        event.setEventStartTime(strartTime);
        try {
            Object returnValue = point.proceed(args);
            Long endTime = System.currentTimeMillis();
            if (returnValue != null) {
                try {
                    event.setResponseParams(JSONObject.fromObject(returnValue).toString());
                } catch (Exception e) {
                    event.setResponseParams(returnValue.toString());
                }
            }
            event.setExcuteTime(endTime - strartTime);
            event.setEventName("system_http_tracer");
            event.setEventEndTime(endTime);
            event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
            event.setTraceId(tracer.getCurrentSpan().traceIdString());
            event.setSuccess(1);
            simpleEventSender.send(event);
            logger.debug("event:" + event.toString());
            return returnValue;
        } catch (Exception e) {
            Long endTime = System.currentTimeMillis();
            event.setExcuteTime(endTime - strartTime);
            event.setEventName("system_http_tracer");
            event.setEventEndTime(endTime);
            event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
            event.setTraceId(tracer.getCurrentSpan().traceIdString());
            event.setFail(1);
            simpleEventSender.send(event);
            logger.debug("event:" + event.toString());
            throw new Exception(e);
        }
    }
    private String matchURI(HttpServletRequest request) {
        String requestURI = request.getRequestURI();
        String method = request.getMethod();
        List<RequestToMethodItem> urls = null;
        if ("get".equals(method.toLowerCase())) {
            urls = getURL;
        } else if ("post".equals(method.toLowerCase())) {
            urls = postURL;
        } else if ("put".equals(method.toLowerCase())) {
            urls = putURL;
        } else if ("delete".equals(method.toLowerCase())) {
            urls = deleteURL;
        }
        for (int i = 0; i < urls.size(); i++) {
            String one = urls.get(i).getRequestUrl();
            if (antPathMatcher.match(one, requestURI)) {
                return one;
            }
        }
        return requestURI;
    }
}

+ 88 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/RequestToMethodItem.java

@ -0,0 +1,88 @@
package com.yihu.admin.client.advice;
import com.yihu.admin.client.properties.AdminClientProperties;
import com.yihu.admin.client.util.NetworkUtil;
import com.yihu.admin.client.websocket.event.HttpEvent;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import net.sf.json.JSONObject;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
/**
 * Created by chenweida on 2018/5/23 0023.1
 */
public class RequestToMethodItem {
    public String controllerName;
    public String methodName;
    public String requestType;
    public String requestUrl;
    public Class<?>[] methodParmaTypes;
    public RequestToMethodItem(String requestUrl, String requestType, String controllerName, String requestMethodName,
                               Class<?>[] methodParmaTypes) {
        this.requestUrl = requestUrl;
        this.requestType = requestType;
        this.controllerName = controllerName;
        this.methodName = requestMethodName;
        this.methodParmaTypes = methodParmaTypes;
    }
    public String getControllerName() {
        return controllerName;
    }
    public void setControllerName(String controllerName) {
        this.controllerName = controllerName;
    }
    public String getMethodName() {
        return methodName;
    }
    public void setMethodName(String methodName) {
        this.methodName = methodName;
    }
    public String getRequestType() {
        return requestType;
    }
    public void setRequestType(String requestType) {
        this.requestType = requestType;
    }
    public String getRequestUrl() {
        return requestUrl;
    }
    public void setRequestUrl(String requestUrl) {
        this.requestUrl = requestUrl;
    }
    public Class<?>[] getMethodParmaTypes() {
        return methodParmaTypes;
    }
    public void setMethodParmaTypes(Class<?>[] methodParmaTypes) {
        this.methodParmaTypes = methodParmaTypes;
    }
}

+ 96 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/advice/SQLTimeAdvice.java

@ -0,0 +1,96 @@
package com.yihu.admin.client.advice;
import com.yihu.admin.client.properties.AdminClientProperties;
import com.yihu.admin.client.websocket.event.SQLTimeEvent;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.trace.Trace;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.UUID;
/**
 * Created by chenweida on 2018/5/21 0021.1
 * 数据库sql的拦截
 */
@Aspect
@Component
public class SQLTimeAdvice {
    @Autowired
    private Tracer tracer;
    @Autowired
    private SimpleEventSender simpleEventSender;
    @Autowired
    private AdminClientProperties adminClientProperties;
    private Logger logger = LoggerFactory.getLogger(SQLTimeAdvice.class);
    @Value("${spring.application.name}")
    private String spanrName;
    @Around("execution(* org.springframework.jdbc.core.JdbcTemplate.batchUpdate*(..)) " +
            "|| execution(* org.springframework.jdbc.core.JdbcTemplate.query*(..)) " +
            "|| execution(* org.springframework.jdbc.core.JdbcTemplate.execute*(..)) " +
            "|| this(org.springframework.data.repository.Repository) " +
            "|| this(org.springframework.data.jpa.repository.JpaSpecificationExecutor)")
    public Object process(ProceedingJoinPoint point) throws Throwable {
        if (!adminClientProperties.getSql()) {
            return point.proceed();
        }
        SQLTimeEvent event = new SQLTimeEvent();
        HttpServletRequest request = null;
        //访问目标方法的参数:
        Object[] args = point.getArgs();
        String sql = null;
        //第一个参数是sql
        if (args != null && args.length > 0 && args[0].getClass() == String.class) {
            sql = args[0].toString();
            if (sql.contains("from")) {
                event.setSql(sql);
                logger.debug("sql:" + sql);
            }
            //第一个参数是sql数组
        }
        //用改变后的参数执行目标方法
        Long startTime = System.currentTimeMillis();
        event.setEventStartTime(startTime);
        try {
            Object returnValue = point.proceed(args);
            Long endTime = System.currentTimeMillis();
            event.setEventEndTime(endTime);
            event.setEventName("system_sql_tracer");
            event.setExcuteTime(endTime - startTime);
            event.setSpanName(spanrName);
            event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
            event.setTraceId(tracer.getCurrentSpan().traceIdString());
            event.setSuccess(1);
            simpleEventSender.send(event);
            logger.debug("event:" + event.toString());
            return returnValue;
        } catch (Exception e) {
            Long endTime = System.currentTimeMillis();
            event.setEventEndTime(endTime);
            event.setEventName("system_sql_tracer");
            event.setExcuteTime(endTime - startTime);
            event.setSpanName(spanrName);
            event.setSpanId(tracer.getCurrentSpan().getSpanId() + "");
            event.setTraceId(tracer.getCurrentSpan().traceIdString());
            event.setFail(1);
            simpleEventSender.send(event);
            throw new Exception(e);
        }
    }
}

+ 27 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/config/ScheduledConfig.java

@ -0,0 +1,27 @@
package com.yihu.admin.client.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
 * Created by chenweida on 2018/5/22 0022.1
 */
@Configuration
@EnableScheduling
public class ScheduledConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(setTaskExecutors());
    }
    @Bean(destroyMethod = "shutdown")
    public Executor setTaskExecutors() {
        return Executors.newScheduledThreadPool(3); // 3个线程来处理。
    }
}

+ 28 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/config/WebsocketConfig.java

@ -0,0 +1,28 @@
package com.yihu.admin.client.config;
import com.yihu.admin.client.websocket.SocketClient;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
 * Created by chenweida on 2018/5/22 0022.1
 */
@ComponentScan(basePackages = {
        "com.yihu.admin.client.websocket",
        "com.yihu.admin.client.advice",
        "com.yihu.admin.client.properties",
        "com.yihu.admin.client.util"
})
@Configuration
public class WebsocketConfig {
    @Autowired
    SocketClient socketClient;
    @Bean
    public SimpleEventSender simpleEventSender() {
        return new SimpleEventSender(socketClient.getCurrentClient());
    }
}

+ 51 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/properties/AdminClientProperties.java

@ -0,0 +1,51 @@
package com.yihu.admin.client.properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * Created by chenweida on 2018/5/15 0015.1
 */
@Component
public class AdminClientProperties {
    @Value("${yihu.admin.client.server.ip:127.0.0.1}")
    private String ip;//ip
    @Value("${yihu.admin.client.server.port:8082}")
    private Integer port;//port
    @Value("${yihu.admin.client.advice.sql:false}")
    private Boolean sql;//port
    @Value("${yihu.admin.client.advice.http:true}")
    private Boolean http;//port
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public Integer getPort() {
        return port;
    }
    public void setPort(Integer port) {
        this.port = port;
    }
    public Boolean getSql() {
        return sql;
    }
    public void setSql(Boolean sql) {
        this.sql = sql;
    }
    public Boolean getHttp() {
        return http;
    }
    public void setHttp(Boolean http) {
        this.http = http;
    }
}

+ 64 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/util/MD5.java

@ -0,0 +1,64 @@
package com.yihu.admin.client.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/*
 * MD5 算法1
 */
public class MD5 {
	// 全局数组
	private final static String[] strDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
	public MD5() {
	}
	// 返回形式为数字跟字符串
	private static String byteToArrayString(byte bByte) {
		int iRet = bByte;
		// System.out.println("iRet="+iRet);
		if (iRet < 0) {
			iRet += 256;
		}
		int iD1 = iRet / 16;
		int iD2 = iRet % 16;
		return strDigits[iD1] + strDigits[iD2];
	}
	// 返回形式只为数字
//	private static String byteToNum(byte bByte) {
//		int iRet = bByte;
//		System.out.println("iRet1=" + iRet);
//		if (iRet < 0) {
//			iRet += 256;
//		}
//		return String.valueOf(iRet);
//	}
	// 转换字节数组为16进制字串
	private static String byteToString(byte[] bByte) {
		StringBuffer sBuffer = new StringBuffer();
		for (int i = 0; i < bByte.length; i++) {
			sBuffer.append(byteToArrayString(bByte[i]));
		}
		return sBuffer.toString();
	}
	public static String GetMD5Code(String strObj) {
		String resultString = null;
		try {
			resultString = new String(strObj);
			MessageDigest md = MessageDigest.getInstance("MD5");
			// md.digest() 该函数返回值为存放哈希值结果的byte数组
			resultString = byteToString(md.digest(strObj.getBytes()));
		} catch (NoSuchAlgorithmException ex) {
			ex.printStackTrace();
		}
		return resultString;
	}
	public static void main(String[] args) {
		System.out.println(GetMD5Code("123456abcdefg"));
	}
}

+ 58 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/util/NetworkUtil.java

@ -0,0 +1,58 @@
package com.yihu.admin.client.util;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/** 
 * 常用获取客户端信息的工具 1
 *  
 */
public final class NetworkUtil {
	/**
	 * 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
	 *
	 * @param request
	 * @return
	 * @throws IOException
	 */
	public final static String getIpAddress(HttpServletRequest request) throws IOException {
		// 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
		String ip = request.getHeader("X-Forwarded-For");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("Proxy-Client-IP");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("WL-Proxy-Client-IP");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("HTTP_CLIENT_IP");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("HTTP_X_FORWARDED_FOR");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getRemoteAddr();
			}
		} else if (ip.length() > 15) {
			String[] ips = ip.split(",");
			for (int index = 0; index < ips.length; index++) {
				String strIp = (String) ips[index];
				if (!("unknown".equalsIgnoreCase(strIp))) {
					ip = strIp;
					break;
				}
			}
		}
		return ip;
	}
}

+ 64 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/util/SpringUtil.java

@ -0,0 +1,64 @@
package com.yihu.admin.client.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
 * 1
 */
@Component
public class SpringUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext = null;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (SpringUtil.applicationContext == null) {
            SpringUtil.applicationContext = applicationContext;
        }
    }
    //获取applicationContext
    public static ApplicationContext
    getApplicationContext() {
        return applicationContext;
    }
    //通过name获取 Bean.
    public static Object
    getBean(String name) {
        return getApplicationContext().getBean(name);
    }
    //通过class获取Bean.
    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }
    //通过name,以及Clazz返回指定的Bean
    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}

+ 91 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/SocketClient.java

@ -0,0 +1,91 @@
package com.yihu.admin.client.websocket;
import com.yihu.admin.client.properties.AdminClientProperties;
import com.yihu.admin.client.util.MD5;
import org.java_websocket.WebSocket;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.drafts.Draft_6455;
import org.java_websocket.handshake.ServerHandshake;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URI;
import java.util.HashMap;
import java.util.Map;
/**
 * Created by chenweida on 2018/5/22 0022.1
 */
@Component
public class SocketClient {
    private Logger logger = LoggerFactory.getLogger(SocketClient.class);
    private WebSocketClient client;
    @Autowired
    private AdminClientProperties adminClientProperties;
    @Value("${server.port}")
    private Integer clientPort;
    private Integer retrySize = 3;
    @PostConstruct
    public void init() throws Exception {
        //如果是开启先关闭
        if (client != null && !client.isClosed()) {
            client.close();
        }
        //设置header参数
        InetAddress address = InetAddress.getLocalHost();
        String hostAddress = address.getHostAddress();//192.168.0.121
        String completeAddress = hostAddress + ":" + clientPort;
        Map<String, String> httpHeaders = new HashMap<>();
        httpHeaders.put("address", completeAddress);
        httpHeaders.put("id", MD5.GetMD5Code(completeAddress));
        client = new WebSocketClient(
                new URI("ws://" + adminClientProperties.getIp() + ":" + adminClientProperties.getPort() + "/websocket/socketServer"),
                new Draft_6455(),
                httpHeaders) {
            @Override
            public void onOpen(ServerHandshake serverHandshake) {
                logger.info("connect to server:" + adminClientProperties.getIp() + ":" + adminClientProperties.getPort());
            }
            @Override
            public void onMessage(String s) {
                logger.info("收到消息:" + s);
            }
            @Override
            public void onClose(int i, String s, boolean b) {
                logger.warn("websocket is close ");
            }
            @Override
            public void onError(Exception e) {
                e.printStackTrace();
                logger.error("websocket error, status:close, message:" + e.getMessage());
            }
        };
        client.connect();
        int retryNum = 1;
        while (retryNum <= retrySize) {
            logger.info("can not connect to server  try :" + retryNum);
            Thread.sleep(3000L);
            retryNum++;
        }
    }
    public WebSocketClient getCurrentClient() {
        return client;
    }
}

+ 60 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/SocketEndPoint.java

@ -0,0 +1,60 @@
package com.yihu.admin.client.websocket;
import com.yihu.admin.client.properties.AdminClientProperties;
import com.yihu.admin.client.websocket.event.SQLTimeEvent;
import com.yihu.admin.client.websocket.sender.SimpleEventSender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
 * Created by chenweida on 2018/5/22 0022.1
 */
@RestController
@RequestMapping("socketClient")
public class SocketEndPoint {
    @Autowired
    private SocketClient socketClient;
    private Logger logger = LoggerFactory.getLogger(SocketEndPoint.class);
    @Autowired
    private SimpleEventSender simpleEventSender;
    @PostMapping("sendTest")
    public String sendTest(
            @RequestParam(value = "message", required = true) String message
    ) {
        if (socketClient.getCurrentClient().isClosed()) {
            return "socket 已经关闭";
        }
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        SQLTimeEvent sqlTimeEvent = new SQLTimeEvent();
        sqlTimeEvent.setEventName("测试");
        sqlTimeEvent.setSql(message);
        simpleEventSender.send(sqlTimeEvent);
        return "发送成功";
    }
    @PostMapping("initAgent")
    public String initAgent(
    ) {
        try {
            socketClient.init();
            return "启动成功";
        } catch (Exception e) {
            return e.getMessage();
        }
    }
}

+ 40 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/SocketHeart.java

@ -0,0 +1,40 @@
package com.yihu.admin.client.websocket;
import org.java_websocket.client.WebSocketClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
 * Created by chenweida on 2018/5/22 0022.1
 */
@Component
public class SocketHeart {
    private Logger logger = LoggerFactory.getLogger(SocketHeart.class);
    @Autowired
    private SocketClient socketClient;
    @Scheduled(cron = "0 0/1 * * * ?")
    public void TaskJob() {
        try {
            WebSocketClient webSocketClient = socketClient.getCurrentClient();
            if (webSocketClient == null || webSocketClient.isClosed()) {
                try {
                    webSocketClient.close();
                } finally {
                    logger.warn("restart connect to server !!");
                    socketClient.init();
                    if (!socketClient.getCurrentClient().isClosed()) {
                        logger.warn("init SocketClient success !!");
                    }else{
                        logger.warn("init SocketClient fail !!");
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

+ 67 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/event/HttpEvent.java

@ -0,0 +1,67 @@
package com.yihu.admin.client.websocket.event;
/**
 * Created by chenweida on 2018/5/23 0023.1
 */
public class HttpEvent extends IEvent {
    private String requestParams;
    private String responseParams;
    private String uri;
    private String ip;
    private String method;
    private String header;
    public String getRequestParams() {
        return requestParams;
    }
    public void setRequestParams(String requestParams) {
        this.requestParams = requestParams;
    }
    public String getResponseParams() {
        return responseParams;
    }
    public void setResponseParams(String responseParams) {
        this.responseParams = responseParams;
    }
    public String getUri() {
        return uri;
    }
    public void setUri(String uri) {
        this.uri = uri;
    }
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String getMethod() {
        return method;
    }
    public void setMethod(String method) {
        this.method = method;
    }
    public String getHeader() {
        return header;
    }
    public void setHeader(String header) {
        this.header = header;
    }
}

+ 133 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/event/IEvent.java

@ -0,0 +1,133 @@
package com.yihu.admin.client.websocket.event;
import java.util.Date;
/**
 * Created by chenweida on 2018/5/22 0022.1
 */
public class IEvent {
    /**
     * 整个請求的ID  在分布式的情况下,用来串起各個微服務的日誌
     *
     * @return
     */
    protected String traceId;
    /**
     * 模块ID  在分布式的情况下 代表這個事件是屬於哪個微服務
     *
     * @return
     */
    protected String spanId;
    /**
     * 模块ID  在分布式的情况下 代表這個事件是屬於哪個微服務
     *
     * @return
     */
    protected String spanName;
    /**
     * 事件名称
     *
     * @return
     */
    protected String eventName;
    /**
     * 时间发生的时间
     *
     * @return
     */
    protected Long eventStartTime;
    /**
     * 时间发生的时间
     *
     * @return
     */
    protected Long eventEndTime;
    /**
     * 执行时间
     */
    protected Long excuteTime;
    protected Integer success=0; //1成功 0失败
    protected Integer fail=0; //1成功 0失败
    public IEvent() {
    }
    public String getTraceId() {
        return traceId;
    }
    public void setTraceId(String traceId) {
        this.traceId = traceId;
    }
    public String getSpanId() {
        return spanId;
    }
    public void setSpanId(String spanId) {
        this.spanId = spanId;
    }
    public String getEventName() {
        return eventName;
    }
    public void setEventName(String eventName) {
        this.eventName = eventName;
    }
    public String getSpanName() {
        return spanName;
    }
    public void setSpanName(String spanName) {
        this.spanName = spanName;
    }
    public Long getExcuteTime() {
        return excuteTime;
    }
    public void setExcuteTime(Long excuteTime) {
        this.excuteTime = excuteTime;
    }
    public Long getEventStartTime() {
        return eventStartTime;
    }
    public void setEventStartTime(Long eventStartTime) {
        this.eventStartTime = eventStartTime;
    }
    public Long getEventEndTime() {
        return eventEndTime;
    }
    public void setEventEndTime(Long eventEndTime) {
        this.eventEndTime = eventEndTime;
    }
    public Integer getSuccess() {
        return success;
    }
    public void setSuccess(Integer success) {
        this.success = success;
    }
    public Integer getFail() {
        return fail;
    }
    public void setFail(Integer fail) {
        this.fail = fail;
    }
}

+ 20 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/event/SQLTimeEvent.java

@ -0,0 +1,20 @@
package com.yihu.admin.client.websocket.event;
/**
 * Created by chenweida on 2018/5/23 0023.1
 */
public class SQLTimeEvent extends IEvent {
    /**
     * sql
     */
    private String sql;
    public String getSql() {
        return sql;
    }
    public void setSql(String sql) {
        this.sql = sql;
    }
}

+ 12 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/sender/EventSender.java

@ -0,0 +1,12 @@
package com.yihu.admin.client.websocket.sender;
import com.yihu.admin.client.websocket.event.IEvent;
/**
 * Created by chenweida on 2018/5/23 0023.1
 */
public interface EventSender {
    Boolean send(IEvent event);
}

+ 55 - 0
admin/admin-client-starter/src/main/java/com/yihu/admin/client/websocket/sender/SimpleEventSender.java

@ -0,0 +1,55 @@
package com.yihu.admin.client.websocket.sender;
import com.yihu.admin.client.websocket.event.IEvent;
import net.sf.json.JSONObject;
import org.java_websocket.client.WebSocketClient;
import java.lang.reflect.Method;
import java.util.Date;
/**
 * Created by chenweida on 2018/5/23 0023.1
 */
public class SimpleEventSender implements EventSender {
    public SimpleEventSender(WebSocketClient client) {
        this.client = client;
    }
    private WebSocketClient client;
    @Override
    public Boolean send(IEvent event) {
        try {
            JSONObject jsonObject = new JSONObject();
            Method[] methods = event.getClass().getMethods();
            for (Method method : methods) {
                if ("getclass".equals(method.getName().toLowerCase())) {
                    continue;
                }
                if (method.getName().startsWith("get")) {
                    String methodName = method.getName();
                    String keyName = methodName.replace("get", "").toLowerCase();
                    Object value = method.invoke(event);
                    if (value != null) {
                        if (value instanceof java.util.Date) {
                            java.util.Date valueDate = (java.util.Date) value;
                            jsonObject.put(keyName, valueDate.getTime());
                        } else if (value instanceof java.sql.Date) {
                            java.sql.Date valueDate = (java.sql.Date) value;
                            jsonObject.put(keyName, valueDate.getTime());
                        } else {
                            jsonObject.put(keyName, value);
                        }
                    }
                }
            }
            client.send(jsonObject.toString());
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

+ 3 - 0
admin/admin-client-starter/src/main/resources/META-INF/spring.factories

@ -0,0 +1,3 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.yihu.admin.client.config.WebsocketConfig,\
  com.yihu.admin.client.config.ScheduledConfig

+ 57 - 0
admin/admin-server-starter/pom.xml

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.yihu</groupId>
        <artifactId>admin-parent</artifactId>
        <version>1.2.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>admin-server-starter</artifactId>
    <version>${verion.yihu.admin}</version>
    <dependencies>
        <dependency>
            <groupId>com.yihu</groupId>
            <artifactId>common-data-es-starter</artifactId>
            <version>1.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator-docs</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
        </dependency>
        <dependency>
            <groupId>com.netflix.hystrix</groupId>
            <artifactId>hystrix-javanica</artifactId>
            <version>1.5.12</version>
        </dependency>
    </dependencies>
</project>

+ 16 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/AdminServerApplication.java

@ -0,0 +1,16 @@
package com.yihu.admin.server;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
 * Created by chenweida on 2018/5/15 0015.1
 */
@SpringBootApplication
@EnableDiscoveryClient//服务注册到发现服务
public class AdminServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(AdminServerApplication.class, args);
    }
}

+ 97 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/config/AdminServerAutoConfig.java

@ -0,0 +1,97 @@
package com.yihu.admin.server.config;
import com.yihu.admin.server.properties.AdminServerProperties;
import com.yihu.admin.server.websocket.store.ElasticSearchStore;
import com.yihu.admin.server.websocket.store.EsEventBuffer;
import com.yihu.admin.server.websocket.store.EventStore;
import com.yihu.base.es.config.ElastricSearchHelper;
import org.elasticsearch.action.admin.indices.alias.exists.AliasesExistResponse;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.io.IOException;
/**
 * Created by chenweida on 2018/5/15 0015.1
 */
@ComponentScan(basePackages = {
        "com.yihu.admin.server.eureka",
        "com.yihu.admin.server.manage",
        "com.yihu.admin.server.properties",
        "com.yihu.admin.server.log"
})
@Configuration
public class AdminServerAutoConfig {
    private Logger logger = LoggerFactory.getLogger(AdminServerAutoConfig.class);
    @Autowired
    private ElastricSearchHelper elastricSearchHelper;
    @Autowired
    private AdminServerProperties adminServerProperties;
    @Autowired
    private EsEventBuffer esEventBuffer;
    @Bean
    @ConditionalOnMissingClass
    public EventStore eventStore() {
        ElasticSearchStore elasticSearchStore = new ElasticSearchStore();
        elasticSearchStore.setEsEventBuffer(esEventBuffer);
        return elasticSearchStore;
    }
    @PostConstruct
    public void createIndex() throws Exception {
        try {
            Client client = elastricSearchHelper.getElasticsearchUtil().getElasticFactory();
            //判断index是否存在
            if (!client.prepareExists(adminServerProperties.getDefaultIndexName()).get().exists()) {
                CreateIndexRequestBuilder cib = client.admin()
                        .indices().prepareCreate(adminServerProperties.getDefaultIndexName());
                XContentBuilder mapping = XContentFactory.jsonBuilder()
                        .startObject()
                        .startObject("properties") //设置之定义字段
                        .startObject("uri")
                        .field("type", "string") //设置数据类型
                        .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                        .endObject()
                        .startObject("spanname")
                        .field("type", "string")
                        .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                        .endObject()
                        .startObject("ip")
                        .field("type", "string")
                        .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                        .endObject()
                        .startObject("eventname")
                        .field("type", "string")
                        .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                        .endObject()
                        .startObject("method")
                        .field("type", "string")
                        .field("index", "not_analyzed") //设置数据类型	"index": "not_analyzed"
                        .endObject()
                        .endObject()
                        .endObject();
                cib.addMapping(adminServerProperties.getDefaultTypeName(), mapping);
                CreateIndexResponse indexResponse = cib.execute().actionGet();
                logger.info("自动创建索引");
            }
        } catch (Exception e) {
        }
    }
}

+ 41 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/config/WebsocketConfig.java

@ -0,0 +1,41 @@
package com.yihu.admin.server.config;
import com.yihu.admin.server.websocket.WebSocketHandler;
import com.yihu.admin.server.websocket.WebSocketHandlerInterceptor;
import com.yihu.admin.server.websocket.store.EventStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
/**
 * Created by chenweida on 2018/5/22 0022.1
 */
@Configuration
@ComponentScan(basePackages = {
        "com.yihu.admin.server.websocket"
})
@EnableWebSocket
public class WebsocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
    @Autowired
    private EventStore eventStore;
    public static final String websocketServer = "/websocket/socketServer";
    public static final String jssocketServer = "/sockjs/socketServer";
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(webSocketHandler(), websocketServer).addInterceptors(new WebSocketHandlerInterceptor());
        registry.addHandler(webSocketHandler(), jssocketServer).addInterceptors(new WebSocketHandlerInterceptor()).withSockJS();
    }
    @Bean
    public WebSocketHandler webSocketHandler() {
        return new WebSocketHandler(eventStore);
    }
}

+ 38 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/config/ZuulAutoConfig.java

@ -0,0 +1,38 @@
package com.yihu.admin.server.config;
import com.yihu.admin.server.eureka.DiscoveryService;
import com.yihu.admin.server.zuul.RouterCreater;
import com.yihu.admin.server.zuul.SimplerRouter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * Created by chenweida on 2018/5/15 0015.1
 */
@EnableZuulProxy
@Configuration
public class ZuulAutoConfig {
    @Autowired
    ZuulProperties zuulProperties;
    @Autowired
    ServerProperties server;
    @Autowired
    private DiscoveryService discoveryService;
    @Bean
    public RouterCreater routerCreater() {
        return new RouterCreater(discoveryService);
    }
    @Bean
    public SimplerRouter simplerRouter() {
        SimplerRouter simplerRouter = new SimplerRouter(this.server.getServletPrefix(), this.zuulProperties);
        simplerRouter.setRouterCreater(routerCreater());
        return simplerRouter;
    }
}

+ 121 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/eureka/DiscoveryController.java

@ -0,0 +1,121 @@
package com.yihu.admin.server.eureka;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.netflix.discovery.shared.Application;
import com.yihu.admin.server.model.Server;
import com.yihu.admin.server.model.MicroService;
import com.yihu.admin.server.properties.AdminServerProperties;
import com.yihu.base.es.config.ElastricSearchHelper;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * Created by chenweida on 2018/5/5 0005.1
 */
@RestController
@RequestMapping(value = "/discovery", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public class DiscoveryController {
    @Autowired
    private DiscoveryService discoveryService;
    @Autowired
    private ElastricSearchHelper elastricSearchHelper;
    @Autowired
    private AdminServerProperties adminServerProperties;
    @GetMapping("getServer")
    public String getServer(
            @RequestParam(value = "uuid", required = true) String uuid
    ) {
        return JSONObject.fromObject(discoveryService.getServer(uuid)).toString();
    }
    /**
     * 获取发现服务的信息
     *
     * @return
     */
    @GetMapping("listMicroService")
    public String listMicroService() {
        JSONObject jo=new JSONObject();
        jo.put("microservers",JSONArray.fromObject(discoveryService.listServers()).toString());
        jo.put("servers",JSONArray.fromObject(discoveryService.listMicroServices()).toString());
        return jo.toString();
    }
    @PostMapping("addMicroService")
    public Boolean addMicroService(
            @RequestParam(value = "ip", required = true) String ip,
            @RequestParam(value = "port", required = true) Integer port,
            @RequestParam(value = "name", required = true) String name,
            @RequestParam(value = "healthCheckUrl", required = false) String healthCheckUrl
    ) {
        return discoveryService.add(ip, port, name, healthCheckUrl);
    }
    @GetMapping("index_v1_num")
    public String index_v1_num() {
        JSONObject jo = new JSONObject();
        Integer microNum = 0;
        Integer serverNum = 0;
        Integer downNum = 0;
        Integer upNum = 0;
        Integer startingNum = 0;
        Integer outNum = 0;
        Integer unknowNum = 0;
        List<MicroService> serviceModels = discoveryService.listMicroServices();
        List<String> downList = new ArrayList<>();
        List<String> startingList = new ArrayList<>();
        List<String> outList = new ArrayList<>();
        List<String> unknowList = new ArrayList<>();
        microNum = serviceModels.size();
        List<Server> servers = discoveryService.listServers();
        serverNum = servers.size();
        for (Server server : servers) {
            if ("up".equals(server.getStatus().toLowerCase())) {
                upNum++;
            }
            if ("down".equals(server.getStatus().toLowerCase())) {
                downNum++;
                downList.add(server.getInstanceId());
            }
            if ("starting".equals(server.getStatus().toLowerCase())) {
                startingNum++;
                startingList.add(server.getInstanceId());
            }
            if ("out_of_service".equals(server.getStatus().toLowerCase())) {
                outNum++;
                outList.add(server.getInstanceId());
            }
            if ("unknown".equals(server.getStatus().toLowerCase())) {
                unknowNum++;
                unknowList.add(server.getInstanceId());
            }
        }
        jo.put("microNum", microNum);
        jo.put("serverNum", serverNum);
        jo.put("downNum", downNum);
        jo.put("upNum", upNum);
        jo.put("downList", downList);
        jo.put("downList", downList);
        jo.put("startingNum", startingNum);
        jo.put("startingList", startingList);
        jo.put("outNum", outNum);
        jo.put("outList", outList);
        jo.put("unknowNum", unknowNum);
        jo.put("unknowList", unknowList);
        return jo.toString();
    }
}

+ 66 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/eureka/DiscoveryService.java

@ -0,0 +1,66 @@
package com.yihu.admin.server.eureka;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.netflix.discovery.shared.Application;
import com.yihu.admin.server.manage.ServerManager;
import com.yihu.admin.server.model.MicroService;
import com.yihu.admin.server.model.Server;
import com.yihu.admin.server.util.MD5;
import net.sf.json.JSONArray;
import org.apache.tomcat.util.security.MD5Encoder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
 * Created by chenweida on 2018/5/15 0015.1
 */
@Service
public class DiscoveryService {
    private Logger logger = LoggerFactory.getLogger(DiscoveryService.class);
    @Autowired
    private ServerManager serverManager;
    public Server getServer(String uuid) {
        return serverManager.getServer(uuid);
    }
    /**
     * 获取注册中心全部的微服务
     *
     * @return
     */
    public List<MicroService> listMicroServices() {
        return serverManager.listMicroService();
    }
    public Boolean add(String ip, Integer port, String name, String healthCheckUrl) {
        try {
            serverManager.addMicroService(ip, port, name, healthCheckUrl);
            return true;
        } catch (Exception e) {
            logger.error(e.getMessage());
            return false;
        }
    }
    /**
     * 获取注册中心全部的服务器
     *
     * @return
     */
    public List<Server> listServers() {
        return serverManager.listServers();
    }
}

+ 98 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/manage/ServerHeart.java

@ -0,0 +1,98 @@
package com.yihu.admin.server.manage;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.netflix.discovery.shared.Application;
import com.yihu.admin.server.model.MicroService;
import com.yihu.admin.server.model.Server;
import com.yihu.admin.server.util.MD5;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * Created by chenweida on 2018/5/17 0017.1
 */
public class ServerHeart implements Runnable {
    private Logger logger = LoggerFactory.getLogger(ServerHeart.class);
    private EurekaClient eurekaClient;
    private Map<String, MicroService> microServices;
    private static final String eureka_pre = "eureka_";
    private static final Long sleepTime = 10 * 1000L;
    private RestTemplate restTemplate = new RestTemplate();
    public ServerHeart(EurekaClient eurekaClient, Map<String, MicroService> microServices) {
        this.eurekaClient = eurekaClient;
        this.microServices = microServices;
    }
    @Override
    public void run() {
        while (true) {
            try {
                //先去eureka获取数据
                for (Application application : eurekaClient.getApplications().getRegisteredApplications()) {
                    MicroService microService = new MicroService(application.getName());
                    List<InstanceInfo> instanceInfos = application.getInstancesAsIsFromEureka();
                    for (InstanceInfo instanceInfo : instanceInfos) {
                        Server server = new Server();
                        BeanUtils.copyProperties(instanceInfo, server);
                        server.setStatus(instanceInfo.getStatus().toString());
                        server.setIp(instanceInfo.getIPAddr());
                        server.setUuid(MD5.GetMD5Code(microService.getName() + "-" + instanceInfo.getInstanceId()));
                        logger.debug(server.toString());
                        microService.getServers().add(server);
                    }
                    microServices.put(eureka_pre + microService.getName(), microService);
                }
                //如果不是从eureka获取的自己在手动去更新状态
                for (Map.Entry<String, MicroService> one : microServices.entrySet()) {
                    if (one.getKey().startsWith(eureka_pre)) {
                        continue;
                    }
                    for (Server server : one.getValue().getServers()) {
                        try {
                            JSONObject jsonObject = JSONObject.fromObject(httpGet(server));
                            String status = jsonObject.getString("status");
                            server.setStatus(status);
                            server.setLastUpdatedTimestamp(new Date().getTime());
                        } catch (Exception e) {
                            server.setStatus("OUT_OF_SERVICE");
                            server.setLastUpdatedTimestamp(new Date().getTime());
                        }
                    }
                }
                logger.debug("MicroService size :" + microServices.size());
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    public String httpGet(Server server) {
        try {
            //设置header
            HttpHeaders headers = new HttpHeaders();
            MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
            headers.setContentType(type);
            headers.add("Accept", MediaType.APPLICATION_JSON.toString());
            String result = restTemplate.getForObject(server.getHealthCheckUrl(), String.class);
            return result;
        } catch (Exception e) {
            logger.error(e.getMessage());
            return "";
        }
    }
}

+ 102 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/manage/ServerManager.java

@ -0,0 +1,102 @@
package com.yihu.admin.server.manage;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.netflix.discovery.shared.Application;
import com.yihu.admin.server.model.MicroService;
import com.yihu.admin.server.model.Server;
import com.yihu.admin.server.util.MD5;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by chenweida on 2018/5/17 0017.1
 */
@Component
public class ServerManager {
    private Logger logger = LoggerFactory.getLogger(ServerManager.class);
    @Autowired
    private EurekaClient eurekaClient;
    private volatile Map<String, MicroService> microServices = new HashMap<>();
    public Boolean addMicroService(
            String ip,
            Integer port,
            String name,
            String healthCheckUrl) {
        try {
            if (StringUtils.isEmpty(healthCheckUrl)) {
                healthCheckUrl = "http://" + ip + ":" + port + "/health";
            }
            String instantsid = ip + ":" + port;
            MicroService microService = new MicroService(name);
            Server server = new Server();
            server.setIp(ip);
            server.setPort(port);
            server.setHealthCheckUrl(healthCheckUrl);
            server.setUuid(MD5.GetMD5Code(microService.getName() + "-" + instantsid));
            server.setInstanceId(instantsid);
            server.setStatus("unknow");
            microService.getServers().add(server);
            if (microServices.containsKey(microService.getName())) {
                microService = microServices.get(microService.getName());
                microService.getServers().add(server);
            }
            microServices.put(microService.getName(), microService);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    public List<MicroService> listMicroService() {
        return new ArrayList<>(microServices.values());
    }
    /**
     * 定时获取eureka中的服务
     *
     * @return
     */
    @PostConstruct
    public Boolean init() {
        new Thread(new ServerHeart(eurekaClient, microServices)).start();
        logger.info("ServerHeart start !!!!!!!!!!!");
        return true;
    }
    public List<Server> listServers() {
        List<Server> serviceModels = new ArrayList<>();
        for (MicroService microService : microServices.values()) {
            for (Server server : microService.getServers()) {
                serviceModels.add(server);
            }
        }
        return serviceModels;
    }
    public Server getServer(String uuid) {
        for (MicroService microService : microServices.values()) {
            for (Server server : microService.getServers()) {
               if(uuid.equals(server.getUuid())){
                   return server;
               }
            }
        }
        return null;
    }
}

+ 34 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/model/MicroService.java

@ -0,0 +1,34 @@
package com.yihu.admin.server.model;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by chenweida on 2018/5/15 0015.1
 * 微服务实体
 */
public class MicroService {
    private String name;//微服务名称
    private List<Server> servers = new ArrayList<>();//服务器实体
    public MicroService(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public List<Server> getServers() {
        return servers;
    }
    public void setServers(List<Server> servers) {
        this.servers = servers;
    }
}

+ 113 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/model/RuleRoute.java

@ -0,0 +1,113 @@
package com.yihu.admin.server.model;
/**
 * Created by chenweida on 2018/4/19 0019.1
 */
public class RuleRoute {
    /**
     * 主键
     */
    private String id;
    /**
     *  path是代理后的路径
     *  下面2种方式的path
     */
    private String path;
    /**
     * 微服务注册到发现服务的id
     * 即这种方式的 serviceId
     *  serviceId和url 2选1
     * zuul:
         routes:
           svr-simple1:    #这种方式和  svr-base: /base/**  一样  svr-base可以随便写 唯一即可
             path: /v1/simple2/**  #zuul path是代理后的路径
             serviceId: spring-cloud-svr-simple1  #serviceId是微服务name
     */
    private String serviceId;
    /**
     * 微服务的地址
     * 即下面这种方式的url
     *
     * zuul:
        routes:
          svr-simple2:     #这种方式和 上面一样 就是serviceId改成具体的url 但是这种配置方法不能利用eurika的负载均衡
            path: /v1/simple3/** #zuul path是代理后的路径
            url: http://localhost:10010/
     */
    private String url;
    /**
     * 失败是否重试
     * 在serviceId模式才有用
     */
    private Boolean retryable;
    /**
     * 是否有用
     */
    private Boolean enabled;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPath() {
        return path;
    }
    public void setPath(String path) {
        this.path = path;
    }
    public String getServiceId() {
        return serviceId;
    }
    public void setServiceId(String serviceId) {
        this.serviceId = serviceId;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public Boolean getRetryable() {
        return retryable;
    }
    public void setRetryable(Boolean retryable) {
        this.retryable = retryable;
    }
    public Boolean getEnabled() {
        return enabled;
    }
    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }
    @Override
    public String toString() {
        return "RuleRoute{" +
                "id='" + id + '\'' +
                ", path='" + path + '\'' +
                ", serviceId='" + serviceId + '\'' +
                ", url='" + url + '\'' +
                ", retryable=" + retryable +
                ", enabled=" + enabled +
                '}';
    }
}

+ 325 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/model/Server.java

@ -0,0 +1,325 @@
package com.yihu.admin.server.model;
import com.netflix.appinfo.DataCenterInfo;
import com.netflix.appinfo.LeaseInfo;
import com.netflix.discovery.converters.Auto;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamOmitField;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
 * Created by chenweida on 2018/5/15 0015.1
 */
public class Server {
    private String uuid;
    private String appName;
    private String appGroupName;
    private String sid;
    private int securePortT;
    private String homePageUrl;
    private String statusPageUrl;
    private String healthCheckUrl;
    private String secureHealthCheckUrl;
    private String vipAddress;
    private String secureVipAddress;
    private String statusPageRelativeUrl;
    private String statusPageExplicitUrl;
    private String healthCheckRelativeUrl;
    private String healthCheckSecureExplicitUrl;
    private String vipAddressUnresolved;
    private String secureVipAddressUnresolved;
    private String healthCheckExplicitUrl;
    private boolean isSecurePortEnabled = false;
    private boolean isUnsecurePortEnabled = true;
    private DataCenterInfo dataCenterInfo;
    private String hostName;
    private boolean isInstanceInfoDirty = false;
    private LeaseInfo leaseInfo;
    private Boolean isCoordinatingDiscoveryServer = Boolean.FALSE;
    private Map<String, String> metadata = new ConcurrentHashMap<String, String>();
    private Long lastUpdatedTimestamp = System.currentTimeMillis();
    private Long lastDirtyTimestamp = System.currentTimeMillis();
    private String asgName;
    private String version = "unknown";
    private String instanceId;
    private String ip;
    private Integer port;
    private String status;
    public String getInstanceId() {
        return instanceId;
    }
    public void setInstanceId(String instanceId) {
        this.instanceId = instanceId;
    }
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public Integer getPort() {
        return port;
    }
    public void setPort(Integer port) {
        this.port = port;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getAppName() {
        return appName;
    }
    public void setAppName(String appName) {
        this.appName = appName;
    }
    public String getAppGroupName() {
        return appGroupName;
    }
    public void setAppGroupName(String appGroupName) {
        this.appGroupName = appGroupName;
    }
    public String getSid() {
        return sid;
    }
    public void setSid(String sid) {
        this.sid = sid;
    }
    public int getSecurePortT() {
        return securePortT;
    }
    public void setSecurePortT(int securePortT) {
        this.securePortT = securePortT;
    }
    public String getHomePageUrl() {
        return homePageUrl;
    }
    public void setHomePageUrl(String homePageUrl) {
        this.homePageUrl = homePageUrl;
    }
    public String getStatusPageUrl() {
        return statusPageUrl;
    }
    public void setStatusPageUrl(String statusPageUrl) {
        this.statusPageUrl = statusPageUrl;
    }
    public String getHealthCheckUrl() {
        return healthCheckUrl;
    }
    public void setHealthCheckUrl(String healthCheckUrl) {
        this.healthCheckUrl = healthCheckUrl;
    }
    public String getSecureHealthCheckUrl() {
        return secureHealthCheckUrl;
    }
    public void setSecureHealthCheckUrl(String secureHealthCheckUrl) {
        this.secureHealthCheckUrl = secureHealthCheckUrl;
    }
    public String getVipAddress() {
        return vipAddress;
    }
    public void setVipAddress(String vipAddress) {
        this.vipAddress = vipAddress;
    }
    public String getSecureVipAddress() {
        return secureVipAddress;
    }
    public void setSecureVipAddress(String secureVipAddress) {
        this.secureVipAddress = secureVipAddress;
    }
    public String getStatusPageRelativeUrl() {
        return statusPageRelativeUrl;
    }
    public void setStatusPageRelativeUrl(String statusPageRelativeUrl) {
        this.statusPageRelativeUrl = statusPageRelativeUrl;
    }
    public String getStatusPageExplicitUrl() {
        return statusPageExplicitUrl;
    }
    public void setStatusPageExplicitUrl(String statusPageExplicitUrl) {
        this.statusPageExplicitUrl = statusPageExplicitUrl;
    }
    public String getHealthCheckRelativeUrl() {
        return healthCheckRelativeUrl;
    }
    public void setHealthCheckRelativeUrl(String healthCheckRelativeUrl) {
        this.healthCheckRelativeUrl = healthCheckRelativeUrl;
    }
    public String getHealthCheckSecureExplicitUrl() {
        return healthCheckSecureExplicitUrl;
    }
    public void setHealthCheckSecureExplicitUrl(String healthCheckSecureExplicitUrl) {
        this.healthCheckSecureExplicitUrl = healthCheckSecureExplicitUrl;
    }
    public String getVipAddressUnresolved() {
        return vipAddressUnresolved;
    }
    public void setVipAddressUnresolved(String vipAddressUnresolved) {
        this.vipAddressUnresolved = vipAddressUnresolved;
    }
    public String getSecureVipAddressUnresolved() {
        return secureVipAddressUnresolved;
    }
    public void setSecureVipAddressUnresolved(String secureVipAddressUnresolved) {
        this.secureVipAddressUnresolved = secureVipAddressUnresolved;
    }
    public String getHealthCheckExplicitUrl() {
        return healthCheckExplicitUrl;
    }
    public void setHealthCheckExplicitUrl(String healthCheckExplicitUrl) {
        this.healthCheckExplicitUrl = healthCheckExplicitUrl;
    }
    public boolean isSecurePortEnabled() {
        return isSecurePortEnabled;
    }
    public void setSecurePortEnabled(boolean securePortEnabled) {
        isSecurePortEnabled = securePortEnabled;
    }
    public boolean isUnsecurePortEnabled() {
        return isUnsecurePortEnabled;
    }
    public void setUnsecurePortEnabled(boolean unsecurePortEnabled) {
        isUnsecurePortEnabled = unsecurePortEnabled;
    }
    public DataCenterInfo getDataCenterInfo() {
        return dataCenterInfo;
    }
    public void setDataCenterInfo(DataCenterInfo dataCenterInfo) {
        this.dataCenterInfo = dataCenterInfo;
    }
    public String getHostName() {
        return hostName;
    }
    public void setHostName(String hostName) {
        this.hostName = hostName;
    }
    public boolean isInstanceInfoDirty() {
        return isInstanceInfoDirty;
    }
    public void setInstanceInfoDirty(boolean instanceInfoDirty) {
        isInstanceInfoDirty = instanceInfoDirty;
    }
    public LeaseInfo getLeaseInfo() {
        return leaseInfo;
    }
    public void setLeaseInfo(LeaseInfo leaseInfo) {
        this.leaseInfo = leaseInfo;
    }
    public Boolean getCoordinatingDiscoveryServer() {
        return isCoordinatingDiscoveryServer;
    }
    public void setCoordinatingDiscoveryServer(Boolean coordinatingDiscoveryServer) {
        isCoordinatingDiscoveryServer = coordinatingDiscoveryServer;
    }
    public Map<String, String> getMetadata() {
        return metadata;
    }
    public void setMetadata(Map<String, String> metadata) {
        this.metadata = metadata;
    }
    public Long getLastUpdatedTimestamp() {
        return lastUpdatedTimestamp;
    }
    public void setLastUpdatedTimestamp(Long lastUpdatedTimestamp) {
        this.lastUpdatedTimestamp = lastUpdatedTimestamp;
    }
    public Long getLastDirtyTimestamp() {
        return lastDirtyTimestamp;
    }
    public void setLastDirtyTimestamp(Long lastDirtyTimestamp) {
        this.lastDirtyTimestamp = lastDirtyTimestamp;
    }
    public String getAsgName() {
        return asgName;
    }
    public void setAsgName(String asgName) {
        this.asgName = asgName;
    }
    public String getVersion() {
        return version;
    }
    public void setVersion(String version) {
        this.version = version;
    }
    public String getUuid() {
        return uuid;
    }
    public void setUuid(String uuid) {
        this.uuid = uuid;
    }
}

+ 42 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/properties/AdminServerProperties.java

@ -0,0 +1,42 @@
package com.yihu.admin.server.properties;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * Created by chenweida on 2018/5/15 0015.1
 */
@Component
public class AdminServerProperties {
    @Value("${yihu.admin.server.defaultIndexName:admin_log}")
    private String defaultIndexName;//默认是index
    @Value("${yihu.admin.server.defaultTypeName:admin_log}")
    private String defaultTypeName;//默认是type
    @Value("${yihu.admin.server.partitionWithEventName:false}")
    private Boolean partitionWithEventName;//默认是index
    public String getDefaultIndexName() {
        return defaultIndexName;
    }
    public void setDefaultIndexName(String defaultIndexName) {
        this.defaultIndexName = defaultIndexName;
    }
    public String getDefaultTypeName() {
        return defaultTypeName;
    }
    public void setDefaultTypeName(String defaultTypeName) {
        this.defaultTypeName = defaultTypeName;
    }
    public Boolean getPartitionWithEventName() {
        return partitionWithEventName;
    }
    public void setPartitionWithEventName(Boolean partitionWithEventName) {
        this.partitionWithEventName = partitionWithEventName;
    }
}

+ 1302 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/util/DateUtil.java

@ -0,0 +1,1302 @@
package com.yihu.admin.server.util;
import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.*;
public class DateUtil {
	public static final String HH_MM = "HH:mm";
	public static final String HH_MM_SS = "HH:mm:ss";
	public static final String YY = "yy";
	public static final String YYYYMM = "yyyyMM";
	public static final String YYYYMMDD = "yyyyMMdd";
	public static final String YYYY_MM_DD = "yyyy-MM-dd";
	public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
	public static final String YYYY_MM_DD_HH = "yyyy-MM-dd HH";
	public static final String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
	public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
	public static final String YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
	public static final String YYYY_M_D_HH_MM_SS = "yyyy/M/d HH:mm:ss";
	public static final String YYYYMMddHHmmssSSS  = "yyyyMMddHHmmssSSS";
	public static final String YYYY_MM ="yyyy-MM";
	/**
	 * 时间格式转中文格式1
	 */
	public static String dateToChinese(Date date) {
		SimpleDateFormat formatter =   new SimpleDateFormat( "yyyy年MM月dd日 EEEEaaaa hh:mm", Locale.CHINA);
		return formatter.format(date);
	}
	/**
	 * 字符串转时间格式
	 */
	public static Date strToDate(String strDate) {
		if (StringUtils.isEmpty(strDate)) {
			return null;
		}
		else{
			int length = strDate.length();
			if(strDate.contains("/"))
			{
				strDate = strDate.replace("/","-");
			}
			if(strDate.contains("-"))
			{
				if(length == 10)
				{
					 return strToDate(strDate,YYYY_MM_DD);
				}
				else if(length == 19)
				{
					return strToDate(strDate,YYYY_MM_DD_HH_MM_SS);
				}
			}
			else{
				if(length == 8)
				{
					return strToDate(strDate,YYYYMMDD);
				}
				else if(length == 14)
				{
					return strToDate(strDate,YYYYMMDDHHMMSS);
				}
			}
		}
		return null;
	}
	/**
	  * 获取现在时间
	  * 
	  * @return 返回时间类型 yyyy-MM-dd HH:mm:ss
	  */
	public static Date getNowDate() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		String dateString = formatter.format(currentTime);
		ParsePosition pos = new ParsePosition(0);
		return formatter.parse(dateString, pos);
	}
	/**
	 * 获取现在时间
	 * 
	 * @return返回短时间格式 yyyy-MM-dd
	 */
	public static Date getNowDateShort() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		String dateString = formatter.format(currentTime);
		return strToDate(dateString, YYYY_MM_DD);
	}
	/**
	 * 获取现在时间
	 * 
	 * @return返回字符串格式 yyyy-MM-dd HH:mm:ss
	 */
	public static String getStringDate() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		return formatter.format(currentTime);
	}
	/**
	 * 获取现在时间
	 * 
	 * @return返回字符串格式 yyyy-MM-dd HH:mm:ss
	 */
	public static String getStringDate(String format) {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		return formatter.format(currentTime);
	}
	/**
	 * 获取现在时间
	 * 
	 * @return 返回短时间字符串格式yyyy-MM-dd
	 */
	public static String getStringDateShort() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		return formatter.format(currentTime);
	}
	/**
	 * 获取时间 小时:分;秒 HH:mm:ss
	 * 
	 * @return
	 */
	public static String getTimeShort() {
		SimpleDateFormat formatter = new SimpleDateFormat(HH_MM_SS);
		Date currentTime = new Date();
		return formatter.format(currentTime);
	}
	/**
	 * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
	 * 
	 * @param strDate
	 * @return
	 */
	public static Date strToDateLong(String strDate) {
		if (StringUtils.isEmpty(strDate)) {
			return null;
		}
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		ParsePosition pos = new ParsePosition(0);
		return formatter.parse(strDate, pos);
	}
	public static Date strToDateShort(String strDate) {
		if (StringUtils.isEmpty(strDate)) {
			return null;
		}
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		ParsePosition pos = new ParsePosition(0);
		return formatter.parse(strDate, pos);
	}
	/**
	 * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss
	 * 
	 * @param dateDate
	 * @return
	 */
	public static String dateToStrLong(Date dateDate) {
		if (dateDate == null) {
			return "";
		}
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		return formatter.format(dateDate);
	}
	public static String dateToStrNoSecond(Date dateDate) {
		if (dateDate == null) {
			return "";
		}
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM);
		return formatter.format(dateDate);
	}
	/**
	 * 将长时间格式时间转换为字符串 yyyy-MM-dd
	 *
	 * @param dateDate
	 * @return
	 */
	public static String dateToStrShort(Date dateDate) {
		if (dateDate == null) {
			return "";
		}
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		return formatter.format(dateDate);
	}
	/**
	 * 将短时间格式时间转换为字符串 yyyy-MM-dd
	 */
	public static String dateToStr(Date dateDate, String format) {
		if (dateDate == null) {
			return "";
		}
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		return formatter.format(dateDate);
	}
	/**
	 * 将短时间格式字符串转换为时间
	 *
	 * @param strDate
	 * @return
	 */
	public static Date strToDate(String strDate, String format) {
		if (StringUtils.isEmpty(strDate)) {
			return null;
		}
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		ParsePosition pos = new ParsePosition(0);
		return formatter.parse(strDate, pos);
	}
	public static Date strToDateAppendNowTime(String strDate, String format) {
		if (StringUtils.isEmpty(strDate)) {
			return null;
		}
		strDate += " " + getTimeShort();
		SimpleDateFormat formatter = new SimpleDateFormat(format);
		ParsePosition pos = new ParsePosition(0);
		return formatter.parse(strDate, pos);
	}
	/**
	 * 得到现在时间
	 *
	 * @return
	 */
	public static Date getNow() {
		Date currentTime = new Date();
		return currentTime;
	}
	/**
	 * 提取一个月中的最后一天
	 *
	 * @param day
	 * @return
	 */
	public static Date getLastDate(long day) {
		Date date = new Date();
		long date_3_hm = date.getTime() - 3600000 * 34 * day;
		Date date_3_hm_date = new Date(date_3_hm);
		return date_3_hm_date;
	}
	/**
	 * 得到现在时间
	 *
	 * @return 字符串 yyyyMMdd HHmmss
	 */
	public static String getStringToday() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HHmmss");
		String dateString = formatter.format(currentTime);
		return dateString;
	}
	/**
	 * 得到现在小时
	 */
	public static String getHour() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		String dateString = formatter.format(currentTime);
		String hour;
		hour = dateString.substring(11, 13);
		return hour;
	}
	/**
	 * 得到现在分钟
	 *
	 * @return
	 */
	public static String getTime() {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		String dateString = formatter.format(currentTime);
		String min;
		min = dateString.substring(14, 16);
		return min;
	}
	/**
	 * 根据用户传入的时间表示格式,返回当前时间的格式 如果是yyyyMMdd,注意字母y不能大写。
	 *
	 * @param sformat
	 *            yyyyMMddhhmmss
	 * @return
	 */
	public static String getUserDate(String sformat) {
		Date currentTime = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat(sformat);
		String dateString = formatter.format(currentTime);
		return dateString;
	}
	/**
	 * 二个小时时间间的差值,必须保证二个时间都是"HH:MM"的格式,返回字符型的分钟
	 */
	public static String getTwoHour(String st1, String st2) {
		String[] kk = null;
		String[] jj = null;
		kk = st1.split(":");
		jj = st2.split(":");
		if (Integer.parseInt(kk[0]) < Integer.parseInt(jj[0]))
			return "0";
		else {
			double y = Double.parseDouble(kk[0]) + Double.parseDouble(kk[1]) / 60;
			double u = Double.parseDouble(jj[0]) + Double.parseDouble(jj[1]) / 60;
			if ((y - u) > 0)
				return y - u + "";
			else
				return "0";
		}
	}
	/**
	 * 得到二个日期间的间隔天数
	 */
	public static String getTwoDay(String sj1, String sj2) {
		SimpleDateFormat myFormatter = new SimpleDateFormat(YYYY_MM_DD);
		long day = 0;
		try {
			Date date = myFormatter.parse(sj1);
			Date mydate = myFormatter.parse(sj2);
			day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
		} catch (Exception e) {
			return "";
		}
		return day + "";
	}
	/**
	 * 时间前推或后推分钟,其中JJ表示分钟.
	 */
	public static String getPreTime(String sj1, String jj) {
		SimpleDateFormat format = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
		String mydate1 = "";
		try {
			Date date1 = format.parse(sj1);
			long Time = (date1.getTime() / 1000) + Integer.parseInt(jj) * 60;
			date1.setTime(Time * 1000);
			mydate1 = format.format(date1);
		} catch (Exception e) {
		}
		return mydate1;
	}
	/**
	 * 时间前推或后推天数(负数前推正数后推)
	 * date 基准时间
	 */
	public static Date getPreDays(Date date, int days) {
		Date day = null;
		try {
			Calendar c = Calendar.getInstance();
			c.setTime(date);
			c.add(Calendar.DATE, days);
			day = c.getTime();
		} catch (Exception e) {
		}
		return day;
	}
	/**
	 * 得到一个时间延后或前移几分钟的时间,nowdate为时间,delay为前移或后延的分钟数
	 */
	public static Date getNextMin(Date date, int delay) {
		try {
			Calendar cal = Calendar.getInstance();
			cal.setTime(date);
			cal.add(Calendar.MINUTE, delay);
			return cal.getTime();
		} catch (Exception e) {
			return null;
		}
	}
	/**
	 * 得到一个时间延后或前移几天的时间,nowdate为时间,delay为前移或后延的天数
	 */
	public static String getNextDay(String nowdate, int delay) {
		try {
			SimpleDateFormat format = new SimpleDateFormat(YYYY_MM_DD);
			String mdate = "";
			Date d = strToDate(nowdate, YYYY_MM_DD);
			long myTime = (d.getTime() / 1000) + delay * 24 * 60 * 60;
			d.setTime(myTime * 1000);
			mdate = format.format(d);
			return mdate;
		} catch (Exception e) {
			return "";
		}
	}
	// public static String getNextDay(Date d, int delay) {
	// try {
	// SimpleDateFormat format = new SimpleDateFormat(YYYY_MM_DD);
	// String mdate = "";
	// long myTime = (d.getTime() / 1000) + delay * 24 * 60 * 60;
	// d.setTime(myTime * 1000);
	// mdate = format.format(d);
	// return mdate;
	// } catch (Exception e) {
	// return "";
	// }
	// }
	public static String getNextDay(Date d, int days) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		c.add(Calendar.DATE, days);
		return dateToStrShort(c.getTime());
	}
	public static String getNextMonth(Date d, int months) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		c.add(Calendar.MONTH, months);
		return dateToStrShort(c.getTime());
	}
	public static Date getNextMonthReturnDate(Date d, int months) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		c.add(Calendar.MONTH, months);
		return c.getTime();
	}
	public static String getNextYear(Date d, int year) {
		Calendar c = Calendar.getInstance();
		c.setTime(d);
		c.add(Calendar.YEAR, year);
		return dateToStrShort(c.getTime());
	}
	/**
	 * 获取本月第一天
	 * @return
     */
	public static String getCurMonthFirstDayShort(){
		Calendar c = Calendar.getInstance();
		c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
		return dateToStrShort(c.getTime());
	}
	/**
	 * 判断是否润年
	 *
	 * @param ddate
	 * @return
	 */
	public static boolean isLeapYear(String ddate) {
		/**
		 * 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年
		 * 3.能被4整除同时能被100整除则不是闰年
		 */
		Date d = strToDate(ddate, YYYY_MM_DD);
		GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
		gc.setTime(d);
		int year = gc.get(Calendar.YEAR);
		if ((year % 400) == 0)
			return true;
		else if ((year % 4) == 0) {
			if ((year % 100) == 0)
				return false;
			else
				return true;
		} else
			return false;
	}
	/**
	 * 返回美国时间格式 26 Apr 2006
	 *
	 * @param str
	 * @return
	 */
	public static String getEDate(String str) {
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		ParsePosition pos = new ParsePosition(0);
		Date strtodate = formatter.parse(str, pos);
		String j = strtodate.toString();
		String[] k = j.split(" ");
		return k[2] + k[1].toUpperCase() + k[5].substring(2, 4);
	}
	/**
	 * 获取一个月的最后一天
	 *
	 * @param dat
	 * @return
	 */
	public static String getEndDateOfMonth(String dat) {// yyyy-MM-dd
		String str = dat.substring(0, 8);
		String month = dat.substring(5, 7);
		int mon = Integer.parseInt(month);
		if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon == 12) {
			str += "31";
		} else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) {
			str += "30";
		} else {
			if (isLeapYear(dat)) {
				str += "29";
			} else {
				str += "28";
			}
		}
		return str;
	}
	/**
	 * 判断二个时间是否在同一个周
	 *
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameWeekDates(Date date1, Date date2) {
		Calendar cal1 = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();
		cal1.setTime(date1);
		cal2.setTime(date2);
		int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
		if (0 == subYear) {
			if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
				return true;
		} else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) {
			// 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周
			if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
				return true;
		} else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) {
			if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
				return true;
		}
		return false;
	}
	/**
	 * 产生周序列,即得到当前时间所在的年度是第几周
	 *
	 * @return
	 */
	public static String getSeqWeek() {
		Calendar c = Calendar.getInstance(Locale.CHINA);
		String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR));
		if (week.length() == 1)
			week = "0" + week;
		String year = Integer.toString(c.get(Calendar.YEAR));
		return year + week;
	}
	/**
	 * 获得一个日期所在的周的星期几的日期,如要找出2002年2月3日所在周的星期一是几号
	 *
	 * @param sdate
	 * @param num
	 * @return
	 */
	public static String getWeek(String sdate, String num) {
		// 再转换为时间
		Date dd = DateUtil.strToDate(sdate, YYYY_MM_DD);
		Calendar c = Calendar.getInstance();
		c.setTime(dd);
		if (num.equals("1")) // 返回星期一所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
		else if (num.equals("2")) // 返回星期二所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY);
		else if (num.equals("3")) // 返回星期三所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY);
		else if (num.equals("4")) // 返回星期四所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY);
		else if (num.equals("5")) // 返回星期五所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY);
		else if (num.equals("6")) // 返回星期六所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
		else if (num.equals("0")) // 返回星期日所在的日期
			c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
		return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime());
	}
	/**
	 * 根据一个日期,返回是星期几的字符串
	 *
	 * @param sdate
	 * @return
	 */
	public static String getWeek(String sdate) {
		// 再转换为时间
		Date date = DateUtil.strToDate(sdate, YYYY_MM_DD);
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		// int hour=c.get(Calendar.DAY_OF_WEEK);
		// hour中存的就是星期几了,其范围 1~7
		// 1=星期日 7=星期六,其他类推
		return new SimpleDateFormat("EEEE").format(c.getTime());
	}
	public static String getWeekStr(String sdate) {
		String str = "";
		str = DateUtil.getWeek(sdate);
		if ("1".equals(str)) {
			str = "星期日";
		} else if ("2".equals(str)) {
			str = "星期一";
		} else if ("3".equals(str)) {
			str = "星期二";
		} else if ("4".equals(str)) {
			str = "星期三";
		} else if ("5".equals(str)) {
			str = "星期四";
		} else if ("6".equals(str)) {
			str = "星期五";
		} else if ("7".equals(str)) {
			str = "星期六";
		}
		return str;
	}
	/**
	 * 两个时间之间的天数
	 *
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static long getDays(String date1, String date2) {
		if (date1 == null || date1.equals(""))
			return 0;
		if (date2 == null || date2.equals(""))
			return 0;
		// 转换为标准时间
		SimpleDateFormat myFormatter = new SimpleDateFormat(YYYY_MM_DD);
		Date date = null;
		Date mydate = null;
		try {
			date = myFormatter.parse(date1);
			mydate = myFormatter.parse(date2);
		} catch (Exception e) {
		}
		long day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
		return day;
	}
	/**
	 * 返回两个日期相差的天数
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static long getDays(Date date1, Date date2) {
		if (date1 == null || date2 == null)
			return 0;
		long day = (date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000);
		return day;
	}
	/**
	 * 返回两个日期相差的小时数(保留2位小数)
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static float getHours(Date date1, Date date2) {
		if (date1 == null || date2 == null)
			return 0;
		float hours = (date1.getTime() - date2.getTime()) / (float)(60 * 60 * 1000);
		BigDecimal decimal = new BigDecimal(hours);
		float hour = decimal.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
		return hour;
	}
	/**
	 * 形成如下的日历 , 根据传入的一个时间返回一个结构 星期日 星期一 星期二 星期三 星期四 星期五 星期六 下面是当月的各个时间
	 * 此函数返回该日历第一行星期日所在的日期
	 *
	 * @param sdate
	 * @return
	 */
	public static String getNowMonth(String sdate) {
		// 取该时间所在月的一号
		sdate = sdate.substring(0, 8) + "01";
		// 得到这个月的1号是星期几
		Date date = DateUtil.strToDate(sdate, YYYY_MM_DD);
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		int u = c.get(Calendar.DAY_OF_WEEK);
		String newday = DateUtil.getNextDay(sdate, 1 - u);
		return newday;
	}
	/**
	 * 取得数据库主键 生成格式为yyyymmddhhmmss+k位随机数
	 *
	 * @param k 表示是取几位随机数,可以自己定
	 */
	public static String getNo(int k) {
		return getUserDate("yyyyMMddhhmmss") + getRandom(k);
	}
	/**
	 * 取得流水号 生成格式为yyyymmddhhmmss+k位随机UUID
	 *
	 * @param k 表示是取几位随机数,可以自己定
	 */
	public static String getUidNo(int k) {
		return getUserDate("yyyyMMddhhmmss") + UUID.randomUUID().toString().replaceAll("-", "").substring(0, k);
	}
	/**
	 * 返回一个随机数
	 *
	 * @param i
	 * @return
	 */
	public static String getRandom(int i) {
		Random jjj = new Random();
		if (i == 0)
			return "";
		String jj = "";
		for (int k = 0; k < i; k++) {
			jj = jj + jjj.nextInt(9);
		}
		return jj;
	}
	/**
	 * 根据用户生日计算年龄
	 */
	public static int getAgeByBirthday(Date birthday) {
		try {
			int age = 0;
			if (birthday == null) {
				return age;
			}
			String birth = new SimpleDateFormat("yyyyMMdd").format(birthday);
			int year = Integer.valueOf(birth.substring(0, 4));
			int month = Integer.valueOf(birth.substring(4, 6));
			int day = Integer.valueOf(birth.substring(6));
			Calendar cal = Calendar.getInstance();
			age = cal.get(Calendar.YEAR) - year;
			//周岁计算
			if (cal.get(Calendar.MONTH) < (month - 1) || (cal.get(Calendar.MONTH) == (month - 1) && cal.get(Calendar.DATE) < day)) {
				age--;
			}
			return age;
		} catch (Exception e) {
			return 0;
		}
	}
	/**
	 *  字符串转时间
	 * @param str 时间字符串
	 * @param eg 格式
	 * @return
	 */
	public static Date stringToDate(String str, String eg) {
		DateFormat format = new SimpleDateFormat(eg);
		Date date = null;
		if (str != null && !"".equals(str)) {
			try {
				date = format.parse(str);
			} catch (Exception e) {
				return null;
			}
		}
		return date;
	}
	public static int getNowMonth(){
		Calendar cal = Calendar.getInstance();
		return cal.get(Calendar.MONTH)+1;
	}
	public static int getNowYear(){
		Calendar cal = Calendar.getInstance();
		return cal.get(Calendar.YEAR);
	}
	/**
	 * 获取周一
	 * @return
     */
	public static String getMondayOfThisWeek() {
		SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
		Calendar c = Calendar.getInstance();
		int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
		if (day_of_week == 0)
			day_of_week = 7;
		c.add(Calendar.DATE, -day_of_week + 1);
		return df2.format(c.getTime());
	}
	/**
	 * 得到本周周日
	 *
	 * @return yyyy-MM-dd
	 */
	public static String getSundayOfThisWeek() {
		SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
		Calendar c = Calendar.getInstance();
		int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
		if (day_of_week == 0)
			day_of_week = 7;
		c.add(Calendar.DATE, -day_of_week + 7);
		return df2.format(c.getTime());
	}
	/**
	 * 获取当月第一天
	 * @return
     */
	public static String getFristDayOfMonth() {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		// 获取前月的第一天
		Calendar c = Calendar.getInstance();
		c.add(Calendar.MONTH, 0);
		c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
		String first = format.format(c.getTime());
		return format.format(c.getTime());
	}
	/**
	 * 获取当月最后一天
	 */
	public static String getLastDayOfMonth(){
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		// 获取前月的第一天
		Calendar ca = Calendar.getInstance();
		ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
		return format.format(ca.getTime());
	}
	public static int getSignYear(){
		Calendar ca = Calendar.getInstance();
		if(getNowMonth()>=7){
			return getNowYear();
		}
		return getNowYear()-1;
	}
	/**
	 * 计算预产期
	 * 末次月经开始日期(第一天),月份+9,日期+7
	 * @param date
	 * @return
	 */
	public static Date getDueDate(Date date){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.MONTH,9);
		cal.add(Calendar.DAY_OF_YEAR,7);
		return cal.getTime();
	}
	/**
	 * 计算产检时间
	 * @param date
	 * @param day
	 * @return
	 */
	public static Date getPrenatalInspectorDate(Date date,Integer day){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.add(Calendar.DAY_OF_YEAR,day);
		return cal.getTime();
	}
	/**
	 * 将HH:MM格式的字符串转TIME
	 * @param hhmm
	 * @return
	 */
	public static Time hhmmStrToTime(String hhmm){
		Time time = null;
		DateFormat sdf = new SimpleDateFormat("HH:mm");
		try {
			Date date = sdf.parse(hhmm);
			time = new Time(date.getTime());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return time;
	}
	/**
	 * 获取当前时间的Timestamp
	 * @return
	 */
	public static Timestamp getNowTimestamp(){
		Date date = new Date();
		Timestamp nousedate = new Timestamp(date.getTime());
		return nousedate;
	}
	/**
	 *  日期加减天数
	 * @param date 时间
	 * @param days 天数�?
	 * @return
	 */
	public static Date setDateTime(Date date,int days){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		cal.set(Calendar.DATE, cal.get(Calendar.DATE) +(days));
		return  cal.getTime();
	}
	public static List<Map<String,Object>> findDates(Date dBegin, Date dEnd) {
		List<Map<String,Object>> lDate = new ArrayList();
		Map<String,Object> st = new HashedMap();
		st.put("date",DateUtil.dateToStr(dBegin,"yyyy-MM-dd"));
		st.put("avg",0);
		st.put("count", 0);
		lDate.add(st);
		Calendar calBegin = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calBegin.setTime(dBegin);
		Calendar calEnd = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calEnd.setTime(dEnd);
		// 测试此日期是否在指定日期之后
		while (dEnd.after(calBegin.getTime())) {
			// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
			calBegin.add(Calendar.DAY_OF_MONTH, 1);
			if(!dEnd.after(calBegin.getTime())){
				break;
			}
			Map<String,Object> stt = new HashedMap();
			stt.put("date",DateUtil.dateToStr(calBegin.getTime(),"yyyy-MM-dd"));
			stt.put("avg",0);
			stt.put("count", 0);
			lDate.add(stt);
		}
		return lDate;
	}
	public static List<Map<String,Object>> findDateASWeeks(Date dBegin, Date dEnd) {
		List<Map<String,Object>> lDate = new ArrayList();
		Calendar calBegin = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calBegin.setTime(dBegin);
		if(checkDateMonday(calBegin)){
			Map<String,Object> st = new HashedMap();
			st.put("date",DateUtil.dateToStr(dBegin,"yyyy-MM-dd"));
			st.put("avg",0);
			st.put("count",0);
			lDate.add(st);
		}
		Calendar calEnd = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calEnd.setTime(dEnd);
		// 测试此日期是否在指定日期之后
		while (dEnd.after(calBegin.getTime())) {
			// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
			calBegin.add(Calendar.DAY_OF_MONTH, 1);
			/*if(!dEnd.after(calBegin.getTime())){
				break;
			}*/
			if (dEnd.compareTo(calBegin.getTime())==-1){
				break;
			}
			if(checkDateMonday(calBegin)){
				Map<String,Object> stt = new HashedMap();
				stt.put("date",DateUtil.dateToStr(calBegin.getTime(),"yyyy-MM-dd"));
				stt.put("avg",0);
				stt.put("count",0);
				lDate.add(stt);
			}
		}
		return lDate;
	}
	public static List<Map<String,Object>> findDateASMonth(Date dBegin, Date dEnd) {
		List<Map<String,Object>> lDate = new ArrayList();
		Calendar calBegin = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calBegin.setTime(dBegin);
		if(checkFristDayOfDateMonth(calBegin)){
			Map<String,Object> st = new HashedMap();
			st.put("date",DateUtil.dateToStr(dBegin,"yyyy-MM"));
			st.put("avg",0);
			lDate.add(st);
		}
		Calendar calEnd = Calendar.getInstance();
		// 使用给定的 Date 设置此 Calendar 的时间
		calEnd.setTime(dEnd);
		// 测试此日期是否在指定日期之后
		while (dEnd.after(calBegin.getTime())) {
			// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
			calBegin.add(Calendar.DAY_OF_MONTH, 1);
			if(!dEnd.after(calBegin.getTime())){
				break;
			}
			if(checkFristDayOfDateMonth(calBegin)){
				Map<String,Object> stt = new HashedMap();
				stt.put("date",DateUtil.dateToStr(calBegin.getTime(),"yyyy-MM"));
				stt.put("avg",0);
				lDate.add(stt);
			}
		}
		return lDate;
	}
	public static boolean checkDateMonday(Calendar cal){
		int week=cal.get(Calendar.DAY_OF_WEEK)-1;
		if(week ==1){
			return true;
		}else{
			return false;
		}
	}
	public static boolean checkFristDayOfDateMonth(Calendar cal){
		int today = cal.get(cal.DAY_OF_MONTH);
		if(today ==1){
			return true;
		}else{
			return false;
		}
	}
	public static List<Map<String,Object>> getLast6Month(){
		List<Map<String,Object>> rs = new ArrayList<>();
		Calendar dd = Calendar.getInstance();//定义日期实例
		Date endDate = new Date();
		dd.setTime(endDate);
		for(int i=1;i<7;i++){
			Map<String,Object> mc = new HashedMap();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
			String date = sdf.format(dd.getTime());
			mc.put("month",date);
			mc.put("count",0);
			dd.add(Calendar.MONTH,-1);
			rs.add(mc);
		}
		return rs;
	}
	/**
	 * 获取去年日期
	 * @return
     */
	public static String getLastYear(){
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.YEAR,-1);
		return dateToStrLong(cal.getTime());
	}
	/**
	 * 获取儿童的年龄
	 * @param date
	 * @return
     */
	public static String getChildAge(Date date){
		Calendar now = Calendar.getInstance();
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		int year = now.get(Calendar.YEAR)-cal.get(Calendar.YEAR);
		int month = now.get(Calendar.MONTH)-cal.get(Calendar.MONTH);
		if(month<0){
			year--;
			month+=12;
		}
		int day = now.get(Calendar.DAY_OF_MONTH)-cal.get(Calendar.DAY_OF_MONTH);
		if(day<0){
			month--;
			Calendar temp = Calendar.getInstance();
			temp.setTime(date);
			temp.add(Calendar.MONTH,1);
			temp.set(Calendar.DAY_OF_MONTH,1);
			temp.add(Calendar.DAY_OF_MONTH,-1);
			day = temp.get(Calendar.DAY_OF_MONTH)+now.get(Calendar.DAY_OF_MONTH)-cal.get(Calendar.DAY_OF_MONTH);
		}
		String y = year>0? year+"岁":"";
		String m = month>0? month+"月":"";
		String d = day>0? day+"天":"";
		return y+m+d;
	}
	public static int getWeekOfMonth(String dateString){
		Date date = strToDate(dateString);
		return getWeekOfMonth(date);
	}
	public static int getWeekOfMonth(Date date){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH);
		return weekOfMonth;
	}
	//将时间维度查出来的quotaDate转成yyyy-MM
	public static String changeQuotaDate(Date quotaDate){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
		String  date = sdf.format(quotaDate);
		return date;
	}
	public static String getYear(String strDate, String format){
		Date date = strToDate(strDate,format);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.YEAR)+"";
	}
	public static String getMonth(String dateString){
		Date date = strToDate(dateString);
		return new SimpleDateFormat(YYYY_MM).format(date);
	}
	/**
	 * 获取周一
	 * @return
	 */
	public static String getMondayOfThisDate(Date date) {
		SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
		if (day_of_week == 0)
			day_of_week = 7;
		c.add(Calendar.DATE, -day_of_week + 1);
		return df2.format(c.getTime());
	}
	/**
	 * 得到本周周日
	 *
	 * @return yyyy-MM-dd
	 */
	public static String getSundayOfThisDate(Date date) {
		SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
		if (day_of_week == 0)
			day_of_week = 7;
		c.add(Calendar.DATE, -day_of_week + 7);
		return df2.format(c.getTime());
	}
	/**
	 * 获取某个时间
	 *
	 * @return返回短时间格式 yyyy-MM-dd
	 */
	public static Date getDateShort(Date date) {
		SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD);
		String dateString = formatter.format(date);
		return strToDate(dateString, YYYY_MM_DD);
	}
	/**
	 * 获取当月第一天
	 * @return
	 */
	public static String getFristDayOfMonthThisDate(Date date) {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		// 获取前月的第一天
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.MONTH, 0);
		c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天
		String first = format.format(c.getTime());
		return format.format(c.getTime());
	}
	/**
	 * 获取当月最后一天
	 */
	public static String getLastDayOfMonthThisDate(Date date){
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		// 获取前月的第一天
		Calendar ca = Calendar.getInstance();
		ca.setTime(date);
		ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
		return format.format(ca.getTime());
	}
	
	/**
	 * 根据日期对象返回星期几
	 * @param date
	 * @return
	 */
	public static int getWeekByDate(Date date){
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		int week = c.get(Calendar.DAY_OF_WEEK);
		return week;
	}
	//获取本年的开始时间
    public static Date getBeginDayOfYear() {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, getNowYear());
		// cal.set
		cal.set(Calendar.MONTH, Calendar.JANUARY);
		cal.set(Calendar.DATE, 1);
		return getDayStartTime(cal.getTime());
	 }
	//获取本年的结束时间
	public static Date getEndDayOfYear() {
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, getNowYear());
		cal.set(Calendar.MONTH, Calendar.DECEMBER);
		cal.set(Calendar.DATE, 31);
		return getDayEndTime(cal.getTime());
	 }
	//获取某个日期的开始时间
	public static Timestamp getDayStartTime(Date d) {
		Calendar calendar = Calendar.getInstance();
		if(null != d) calendar.setTime(d);
		calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		return new Timestamp(calendar.getTimeInMillis());
	}
	//获取某个日期的结束时间
     public static Timestamp getDayEndTime(Date d) {
		 Calendar calendar = Calendar.getInstance();
		 if(null != d) calendar.setTime(d);
		 calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),    calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
		 calendar.set(Calendar.MILLISECOND, 999);
		 return new Timestamp(calendar.getTimeInMillis());
	 }
	/**
	 * 比较2个时间相差月份
	 * @return
     */
	public static int compareYear(Date start,Date end){
		int re = 1;
		Calendar cal1 = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();
		cal1.setTime(start);
		cal2.setTime(end);
		int year = cal2.get(Calendar.YEAR)-cal1.get(Calendar.YEAR);
		int month = cal2.get(Calendar.MONTH)-cal1.get(Calendar.MONTH);
		int day = cal2.get(Calendar.DAY_OF_MONTH)-cal1.get(Calendar.DAY_OF_MONTH);
		if(year>0){
			re = year;
			if(month>0){
				re++;
			}else if(month==0&&day>=0){
				re++;
			}
		}
		return re;
	}
}

+ 64 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/util/MD5.java

@ -0,0 +1,64 @@
package com.yihu.admin.server.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/*
 * MD5 算法1
 */
public class MD5 {
	// 全局数组
	private final static String[] strDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
	public MD5() {
	}
	// 返回形式为数字跟字符串
	private static String byteToArrayString(byte bByte) {
		int iRet = bByte;
		// System.out.println("iRet="+iRet);
		if (iRet < 0) {
			iRet += 256;
		}
		int iD1 = iRet / 16;
		int iD2 = iRet % 16;
		return strDigits[iD1] + strDigits[iD2];
	}
	// 返回形式只为数字
//	private static String byteToNum(byte bByte) {
//		int iRet = bByte;
//		System.out.println("iRet1=" + iRet);
//		if (iRet < 0) {
//			iRet += 256;
//		}
//		return String.valueOf(iRet);
//	}
	// 转换字节数组为16进制字串
	private static String byteToString(byte[] bByte) {
		StringBuffer sBuffer = new StringBuffer();
		for (int i = 0; i < bByte.length; i++) {
			sBuffer.append(byteToArrayString(bByte[i]));
		}
		return sBuffer.toString();
	}
	public static String GetMD5Code(String strObj) {
		String resultString = null;
		try {
			resultString = new String(strObj);
			MessageDigest md = MessageDigest.getInstance("MD5");
			// md.digest() 该函数返回值为存放哈希值结果的byte数组
			resultString = byteToString(md.digest(strObj.getBytes()));
		} catch (NoSuchAlgorithmException ex) {
			ex.printStackTrace();
		}
		return resultString;
	}
	public static void main(String[] args) {
		System.out.println(GetMD5Code("123456abcdefg"));
	}
}

+ 31 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/SocketEndPoint.java

@ -0,0 +1,31 @@
package com.yihu.admin.server.websocket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.socket.handler.TextWebSocketHandler;
/**
 * Created by chenweida on 2018/5/22 0022.1
 */
@RestController
@RequestMapping("socketServer")
public class SocketEndPoint {
    @Autowired
    private WebSocketHandler webSocketHandler;
    @PostMapping("sendTest")
    public void sendTest(
            @RequestParam(value = "userid", required = true) String userid,
            @RequestParam(value = "message", required = true) String message
    ) {
        webSocketHandler.getAllUsers();
    }
    @GetMapping("getAllUsers")
    public String getAllUsers(
    ) {
        return webSocketHandler.getAllUsers().keySet().toString();
    }
}

+ 139 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/WebSocketHandler.java

@ -0,0 +1,139 @@
package com.yihu.admin.server.websocket;
import com.yihu.admin.server.websocket.store.EventStore;
import net.sf.json.JSONObject;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
/**
 * Created by chenweida on 2018/5/22 0022.1
 */
public class WebSocketHandler extends TextWebSocketHandler {
    private static Logger logger = LoggerFactory.getLogger(WebSocketHandler.class);
    private static final Map<String, WebSocketSession> users;  //Map来存储WebSocketSession,key用USER_ID 即在线用户列表
    //用户标识
    public static final String USER_ID = "WEBSOCKET_USERID";   //对应监听器从的key
    public static final String USER_ADDRESS = "WEBSOCKET_ADDRESS";   //对应监听器从的key
    private EventStore eventStore;
    static {
        users = new HashMap<String, WebSocketSession>();
    }
    public WebSocketHandler(EventStore eventStore) {
        this.eventStore = eventStore;
    }
    /**
     * 连接成功时候,会触发页面上onopen方法
     */
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        logger.info("成功建立websocket连接!");
        String userId = (String) session.getAttributes().get(USER_ID);
        users.put(userId, session);
        logger.info("当前线上监控的服务器数量:" + users.size());
        //这块会实现自己业务,比如,当用户登录后,会把离线消息推送给用户
        //TextMessage returnMessage = new TextMessage("成功建立socket连接,你将收到的离线");
        //session.sendMessage(returnMessage);
    }
    /**
     * 关闭连接时触发
     */
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        logger.debug("关闭websocket连接");
        String userId = (String) session.getAttributes().get(USER_ID);
        logger.info("服务器" + userId + "已退出!");
        users.remove(userId);
        logger.info("剩余监控的服务器" + users.size());
    }
    /**
     * 调用websocket.send时候,会调用该方法
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        super.handleTextMessage(session, message);
        /**
         * 收到消息,自定义处理机制,实现业务
         */
        logger.info("服务器收到消息:" + message);
        String messageBody = message.getPayload();
        eventStore.saveEvent(JSONObject.fromObject(messageBody));
    }
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        if (session.isOpen()) {
            session.close();
        }
        logger.info("传输出现异常,关闭websocket连接... ");
        String userId = (String) session.getAttributes().get(USER_ID);
        users.remove(userId);
    }
    public boolean supportsPartialMessages() {
        return false;
    }
    /**
     * 给某个用户发送消息
     *
     * @param userId
     * @param message
     */
    public void sendMessageToUser(String userId, TextMessage message) {
        for (String id : users.keySet()) {
            if (id.equals(userId)) {
                try {
                    if (users.get(id).isOpen()) {
                        users.get(id).sendMessage(message);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
                break;
            }
        }
    }
    /**
     * 给所有在线用户发送消息
     *
     * @param message
     */
    public void sendMessageToUsers(TextMessage message) {
        for (String userId : users.keySet()) {
            try {
                if (users.get(userId).isOpen()) {
                    users.get(userId).sendMessage(message);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 获取现在的全部用户
     */
    public Map<String, WebSocketSession> getAllUsers() {
        return users;
    }
}

+ 50 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/WebSocketHandlerInterceptor.java

@ -0,0 +1,50 @@
package com.yihu.admin.server.websocket;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
import java.util.Map;
/**
 * WebSocket拦截器----握手之前将登陆用户信息从session设置到WebSocketSession1
 */
public class WebSocketHandlerInterceptor extends HttpSessionHandshakeInterceptor {
    private Logger logger = LoggerFactory.getLogger(WebSocketHandlerInterceptor.class);
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
                                   Map<String, Object> attributes) throws Exception {
        if (request instanceof ServletServerHttpRequest) {
            ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
            //使用userName区分WebSocketHandler,以便定向发送消息
            String id = servletRequest.getHeaders().get("id").toString();  //一般直接保存user实体
            String address = servletRequest.getHeaders().get("address").toString();  //一般直接保存user实体
            logger.info("注入到服务列表的userName:" + id);
            if (!StringUtils.isEmpty(id)) {
                attributes.put(com.yihu.admin.server.websocket.WebSocketHandler.USER_ID, id);
            }
            if (!StringUtils.isEmpty(address)) {
                attributes.put(com.yihu.admin.server.websocket.WebSocketHandler.USER_ADDRESS, address);
            }
        }
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }
    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
                               Exception ex) {
        super.afterHandshake(request, response, wsHandler, ex);
    }
}

+ 41 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/store/ElasticSearchStore.java

@ -0,0 +1,41 @@
package com.yihu.admin.server.websocket.store;
import com.yihu.admin.server.properties.AdminServerProperties;
import com.yihu.base.es.config.ElastricSearchHelper;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
/**
 * Created by chenweida on 2018/5/23 0023.1
 */
public class ElasticSearchStore implements EventStore {
    private Logger logger = LoggerFactory.getLogger(ElasticSearchStore.class);
    private EsEventBuffer esEventBuffer;
    @Override
    public Boolean saveEvent(JSONObject jo) {
        try {
            esEventBuffer.addLogEvent(jo.toString());
            return true;
        } catch (Exception e) {
            logger.error(e.getMessage());
            return false;
        }
    }
    public EsEventBuffer getEsEventBuffer() {
        return esEventBuffer;
    }
    public void setEsEventBuffer(EsEventBuffer esEventBuffer) {
        this.esEventBuffer = esEventBuffer;
    }
}

+ 67 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/store/EsEventBuffer.java

@ -0,0 +1,67 @@
package com.yihu.admin.server.websocket.store;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.LoggingEvent;
import com.yihu.admin.server.properties.AdminServerProperties;
import com.yihu.base.es.config.ElastricSearchHelper;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
 * Created by chenweida on 2018/2/24.1
 */
@Component
public class EsEventBuffer {
    //缓冲队列
    BlockingQueue queue = null;
    @Autowired
    private ElastricSearchHelper elastricSearchHelper;
    @Autowired
    private AdminServerProperties adminServerProperties;
    public EsEventBuffer() {
        queue = new ArrayBlockingQueue(50000);
    }
    public BlockingQueue getBuffer() {
        return queue;
    }
    public void setQueue(BlockingQueue queue) {
        this.queue = queue;
    }
    public void addLogEvent(String eventObject) {
        queue.add(eventObject);
    }
    @Scheduled(cron = "0/3 * * * * ?")
    public void TaskJob() {
        try {
            List<Object> eventObjectList = new ArrayList<>();
            //获取队列中的全部数据
            queue.drainTo(eventObjectList);
            if (eventObjectList.size() > 0) {
                if (adminServerProperties.getPartitionWithEventName()) {
                    String index = adminServerProperties.getDefaultIndexName();
                    String type = adminServerProperties.getDefaultTypeName();
                    elastricSearchHelper.save(index, type, eventObjectList);
                } else {
                    elastricSearchHelper.save(adminServerProperties.getDefaultIndexName(), adminServerProperties.getDefaultTypeName(), eventObjectList);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

+ 11 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/websocket/store/EventStore.java

@ -0,0 +1,11 @@
package com.yihu.admin.server.websocket.store;
import net.sf.json.JSONObject;
/**
 * Created by chenweida on 2018/5/23 0023.1
 */
public interface EventStore {
    Boolean saveEvent(JSONObject jo);
}

+ 44 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/zuul/RouterCreater.java

@ -0,0 +1,44 @@
package com.yihu.admin.server.zuul;
import com.yihu.admin.server.eureka.DiscoveryService;
import com.yihu.admin.server.model.RuleRoute;
import com.yihu.admin.server.model.Server;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
 * Created by chenweida on 2018/5/15 0015.1
 */
public class RouterCreater {
    private Logger logger= LoggerFactory.getLogger(RouterCreater.class);
    private DiscoveryService discoveryService;
    public RouterCreater(DiscoveryService discoveryService) {
        this.discoveryService = discoveryService;
    }
    public List<RuleRoute> create() {
        List<RuleRoute> ruleRoutes = new ArrayList<>();
        List<Server> servers = discoveryService.listServers();
        for (Server server : servers) {
            RuleRoute ruleRoute = new RuleRoute();
            ruleRoute.setId(server.getUuid());
            ruleRoute.setPath("/" + server.getUuid() + "/**");
            ruleRoute.setUrl("http://"+server.getIp()+":"+server.getPort()+"/");
            ruleRoute.setEnabled(true);
            ruleRoute.setRetryable(true);
            logger.debug(ruleRoute.toString());
            ruleRoutes.add(ruleRoute);
        }
        return ruleRoutes;
    }
}

+ 105 - 0
admin/admin-server-starter/src/main/java/com/yihu/admin/server/zuul/SimplerRouter.java

@ -0,0 +1,105 @@
package com.yihu.admin.server.zuul;
import com.yihu.admin.server.model.RuleRoute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.cloud.netflix.zuul.filters.RefreshableRouteLocator;
import org.springframework.cloud.netflix.zuul.filters.SimpleRouteLocator;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by chenweida on 2018/4/27 0027.1
 * 简单的实现路由器
 */
public class SimplerRouter extends SimpleRouteLocator implements RefreshableRouteLocator {
    public final static Logger logger = LoggerFactory.getLogger(SimplerRouter.class);
    private ZuulProperties properties;
    private RouterCreater routerCreater;
    public SimplerRouter(String servletPath, ZuulProperties properties) {
        super(servletPath, properties);
        this.properties = properties;
        logger.info("servletPath:{}", servletPath);
    }
    @Override
    public void refresh() {
        super.doRefresh();
    }
    @Override
    protected Map<String, ZuulProperties.ZuulRoute> locateRoutes() {
        LinkedHashMap<String, ZuulProperties.ZuulRoute> routesMap = new LinkedHashMap<String, ZuulProperties.ZuulRoute>();
        //从application.properties中加载路由信息  禁用掉
        //routesMap.putAll(super.locateRoutes());
        //从db中加载路由信息
        routesMap.putAll(locateRoutesFromDB());
        //优化一下配置
        LinkedHashMap<String, ZuulProperties.ZuulRoute> values = new LinkedHashMap<String, ZuulProperties.ZuulRoute>();
        for (Map.Entry<String, ZuulProperties.ZuulRoute> entry : routesMap.entrySet()) {
            String path = entry.getKey();
            // Prepend with slash if not already present.
            if (!path.startsWith("/")) {
                path = "/" + path;
            }
            if (StringUtils.hasText(this.properties.getPrefix())) {
                path = this.properties.getPrefix() + path;
                if (!path.startsWith("/")) {
                    path = "/" + path;
                }
            }
            values.put(path, entry.getValue());
        }
        return values;
    }
    /**
     * 模拟从数据库加载数据
     *
     * @return
     */
    private Map<String, ZuulProperties.ZuulRoute> locateRoutesFromDB() {
        Map<String, ZuulProperties.ZuulRoute> routes = new LinkedHashMap<String, ZuulProperties.ZuulRoute>();
        //现在是写死在代码中,这边可以改成用数据库获取数据
        List<RuleRoute> results = routerCreater.create();
        for (RuleRoute result : results) {
            //判断配置是否正确
            if (StringUtils.isEmpty(result.getPath())) {
                logger.error(" id: " + result.getId() + " path 为空");
                continue;
            }
            if (StringUtils.isEmpty(result.getServiceId()) && StringUtils.isEmpty(result.getUrl())) {
                logger.error(" id: " + result.getId() + " serviceID,url 都为空");
                continue;
            }
            ZuulProperties.ZuulRoute zuulRoute = new ZuulProperties.ZuulRoute();
            try {
                BeanUtils.copyProperties(result, zuulRoute);
            } catch (Exception e) {
                logger.error("=============从数据库加载Zuul配置失败==============", e);
            }
            logger.debug(result.toString());
            routes.put(zuulRoute.getPath(), zuulRoute);
        }
        return routes;
    }
    public RouterCreater getRouterCreater() {
        return routerCreater;
    }
    public void setRouterCreater(RouterCreater routerCreater) {
        this.routerCreater = routerCreater;
    }
}

+ 4 - 0
admin/admin-server-starter/src/main/resources/META-INF/spring.factories

@ -0,0 +1,4 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.yihu.admin.server.config.ZuulAutoConfig,\
  com.yihu.admin.server.config.WebsocketConfig,\
  com.yihu.admin.server.config.AdminServerAutoConfig

+ 57 - 0
admin/admin-server-starter/src/main/resources/application.yml

@ -0,0 +1,57 @@
server:
  port: 8082
spring:
  application:
    name: admin-server-starter
  mail:
    host: smtp.qq.com
    port: 465
    username: 1501877145@qq.com
    protocol: smtp
    password: uihqhvqtrnkwhdhf #QQ的授权码
    properties:
      mail:
        smtp:
          auth: true
          socketFactory:
           class: javax.net.ssl.SSLSocketFactory
          starttls: true
          required: true
##关闭验证
management:
  security:
    enabled: false
#euruka相关配置
eureka:
  client:
    serviceUrl:
      #http://账号:密码@127.0.0.1:8761/eureka/
      defaultZone: http://jw:jkzl@127.0.0.1:8761/eureka/
  instance:
    #eurika使用IP不使用host
    prefer-ip-address: true
    #定制化在eurika中显示的名称
    instance-id: ${spring.cloud.client.ipAddress}:${server.port}
#info端点信息
info:
  application:
    name: ${spring.application.name}
    port: ${server.port}
##logback地址
logging:
  file: admin-server-starter.log
  path: G:\idea_workspace\jkzl_git\jkzl-start\jkzl-start\admin\admin-server-starter\logs
  level:
    root: INFO
yihu:
  admin:
    server:
      defaultIndexName: adminlog
      defaultTypeName: adminlog
      partitionWithEventName: true

+ 5 - 0
admin/admin-server-starter/src/main/resources/logback.xml

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <jmxConfigurator/>
</configuration>

+ 33 - 0
admin/admin-server-ui-starter/pom.xml

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.yihu</groupId>
        <artifactId>admin-parent</artifactId>
        <version>1.2.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>admin-server-ui-starter</artifactId>
    <version>${verion.yihu.admin}</version>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator-docs</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
</project>

+ 19 - 0
admin/admin-server-ui-starter/src/main/java/com.yihu.admin.server.ui/config/MVCConfig.java

@ -0,0 +1,19 @@
package com.yihu.admin.server.ui.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
 * Created by chenweida on 2018/5/15 0015.
 */
@Configuration
public class MVCConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/demo/**").addResourceLocations("classpath:/demo/");
        registry.addResourceHandler("/admin/**").addResourceLocations("classpath:/admin/");
        super.addResourceHandlers(registry);
    }
}

+ 2 - 0
admin/admin-server-ui-starter/src/main/resources/META-INF/spring.factories

@ -0,0 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.yihu.admin.server.ui.config.MVCConfig

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 12 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/animate.min.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 5 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/bootstrap.min.css


+ 358 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/demo/webuploader-demo.css

@ -0,0 +1,358 @@
#container {
    color: #838383;
    font-size: 12px;
}
#uploader .queueList {
    margin: 20px;
    border: 3px dashed #e6e6e6;
}
#uploader .queueList.filled {
    padding: 17px;
    margin: 0;
    border: 3px dashed transparent;
}
#uploader .queueList.webuploader-dnd-over {
    border: 3px dashed #999999;
}
#uploader p {margin: 0;}
.element-invisible {
    position: absolute !important;
    clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
    clip: rect(1px,1px,1px,1px);
}
#uploader .placeholder {
    min-height: 350px;
    padding-top: 178px;
    text-align: center;
    background: url(../../../img/webuploader.png) center 93px no-repeat;
    color: #cccccc;
    font-size: 18px;
    position: relative;
}
#uploader .placeholder .webuploader-pick {
    font-size: 18px;
    background: #00b7ee;
    border-radius: 3px;
    line-height: 44px;
    padding: 0 30px;
    *width: 120px;
    color: #fff;
    display: inline-block;
    margin: 0 auto 20px auto;
    cursor: pointer;
    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
}
#uploader .placeholder .webuploader-pick-hover {
    background: #00a2d4;
}
#uploader .placeholder .flashTip {
    color: #666666;
    font-size: 12px;
    position: absolute;
    width: 100%;
    text-align: center;
    bottom: 20px;
}
#uploader .placeholder .flashTip a {
    color: #0785d1;
    text-decoration: none;
}
#uploader .placeholder .flashTip a:hover {
    text-decoration: underline;
}
#uploader .filelist {
    list-style: none;
    margin: 0;
    padding: 0;
}
#uploader .filelist:after {
    content: '';
    display: block;
    width: 0;
    height: 0;
    overflow: hidden;
    clear: both;
}
#uploader .filelist li {
    width: 110px;
    height: 110px;
    background: url(../../img/bg.png) no-repeat;
    text-align: center;
    margin: 0 8px 20px 0;
    position: relative;
    display: inline;
    float: left;
    overflow: hidden;
    font-size: 12px;
}
#uploader .filelist li p.log {
    position: relative;
    top: -45px;
}
#uploader .filelist li p.title {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    overflow: hidden;
    white-space: nowrap;
    text-overflow : ellipsis;
    top: 5px;
    text-indent: 5px;
    text-align: left;
}
#uploader .filelist li p.progress {
    position: absolute;
    width: 100%;
    bottom: 0;
    left: 0;
    height: 8px;
    overflow: hidden;
    z-index: 50;
    margin: 0;
    border-radius: 0;
    background: none;
    -webkit-box-shadow: 0 0 0;
}
#uploader .filelist li p.progress span {
    display: none;
    overflow: hidden;
    width: 0;
    height: 100%;
    background: #1483d8 url(../../img/progress.png) repeat-x;
    -webit-transition: width 200ms linear;
    -moz-transition: width 200ms linear;
    -o-transition: width 200ms linear;
    -ms-transition: width 200ms linear;
    transition: width 200ms linear;
    -webkit-animation: progressmove 2s linear infinite;
    -moz-animation: progressmove 2s linear infinite;
    -o-animation: progressmove 2s linear infinite;
    -ms-animation: progressmove 2s linear infinite;
    animation: progressmove 2s linear infinite;
    -webkit-transform: translateZ(0);
}
@-webkit-keyframes progressmove {
    0% {
       background-position: 0 0;
    }
    100% {
       background-position: 17px 0;
    }
}
@-moz-keyframes progressmove {
    0% {
       background-position: 0 0;
    }
    100% {
       background-position: 17px 0;
    }
}
@keyframes progressmove {
    0% {
       background-position: 0 0;
    }
    100% {
       background-position: 17px 0;
    }
}
#uploader .filelist li p.imgWrap {
    position: relative;
    z-index: 2;
    line-height: 110px;
    vertical-align: middle;
    overflow: hidden;
    width: 110px;
    height: 110px;
    -webkit-transform-origin: 50% 50%;
    -moz-transform-origin: 50% 50%;
    -o-transform-origin: 50% 50%;
    -ms-transform-origin: 50% 50%;
    transform-origin: 50% 50%;
    -webit-transition: 200ms ease-out;
    -moz-transition: 200ms ease-out;
    -o-transition: 200ms ease-out;
    -ms-transition: 200ms ease-out;
    transition: 200ms ease-out;
}
#uploader .filelist li img {
    width: 100%;
}
#uploader .filelist li p.error {
    background: #f43838;
    color: #fff;
    position: absolute;
    bottom: 0;
    left: 0;
    height: 28px;
    line-height: 28px;
    width: 100%;
    z-index: 100;
}
#uploader .filelist li .success {
    display: block;
    position: absolute;
    left: 0;
    bottom: 0;
    height: 40px;
    width: 100%;
    z-index: 200;
    background: url(../../img/success.png) no-repeat right bottom;
}
#uploader .filelist div.file-panel {
    position: absolute;
    height: 0;
    filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#80000000', endColorstr='#80000000')\0;
    background: rgba( 0, 0, 0, 0.5 );
    width: 100%;
    top: 0;
    left: 0;
    overflow: hidden;
    z-index: 300;
}
#uploader .filelist div.file-panel span {
    width: 24px;
    height: 24px;
    display: inline;
    float: right;
    text-indent: -9999px;
    overflow: hidden;
    background: url(../../img/icons.png) no-repeat;
    margin: 5px 1px 1px;
    cursor: pointer;
}
#uploader .filelist div.file-panel span.rotateLeft {
    background-position: 0 -24px;
}
#uploader .filelist div.file-panel span.rotateLeft:hover {
    background-position: 0 0;
}
#uploader .filelist div.file-panel span.rotateRight {
    background-position: -24px -24px;
}
#uploader .filelist div.file-panel span.rotateRight:hover {
    background-position: -24px 0;
}
#uploader .filelist div.file-panel span.cancel {
    background-position: -48px -24px;
}
#uploader .filelist div.file-panel span.cancel:hover {
    background-position: -48px 0;
}
#uploader .statusBar {
    height: 63px;
    border-top: 1px solid #dadada;
    padding: 0 20px;
    line-height: 63px;
    vertical-align: middle;
    position: relative;
}
#uploader .statusBar .progress {
    border: 1px solid #1483d8;
    width: 198px;
    background: #fff;
    height: 18px;
    position: relative;
    display: inline-block;
    text-align: center;
    line-height: 20px;
    color: #6dbfff;
    position: relative;
    margin: 0 10px 0 0;
}
#uploader .statusBar .progress span.percentage {
    width: 0;
    height: 100%;
    left: 0;
    top: 0;
    background: #1483d8;
    position: absolute;
}
#uploader .statusBar .progress span.text {
    position: relative;
    z-index: 10;
}
#uploader .statusBar .info {
    display: inline-block;
    font-size: 14px;
    color: #666666;
}
#uploader .statusBar .btns {
    position: absolute;
    top: 10px;
    right: 20px;
    line-height: 40px;
}
#filePicker2 {
    display: inline-block;
    float: left;
}
#uploader .statusBar .btns .webuploader-pick,
#uploader .statusBar .btns .uploadBtn,
#uploader .statusBar .btns .uploadBtn.state-uploading,
#uploader .statusBar .btns .uploadBtn.state-paused {
    background: #ffffff;
    border: 1px solid #cfcfcf;
    color: #565656;
    padding: 0 18px;
    display: inline-block;
    border-radius: 3px;
    margin-left: 10px;
    cursor: pointer;
    font-size: 14px;
    float: left;
}
#uploader .statusBar .btns .webuploader-pick-hover,
#uploader .statusBar .btns .uploadBtn:hover,
#uploader .statusBar .btns .uploadBtn.state-uploading:hover,
#uploader .statusBar .btns .uploadBtn.state-paused:hover {
    background: #f0f0f0;
}
#uploader .statusBar .btns .uploadBtn {
    background: #00b7ee;
    color: #fff;
    border-color: transparent;
}
#uploader .statusBar .btns .uploadBtn:hover {
    background: #00a2d4;
}
#uploader .statusBar .btns .uploadBtn.disabled {
    pointer-events: none;
    opacity: 0.6;
}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 5 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/font-awesome.min.css


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/patterns/header-profile-skin-1.png


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/patterns/header-profile-skin-3.png


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/patterns/header-profile.png


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/patterns/shattered.png


+ 251 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/awesome-bootstrap-checkbox/awesome-bootstrap-checkbox.css

@ -0,0 +1,251 @@
.checkbox {
  padding-left: 20px;
}
.checkbox label {
  display: inline-block;
  vertical-align: middle;
  position: relative;
  padding-left: 5px;
}
.checkbox label::before {
  content: "";
  display: inline-block;
  position: absolute;
  width: 17px;
  height: 17px;
  left: 0;
  margin-left: -20px;
  border: 1px solid #cccccc;
  border-radius: 3px;
  background-color: #fff;
  -webkit-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
  -o-transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
  transition: border 0.15s ease-in-out, color 0.15s ease-in-out;
}
.checkbox label::after {
  display: inline-block;
  position: absolute;
  width: 16px;
  height: 16px;
  left: 0;
  top: 0;
  margin-left: -20px;
  padding-left: 3px;
  padding-top: 1px;
  font-size: 11px;
  color: #555555;
}
.checkbox input[type="checkbox"],
.checkbox input[type="radio"] {
  opacity: 0;
  z-index: 1;
}
.checkbox input[type="checkbox"]:focus + label::before,
.checkbox input[type="radio"]:focus + label::before {
  outline: thin dotted;
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}
.checkbox input[type="checkbox"]:checked + label::after,
.checkbox input[type="radio"]:checked + label::after {
  font-family: "FontAwesome";
  content: "\f00c";
}
.checkbox input[type="checkbox"]:disabled + label,
.checkbox input[type="radio"]:disabled + label {
  opacity: 0.65;
}
.checkbox input[type="checkbox"]:disabled + label::before,
.checkbox input[type="radio"]:disabled + label::before {
  background-color: #eeeeee;
  cursor: not-allowed;
}
.checkbox.checkbox-circle label::before {
  border-radius: 50%;
}
.checkbox.checkbox-inline {
  margin-top: 0;
}
.checkbox-primary input[type="checkbox"]:checked + label::before,
.checkbox-primary input[type="radio"]:checked + label::before {
  background-color: #337ab7;
  border-color: #337ab7;
}
.checkbox-primary input[type="checkbox"]:checked + label::after,
.checkbox-primary input[type="radio"]:checked + label::after {
  color: #fff;
}
.checkbox-danger input[type="checkbox"]:checked + label::before,
.checkbox-danger input[type="radio"]:checked + label::before {
  background-color: #d9534f;
  border-color: #d9534f;
}
.checkbox-danger input[type="checkbox"]:checked + label::after,
.checkbox-danger input[type="radio"]:checked + label::after {
  color: #fff;
}
.checkbox-info input[type="checkbox"]:checked + label::before,
.checkbox-info input[type="radio"]:checked + label::before {
  background-color: #5bc0de;
  border-color: #5bc0de;
}
.checkbox-info input[type="checkbox"]:checked + label::after,
.checkbox-info input[type="radio"]:checked + label::after {
  color: #fff;
}
.checkbox-warning input[type="checkbox"]:checked + label::before,
.checkbox-warning input[type="radio"]:checked + label::before {
  background-color: #f0ad4e;
  border-color: #f0ad4e;
}
.checkbox-warning input[type="checkbox"]:checked + label::after,
.checkbox-warning input[type="radio"]:checked + label::after {
  color: #fff;
}
.checkbox-success input[type="checkbox"]:checked + label::before,
.checkbox-success input[type="radio"]:checked + label::before {
  background-color: #5cb85c;
  border-color: #5cb85c;
}
.checkbox-success input[type="checkbox"]:checked + label::after,
.checkbox-success input[type="radio"]:checked + label::after {
  color: #fff;
}
.radio {
  padding-left: 20px;
}
.radio label {
  display: inline-block;
  vertical-align: middle;
  position: relative;
  padding-left: 5px;
}
.radio label::before {
  content: "";
  display: inline-block;
  position: absolute;
  width: 17px;
  height: 17px;
  left: 0;
  margin-left: -20px;
  border: 1px solid #cccccc;
  border-radius: 50%;
  background-color: #fff;
  -webkit-transition: border 0.15s ease-in-out;
  -o-transition: border 0.15s ease-in-out;
  transition: border 0.15s ease-in-out;
}
.radio label::after {
  display: inline-block;
  position: absolute;
  content: " ";
  width: 11px;
  height: 11px;
  left: 3px;
  top: 3px;
  margin-left: -20px;
  border-radius: 50%;
  background-color: #555555;
  -webkit-transform: scale(0, 0);
  -ms-transform: scale(0, 0);
  -o-transform: scale(0, 0);
  transform: scale(0, 0);
  -webkit-transition: -webkit-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
  -moz-transition: -moz-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
  -o-transition: -o-transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
  transition: transform 0.1s cubic-bezier(0.8, -0.33, 0.2, 1.33);
}
.radio input[type="radio"] {
  opacity: 0;
  z-index: 1;
}
.radio input[type="radio"]:focus + label::before {
  outline: thin dotted;
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}
.radio input[type="radio"]:checked + label::after {
  -webkit-transform: scale(1, 1);
  -ms-transform: scale(1, 1);
  -o-transform: scale(1, 1);
  transform: scale(1, 1);
}
.radio input[type="radio"]:disabled + label {
  opacity: 0.65;
}
.radio input[type="radio"]:disabled + label::before {
  cursor: not-allowed;
}
.radio.radio-inline {
  margin-top: 0;
}
.radio-primary input[type="radio"] + label::after {
  background-color: #337ab7;
}
.radio-primary input[type="radio"]:checked + label::before {
  border-color: #337ab7;
}
.radio-primary input[type="radio"]:checked + label::after {
  background-color: #337ab7;
}
.radio-danger input[type="radio"] + label::after {
  background-color: #d9534f;
}
.radio-danger input[type="radio"]:checked + label::before {
  border-color: #d9534f;
}
.radio-danger input[type="radio"]:checked + label::after {
  background-color: #d9534f;
}
.radio-info input[type="radio"] + label::after {
  background-color: #5bc0de;
}
.radio-info input[type="radio"]:checked + label::before {
  border-color: #5bc0de;
}
.radio-info input[type="radio"]:checked + label::after {
  background-color: #5bc0de;
}
.radio-warning input[type="radio"] + label::after {
  background-color: #f0ad4e;
}
.radio-warning input[type="radio"]:checked + label::before {
  border-color: #f0ad4e;
}
.radio-warning input[type="radio"]:checked + label::after {
  background-color: #f0ad4e;
}
.radio-success input[type="radio"] + label::after {
  background-color: #5cb85c;
}
.radio-success input[type="radio"]:checked + label::before {
  border-color: #5cb85c;
}
.radio-success input[type="radio"]:checked + label::after {
  background-color: #5cb85c;
}
input[type="checkbox"].styled:checked + label:after,
input[type="radio"].styled:checked + label:after {
  font-family: 'FontAwesome';
  content: "\f00c";
}
input[type="checkbox"] .styled:checked + label::before,
input[type="radio"] .styled:checked + label::before {
  color: #fff;
}
input[type="checkbox"] .styled:checked + label::after,
input[type="radio"] .styled:checked + label::after {
  color: #fff;
}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/blueimp/css/blueimp-gallery.min.css


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/chosen/chosen-sprite.png


+ 423 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/chosen/chosen.css

@ -0,0 +1,423 @@
/*!
Chosen, a Select Box Enhancer for jQuery and Prototype
by Patrick Filler for Harvest, http://getharvest.com
Version 1.1.0
Full source at https://github.com/harvesthq/chosen
Copyright (c) 2011 Harvest http://getharvest.com
MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
This file is generated by `grunt build`, do not edit it by hand.
*/
/* @group Base */
.chosen-container {
    position: relative;
    display: inline-block;
    vertical-align: middle;
    font-size: 13px;
    zoom: 1;
    *display: inline;
    -webkit-user-select: none;
    -moz-user-select: none;
    user-select: none;
}
.chosen-container .chosen-drop {
    position: absolute;
    top: 100%;
    left: -9999px;
    z-index: 1010;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    width: 100%;
    border: 1px solid #aaa;
    border-top: 0;
    background: #fff;
    box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15);
}
.chosen-container.chosen-with-drop .chosen-drop {
    left: 0;
}
.chosen-container a {
    cursor: pointer;
}
/* @end */
/* @group Single Chosen */
.chosen-container-single .chosen-single {
    position: relative;
    display: block;
    overflow: hidden;
    padding: 0 0 0 8px;
    height: 23px;
    border: 1px solid #aaa;
    border-radius: 5px;
    background-color: #fff;
    background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4));
    background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
    background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
    background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
    background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%);
    background-clip: padding-box;
    box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1);
    color: #444;
    text-decoration: none;
    white-space: nowrap;
    line-height: 24px;
}
.chosen-container-single .chosen-default {
    color: #999;
}
.chosen-container-single .chosen-single span {
    display: block;
    overflow: hidden;
    margin-right: 26px;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.chosen-container-single .chosen-single-with-deselect span {
    margin-right: 38px;
}
.chosen-container-single .chosen-single abbr {
    position: absolute;
    top: 6px;
    right: 26px;
    display: block;
    width: 12px;
    height: 12px;
    background: url('chosen-sprite.png') -42px 1px no-repeat;
    font-size: 1px;
}
.chosen-container-single .chosen-single abbr:hover {
    background-position: -42px -10px;
}
.chosen-container-single.chosen-disabled .chosen-single abbr:hover {
    background-position: -42px -10px;
}
.chosen-container-single .chosen-single div {
    position: absolute;
    top: 0;
    right: 0;
    display: block;
    width: 18px;
    height: 100%;
}
.chosen-container-single .chosen-single div b {
    display: block;
    width: 100%;
    height: 100%;
    background: url('chosen-sprite.png') no-repeat 0px 7px;
}
.chosen-container-single .chosen-search {
    position: relative;
    z-index: 1010;
    margin: 0;
    padding: 3px 4px;
    white-space: nowrap;
}
.chosen-container-single .chosen-search input[type="text"] {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    margin: 1px 0;
    padding: 4px 20px 4px 5px;
    width: 100%;
    height: auto;
    outline: 0;
    border: 1px solid #aaa;
    background: white url('chosen-sprite.png') no-repeat 100% -20px;
    background: url('chosen-sprite.png') no-repeat 100% -20px;
    font-size: 1em;
    font-family: sans-serif;
    line-height: normal;
    border-radius: 0;
}
.chosen-container-single .chosen-drop {
    margin-top: -1px;
    border-radius: 0 0 4px 4px;
    background-clip: padding-box;
}
.chosen-container-single.chosen-container-single-nosearch .chosen-search {
    position: absolute;
    left: -9999px;
}
/* @end */
/* @group Results */
.chosen-container .chosen-results {
    position: relative;
    overflow-x: hidden;
    overflow-y: auto;
    margin: 0 4px 4px 0;
    padding: 0 0 0 4px;
    max-height: 240px;
    -webkit-overflow-scrolling: touch;
}
.chosen-container .chosen-results li {
    display: none;
    margin: 0;
    padding: 5px 6px;
    list-style: none;
    line-height: 15px;
    -webkit-touch-callout: none;
}
.chosen-container .chosen-results li.active-result {
    display: list-item;
    cursor: pointer;
}
.chosen-container .chosen-results li.disabled-result {
    display: list-item;
    color: #ccc;
    cursor: default;
}
.chosen-container .chosen-results li.highlighted {
    background-color: #3875d7;
    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc));
    background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%);
    background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%);
    background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%);
    background-image: linear-gradient(#3875d7 20%, #2a62bc 90%);
    color: #fff;
}
.chosen-container .chosen-results li.no-results {
    display: list-item;
    background: #f4f4f4;
}
.chosen-container .chosen-results li.group-result {
    display: list-item;
    font-weight: bold;
    cursor: default;
}
.chosen-container .chosen-results li.group-option {
    padding-left: 15px;
}
.chosen-container .chosen-results li em {
    font-style: normal;
    text-decoration: underline;
}
/* @end */
/* @group Multi Chosen */
.chosen-container-multi .chosen-choices {
    -moz-box-sizing: border-box;
    background-color: #FFFFFF;
    border: 1px solid #CBD5DD;
    border-radius: 2px;
    cursor: text;
    height: auto !important;
    margin: 0;
    min-height: 30px;
    overflow: hidden;
    padding: 2px;
    position: relative;
    width: 100%;
}
.chosen-container-multi .chosen-choices li {
    float: left;
    list-style: none;
}
.chosen-container-multi .chosen-choices li.search-field {
    margin: 0;
    padding: 0;
    white-space: nowrap;
}
.chosen-container-multi .chosen-choices li.search-field input[type="text"] {
    margin: 1px 0;
    padding: 5px;
    height: 25px;
    outline: 0;
    border: 0 !important;
    background: transparent !important;
    box-shadow: none;
    color: #666;
    font-size: 100%;
    font-family: sans-serif;
    line-height: normal;
    border-radius: 0;
}
.chosen-container-multi .chosen-choices li.search-field .default {
    color: #999;
}
.chosen-container-multi .chosen-choices li.search-choice {
    position: relative;
    margin: 3px 0 3px 5px;
    padding: 3px 20px 3px 5px;
    border: 1px solid #aaa;
    border-radius: 3px;
    background-color: #e4e4e4;
    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
    background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-clip: padding-box;
    box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05);
    color: #333;
    line-height: 13px;
    cursor: default;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close {
    position: absolute;
    top: 4px;
    right: 3px;
    display: block;
    width: 12px;
    height: 12px;
    background: url('chosen-sprite.png') -42px 1px no-repeat;
    font-size: 1px;
}
.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover {
    background-position: -42px -10px;
}
.chosen-container-multi .chosen-choices li.search-choice-disabled {
    padding-right: 5px;
    border: 1px solid #ccc;
    background-color: #e4e4e4;
    background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee));
    background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%);
    color: #666;
}
.chosen-container-multi .chosen-choices li.search-choice-focus {
    background: #d4d4d4;
}
.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close {
    background-position: -42px -10px;
}
.chosen-container-multi .chosen-results {
    margin: 0;
    padding: 0;
}
.chosen-container-multi .chosen-drop .result-selected {
    display: list-item;
    color: #ccc;
    cursor: default;
}
/* @end */
/* @group Active  */
.chosen-container-active .chosen-single {
    border: 1px solid #5897fb;
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
.chosen-container-active.chosen-with-drop .chosen-single {
    border: 1px solid #aaa;
    -moz-border-radius-bottomright: 0;
    border-bottom-right-radius: 0;
    -moz-border-radius-bottomleft: 0;
    border-bottom-left-radius: 0;
}
.chosen-container-active.chosen-with-drop .chosen-single div {
    border-left: none;
    background: transparent;
}
.chosen-container-active.chosen-with-drop .chosen-single div b {
    background-position: -18px 7px;
}
.chosen-container-active .chosen-choices {
    border: 1px solid #5897fb;
    box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
}
.chosen-container-active .chosen-choices li.search-field input[type="text"] {
    color: #111 !important;
}
/* @end */
/* @group Disabled Support */
.chosen-disabled {
    opacity: 0.5 !important;
    cursor: default;
}
.chosen-disabled .chosen-single {
    cursor: default;
}
.chosen-disabled .chosen-choices .search-choice .search-choice-close {
    cursor: default;
}
/* @end */
/* @group Right to Left */
.chosen-rtl {
    text-align: right;
}
.chosen-rtl .chosen-single {
    overflow: visible;
    padding: 0 8px 0 0;
}
.chosen-rtl .chosen-single span {
    margin-right: 0;
    margin-left: 26px;
    direction: rtl;
}
.chosen-rtl .chosen-single-with-deselect span {
    margin-left: 38px;
}
.chosen-rtl .chosen-single div {
    right: auto;
    left: 3px;
}
.chosen-rtl .chosen-single abbr {
    right: auto;
    left: 26px;
}
.chosen-rtl .chosen-choices li {
    float: right;
}
.chosen-rtl .chosen-choices li.search-field input[type="text"] {
    direction: rtl;
}
.chosen-rtl .chosen-choices li.search-choice {
    margin: 3px 5px 3px 0;
    padding: 3px 5px 3px 19px;
}
.chosen-rtl .chosen-choices li.search-choice .search-choice-close {
    right: auto;
    left: 4px;
}
.chosen-rtl.chosen-container-single-nosearch .chosen-search,
.chosen-rtl .chosen-drop {
    left: 9999px;
}
.chosen-rtl.chosen-container-single .chosen-results {
    margin: 0 0 4px 4px;
    padding: 0 4px 0 0;
}
.chosen-rtl .chosen-results li.group-option {
    padding-right: 15px;
    padding-left: 0;
}
.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div {
    border-right: none;
}
.chosen-rtl .chosen-search input[type="text"] {
    padding: 4px 5px 4px 20px;
    background: white url('chosen-sprite.png') no-repeat -30px -20px;
    background: url('chosen-sprite.png') no-repeat -30px -20px;
    direction: rtl;
}
.chosen-rtl.chosen-container-single .chosen-single div b {
    background-position: 6px 2px;
}
.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b {
    background-position: -12px 2px;
}
/* @end */
/* @group Retina compatibility */
@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) {
    .chosen-rtl .chosen-search input[type="text"],
    .chosen-container-single .chosen-single abbr,
    .chosen-container-single .chosen-single div b,
    .chosen-container-single .chosen-search input[type="text"],
    .chosen-container-multi .chosen-choices .search-choice .search-choice-close,
    .chosen-container .chosen-results-scroll-down span,
    .chosen-container .chosen-results-scroll-up span {
        background-image: url('chosen-sprite@2x.png') !important;
        background-size: 52px 37px !important;
        background-repeat: no-repeat !important;
    }
}
/* @end */

+ 168 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/clockpicker/clockpicker.css

@ -0,0 +1,168 @@
/*!
 * ClockPicker v{package.version} for Bootstrap (http://weareoutman.github.io/clockpicker/)
 * Copyright 2014 Wang Shenwei.
 * Licensed under MIT (https://github.com/weareoutman/clockpicker/blob/gh-pages/LICENSE)
 */
.clockpicker .input-group-addon {
	cursor: pointer;
}
.clockpicker-moving {
	cursor: move;
}
.clockpicker-align-left.popover > .arrow {
	left: 25px;
}
.clockpicker-align-top.popover > .arrow {
	top: 17px;
}
.clockpicker-align-right.popover > .arrow {
	left: auto;
	right: 25px;
}
.clockpicker-align-bottom.popover > .arrow {
	top: auto;
	bottom: 6px;
}
.clockpicker-popover .popover-title {
	background-color: #fff;
	color: #999;
	font-size: 24px;
	font-weight: bold;
	line-height: 30px;
	text-align: center;
}
.clockpicker-popover .popover-title span {
	cursor: pointer;
}
.clockpicker-popover .popover-content {
	background-color: #f8f8f8;
	padding: 12px;
}
.popover-content:last-child {
	border-bottom-left-radius: 5px;
	border-bottom-right-radius: 5px;
}
.clockpicker-plate {
	background-color: #fff;
	border: 1px solid #ccc;
	border-radius: 50%;
	width: 200px;
	height: 200px;
	overflow: visible;
	position: relative;
	/* Disable text selection highlighting. Thanks to Hermanya */
	-webkit-touch-callout: none;
	-webkit-user-select: none;
	-khtml-user-select: none;
	-moz-user-select: none;
	-ms-user-select: none;
	user-select: none;
}
.clockpicker-canvas,
.clockpicker-dial {
	width: 200px;
	height: 200px;
	position: absolute;
	left: -1px;
	top: -1px;
}
.clockpicker-minutes {
	visibility: hidden;
}
.clockpicker-tick {
	border-radius: 50%;
	color: #666;
	line-height: 26px;
	text-align: center;
	width: 26px;
	height: 26px;
	position: absolute;
	cursor: pointer;
}
.clockpicker-tick.active,
.clockpicker-tick:hover {
	background-color: rgb(192, 229, 247);
	background-color: rgba(0, 149, 221, .25);
}
.clockpicker-button {
	background-image: none;
	background-color: #fff;
	border-width: 1px 0 0;
	border-top-left-radius: 0;
	border-top-right-radius: 0;
	margin: 0;
	padding: 10px 0;
}
.clockpicker-button:hover {
	background-image: none;
	background-color: #ebebeb;
}
.clockpicker-button:focus {
	outline: none!important;
}
.clockpicker-dial {
	-webkit-transition: -webkit-transform 350ms, opacity 350ms;
	-moz-transition: -moz-transform 350ms, opacity 350ms;
	-ms-transition: -ms-transform 350ms, opacity 350ms;
	-o-transition: -o-transform 350ms, opacity 350ms;
	transition: transform 350ms, opacity 350ms;
}
.clockpicker-dial-out {
	opacity: 0;
}
.clockpicker-hours.clockpicker-dial-out {
	-webkit-transform: scale(1.2, 1.2);
	-moz-transform: scale(1.2, 1.2);
	-ms-transform: scale(1.2, 1.2);
	-o-transform: scale(1.2, 1.2);
	transform: scale(1.2, 1.2);
}
.clockpicker-minutes.clockpicker-dial-out {
	-webkit-transform: scale(.8, .8);
	-moz-transform: scale(.8, .8);
	-ms-transform: scale(.8, .8);
	-o-transform: scale(.8, .8);
	transform: scale(.8, .8);
}
.clockpicker-canvas {
	-webkit-transition: opacity 175ms;
	-moz-transition: opacity 175ms;
	-ms-transition: opacity 175ms;
	-o-transition: opacity 175ms;
	transition: opacity 175ms;
}
.clockpicker-canvas-out {
	opacity: 0.25;
}
.clockpicker-canvas-bearing,
.clockpicker-canvas-fg {
	stroke: none;
	fill: rgb(0, 149, 221);
}
.clockpicker-canvas-bg {
	stroke: none;
	fill: rgb(192, 229, 247);
}
.clockpicker-canvas-bg-trans {
	fill: rgba(0, 149, 221, .25);
}
.clockpicker-canvas line {
	stroke: rgb(0, 149, 221);
	stroke-width: 1;
	stroke-linecap: round;
	/*shape-rendering: crispEdges;*/
}
.clockpicker-button.am-button {
	margin: 1px;
	padding: 5px;
	border: 1px solid rgba(0, 0, 0, .2);
	border-radius: 4px;
	
}
.clockpicker-button.pm-button {
	margin: 1px 1px 1px 136px;
	padding: 5px;
	border: 1px solid rgba(0, 0, 0, .2);
	border-radius: 4px;
}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 77 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/codemirror/ambiance.css


+ 309 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/codemirror/codemirror.css

@ -0,0 +1,309 @@
/* BASICS */
.CodeMirror {
  /* Set height, width, borders, and global font properties here */
  font-family: monospace;
  height: 300px;
}
.CodeMirror-scroll {
  /* Set scrolling behaviour here */
  overflow: auto;
}
/* PADDING */
.CodeMirror-lines {
  padding: 4px 0; /* Vertical padding around content */
}
.CodeMirror pre {
  padding: 0 4px; /* Horizontal padding of content */
}
.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
  background-color: white; /* The little square between H and V scrollbars */
}
/* GUTTER */
.CodeMirror-gutters {
  border-right: 1px solid #ddd;
  background-color: #f7f7f7;
  white-space: nowrap;
}
.CodeMirror-linenumbers {}
.CodeMirror-linenumber {
  padding: 0 3px 0 5px;
  min-width: 20px;
  text-align: right;
  color: #999;
  -moz-box-sizing: content-box;
  box-sizing: content-box;
}
.CodeMirror-guttermarker { color: black; }
.CodeMirror-guttermarker-subtle { color: #999; }
/* CURSOR */
.CodeMirror div.CodeMirror-cursor {
  border-left: 1px solid black;
}
/* Shown when moving in bi-directional text */
.CodeMirror div.CodeMirror-secondarycursor {
  border-left: 1px solid silver;
}
.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
  width: auto;
  border: 0;
  background: #7e7;
}
.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursors {
  z-index: 1;
}
.cm-animate-fat-cursor {
  width: auto;
  border: 0;
  -webkit-animation: blink 1.06s steps(1) infinite;
  -moz-animation: blink 1.06s steps(1) infinite;
  animation: blink 1.06s steps(1) infinite;
}
@-moz-keyframes blink {
  0% { background: #7e7; }
  50% { background: none; }
  100% { background: #7e7; }
}
@-webkit-keyframes blink {
  0% { background: #7e7; }
  50% { background: none; }
  100% { background: #7e7; }
}
@keyframes blink {
  0% { background: #7e7; }
  50% { background: none; }
  100% { background: #7e7; }
}
/* Can style cursor different in overwrite (non-insert) mode */
div.CodeMirror-overwrite div.CodeMirror-cursor {}
.cm-tab { display: inline-block; text-decoration: inherit; }
.CodeMirror-ruler {
  border-left: 1px solid #ccc;
  position: absolute;
}
/* DEFAULT THEME */
.cm-s-default .cm-keyword {color: #708;}
.cm-s-default .cm-atom {color: #219;}
.cm-s-default .cm-number {color: #164;}
.cm-s-default .cm-def {color: #00f;}
.cm-s-default .cm-variable,
.cm-s-default .cm-punctuation,
.cm-s-default .cm-property,
.cm-s-default .cm-operator {}
.cm-s-default .cm-variable-2 {color: #05a;}
.cm-s-default .cm-variable-3 {color: #085;}
.cm-s-default .cm-comment {color: #a50;}
.cm-s-default .cm-string {color: #a11;}
.cm-s-default .cm-string-2 {color: #f50;}
.cm-s-default .cm-meta {color: #555;}
.cm-s-default .cm-qualifier {color: #555;}
.cm-s-default .cm-builtin {color: #30a;}
.cm-s-default .cm-bracket {color: #997;}
.cm-s-default .cm-tag {color: #170;}
.cm-s-default .cm-attribute {color: #00c;}
.cm-s-default .cm-header {color: blue;}
.cm-s-default .cm-quote {color: #090;}
.cm-s-default .cm-hr {color: #999;}
.cm-s-default .cm-link {color: #00c;}
.cm-negative {color: #d44;}
.cm-positive {color: #292;}
.cm-header, .cm-strong {font-weight: bold;}
.cm-em {font-style: italic;}
.cm-link {text-decoration: underline;}
.cm-s-default .cm-error {color: #f00;}
.cm-invalidchar {color: #f00;}
/* Default styles for common addons */
div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
.CodeMirror-activeline-background {background: #e8f2ff;}
/* STOP */
/* The rest of this file contains styles related to the mechanics of
   the editor. You probably shouldn't touch them. */
.CodeMirror {
  line-height: 1;
  position: relative;
  overflow: hidden;
  background: white;
  color: black;
}
.CodeMirror-scroll {
  /* 30px is the magic margin used to hide the element's real scrollbars */
  /* See overflow: hidden in .CodeMirror */
  margin-bottom: -30px; margin-right: -30px;
  padding-bottom: 30px;
  height: 100%;
  outline: none; /* Prevent dragging from highlighting the element */
  position: relative;
  -moz-box-sizing: content-box;
  box-sizing: content-box;
}
.CodeMirror-sizer {
  position: relative;
  border-right: 30px solid transparent;
  -moz-box-sizing: content-box;
  box-sizing: content-box;
}
/* The fake, visible scrollbars. Used to force redraw during scrolling
   before actuall scrolling happens, thus preventing shaking and
   flickering artifacts. */
.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
  position: absolute;
  z-index: 6;
  display: none;
}
.CodeMirror-vscrollbar {
  right: 0; top: 0;
  overflow-x: hidden;
  overflow-y: scroll;
}
.CodeMirror-hscrollbar {
  bottom: 0; left: 0;
  overflow-y: hidden;
  overflow-x: scroll;
}
.CodeMirror-scrollbar-filler {
  right: 0; bottom: 0;
}
.CodeMirror-gutter-filler {
  left: 0; bottom: 0;
}
.CodeMirror-gutters {
  position: absolute; left: 0; top: 0;
  padding-bottom: 30px;
  z-index: 3;
}
.CodeMirror-gutter {
  white-space: normal;
  height: 100%;
  -moz-box-sizing: content-box;
  box-sizing: content-box;
  padding-bottom: 30px;
  margin-bottom: -32px;
  display: inline-block;
  /* Hack to make IE7 behave */
  *zoom:1;
  *display:inline;
}
.CodeMirror-gutter-elt {
  position: absolute;
  cursor: default;
  z-index: 4;
}
.CodeMirror-lines {
  cursor: text;
  min-height: 1px; /* prevents collapsing before first draw */
}
.CodeMirror pre {
  /* Reset some styles that the rest of the page might have set */
  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
  border-width: 0;
  background: transparent;
  font-family: inherit;
  font-size: inherit;
  margin: 0;
  white-space: pre;
  word-wrap: normal;
  line-height: inherit;
  color: inherit;
  z-index: 2;
  position: relative;
  overflow: visible;
}
.CodeMirror-wrap pre {
  word-wrap: break-word;
  white-space: pre-wrap;
  word-break: normal;
}
.CodeMirror-linebackground {
  position: absolute;
  left: 0; right: 0; top: 0; bottom: 0;
  z-index: 0;
}
.CodeMirror-linewidget {
  position: relative;
  z-index: 2;
  overflow: auto;
}
.CodeMirror-widget {}
.CodeMirror-wrap .CodeMirror-scroll {
  overflow-x: hidden;
}
.CodeMirror-measure {
  position: absolute;
  width: 100%;
  height: 0;
  overflow: hidden;
  visibility: hidden;
}
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor {
  position: absolute;
  border-right: none;
  width: 0;
}
div.CodeMirror-cursors {
  visibility: hidden;
  position: relative;
  z-index: 3;
}
.CodeMirror-focused div.CodeMirror-cursors {
  visibility: visible;
}
.CodeMirror-selected { background: #d9d9d9; }
.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
.CodeMirror-crosshair { cursor: crosshair; }
.cm-searching {
  background: #ffa;
  background: rgba(255, 255, 0, .4);
}
/* IE7 hack to prevent it from returning funny offsetTops on the spans */
.CodeMirror span { *vertical-align: text-bottom; }
/* Used to force a border model for a node */
.cm-force-border { padding-right: .1px; }
@media print {
  /* Hide the cursor when printing */
  .CodeMirror div.CodeMirror-cursors {
    visibility: hidden;
  }
}
/* Help users use markselection to safely style text background */
span.CodeMirror-selectedtext { background: none; }

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 9 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/colorpicker/css/bootstrap-colorpicker.min.css


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/colorpicker/img/bootstrap-colorpicker/alpha.png


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/colorpicker/img/bootstrap-colorpicker/hue.png


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/colorpicker/img/bootstrap-colorpicker/saturation.png


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 9 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/cropper/cropper.min.css


+ 232 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/dataTables/dataTables.bootstrap.css

@ -0,0 +1,232 @@
div.dataTables_length label {
    float: left;
    text-align: left;
    font-weight: normal;
}
div.dataTables_length select {
    width: 75px;
}
div.dataTables_filter label {
    float: right;
    font-weight: normal;
}
div.dataTables_filter input {
    width: 16em;
}
div.dataTables_info {
    padding-top: 8px;
    float:right
}
div.dataTables_paginate {
    /*float: right;*/
    margin: 0;
}
div.dataTables_paginate ul.pagination {
    margin: 2px 0;
    white-space: nowrap;
}
table.dataTable,
table.dataTable td,
table.dataTable th {
    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    box-sizing: content-box;
}
table.dataTable {
    clear: both;
    margin-top: 6px !important;
    margin-bottom: 6px !important;
    max-width: none !important;
}
table.dataTable thead .sorting,
table.dataTable thead .sorting_asc,
table.dataTable thead .sorting_desc,
table.dataTable thead .sorting_asc_disabled,
table.dataTable thead .sorting_desc_disabled {
    cursor: pointer;
}
table.dataTable thead .sorting {
    
}
table.dataTable thead .sorting_asc {
    background: url('../images/sort_asc.png') no-repeat center right;
}
table.dataTable thead .sorting_desc {
    background: url('../images/sort_desc.png') no-repeat center right;
}
table.dataTable thead .sorting_asc_disabled {
}
table.dataTable thead .sorting_desc_disabled {
}
table.dataTable th:active {
    outline: none;
}
/* Scrolling */
div.dataTables_scrollHead table {
    margin-bottom: 0 !important;
    border-bottom-left-radius: 0;
    border-bottom-right-radius: 0;
}
div.dataTables_scrollHead table thead tr:last-child th:first-child,
div.dataTables_scrollHead table thead tr:last-child td:first-child {
    border-bottom-left-radius: 0 !important;
    border-bottom-right-radius: 0 !important;
}
div.dataTables_scrollBody table {
    margin-top: 0 !important;
    margin-bottom: 0 !important;
    border-top: none;
}
div.dataTables_scrollBody tbody tr:first-child th,
div.dataTables_scrollBody tbody tr:first-child td {
    border-top: none;
}
div.dataTables_scrollFoot table {
    margin-top: 0 !important;
    border-top: none;
}
/*
 * TableTools styles
 */
.table tbody tr.active td,
.table tbody tr.active th {
    color: white;
    background-color: #08C;
}
.table tbody tr.active:hover td,
.table tbody tr.active:hover th {
    background-color: #0075b0 !important;
}
.table tbody tr.active a {
    color: white;
}
.table-striped tbody tr.active:nth-child(odd) td,
.table-striped tbody tr.active:nth-child(odd) th {
    background-color: #017ebc;
}
table.DTTT_selectable tbody tr {
    cursor: pointer;
}
div.DTTT .btn {
    font-size: 12px;
    color: #333 !important;
}
div.DTTT .btn:hover {
    text-decoration: none !important;
}
ul.DTTT_dropdown.dropdown-menu {
    z-index: 2003;
}
ul.DTTT_dropdown.dropdown-menu a {
    color: #333 !important; /* needed only when demo_page.css is included */
}
ul.DTTT_dropdown.dropdown-menu li {
    position: relative;
}
ul.DTTT_dropdown.dropdown-menu li:hover a {
    color: white !important;
    background-color: #0088cc;
}
div.DTTT_collection_background {
    z-index: 2002;
}
/* TableTools information display */
div.DTTT_print_info.modal {
    height: 150px;
    margin-top: -75px;
    text-align: center;
}
div.DTTT_print_info h6 {
    margin: 1em;
    font-size: 28px;
    font-weight: normal;
    line-height: 28px;
}
div.DTTT_print_info p {
    font-size: 14px;
    line-height: 20px;
}
/*
 * FixedColumns styles
 */
div.DTFC_LeftHeadWrapper table,
div.DTFC_LeftFootWrapper table,
div.DTFC_RightHeadWrapper table,
div.DTFC_RightFootWrapper table,
table.DTFC_Cloned tr.even {
    background-color: white;
}
div.DTFC_RightHeadWrapper table,
div.DTFC_LeftHeadWrapper table {
    margin-bottom: 0 !important;
    border-top-right-radius: 0 !important;
    border-bottom-left-radius: 0 !important;
    border-bottom-right-radius: 0 !important;
}
div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,
div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,
div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,
div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {
    border-bottom-left-radius: 0 !important;
    border-bottom-right-radius: 0 !important;
}
div.DTFC_RightBodyWrapper table,
div.DTFC_LeftBodyWrapper table {
    margin-bottom: 0 !important;
    border-top: none;
}
div.DTFC_RightBodyWrapper tbody tr:first-child th,
div.DTFC_RightBodyWrapper tbody tr:first-child td,
div.DTFC_LeftBodyWrapper tbody tr:first-child th,
div.DTFC_LeftBodyWrapper tbody tr:first-child td {
    border-top: none;
}
div.DTFC_RightFootWrapper table,
div.DTFC_LeftFootWrapper table {
    border-top: none;
}

+ 789 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/datapicker/datepicker3.css

@ -0,0 +1,789 @@
/*!
 * Datepicker for Bootstrap
 *
 * Copyright 2012 Stefan Petre
 * Improvements by Andrew Rowls
 * Licensed under the Apache License v2.0
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 */
.datepicker {
  padding: 4px;
  border-radius: 4px;
  direction: ltr;
  /*.dow {
		border-top: 1px solid #ddd !important;
	}*/
}
.datepicker-inline {
  width: 220px;
}
.datepicker.datepicker-rtl {
  direction: rtl;
}
.datepicker.datepicker-rtl table tr td span {
  float: right;
}
.datepicker-dropdown {
  top: 0;
  left: 0;
}
.datepicker-dropdown:before {
  content: '';
  display: inline-block;
  border-left: 7px solid transparent;
  border-right: 7px solid transparent;
  border-bottom: 7px solid #ccc;
  border-top: 0;
  border-bottom-color: rgba(0, 0, 0, 0.2);
  position: absolute;
}
.datepicker-dropdown:after {
  content: '';
  display: inline-block;
  border-left: 6px solid transparent;
  border-right: 6px solid transparent;
  border-bottom: 6px solid #fff;
  border-top: 0;
  position: absolute;
}
.datepicker-dropdown.datepicker-orient-left:before {
  left: 6px;
}
.datepicker-dropdown.datepicker-orient-left:after {
  left: 7px;
}
.datepicker-dropdown.datepicker-orient-right:before {
  right: 6px;
}
.datepicker-dropdown.datepicker-orient-right:after {
  right: 7px;
}
.datepicker-dropdown.datepicker-orient-top:before {
  top: -7px;
}
.datepicker-dropdown.datepicker-orient-top:after {
  top: -6px;
}
.datepicker-dropdown.datepicker-orient-bottom:before {
  bottom: -7px;
  border-bottom: 0;
  border-top: 7px solid #999;
}
.datepicker-dropdown.datepicker-orient-bottom:after {
  bottom: -6px;
  border-bottom: 0;
  border-top: 6px solid #fff;
}
.datepicker > div {
  display: none;
}
.datepicker.days div.datepicker-days {
  display: block;
}
.datepicker.months div.datepicker-months {
  display: block;
}
.datepicker.years div.datepicker-years {
  display: block;
}
.datepicker table {
  margin: 0;
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}
.datepicker table tr td,
.datepicker table tr th {
  text-align: center;
  width: 30px;
  height: 30px;
  border-radius: 4px;
  border: none;
}
.table-striped .datepicker table tr td,
.table-striped .datepicker table tr th {
  background-color: transparent;
}
.datepicker table tr td.day:hover,
.datepicker table tr td.day.focused {
  background: #eeeeee;
  cursor: pointer;
}
.datepicker table tr td.old,
.datepicker table tr td.new {
  color: #999999;
}
.datepicker table tr td.disabled,
.datepicker table tr td.disabled:hover {
  background: none;
  color: #999999;
  cursor: default;
}
.datepicker table tr td.today,
.datepicker table tr td.today:hover,
.datepicker table tr td.today.disabled,
.datepicker table tr td.today.disabled:hover {
  color: #000000;
  background-color: #ffdb99;
  border-color: #ffb733;
}
.datepicker table tr td.today:hover,
.datepicker table tr td.today:hover:hover,
.datepicker table tr td.today.disabled:hover,
.datepicker table tr td.today.disabled:hover:hover,
.datepicker table tr td.today:focus,
.datepicker table tr td.today:hover:focus,
.datepicker table tr td.today.disabled:focus,
.datepicker table tr td.today.disabled:hover:focus,
.datepicker table tr td.today:active,
.datepicker table tr td.today:hover:active,
.datepicker table tr td.today.disabled:active,
.datepicker table tr td.today.disabled:hover:active,
.datepicker table tr td.today.active,
.datepicker table tr td.today:hover.active,
.datepicker table tr td.today.disabled.active,
.datepicker table tr td.today.disabled:hover.active,
.open .dropdown-toggle.datepicker table tr td.today,
.open .dropdown-toggle.datepicker table tr td.today:hover,
.open .dropdown-toggle.datepicker table tr td.today.disabled,
.open .dropdown-toggle.datepicker table tr td.today.disabled:hover {
  color: #000000;
  background-color: #ffcd70;
  border-color: #f59e00;
}
.datepicker table tr td.today:active,
.datepicker table tr td.today:hover:active,
.datepicker table tr td.today.disabled:active,
.datepicker table tr td.today.disabled:hover:active,
.datepicker table tr td.today.active,
.datepicker table tr td.today:hover.active,
.datepicker table tr td.today.disabled.active,
.datepicker table tr td.today.disabled:hover.active,
.open .dropdown-toggle.datepicker table tr td.today,
.open .dropdown-toggle.datepicker table tr td.today:hover,
.open .dropdown-toggle.datepicker table tr td.today.disabled,
.open .dropdown-toggle.datepicker table tr td.today.disabled:hover {
  background-image: none;
}
.datepicker table tr td.today.disabled,
.datepicker table tr td.today:hover.disabled,
.datepicker table tr td.today.disabled.disabled,
.datepicker table tr td.today.disabled:hover.disabled,
.datepicker table tr td.today[disabled],
.datepicker table tr td.today:hover[disabled],
.datepicker table tr td.today.disabled[disabled],
.datepicker table tr td.today.disabled:hover[disabled],
fieldset[disabled] .datepicker table tr td.today,
fieldset[disabled] .datepicker table tr td.today:hover,
fieldset[disabled] .datepicker table tr td.today.disabled,
fieldset[disabled] .datepicker table tr td.today.disabled:hover,
.datepicker table tr td.today.disabled:hover,
.datepicker table tr td.today:hover.disabled:hover,
.datepicker table tr td.today.disabled.disabled:hover,
.datepicker table tr td.today.disabled:hover.disabled:hover,
.datepicker table tr td.today[disabled]:hover,
.datepicker table tr td.today:hover[disabled]:hover,
.datepicker table tr td.today.disabled[disabled]:hover,
.datepicker table tr td.today.disabled:hover[disabled]:hover,
fieldset[disabled] .datepicker table tr td.today:hover,
fieldset[disabled] .datepicker table tr td.today:hover:hover,
fieldset[disabled] .datepicker table tr td.today.disabled:hover,
fieldset[disabled] .datepicker table tr td.today.disabled:hover:hover,
.datepicker table tr td.today.disabled:focus,
.datepicker table tr td.today:hover.disabled:focus,
.datepicker table tr td.today.disabled.disabled:focus,
.datepicker table tr td.today.disabled:hover.disabled:focus,
.datepicker table tr td.today[disabled]:focus,
.datepicker table tr td.today:hover[disabled]:focus,
.datepicker table tr td.today.disabled[disabled]:focus,
.datepicker table tr td.today.disabled:hover[disabled]:focus,
fieldset[disabled] .datepicker table tr td.today:focus,
fieldset[disabled] .datepicker table tr td.today:hover:focus,
fieldset[disabled] .datepicker table tr td.today.disabled:focus,
fieldset[disabled] .datepicker table tr td.today.disabled:hover:focus,
.datepicker table tr td.today.disabled:active,
.datepicker table tr td.today:hover.disabled:active,
.datepicker table tr td.today.disabled.disabled:active,
.datepicker table tr td.today.disabled:hover.disabled:active,
.datepicker table tr td.today[disabled]:active,
.datepicker table tr td.today:hover[disabled]:active,
.datepicker table tr td.today.disabled[disabled]:active,
.datepicker table tr td.today.disabled:hover[disabled]:active,
fieldset[disabled] .datepicker table tr td.today:active,
fieldset[disabled] .datepicker table tr td.today:hover:active,
fieldset[disabled] .datepicker table tr td.today.disabled:active,
fieldset[disabled] .datepicker table tr td.today.disabled:hover:active,
.datepicker table tr td.today.disabled.active,
.datepicker table tr td.today:hover.disabled.active,
.datepicker table tr td.today.disabled.disabled.active,
.datepicker table tr td.today.disabled:hover.disabled.active,
.datepicker table tr td.today[disabled].active,
.datepicker table tr td.today:hover[disabled].active,
.datepicker table tr td.today.disabled[disabled].active,
.datepicker table tr td.today.disabled:hover[disabled].active,
fieldset[disabled] .datepicker table tr td.today.active,
fieldset[disabled] .datepicker table tr td.today:hover.active,
fieldset[disabled] .datepicker table tr td.today.disabled.active,
fieldset[disabled] .datepicker table tr td.today.disabled:hover.active {
  background-color: #ffdb99;
  border-color: #ffb733;
}
.datepicker table tr td.today:hover:hover {
  color: #000;
}
.datepicker table tr td.today.active:hover {
  color: #fff;
}
.datepicker table tr td.range,
.datepicker table tr td.range:hover,
.datepicker table tr td.range.disabled,
.datepicker table tr td.range.disabled:hover {
  background: #eeeeee;
  border-radius: 0;
}
.datepicker table tr td.range.today,
.datepicker table tr td.range.today:hover,
.datepicker table tr td.range.today.disabled,
.datepicker table tr td.range.today.disabled:hover {
  color: #000000;
  background-color: #f7ca77;
  border-color: #f1a417;
  border-radius: 0;
}
.datepicker table tr td.range.today:hover,
.datepicker table tr td.range.today:hover:hover,
.datepicker table tr td.range.today.disabled:hover,
.datepicker table tr td.range.today.disabled:hover:hover,
.datepicker table tr td.range.today:focus,
.datepicker table tr td.range.today:hover:focus,
.datepicker table tr td.range.today.disabled:focus,
.datepicker table tr td.range.today.disabled:hover:focus,
.datepicker table tr td.range.today:active,
.datepicker table tr td.range.today:hover:active,
.datepicker table tr td.range.today.disabled:active,
.datepicker table tr td.range.today.disabled:hover:active,
.datepicker table tr td.range.today.active,
.datepicker table tr td.range.today:hover.active,
.datepicker table tr td.range.today.disabled.active,
.datepicker table tr td.range.today.disabled:hover.active,
.open .dropdown-toggle.datepicker table tr td.range.today,
.open .dropdown-toggle.datepicker table tr td.range.today:hover,
.open .dropdown-toggle.datepicker table tr td.range.today.disabled,
.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover {
  color: #000000;
  background-color: #f4bb51;
  border-color: #bf800c;
}
.datepicker table tr td.range.today:active,
.datepicker table tr td.range.today:hover:active,
.datepicker table tr td.range.today.disabled:active,
.datepicker table tr td.range.today.disabled:hover:active,
.datepicker table tr td.range.today.active,
.datepicker table tr td.range.today:hover.active,
.datepicker table tr td.range.today.disabled.active,
.datepicker table tr td.range.today.disabled:hover.active,
.open .dropdown-toggle.datepicker table tr td.range.today,
.open .dropdown-toggle.datepicker table tr td.range.today:hover,
.open .dropdown-toggle.datepicker table tr td.range.today.disabled,
.open .dropdown-toggle.datepicker table tr td.range.today.disabled:hover {
  background-image: none;
}
.datepicker table tr td.range.today.disabled,
.datepicker table tr td.range.today:hover.disabled,
.datepicker table tr td.range.today.disabled.disabled,
.datepicker table tr td.range.today.disabled:hover.disabled,
.datepicker table tr td.range.today[disabled],
.datepicker table tr td.range.today:hover[disabled],
.datepicker table tr td.range.today.disabled[disabled],
.datepicker table tr td.range.today.disabled:hover[disabled],
fieldset[disabled] .datepicker table tr td.range.today,
fieldset[disabled] .datepicker table tr td.range.today:hover,
fieldset[disabled] .datepicker table tr td.range.today.disabled,
fieldset[disabled] .datepicker table tr td.range.today.disabled:hover,
.datepicker table tr td.range.today.disabled:hover,
.datepicker table tr td.range.today:hover.disabled:hover,
.datepicker table tr td.range.today.disabled.disabled:hover,
.datepicker table tr td.range.today.disabled:hover.disabled:hover,
.datepicker table tr td.range.today[disabled]:hover,
.datepicker table tr td.range.today:hover[disabled]:hover,
.datepicker table tr td.range.today.disabled[disabled]:hover,
.datepicker table tr td.range.today.disabled:hover[disabled]:hover,
fieldset[disabled] .datepicker table tr td.range.today:hover,
fieldset[disabled] .datepicker table tr td.range.today:hover:hover,
fieldset[disabled] .datepicker table tr td.range.today.disabled:hover,
fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:hover,
.datepicker table tr td.range.today.disabled:focus,
.datepicker table tr td.range.today:hover.disabled:focus,
.datepicker table tr td.range.today.disabled.disabled:focus,
.datepicker table tr td.range.today.disabled:hover.disabled:focus,
.datepicker table tr td.range.today[disabled]:focus,
.datepicker table tr td.range.today:hover[disabled]:focus,
.datepicker table tr td.range.today.disabled[disabled]:focus,
.datepicker table tr td.range.today.disabled:hover[disabled]:focus,
fieldset[disabled] .datepicker table tr td.range.today:focus,
fieldset[disabled] .datepicker table tr td.range.today:hover:focus,
fieldset[disabled] .datepicker table tr td.range.today.disabled:focus,
fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:focus,
.datepicker table tr td.range.today.disabled:active,
.datepicker table tr td.range.today:hover.disabled:active,
.datepicker table tr td.range.today.disabled.disabled:active,
.datepicker table tr td.range.today.disabled:hover.disabled:active,
.datepicker table tr td.range.today[disabled]:active,
.datepicker table tr td.range.today:hover[disabled]:active,
.datepicker table tr td.range.today.disabled[disabled]:active,
.datepicker table tr td.range.today.disabled:hover[disabled]:active,
fieldset[disabled] .datepicker table tr td.range.today:active,
fieldset[disabled] .datepicker table tr td.range.today:hover:active,
fieldset[disabled] .datepicker table tr td.range.today.disabled:active,
fieldset[disabled] .datepicker table tr td.range.today.disabled:hover:active,
.datepicker table tr td.range.today.disabled.active,
.datepicker table tr td.range.today:hover.disabled.active,
.datepicker table tr td.range.today.disabled.disabled.active,
.datepicker table tr td.range.today.disabled:hover.disabled.active,
.datepicker table tr td.range.today[disabled].active,
.datepicker table tr td.range.today:hover[disabled].active,
.datepicker table tr td.range.today.disabled[disabled].active,
.datepicker table tr td.range.today.disabled:hover[disabled].active,
fieldset[disabled] .datepicker table tr td.range.today.active,
fieldset[disabled] .datepicker table tr td.range.today:hover.active,
fieldset[disabled] .datepicker table tr td.range.today.disabled.active,
fieldset[disabled] .datepicker table tr td.range.today.disabled:hover.active {
  background-color: #f7ca77;
  border-color: #f1a417;
}
.datepicker table tr td.selected,
.datepicker table tr td.selected:hover,
.datepicker table tr td.selected.disabled,
.datepicker table tr td.selected.disabled:hover {
  color: #ffffff;
  background-color: #999999;
  border-color: #555555;
  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.datepicker table tr td.selected:hover,
.datepicker table tr td.selected:hover:hover,
.datepicker table tr td.selected.disabled:hover,
.datepicker table tr td.selected.disabled:hover:hover,
.datepicker table tr td.selected:focus,
.datepicker table tr td.selected:hover:focus,
.datepicker table tr td.selected.disabled:focus,
.datepicker table tr td.selected.disabled:hover:focus,
.datepicker table tr td.selected:active,
.datepicker table tr td.selected:hover:active,
.datepicker table tr td.selected.disabled:active,
.datepicker table tr td.selected.disabled:hover:active,
.datepicker table tr td.selected.active,
.datepicker table tr td.selected:hover.active,
.datepicker table tr td.selected.disabled.active,
.datepicker table tr td.selected.disabled:hover.active,
.open .dropdown-toggle.datepicker table tr td.selected,
.open .dropdown-toggle.datepicker table tr td.selected:hover,
.open .dropdown-toggle.datepicker table tr td.selected.disabled,
.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover {
  color: #ffffff;
  background-color: #858585;
  border-color: #373737;
}
.datepicker table tr td.selected:active,
.datepicker table tr td.selected:hover:active,
.datepicker table tr td.selected.disabled:active,
.datepicker table tr td.selected.disabled:hover:active,
.datepicker table tr td.selected.active,
.datepicker table tr td.selected:hover.active,
.datepicker table tr td.selected.disabled.active,
.datepicker table tr td.selected.disabled:hover.active,
.open .dropdown-toggle.datepicker table tr td.selected,
.open .dropdown-toggle.datepicker table tr td.selected:hover,
.open .dropdown-toggle.datepicker table tr td.selected.disabled,
.open .dropdown-toggle.datepicker table tr td.selected.disabled:hover {
  background-image: none;
}
.datepicker table tr td.selected.disabled,
.datepicker table tr td.selected:hover.disabled,
.datepicker table tr td.selected.disabled.disabled,
.datepicker table tr td.selected.disabled:hover.disabled,
.datepicker table tr td.selected[disabled],
.datepicker table tr td.selected:hover[disabled],
.datepicker table tr td.selected.disabled[disabled],
.datepicker table tr td.selected.disabled:hover[disabled],
fieldset[disabled] .datepicker table tr td.selected,
fieldset[disabled] .datepicker table tr td.selected:hover,
fieldset[disabled] .datepicker table tr td.selected.disabled,
fieldset[disabled] .datepicker table tr td.selected.disabled:hover,
.datepicker table tr td.selected.disabled:hover,
.datepicker table tr td.selected:hover.disabled:hover,
.datepicker table tr td.selected.disabled.disabled:hover,
.datepicker table tr td.selected.disabled:hover.disabled:hover,
.datepicker table tr td.selected[disabled]:hover,
.datepicker table tr td.selected:hover[disabled]:hover,
.datepicker table tr td.selected.disabled[disabled]:hover,
.datepicker table tr td.selected.disabled:hover[disabled]:hover,
fieldset[disabled] .datepicker table tr td.selected:hover,
fieldset[disabled] .datepicker table tr td.selected:hover:hover,
fieldset[disabled] .datepicker table tr td.selected.disabled:hover,
fieldset[disabled] .datepicker table tr td.selected.disabled:hover:hover,
.datepicker table tr td.selected.disabled:focus,
.datepicker table tr td.selected:hover.disabled:focus,
.datepicker table tr td.selected.disabled.disabled:focus,
.datepicker table tr td.selected.disabled:hover.disabled:focus,
.datepicker table tr td.selected[disabled]:focus,
.datepicker table tr td.selected:hover[disabled]:focus,
.datepicker table tr td.selected.disabled[disabled]:focus,
.datepicker table tr td.selected.disabled:hover[disabled]:focus,
fieldset[disabled] .datepicker table tr td.selected:focus,
fieldset[disabled] .datepicker table tr td.selected:hover:focus,
fieldset[disabled] .datepicker table tr td.selected.disabled:focus,
fieldset[disabled] .datepicker table tr td.selected.disabled:hover:focus,
.datepicker table tr td.selected.disabled:active,
.datepicker table tr td.selected:hover.disabled:active,
.datepicker table tr td.selected.disabled.disabled:active,
.datepicker table tr td.selected.disabled:hover.disabled:active,
.datepicker table tr td.selected[disabled]:active,
.datepicker table tr td.selected:hover[disabled]:active,
.datepicker table tr td.selected.disabled[disabled]:active,
.datepicker table tr td.selected.disabled:hover[disabled]:active,
fieldset[disabled] .datepicker table tr td.selected:active,
fieldset[disabled] .datepicker table tr td.selected:hover:active,
fieldset[disabled] .datepicker table tr td.selected.disabled:active,
fieldset[disabled] .datepicker table tr td.selected.disabled:hover:active,
.datepicker table tr td.selected.disabled.active,
.datepicker table tr td.selected:hover.disabled.active,
.datepicker table tr td.selected.disabled.disabled.active,
.datepicker table tr td.selected.disabled:hover.disabled.active,
.datepicker table tr td.selected[disabled].active,
.datepicker table tr td.selected:hover[disabled].active,
.datepicker table tr td.selected.disabled[disabled].active,
.datepicker table tr td.selected.disabled:hover[disabled].active,
fieldset[disabled] .datepicker table tr td.selected.active,
fieldset[disabled] .datepicker table tr td.selected:hover.active,
fieldset[disabled] .datepicker table tr td.selected.disabled.active,
fieldset[disabled] .datepicker table tr td.selected.disabled:hover.active {
  background-color: #999999;
  border-color: #555555;
}
.datepicker table tr td.active,
.datepicker table tr td.active:hover,
.datepicker table tr td.active.disabled,
.datepicker table tr td.active.disabled:hover {
  color: #ffffff;
  background-color: #428bca;
  border-color: #357ebd;
  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.datepicker table tr td.active:hover,
.datepicker table tr td.active:hover:hover,
.datepicker table tr td.active.disabled:hover,
.datepicker table tr td.active.disabled:hover:hover,
.datepicker table tr td.active:focus,
.datepicker table tr td.active:hover:focus,
.datepicker table tr td.active.disabled:focus,
.datepicker table tr td.active.disabled:hover:focus,
.datepicker table tr td.active:active,
.datepicker table tr td.active:hover:active,
.datepicker table tr td.active.disabled:active,
.datepicker table tr td.active.disabled:hover:active,
.datepicker table tr td.active.active,
.datepicker table tr td.active:hover.active,
.datepicker table tr td.active.disabled.active,
.datepicker table tr td.active.disabled:hover.active,
.open .dropdown-toggle.datepicker table tr td.active,
.open .dropdown-toggle.datepicker table tr td.active:hover,
.open .dropdown-toggle.datepicker table tr td.active.disabled,
.open .dropdown-toggle.datepicker table tr td.active.disabled:hover {
  color: #ffffff;
  background-color: #3276b1;
  border-color: #285e8e;
}
.datepicker table tr td.active:active,
.datepicker table tr td.active:hover:active,
.datepicker table tr td.active.disabled:active,
.datepicker table tr td.active.disabled:hover:active,
.datepicker table tr td.active.active,
.datepicker table tr td.active:hover.active,
.datepicker table tr td.active.disabled.active,
.datepicker table tr td.active.disabled:hover.active,
.open .dropdown-toggle.datepicker table tr td.active,
.open .dropdown-toggle.datepicker table tr td.active:hover,
.open .dropdown-toggle.datepicker table tr td.active.disabled,
.open .dropdown-toggle.datepicker table tr td.active.disabled:hover {
  background-image: none;
}
.datepicker table tr td.active.disabled,
.datepicker table tr td.active:hover.disabled,
.datepicker table tr td.active.disabled.disabled,
.datepicker table tr td.active.disabled:hover.disabled,
.datepicker table tr td.active[disabled],
.datepicker table tr td.active:hover[disabled],
.datepicker table tr td.active.disabled[disabled],
.datepicker table tr td.active.disabled:hover[disabled],
fieldset[disabled] .datepicker table tr td.active,
fieldset[disabled] .datepicker table tr td.active:hover,
fieldset[disabled] .datepicker table tr td.active.disabled,
fieldset[disabled] .datepicker table tr td.active.disabled:hover,
.datepicker table tr td.active.disabled:hover,
.datepicker table tr td.active:hover.disabled:hover,
.datepicker table tr td.active.disabled.disabled:hover,
.datepicker table tr td.active.disabled:hover.disabled:hover,
.datepicker table tr td.active[disabled]:hover,
.datepicker table tr td.active:hover[disabled]:hover,
.datepicker table tr td.active.disabled[disabled]:hover,
.datepicker table tr td.active.disabled:hover[disabled]:hover,
fieldset[disabled] .datepicker table tr td.active:hover,
fieldset[disabled] .datepicker table tr td.active:hover:hover,
fieldset[disabled] .datepicker table tr td.active.disabled:hover,
fieldset[disabled] .datepicker table tr td.active.disabled:hover:hover,
.datepicker table tr td.active.disabled:focus,
.datepicker table tr td.active:hover.disabled:focus,
.datepicker table tr td.active.disabled.disabled:focus,
.datepicker table tr td.active.disabled:hover.disabled:focus,
.datepicker table tr td.active[disabled]:focus,
.datepicker table tr td.active:hover[disabled]:focus,
.datepicker table tr td.active.disabled[disabled]:focus,
.datepicker table tr td.active.disabled:hover[disabled]:focus,
fieldset[disabled] .datepicker table tr td.active:focus,
fieldset[disabled] .datepicker table tr td.active:hover:focus,
fieldset[disabled] .datepicker table tr td.active.disabled:focus,
fieldset[disabled] .datepicker table tr td.active.disabled:hover:focus,
.datepicker table tr td.active.disabled:active,
.datepicker table tr td.active:hover.disabled:active,
.datepicker table tr td.active.disabled.disabled:active,
.datepicker table tr td.active.disabled:hover.disabled:active,
.datepicker table tr td.active[disabled]:active,
.datepicker table tr td.active:hover[disabled]:active,
.datepicker table tr td.active.disabled[disabled]:active,
.datepicker table tr td.active.disabled:hover[disabled]:active,
fieldset[disabled] .datepicker table tr td.active:active,
fieldset[disabled] .datepicker table tr td.active:hover:active,
fieldset[disabled] .datepicker table tr td.active.disabled:active,
fieldset[disabled] .datepicker table tr td.active.disabled:hover:active,
.datepicker table tr td.active.disabled.active,
.datepicker table tr td.active:hover.disabled.active,
.datepicker table tr td.active.disabled.disabled.active,
.datepicker table tr td.active.disabled:hover.disabled.active,
.datepicker table tr td.active[disabled].active,
.datepicker table tr td.active:hover[disabled].active,
.datepicker table tr td.active.disabled[disabled].active,
.datepicker table tr td.active.disabled:hover[disabled].active,
fieldset[disabled] .datepicker table tr td.active.active,
fieldset[disabled] .datepicker table tr td.active:hover.active,
fieldset[disabled] .datepicker table tr td.active.disabled.active,
fieldset[disabled] .datepicker table tr td.active.disabled:hover.active {
  background-color: #428bca;
  border-color: #357ebd;
}
.datepicker table tr td span {
  display: block;
  width: 23%;
  height: 54px;
  line-height: 54px;
  float: left;
  margin: 1%;
  cursor: pointer;
  border-radius: 4px;
}
.datepicker table tr td span:hover {
  background: #eeeeee;
}
.datepicker table tr td span.disabled,
.datepicker table tr td span.disabled:hover {
  background: none;
  color: #999999;
  cursor: default;
}
.datepicker table tr td span.active,
.datepicker table tr td span.active:hover,
.datepicker table tr td span.active.disabled,
.datepicker table tr td span.active.disabled:hover {
  color: #ffffff;
  background-color: #428bca;
  border-color: #357ebd;
  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
}
.datepicker table tr td span.active:hover,
.datepicker table tr td span.active:hover:hover,
.datepicker table tr td span.active.disabled:hover,
.datepicker table tr td span.active.disabled:hover:hover,
.datepicker table tr td span.active:focus,
.datepicker table tr td span.active:hover:focus,
.datepicker table tr td span.active.disabled:focus,
.datepicker table tr td span.active.disabled:hover:focus,
.datepicker table tr td span.active:active,
.datepicker table tr td span.active:hover:active,
.datepicker table tr td span.active.disabled:active,
.datepicker table tr td span.active.disabled:hover:active,
.datepicker table tr td span.active.active,
.datepicker table tr td span.active:hover.active,
.datepicker table tr td span.active.disabled.active,
.datepicker table tr td span.active.disabled:hover.active,
.open .dropdown-toggle.datepicker table tr td span.active,
.open .dropdown-toggle.datepicker table tr td span.active:hover,
.open .dropdown-toggle.datepicker table tr td span.active.disabled,
.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover {
  color: #ffffff;
  background-color: #3276b1;
  border-color: #285e8e;
}
.datepicker table tr td span.active:active,
.datepicker table tr td span.active:hover:active,
.datepicker table tr td span.active.disabled:active,
.datepicker table tr td span.active.disabled:hover:active,
.datepicker table tr td span.active.active,
.datepicker table tr td span.active:hover.active,
.datepicker table tr td span.active.disabled.active,
.datepicker table tr td span.active.disabled:hover.active,
.open .dropdown-toggle.datepicker table tr td span.active,
.open .dropdown-toggle.datepicker table tr td span.active:hover,
.open .dropdown-toggle.datepicker table tr td span.active.disabled,
.open .dropdown-toggle.datepicker table tr td span.active.disabled:hover {
  background-image: none;
}
.datepicker table tr td span.active.disabled,
.datepicker table tr td span.active:hover.disabled,
.datepicker table tr td span.active.disabled.disabled,
.datepicker table tr td span.active.disabled:hover.disabled,
.datepicker table tr td span.active[disabled],
.datepicker table tr td span.active:hover[disabled],
.datepicker table tr td span.active.disabled[disabled],
.datepicker table tr td span.active.disabled:hover[disabled],
fieldset[disabled] .datepicker table tr td span.active,
fieldset[disabled] .datepicker table tr td span.active:hover,
fieldset[disabled] .datepicker table tr td span.active.disabled,
fieldset[disabled] .datepicker table tr td span.active.disabled:hover,
.datepicker table tr td span.active.disabled:hover,
.datepicker table tr td span.active:hover.disabled:hover,
.datepicker table tr td span.active.disabled.disabled:hover,
.datepicker table tr td span.active.disabled:hover.disabled:hover,
.datepicker table tr td span.active[disabled]:hover,
.datepicker table tr td span.active:hover[disabled]:hover,
.datepicker table tr td span.active.disabled[disabled]:hover,
.datepicker table tr td span.active.disabled:hover[disabled]:hover,
fieldset[disabled] .datepicker table tr td span.active:hover,
fieldset[disabled] .datepicker table tr td span.active:hover:hover,
fieldset[disabled] .datepicker table tr td span.active.disabled:hover,
fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover,
.datepicker table tr td span.active.disabled:focus,
.datepicker table tr td span.active:hover.disabled:focus,
.datepicker table tr td span.active.disabled.disabled:focus,
.datepicker table tr td span.active.disabled:hover.disabled:focus,
.datepicker table tr td span.active[disabled]:focus,
.datepicker table tr td span.active:hover[disabled]:focus,
.datepicker table tr td span.active.disabled[disabled]:focus,
.datepicker table tr td span.active.disabled:hover[disabled]:focus,
fieldset[disabled] .datepicker table tr td span.active:focus,
fieldset[disabled] .datepicker table tr td span.active:hover:focus,
fieldset[disabled] .datepicker table tr td span.active.disabled:focus,
fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus,
.datepicker table tr td span.active.disabled:active,
.datepicker table tr td span.active:hover.disabled:active,
.datepicker table tr td span.active.disabled.disabled:active,
.datepicker table tr td span.active.disabled:hover.disabled:active,
.datepicker table tr td span.active[disabled]:active,
.datepicker table tr td span.active:hover[disabled]:active,
.datepicker table tr td span.active.disabled[disabled]:active,
.datepicker table tr td span.active.disabled:hover[disabled]:active,
fieldset[disabled] .datepicker table tr td span.active:active,
fieldset[disabled] .datepicker table tr td span.active:hover:active,
fieldset[disabled] .datepicker table tr td span.active.disabled:active,
fieldset[disabled] .datepicker table tr td span.active.disabled:hover:active,
.datepicker table tr td span.active.disabled.active,
.datepicker table tr td span.active:hover.disabled.active,
.datepicker table tr td span.active.disabled.disabled.active,
.datepicker table tr td span.active.disabled:hover.disabled.active,
.datepicker table tr td span.active[disabled].active,
.datepicker table tr td span.active:hover[disabled].active,
.datepicker table tr td span.active.disabled[disabled].active,
.datepicker table tr td span.active.disabled:hover[disabled].active,
fieldset[disabled] .datepicker table tr td span.active.active,
fieldset[disabled] .datepicker table tr td span.active:hover.active,
fieldset[disabled] .datepicker table tr td span.active.disabled.active,
fieldset[disabled] .datepicker table tr td span.active.disabled:hover.active {
  background-color: #428bca;
  border-color: #357ebd;
}
.datepicker table tr td span.old,
.datepicker table tr td span.new {
  color: #999999;
}
.datepicker th.datepicker-switch {
  width: 145px;
}
.datepicker thead tr:first-child th,
.datepicker tfoot tr th {
  cursor: pointer;
}
.datepicker thead tr:first-child th:hover,
.datepicker tfoot tr th:hover {
  background: #eeeeee;
}
.datepicker .cw {
  font-size: 10px;
  width: 12px;
  padding: 0 2px 0 5px;
  vertical-align: middle;
}
.datepicker thead tr:first-child th.cw {
  cursor: default;
  background-color: transparent;
}
.input-group.date .input-group-addon i {
  cursor: pointer;
  width: 16px;
  height: 16px;
}
.input-daterange input {
  text-align: center;
}
.input-daterange input:first-child {
  border-radius: 3px 0 0 3px;
}
.input-daterange input:last-child {
  border-radius: 0 3px 3px 0;
}
.input-daterange .input-group-addon {
  width: auto;
  min-width: 16px;
  padding: 4px 5px;
  font-weight: normal;
  line-height: 1.428571429;
  text-align: center;
  text-shadow: 0 1px 0 #fff;
  vertical-align: middle;
  background-color: #eeeeee;
  border-width: 1px 0;
  margin-left: -5px;
  margin-right: -5px;
}
.datepicker.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  z-index: 1000;
  float: left;
  display: none;
  min-width: 160px;
  list-style: none;
  background-color: #ffffff;
  border: 1px solid #ccc;
  border: 1px solid rgba(0, 0, 0, 0.2);
  border-radius: 5px;
  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
  -webkit-background-clip: padding-box;
  -moz-background-clip: padding;
  background-clip: padding-box;
  *border-right-width: 2px;
  *border-bottom-width: 2px;
  color: #333333;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  font-size: 13px;
  line-height: 1.428571429;
}
.datepicker.dropdown-menu th,
.datepicker.dropdown-menu td {
  padding: 4px 5px;
}

+ 155 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/dropzone/basic.css

@ -0,0 +1,155 @@
/* The MIT License */
.dropzone,
.dropzone *,
.dropzone-previews,
.dropzone-previews * {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}
.dropzone {
  position: relative;
  border: 1px solid rgba(0,0,0,0.08);
  background: rgba(0,0,0,0.02);
  padding: 1em;
}
.dropzone.dz-clickable {
  cursor: pointer;
}
.dropzone.dz-clickable .dz-message,
.dropzone.dz-clickable .dz-message span {
  cursor: pointer;
}
.dropzone.dz-clickable * {
  cursor: default;
}
.dropzone .dz-message {
  opacity: 1;
  -ms-filter: none;
  filter: none;
}
.dropzone.dz-drag-hover {
  border-color: rgba(0,0,0,0.15);
  background: rgba(0,0,0,0.04);
}
.dropzone.dz-started .dz-message {
  display: none;
}
.dropzone .dz-preview,
.dropzone-previews .dz-preview {
  background: rgba(255,255,255,0.8);
  position: relative;
  display: inline-block;
  margin: 17px;
  vertical-align: top;
  border: 1px solid #acacac;
  padding: 6px 6px 6px 6px;
}
.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],
.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] {
  display: none;
}
.dropzone .dz-preview .dz-details,
.dropzone-previews .dz-preview .dz-details {
  width: 100px;
  height: 100px;
  position: relative;
  background: #ebebeb;
  padding: 5px;
  margin-bottom: 22px;
}
.dropzone .dz-preview .dz-details .dz-filename,
.dropzone-previews .dz-preview .dz-details .dz-filename {
  overflow: hidden;
  height: 100%;
}
.dropzone .dz-preview .dz-details img,
.dropzone-previews .dz-preview .dz-details img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100px;
  height: 100px;
}
.dropzone .dz-preview .dz-details .dz-size,
.dropzone-previews .dz-preview .dz-details .dz-size {
  position: absolute;
  bottom: -28px;
  left: 3px;
  height: 28px;
  line-height: 28px;
}
.dropzone .dz-preview.dz-error .dz-error-mark,
.dropzone-previews .dz-preview.dz-error .dz-error-mark {
  display: block;
}
.dropzone .dz-preview.dz-success .dz-success-mark,
.dropzone-previews .dz-preview.dz-success .dz-success-mark {
  display: block;
}
.dropzone .dz-preview:hover .dz-details img,
.dropzone-previews .dz-preview:hover .dz-details img {
  display: none;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark,
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
  display: none;
  position: absolute;
  width: 40px;
  height: 40px;
  font-size: 30px;
  text-align: center;
  right: -10px;
  top: -10px;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
  color: #8cc657;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
  color: #ee162d;
}
.dropzone .dz-preview .dz-progress,
.dropzone-previews .dz-preview .dz-progress {
  position: absolute;
  top: 100px;
  left: 6px;
  right: 6px;
  height: 6px;
  background: #d7d7d7;
  display: none;
}
.dropzone .dz-preview .dz-progress .dz-upload,
.dropzone-previews .dz-preview .dz-progress .dz-upload {
  display: block;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 0%;
  background-color: #8cc657;
}
.dropzone .dz-preview.dz-processing .dz-progress,
.dropzone-previews .dz-preview.dz-processing .dz-progress {
  display: block;
}
.dropzone .dz-preview .dz-error-message,
.dropzone-previews .dz-preview .dz-error-message {
  display: none;
  position: absolute;
  top: -5px;
  left: -20px;
  background: rgba(245,245,245,0.8);
  padding: 8px 10px;
  color: #800;
  min-width: 140px;
  max-width: 500px;
  z-index: 500;
}
.dropzone .dz-preview:hover.dz-error .dz-error-message,
.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {
  display: block;
}

+ 410 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/dropzone/dropzone.css

@ -0,0 +1,410 @@
/* The MIT License */
.dropzone,
.dropzone *,
.dropzone-previews,
.dropzone-previews * {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}
.dropzone {
  position: relative;
  border: 1px solid rgba(0,0,0,0.08);
  background: rgba(0,0,0,0.02);
  padding: 1em;
}
.dropzone.dz-clickable {
  cursor: pointer;
}
.dropzone.dz-clickable .dz-message,
.dropzone.dz-clickable .dz-message span {
  cursor: pointer;
}
.dropzone.dz-clickable * {
  cursor: default;
}
.dropzone .dz-message {
  opacity: 1;
  -ms-filter: none;
  filter: none;
}
.dropzone.dz-drag-hover {
  border-color: rgba(0,0,0,0.15);
  background: rgba(0,0,0,0.04);
}
.dropzone.dz-started .dz-message {
  display: none;
}
.dropzone .dz-preview,
.dropzone-previews .dz-preview {
  background: rgba(255,255,255,0.8);
  position: relative;
  display: inline-block;
  margin: 17px;
  vertical-align: top;
  border: 1px solid #acacac;
  padding: 6px 6px 6px 6px;
}
.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail],
.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] {
  display: none;
}
.dropzone .dz-preview .dz-details,
.dropzone-previews .dz-preview .dz-details {
  width: 100px;
  height: 100px;
  position: relative;
  background: #ebebeb;
  padding: 5px;
  margin-bottom: 22px;
}
.dropzone .dz-preview .dz-details .dz-filename,
.dropzone-previews .dz-preview .dz-details .dz-filename {
  overflow: hidden;
  height: 100%;
}
.dropzone .dz-preview .dz-details img,
.dropzone-previews .dz-preview .dz-details img {
  position: absolute;
  top: 0;
  left: 0;
  width: 100px;
  height: 100px;
}
.dropzone .dz-preview .dz-details .dz-size,
.dropzone-previews .dz-preview .dz-details .dz-size {
  position: absolute;
  bottom: -28px;
  left: 3px;
  height: 28px;
  line-height: 28px;
}
.dropzone .dz-preview.dz-error .dz-error-mark,
.dropzone-previews .dz-preview.dz-error .dz-error-mark {
  display: block;
}
.dropzone .dz-preview.dz-success .dz-success-mark,
.dropzone-previews .dz-preview.dz-success .dz-success-mark {
  display: block;
}
.dropzone .dz-preview:hover .dz-details img,
.dropzone-previews .dz-preview:hover .dz-details img {
  display: none;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark,
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
  display: none;
  position: absolute;
  width: 40px;
  height: 40px;
  font-size: 30px;
  text-align: center;
  right: -10px;
  top: -10px;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
  color: #8cc657;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
  color: #ee162d;
}
.dropzone .dz-preview .dz-progress,
.dropzone-previews .dz-preview .dz-progress {
  position: absolute;
  top: 100px;
  left: 6px;
  right: 6px;
  height: 6px;
  background: #d7d7d7;
  display: none;
}
.dropzone .dz-preview .dz-progress .dz-upload,
.dropzone-previews .dz-preview .dz-progress .dz-upload {
  display: block;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  width: 0%;
  background-color: #8cc657;
}
.dropzone .dz-preview.dz-processing .dz-progress,
.dropzone-previews .dz-preview.dz-processing .dz-progress {
  display: block;
}
.dropzone .dz-preview .dz-error-message,
.dropzone-previews .dz-preview .dz-error-message {
  display: none;
  position: absolute;
  top: -5px;
  left: -20px;
  background: rgba(245,245,245,0.8);
  padding: 8px 10px;
  color: #800;
  min-width: 140px;
  max-width: 500px;
  z-index: 500;
}
.dropzone .dz-preview:hover.dz-error .dz-error-message,
.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {
  display: block;
}
.dropzone {
  border: 1px solid rgba(0,0,0,0.03);
  min-height: 360px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
  background: rgba(0,0,0,0.03);
  padding: 23px;
}
.dropzone .dz-default.dz-message {
  opacity: 1;
  -ms-filter: none;
  filter: none;
  -webkit-transition: opacity 0.3s ease-in-out;
  -moz-transition: opacity 0.3s ease-in-out;
  -o-transition: opacity 0.3s ease-in-out;
  -ms-transition: opacity 0.3s ease-in-out;
  transition: opacity 0.3s ease-in-out;
  background-image: url("../images/spritemap.png");
  background-repeat: no-repeat;
  background-position: 0 0;
  position: absolute;
  width: 428px;
  height: 123px;
  margin-left: -214px;
  margin-top: -61.5px;
  top: 50%;
  left: 50%;
}
@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {
  .dropzone .dz-default.dz-message {
    background-image: url("../images/spritemap@2x.png");
    -webkit-background-size: 428px 406px;
    -moz-background-size: 428px 406px;
    background-size: 428px 406px;
  }
}
.dropzone .dz-default.dz-message span {
  display: none;
}
.dropzone.dz-square .dz-default.dz-message {
  background-position: 0 -123px;
  width: 268px;
  margin-left: -134px;
  height: 174px;
  margin-top: -87px;
}
.dropzone.dz-drag-hover .dz-message {
  opacity: 0.15;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=15)";
  filter: alpha(opacity=15);
}
.dropzone.dz-started .dz-message {
  display: block;
  opacity: 0;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
  filter: alpha(opacity=0);
}
.dropzone .dz-preview,
.dropzone-previews .dz-preview {
  -webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.16);
  box-shadow: 1px 1px 4px rgba(0,0,0,0.16);
  font-size: 14px;
}
.dropzone .dz-preview.dz-image-preview:hover .dz-details img,
.dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img {
  display: block;
  opacity: 0.1;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)";
  filter: alpha(opacity=10);
}
.dropzone .dz-preview.dz-success .dz-success-mark,
.dropzone-previews .dz-preview.dz-success .dz-success-mark {
  opacity: 1;
  -ms-filter: none;
  filter: none;
}
.dropzone .dz-preview.dz-error .dz-error-mark,
.dropzone-previews .dz-preview.dz-error .dz-error-mark {
  opacity: 1;
  -ms-filter: none;
  filter: none;
}
.dropzone .dz-preview.dz-error .dz-progress .dz-upload,
.dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload {
  background: #ee1e2d;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark,
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
  display: block;
  opacity: 0;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
  filter: alpha(opacity=0);
  -webkit-transition: opacity 0.4s ease-in-out;
  -moz-transition: opacity 0.4s ease-in-out;
  -o-transition: opacity 0.4s ease-in-out;
  -ms-transition: opacity 0.4s ease-in-out;
  transition: opacity 0.4s ease-in-out;
  background-image: url("../images/spritemap.png");
  background-repeat: no-repeat;
}
@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {
  .dropzone .dz-preview .dz-error-mark,
  .dropzone-previews .dz-preview .dz-error-mark,
  .dropzone .dz-preview .dz-success-mark,
  .dropzone-previews .dz-preview .dz-success-mark {
    background-image: url("../images/spritemap@2x.png");
    -webkit-background-size: 428px 406px;
    -moz-background-size: 428px 406px;
    background-size: 428px 406px;
  }
}
.dropzone .dz-preview .dz-error-mark span,
.dropzone-previews .dz-preview .dz-error-mark span,
.dropzone .dz-preview .dz-success-mark span,
.dropzone-previews .dz-preview .dz-success-mark span {
  display: none;
}
.dropzone .dz-preview .dz-error-mark,
.dropzone-previews .dz-preview .dz-error-mark {
  background-position: -268px -123px;
}
.dropzone .dz-preview .dz-success-mark,
.dropzone-previews .dz-preview .dz-success-mark {
  background-position: -268px -163px;
}
.dropzone .dz-preview .dz-progress .dz-upload,
.dropzone-previews .dz-preview .dz-progress .dz-upload {
  -webkit-animation: loading 0.4s linear infinite;
  -moz-animation: loading 0.4s linear infinite;
  -o-animation: loading 0.4s linear infinite;
  -ms-animation: loading 0.4s linear infinite;
  animation: loading 0.4s linear infinite;
  -webkit-transition: width 0.3s ease-in-out;
  -moz-transition: width 0.3s ease-in-out;
  -o-transition: width 0.3s ease-in-out;
  -ms-transition: width 0.3s ease-in-out;
  transition: width 0.3s ease-in-out;
  -webkit-border-radius: 2px;
  border-radius: 2px;
  position: absolute;
  top: 0;
  left: 0;
  width: 0%;
  height: 100%;
  background-image: url("../images/spritemap.png");
  background-repeat: repeat-x;
  background-position: 0px -400px;
}
@media all and (-webkit-min-device-pixel-ratio:1.5),(min--moz-device-pixel-ratio:1.5),(-o-min-device-pixel-ratio:1.5/1),(min-device-pixel-ratio:1.5),(min-resolution:138dpi),(min-resolution:1.5dppx) {
  .dropzone .dz-preview .dz-progress .dz-upload,
  .dropzone-previews .dz-preview .dz-progress .dz-upload {
    background-image: url("../images/spritemap@2x.png");
    -webkit-background-size: 428px 406px;
    -moz-background-size: 428px 406px;
    background-size: 428px 406px;
  }
}
.dropzone .dz-preview.dz-success .dz-progress,
.dropzone-previews .dz-preview.dz-success .dz-progress {
  display: block;
  opacity: 0;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
  filter: alpha(opacity=0);
  -webkit-transition: opacity 0.4s ease-in-out;
  -moz-transition: opacity 0.4s ease-in-out;
  -o-transition: opacity 0.4s ease-in-out;
  -ms-transition: opacity 0.4s ease-in-out;
  transition: opacity 0.4s ease-in-out;
}
.dropzone .dz-preview .dz-error-message,
.dropzone-previews .dz-preview .dz-error-message {
  display: block;
  opacity: 0;
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
  filter: alpha(opacity=0);
  -webkit-transition: opacity 0.3s ease-in-out;
  -moz-transition: opacity 0.3s ease-in-out;
  -o-transition: opacity 0.3s ease-in-out;
  -ms-transition: opacity 0.3s ease-in-out;
  transition: opacity 0.3s ease-in-out;
}
.dropzone .dz-preview:hover.dz-error .dz-error-message,
.dropzone-previews .dz-preview:hover.dz-error .dz-error-message {
  opacity: 1;
  -ms-filter: none;
  filter: none;
}
.dropzone a.dz-remove,
.dropzone-previews a.dz-remove {
  background-image: -webkit-linear-gradient(top, #fafafa, #eee);
  background-image: -moz-linear-gradient(top, #fafafa, #eee);
  background-image: -o-linear-gradient(top, #fafafa, #eee);
  background-image: -ms-linear-gradient(top, #fafafa, #eee);
  background-image: linear-gradient(to bottom, #fafafa, #eee);
  -webkit-border-radius: 2px;
  border-radius: 2px;
  border: 1px solid #eee;
  text-decoration: none;
  display: block;
  padding: 4px 5px;
  text-align: center;
  color: #aaa;
  margin-top: 26px;
}
.dropzone a.dz-remove:hover,
.dropzone-previews a.dz-remove:hover {
  color: #666;
}
@-moz-keyframes loading {
  0% {
    background-position: 0 -400px;
  }
  100% {
    background-position: -7px -400px;
  }
}
@-webkit-keyframes loading {
  0% {
    background-position: 0 -400px;
  }
  100% {
    background-position: -7px -400px;
  }
}
@-o-keyframes loading {
  0% {
    background-position: 0 -400px;
  }
  100% {
    background-position: -7px -400px;
  }
}
@-ms-keyframes loading {
  0% {
    background-position: 0 -400px;
  }
  100% {
    background-position: -7px -400px;
  }
}
@keyframes loading {
  0% {
    background-position: 0 -400px;
  }
  100% {
    background-position: -7px -400px;
  }
}

BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/footable/fonts/footable.woff


+ 178 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/footable/footable.core.css

@ -0,0 +1,178 @@
@font-face {
  font-family: 'footable';
  src: url('fonts/footable.eot');
  src: url('fonts/footable.eot?#iefix') format('embedded-opentype'), url('fonts/footable.woff') format('woff'), url('fonts/footable.ttf') format('truetype'), url('fonts/footable.svg#footable') format('svg');
  font-weight: normal;
  font-style: normal;
}
@media screen and (-webkit-min-device-pixel-ratio: 0) {
  @font-face {
    font-family: 'footable';
    src: url('fonts/footable.svg#footable') format('svg');
    font-weight: normal;
    font-style: normal;
  }
}
.footable {
  width: 100%;
  /** SORTING **/
  /** PAGINATION **/
}
.footable.breakpoint > tbody > tr.footable-detail-show > td {
  border-bottom: none;
}
.footable.breakpoint > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e001";
}
.footable.breakpoint > tbody > tr:hover:not(.footable-row-detail) {
  cursor: pointer;
}
.footable.breakpoint > tbody > tr > td.footable-cell-detail {
  background: #eee;
  border-top: none;
}
.footable.breakpoint > tbody > tr > td > span.footable-toggle {
  display: inline-block;
  font-family: 'footable';
  speak: none;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  text-transform: none;
  -webkit-font-smoothing: antialiased;
  padding-right: 5px;
  font-size: 14px;
  color: #888888;
}
.footable.breakpoint > tbody > tr > td > span.footable-toggle:before {
  content: "\e000";
}
.footable.breakpoint.toggle-circle > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e005";
}
.footable.breakpoint.toggle-circle > tbody > tr > td > span.footable-toggle:before {
  content: "\e004";
}
.footable.breakpoint.toggle-circle-filled > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e003";
}
.footable.breakpoint.toggle-circle-filled > tbody > tr > td > span.footable-toggle:before {
  content: "\e002";
}
.footable.breakpoint.toggle-square > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e007";
}
.footable.breakpoint.toggle-square > tbody > tr > td > span.footable-toggle:before {
  content: "\e006";
}
.footable.breakpoint.toggle-square-filled > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e009";
}
.footable.breakpoint.toggle-square-filled > tbody > tr > td > span.footable-toggle:before {
  content: "\e008";
}
.footable.breakpoint.toggle-arrow > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e00f";
}
.footable.breakpoint.toggle-arrow > tbody > tr > td > span.footable-toggle:before {
  content: "\e011";
}
.footable.breakpoint.toggle-arrow-small > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e013";
}
.footable.breakpoint.toggle-arrow-small > tbody > tr > td > span.footable-toggle:before {
  content: "\e015";
}
.footable.breakpoint.toggle-arrow-circle > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e01b";
}
.footable.breakpoint.toggle-arrow-circle > tbody > tr > td > span.footable-toggle:before {
  content: "\e01d";
}
.footable.breakpoint.toggle-arrow-circle-filled > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e00b";
}
.footable.breakpoint.toggle-arrow-circle-filled > tbody > tr > td > span.footable-toggle:before {
  content: "\e00d";
}
.footable.breakpoint.toggle-arrow-tiny > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e01f";
}
.footable.breakpoint.toggle-arrow-tiny > tbody > tr > td > span.footable-toggle:before {
  content: "\e021";
}
.footable.breakpoint.toggle-arrow-alt > tbody > tr.footable-detail-show > td > span.footable-toggle:before {
  content: "\e017";
}
.footable.breakpoint.toggle-arrow-alt > tbody > tr > td > span.footable-toggle:before {
  content: "\e019";
}
.footable.breakpoint.toggle-medium > tbody > tr > td > span.footable-toggle {
  font-size: 18px;
}
.footable.breakpoint.toggle-large > tbody > tr > td > span.footable-toggle {
  font-size: 24px;
}
.footable > thead > tr > th {
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: -moz-none;
  -ms-user-select: none;
  user-select: none;
}
.footable > thead > tr > th.footable-sortable:hover {
  cursor: pointer;
}
.footable > thead > tr > th.footable-sorted > span.footable-sort-indicator:before {
  content: "\e013";
}
.footable > thead > tr > th.footable-sorted-desc > span.footable-sort-indicator:before {
  content: "\e012";
}
.footable > thead > tr > th > span.footable-sort-indicator {
  display: inline-block;
  font-family: 'footable';
  speak: none;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  text-transform: none;
  -webkit-font-smoothing: antialiased;
  padding-left: 5px;
}
.footable > thead > tr > th > span.footable-sort-indicator:before {
  content: "\e022";
}
.footable > tfoot .pagination {
  margin: 0;
}
.footable.no-paging .hide-if-no-paging {
  display: none;
}
.footable-row-detail-inner {
  display: table;
}
.footable-row-detail-row {
  display: table-row;
  line-height: 1.5em;
}
.footable-row-detail-group {
  display: block;
  line-height: 2em;
  font-size: 1.2em;
  font-weight: bold;
}
.footable-row-detail-name {
  display: table-cell;
  font-weight: bold;
  padding-right: 0.5em;
}
.footable-row-detail-value {
  display: table-cell;
}
.footable-odd {
  background-color: #f7f7f7;
}

+ 589 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/fullcalendar/fullcalendar.css

@ -0,0 +1,589 @@
/*!
 * FullCalendar v1.6.4 Stylesheet
 * Docs & License: http://arshaw.com/fullcalendar/
 * (c) 2013 Adam Shaw
 */
.fc {
	direction: ltr;
	text-align: left;
	}
	
.fc table {
	border-collapse: collapse;
	border-spacing: 0;
	}
	
html .fc,
.fc table {
	font-size: 1em;
	}
	
.fc td,
.fc th {
	padding: 0;
	vertical-align: top;
	}
/* Header
------------------------------------------------------------------------*/
.fc-header td {
	white-space: nowrap;
	}
.fc-header-left {
	width: 25%;
	text-align: left;
	}
	
.fc-header-center {
	text-align: center;
	}
	
.fc-header-right {
	width: 25%;
	text-align: right;
	}
	
.fc-header-title {
	display: inline-block;
	vertical-align: top;
	}
	
.fc-header-title h2 {
	margin-top: 0;
	white-space: nowrap;
	}
	
.fc .fc-header-space {
	padding-left: 10px;
	}
	
.fc-header .fc-button {
	margin-bottom: 1em;
	vertical-align: top;
	}
	
/* buttons edges butting together */
.fc-header .fc-button {
	margin-right: -1px;
	}
	
.fc-header .fc-corner-right,  /* non-theme */
.fc-header .ui-corner-right { /* theme */
	margin-right: 0; /* back to normal */
	}
	
/* button layering (for border precedence) */
	
.fc-header .fc-state-hover,
.fc-header .ui-state-hover {
	z-index: 2;
	}
	
.fc-header .fc-state-down {
	z-index: 3;
	}
.fc-header .fc-state-active,
.fc-header .ui-state-active {
	z-index: 4;
	}
	
	
	
/* Content
------------------------------------------------------------------------*/
	
.fc-content {
	clear: both;
	zoom: 1; /* for IE7, gives accurate coordinates for [un]freezeContentHeight */
	}
	
.fc-view {
	width: 100%;
	overflow: hidden;
	}
	
	
/* Cell Styles
------------------------------------------------------------------------*/
.fc-widget-header,    /* <th>, usually */
.fc-widget-content {  /* <td>, usually */
	border: 1px solid #ddd;
	}
	
.fc-state-highlight { /* <td> today cell */ /* TODO: add .fc-today to <th> */
	background: #fcf8e3;
	}
	
.fc-cell-overlay { /* semi-transparent rectangle while dragging */
	background: #bce8f1;
	opacity: .3;
	filter: alpha(opacity=30); /* for IE */
	}
	
/* Buttons
------------------------------------------------------------------------*/
.fc-button {
	position: relative;
	display: inline-block;
	padding: 0 .6em;
	overflow: hidden;
	height: 1.9em;
	line-height: 1.9em;
	white-space: nowrap;
	cursor: pointer;
	}
	
.fc-state-default { /* non-theme */
	border: 1px solid;
	}
.fc-state-default.fc-corner-left { /* non-theme */
	border-top-left-radius: 4px;
	border-bottom-left-radius: 4px;
	}
.fc-state-default.fc-corner-right { /* non-theme */
	border-top-right-radius: 4px;
	border-bottom-right-radius: 4px;
	}
/*
	Our default prev/next buttons use HTML entities like &lsaquo; &rsaquo; &laquo; &raquo;
	and we'll try to make them look good cross-browser.
*/
.fc-text-arrow {
	margin: 0 .1em;
	font-size: 2em;
	font-family: "Courier New", Courier, monospace;
	vertical-align: baseline; /* for IE7 */
	}
.fc-button-prev .fc-text-arrow,
.fc-button-next .fc-text-arrow { /* for &lsaquo; &rsaquo; */
	font-weight: bold;
	}
	
/* icon (for jquery ui) */
	
.fc-button .fc-icon-wrap {
	position: relative;
	float: left;
	top: 50%;
	}
	
.fc-button .ui-icon {
	position: relative;
	float: left;
	margin-top: -50%;
	*margin-top: 0;
	*top: -50%;
	}
	
/*
  button states
  borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/)
*/
.fc-state-default {
	background-color: #f5f5f5;
	background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
	background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
	background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
	background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
	background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
	background-repeat: repeat-x;
	border-color: #e6e6e6 #e6e6e6 #bfbfbf;
	border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
	color: #333;
	text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
	box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
	}
.fc-state-hover,
.fc-state-down,
.fc-state-active,
.fc-state-disabled {
	color: #333333;
	background-color: #e6e6e6;
	}
.fc-state-hover {
	color: #333333;
	text-decoration: none;
	background-position: 0 -15px;
	-webkit-transition: background-position 0.1s linear;
	   -moz-transition: background-position 0.1s linear;
	     -o-transition: background-position 0.1s linear;
	        transition: background-position 0.1s linear;
	}
.fc-state-down,
.fc-state-active {
	background-color: #cccccc;
	background-image: none;
	outline: 0;
	box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
	}
.fc-state-disabled {
	cursor: default;
	background-image: none;
	opacity: 0.65;
	filter: alpha(opacity=65);
	box-shadow: none;
	}
	
/* Global Event Styles
------------------------------------------------------------------------*/
.fc-event-container > * {
	z-index: 8;
	}
.fc-event-container > .ui-draggable-dragging,
.fc-event-container > .ui-resizable-resizing {
	z-index: 9;
	}
	 
.fc-event {
	border: 1px solid #3a87ad; /* default BORDER color */
	background-color: #3a87ad; /* default BACKGROUND color */
	color: #fff;               /* default TEXT color */
	font-size: .85em;
	cursor: default;
	}
a.fc-event {
	text-decoration: none;
	}
	
a.fc-event,
.fc-event-draggable {
	cursor: pointer;
	}
	
.fc-rtl .fc-event {
	text-align: right;
	}
.fc-event-inner {
	width: 100%;
	height: 100%;
	overflow: hidden;
	}
	
.fc-event-time,
.fc-event-title {
	padding: 0 1px;
	}
	
.fc .ui-resizable-handle {
	display: block;
	position: absolute;
	z-index: 99999;
	overflow: hidden; /* hacky spaces (IE6/7) */
	font-size: 300%;  /* */
	line-height: 50%; /* */
	}
	
	
	
/* Horizontal Events
------------------------------------------------------------------------*/
.fc-event-hori {
	border-width: 1px 0;
	margin-bottom: 1px;
	}
.fc-ltr .fc-event-hori.fc-event-start,
.fc-rtl .fc-event-hori.fc-event-end {
	border-left-width: 1px;
	border-top-left-radius: 3px;
	border-bottom-left-radius: 3px;
	}
.fc-ltr .fc-event-hori.fc-event-end,
.fc-rtl .fc-event-hori.fc-event-start {
	border-right-width: 1px;
	border-top-right-radius: 3px;
	border-bottom-right-radius: 3px;
	}
	
/* resizable */
	
.fc-event-hori .ui-resizable-e {
	top: 0           !important; /* importants override pre jquery ui 1.7 styles */
	right: -3px      !important;
	width: 7px       !important;
	height: 100%     !important;
	cursor: e-resize;
	}
	
.fc-event-hori .ui-resizable-w {
	top: 0           !important;
	left: -3px       !important;
	width: 7px       !important;
	height: 100%     !important;
	cursor: w-resize;
	}
	
.fc-event-hori .ui-resizable-handle {
	_padding-bottom: 14px; /* IE6 had 0 height */
	}
	
	
	
/* Reusable Separate-border Table
------------------------------------------------------------*/
table.fc-border-separate {
	border-collapse: separate;
	}
	
.fc-border-separate th,
.fc-border-separate td {
	border-width: 1px 0 0 1px;
	}
	
.fc-border-separate th.fc-last,
.fc-border-separate td.fc-last {
	border-right-width: 1px;
	}
	
.fc-border-separate tr.fc-last th,
.fc-border-separate tr.fc-last td {
	border-bottom-width: 1px;
	}
	
.fc-border-separate tbody tr.fc-first td,
.fc-border-separate tbody tr.fc-first th {
	border-top-width: 0;
	}
	
	
/* Month View, Basic Week View, Basic Day View
------------------------------------------------------------------------*/
.fc-grid th {
	text-align: center;
	}
.fc .fc-week-number {
	width: 22px;
	text-align: center;
	}
.fc .fc-week-number div {
	padding: 0 2px;
	}
	
.fc-grid .fc-day-number {
	float: right;
	padding: 0 2px;
	}
	
.fc-grid .fc-other-month .fc-day-number {
	opacity: 0.3;
	filter: alpha(opacity=30); /* for IE */
	/* opacity with small font can sometimes look too faded
	   might want to set the 'color' property instead
	   making day-numbers bold also fixes the problem */
	}
	
.fc-grid .fc-day-content {
	clear: both;
	padding: 2px 2px 1px; /* distance between events and day edges */
	}
	
/* event styles */
	
.fc-grid .fc-event-time {
	font-weight: bold;
	}
	
/* right-to-left */
	
.fc-rtl .fc-grid .fc-day-number {
	float: left;
	}
	
.fc-rtl .fc-grid .fc-event-time {
	float: right;
	}
	
	
/* Agenda Week View, Agenda Day View
------------------------------------------------------------------------*/
.fc-agenda table {
	border-collapse: separate;
	}
	
.fc-agenda-days th {
	text-align: center;
	}
	
.fc-agenda .fc-agenda-axis {
	width: 50px;
	padding: 0 4px;
	vertical-align: middle;
	text-align: right;
	white-space: nowrap;
	font-weight: normal;
	}
.fc-agenda .fc-week-number {
	font-weight: bold;
	}
	
.fc-agenda .fc-day-content {
	padding: 2px 2px 1px;
	}
	
/* make axis border take precedence */
	
.fc-agenda-days .fc-agenda-axis {
	border-right-width: 1px;
	}
	
.fc-agenda-days .fc-col0 {
	border-left-width: 0;
	}
	
/* all-day area */
	
.fc-agenda-allday th {
	border-width: 0 1px;
	}
	
.fc-agenda-allday .fc-day-content {
	min-height: 34px; /* TODO: doesnt work well in quirksmode */
	_height: 34px;
	}
	
/* divider (between all-day and slots) */
	
.fc-agenda-divider-inner {
	height: 2px;
	overflow: hidden;
	}
	
.fc-widget-header .fc-agenda-divider-inner {
	background: #eee;
	}
	
/* slot rows */
	
.fc-agenda-slots th {
	border-width: 1px 1px 0;
	}
	
.fc-agenda-slots td {
	border-width: 1px 0 0;
	background: none;
	}
	
.fc-agenda-slots td div {
	height: 20px;
	}
	
.fc-agenda-slots tr.fc-slot0 th,
.fc-agenda-slots tr.fc-slot0 td {
	border-top-width: 0;
	}
.fc-agenda-slots tr.fc-minor th,
.fc-agenda-slots tr.fc-minor td {
	border-top-style: dotted;
	}
	
.fc-agenda-slots tr.fc-minor th.ui-widget-header {
	*border-top-style: solid; /* doesn't work with background in IE6/7 */
	}
	
/* Vertical Events
------------------------------------------------------------------------*/
.fc-event-vert {
	border-width: 0 1px;
	}
.fc-event-vert.fc-event-start {
	border-top-width: 1px;
	border-top-left-radius: 3px;
	border-top-right-radius: 3px;
	}
.fc-event-vert.fc-event-end {
	border-bottom-width: 1px;
	border-bottom-left-radius: 3px;
	border-bottom-right-radius: 3px;
	}
	
.fc-event-vert .fc-event-time {
	white-space: nowrap;
	font-size: 10px;
	}
.fc-event-vert .fc-event-inner {
	position: relative;
	z-index: 2;
	}
	
.fc-event-vert .fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay  */
	position: absolute;
	z-index: 1;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	background: #fff;
	opacity: .25;
	filter: alpha(opacity=25);
	}
	
.fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */
.fc-select-helper .fc-event-bg {
	display: none\9; /* for IE6/7/8. nested opacity filters while dragging don't work */
	}
	
/* resizable */
	
.fc-event-vert .ui-resizable-s {
	bottom: 0        !important; /* importants override pre jquery ui 1.7 styles */
	width: 100%      !important;
	height: 8px      !important;
	overflow: hidden !important;
	line-height: 8px !important;
	font-size: 11px  !important;
	font-family: monospace;
	text-align: center;
	cursor: s-resize;
	}
	
.fc-agenda .ui-resizable-resizing { /* TODO: better selector */
	_overflow: hidden;
	}
	
	

+ 32 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/fullcalendar/fullcalendar.print.css

@ -0,0 +1,32 @@
/*!
 * FullCalendar v1.6.4 Print Stylesheet
 * Docs & License: http://arshaw.com/fullcalendar/
 * (c) 2013 Adam Shaw
 */
/*
 * Include this stylesheet on your page to get a more printer-friendly calendar.
 * When including this stylesheet, use the media='print' attribute of the <link> tag.
 * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.
 */
 
 
 /* Events
-----------------------------------------------------*/
 
.fc-event {
	background: #fff !important;
	color: #000 !important;
	}
	
/* for vertical events */
	
.fc-event-bg {
	display: none !important;
	}
	
.fc-event .ui-resizable-handle {
	display: none !important;
	}
	
	

+ 59 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/iCheck/custom.css

@ -0,0 +1,59 @@
/* iCheck plugin Square skin, green
----------------------------------- */
.icheckbox_square-green,
.iradio_square-green {
    display: inline-block;
    *display: inline;
    vertical-align: middle;
    margin: 0;
    padding: 0;
    width: 22px;
    height: 22px;
    background: url(green.png) no-repeat;
    border: none;
    cursor: pointer;
}
.icheckbox_square-green {
    background-position: 0 0;
}
.icheckbox_square-green.hover {
    background-position: -24px 0;
}
.icheckbox_square-green.checked {
    background-position: -48px 0;
}
.icheckbox_square-green.disabled {
    background-position: -72px 0;
    cursor: default;
}
.icheckbox_square-green.checked.disabled {
    background-position: -96px 0;
}
.iradio_square-green {
    background-position: -120px 0;
}
.iradio_square-green.hover {
    background-position: -144px 0;
}
.iradio_square-green.checked {
    background-position: -168px 0;
}
.iradio_square-green.disabled {
    background-position: -192px 0;
    cursor: default;
}
.iradio_square-green.checked.disabled {
    background-position: -216px 0;
}
/* HiDPI support */
@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) {
    .icheckbox_square-green,
    .iradio_square-green {
        background-image: url(green@2x.png);
        -webkit-background-size: 240px 24px;
        background-size: 240px 24px;
    }
}

BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/iCheck/green.png


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/images/sort_asc.png


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/images/sprite-skin-flat.png


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/images/spritemap.png


+ 126 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/ionRangeSlider/ion.rangeSlider.css

@ -0,0 +1,126 @@
/* Ion.RangeSlider
// css version 1.8.5
// by Denis Ineshin | ionden.com
// ===================================================================================================================*/
/* =====================================================================================================================
// RangeSlider */
.irs {
    position: relative; display: block;
}
    .irs-line {
        position: relative; display: block;
        overflow: hidden;
    }
        .irs-line-left, .irs-line-mid, .irs-line-right {
            position: absolute; display: block;
            top: 0;
        }
        .irs-line-left {
            left: 0; width: 10%;
        }
        .irs-line-mid {
            left: 10%; width: 80%;
        }
        .irs-line-right {
            right: 0; width: 10%;
        }
    .irs-diapason {
        position: absolute; display: block;
        left: 0; width: 100%;
    }
    .irs-slider {
        position: absolute; display: block;
        cursor: default;
        z-index: 1;
    }
        .irs-slider.single {
            left: 10px;
        }
            .irs-slider.single:before {
                position: absolute; display: block; content: "";
                top: -30%; left: -30%;
                width: 160%; height: 160%;
                background: rgba(0,0,0,0.0);
            }
        .irs-slider.from {
            left: 100px;
        }
            .irs-slider.from:before {
                position: absolute; display: block; content: "";
                top: -30%; left: -30%;
                width: 130%; height: 160%;
                background: rgba(0,0,0,0.0);
            }
        .irs-slider.to {
            left: 300px;
        }
            .irs-slider.to:before {
                position: absolute; display: block; content: "";
                top: -30%; left: 0;
                width: 130%; height: 160%;
                background: rgba(0,0,0,0.0);
            }
        .irs-slider.last {
            z-index: 2;
        }
    .irs-min {
        position: absolute; display: block;
        left: 0;
        cursor: default;
    }
    .irs-max {
        position: absolute; display: block;
        right: 0;
        cursor: default;
    }
    .irs-from, .irs-to, .irs-single {
        position: absolute; display: block;
        top: 0; left: 0;
        cursor: default;
        white-space: nowrap;
    }
.irs-grid {
    position: absolute; display: none;
    bottom: 0; left: 0;
    width: 100%; height: 20px;
}
.irs-with-grid .irs-grid {
    display: block;
}
    .irs-grid-pol {
        position: absolute;
        top: 0; left: 0;
        width: 1px; height: 8px;
        background: #000;
    }
    .irs-grid-pol.small {
        height: 4px;
    }
    .irs-grid-text {
        position: absolute;
        bottom: 0; left: 0;
        width: 100px;
        white-space: nowrap;
        text-align: center;
        font-size: 9px; line-height: 9px;
        color: #000;
    }
.irs-disable-mask {
    position: absolute; display: block;
    top: 0; left: 0;
    width: 100%; height: 100%;
    cursor: default;
    background: rgba(0,0,0,0.0);
    z-index: 2;
}
.irs-disabled {
    opacity: 0.4;
}

+ 89 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/ionRangeSlider/ion.rangeSlider.skinFlat.css

@ -0,0 +1,89 @@
/* Ion.RangeSlider, Flat UI Skin
// css version 1.8.5
// by Denis Ineshin | ionden.com
// ===================================================================================================================*/
/* =====================================================================================================================
// Skin details */
.irs-line-mid,
.irs-line-left,
.irs-line-right,
.irs-diapason,
.irs-slider {
    background: url(../images/sprite-skin-flat.png) repeat-x;
}
.irs {
    height: 40px;
}
.irs-with-grid {
    height: 60px;
}
.irs-line {
    height: 12px; top: 25px;
}
    .irs-line-left {
        height: 12px;
        background-position: 0 -30px;
    }
    .irs-line-mid {
        height: 12px;
        background-position: 0 0;
    }
    .irs-line-right {
        height: 12px;
        background-position: 100% -30px;
    }
.irs-diapason {
    height: 12px; top: 25px;
    background-position: 0 -60px;
}
.irs-slider {
    width: 16px; height: 18px;
    top: 22px;
    background-position: 0 -90px;
}
#irs-active-slider, .irs-slider:hover {
    background-position: 0 -120px;
}
.irs-min, .irs-max {
    color: #999;
    font-size: 10px; line-height: 1.333;
    text-shadow: none;
    top: 0; padding: 1px 3px;
    background: #e1e4e9;
    border-radius: 4px;
}
.irs-from, .irs-to, .irs-single {
    color: #fff;
    font-size: 10px; line-height: 1.333;
    text-shadow: none;
    padding: 1px 5px;
    background: #ed5565;
    border-radius: 4px;
}
.irs-from:after, .irs-to:after, .irs-single:after {
    position: absolute; display: block; content: "";
    bottom: -6px; left: 50%;
    width: 0; height: 0;
    margin-left: -3px;
    overflow: hidden;
    border: 3px solid transparent;
    border-top-color: #ed5565;
}
.irs-grid-pol {
    background: #e1e4e9;
}
.irs-grid-text {
    color: #999;
}
.irs-disabled {
}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 7 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/jasny/jasny-bootstrap.min.css


+ 851 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/jqgrid/ui.jqgrid.css_0820

@ -0,0 +1,851 @@
/*Grid*/
.ui-jqgrid {
	position: relative; 
	border: 1px solid #ddd;
    overflow: hidden;
}
.ui-jqgrid .ui-jqgrid-view {
	position: relative;
	left:0; 
	top: 0; 
	padding: 0;
}
.ui-jqgrid .ui-common-table {}
/* Caption*/
.ui-jqgrid .ui-jqgrid-titlebar {
	font-weight: normal;
	min-height:37px; 
	padding: 4px 8px; 
	position: relative; 
	margin-right: 2px;
	border-bottom: 1px solid #ddd; //default
}
.ui-jqgrid .ui-jqgrid-caption {
	text-align: left;
}
.ui-jqgrid .ui-jqgrid-title { 
	padding-top: 5px; 
	vertical-align: middle;
}
.ui-jqgrid .ui-jqgrid-titlebar-close { 
	color: inherit; 
	position: absolute;
	top: 50%; 
	margin: -10px 7px 0 0; 
	padding: 1px; 
	cursor:pointer;
}
.ui-jqgrid .ui-jqgrid-titlebar-close span { 
	display: block; 
	margin: 1px; 
}
.ui-jqgrid .ui-jqgrid-titlebar-close:hover {  }
/* Header*/
.ui-jqgrid .ui-jqgrid-hdiv {
	position: relative; 
	margin: 0;
	padding: 0; 
	overflow: hidden;
}
.ui-jqgrid .ui-jqgrid-hbox {
	float: left; 
	padding-right: 20px;
}
.ui-jqgrid .ui-jqgrid-htable { 
	margin-bottom: 0; 
	table-layout: fixed; 
	border-top:none;
}
.ui-jqgrid .ui-jqgrid-htable thead th {
	overflow : hidden; 
	border-bottom : none;
	padding-right: 2px;
}
.ui-jqgrid .ui-jqgrid-htable thead th div {
	overflow: hidden; 
	position:relative;
}
.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {
	overflow: hidden;
	white-space: nowrap;
}
.ui-th-column-header, 
.ui-jqgrid .ui-jqgrid-htable th.ui-th-column-header {
	overflow: hidden;
	white-space: nowrap;
}
.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {}
.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {text-align: center; }
.ui-first-th-ltr { }
.ui-first-th-rtl { }
.ui-jqgrid tr.jqg-first-row-header th {
	height:auto; 
	border-top:none; 
	padding-bottom: 0;
	padding-top: 0;
	border-bottom: none; 
	padding-right: 2px;
	text-align: center;
}
.ui-jqgrid tr.jqg-second-row-header th,
.ui-jqgrid tr.jqg-third--row-header th
{
	border-top:none;
	text-align: center;
}
.ui-jqgrid .ui-th-div-ie {
	white-space: nowrap; 
	zoom :1; 
	height:17px;
}
.ui-jqgrid .ui-jqgrid-resize {
	height:20px !important;
	position: relative; 
	cursor :e-resize;
	display: inline;
	overflow: hidden;
}
.ui-jqgrid .ui-grid-ico-sort { 
	margin-left:5px; 
	overflow:hidden;
	position:absolute;
	right: 3px;
	font-size:12px;
}
.ui-jqgrid .ui-icon-asc {
	margin-top:-3px;
}
.ui-jqgrid .ui-icon-desc {
	margin-top:4px;
}
.ui-jqgrid .ui-i-asc {
	margin-top:0;
}
.ui-jqgrid .ui-i-desc {
	margin-top:0;
	margin-right:13px;
}
.ui-jqgrid .ui-single-sort-asc {
	margin-top:0;
}
.ui-jqgrid .ui-single-sort-desc {}
.ui-jqgrid .ui-jqgrid-sortable {
	cursor:pointer;
}
.ui-jqgrid tr.ui-search-toolbar th { }
.ui-jqgrid .ui-search-table td.ui-search-clear { }
.ui-jqgrid tr.ui-search-toolbar td > input { }
.ui-jqgrid tr.ui-search-toolbar select {}
/* Body */ 
.ui-jqgrid .table-bordered,
.ui-jqgrid .table-bordered td,
.ui-jqgrid .table-bordered th.ui-th-ltr
{
	border-left:0px none !important;
}
.ui-jqgrid .table-bordered th.ui-th-rtl
{
	border-right:0px none !important;
}
.ui-jqgrid .table-bordered tr.ui-row-rtl td
{
	border-right:0px none !important;
	border-left: 1px solid #ddd !important;
}
div.tablediv > .table-bordered {
	border-left : 1px solid #ddd !important;
}
.ui-jqgrid  .ui-jqgrid-bdiv table.table-bordered td {
	border-top: 0px none;
}
.ui-jqgrid .ui-jqgrid-bdiv {
	position: relative; 
	margin: 0; 
	padding:0; 
	overflow-x:hidden; 
	text-align:left; 
}
.ui-jqgrid .ui-jqgrid-btable {
	table-layout: fixed; 
	border-left:none ; 
	border-top:none; 
	margin-bottom: 0px
}
.ui-jqgrid tr.jqgrow {  
	outline-style: none; 
}
.ui-jqgrid tr.jqgroup {  
	outline-style: none; 
}
.ui-jqgrid tr.jqgrow td { 
	overflow: hidden; 
	white-space: pre; 
	padding-right: 2px;
}
.ui-jqgrid tr.jqgfirstrow  td {
	height:auto; 
	border-top:none; 
	padding-bottom: 0;
	padding-top: 0;
	border-bottom: none; 
	padding-right: 2px;
}
.ui-jqgrid tr.jqgroup td { }
.ui-jqgrid tr.jqfoot td {}
.ui-jqgrid tr.ui-row-ltr td {}
.ui-jqgrid tr.ui-row-rtl td {}
.ui-jqgrid td.jqgrid-rownum { }
.ui-jqgrid .ui-jqgrid-resize-mark { 
	width:2px; 
	left:0; 
	background-color:#777; 
	cursor: e-resize; 
	cursor: col-resize; 
	position:absolute; 
	top:0; 
	height:100px; 
	overflow:hidden; 
	display:none; 
	border:0 none; 
	z-index: 99999;
}
/* Footer */
.ui-jqgrid .ui-jqgrid-sdiv {
	position: relative; 
	margin: 0;
	padding: 0; 
	overflow: hidden; 
	border-left: 0 none !important; 
	border-top : 0 none !important; 
	border-right : 0 none !important;
}
.ui-jqgrid .ui-jqgrid-ftable {
	table-layout:fixed;
	margin-bottom:0;
}
.ui-jqgrid tr.footrow td {
	font-weight: bold; 
	overflow: hidden; 
	white-space:nowrap; 
	padding-right: 2px;
	border-bottom: 0px none;
}
.ui-jqgrid tr.footrow-ltr td {
	text-align:left;
}
.ui-jqgrid tr.footrow-rtl td {
	text-align:right;
}
/* Pager*/
.ui-jqgrid .ui-jqgrid-pager,
.ui-jqgrid .ui-jqgrid-toppager
{ 
	border-left-width: 0px;
	border-top: 1px solid #ddd;  
	padding : 4px 0px;
	position: relative; 
	height: auto; 
	white-space: nowrap;
	overflow: hidden;
}
.ui-jqgrid .ui-jqgrid-toppager {
	border-top-width :0;
	border-bottom : 1px solid #ddd;
}
.ui-jqgrid .ui-jqgrid-toppager .ui-pager-control, 
.ui-jqgrid .ui-jqgrid-pager .ui-pager-control {
	position: relative;
	border-left: 0;
	border-bottom: 0;
	border-top: 0; 
	height: 30px;
}
.ui-jqgrid .ui-pg-table {
	position: relative; 
	padding: 1px 0; 
	width:auto; 
	margin: 0;
}
.ui-jqgrid .ui-pg-table td {
	font-weight:normal; 
	vertical-align:middle; 
	padding:0px 6px;
}
.ui-jqgrid .ui-pg-button  { 
	height:auto; 
}
.ui-jqgrid .ui-pg-button span { 
	display: block; 
	margin: 2px; 
	float:left;
}
.ui-jqgrid .ui-pg-button:hover {  }
.ui-jqgrid .ui-disabled:hover {}
.ui-jqgrid .ui-pg-input,
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-input { 
	display: inline;
	height:auto;
	width: auto;
	font-size:.9em; 
	margin:0;
	line-height: inherit;
	padding: 0px 5px
}
.ui-jqgrid .ui-pg-selbox, 
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-selbox {
	font-size:.9em; 
	line-height:inherit; 
	display:block; 
	height:22px; 
	margin: 0; 
	padding: 3px 0px 3px 3px; 
	border:none;
}
.ui-jqgrid .ui-separator {
	height: 18px; 
	border : none;
	border-left: 2px solid #ccc ; //default
}
.ui-separator-li {
	height: 2px; 
	border : none;
	border-top: 2px solid #ccc ;  //default
	margin: 0; padding: 0; width:100%
}
.ui-jqgrid .ui-jqgrid-pager .ui-pg-div,
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div
{
	float:left;
	position:relative; 
}
.ui-jqgrid .ui-jqgrid-pager .ui-pg-button,
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button
{ 
	cursor:pointer; 
}
.ui-jqgrid .ui-jqgrid-pager .ui-pg-div  span,
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div  span
{
	float:left;
}
.ui-jqgrid td input, 
.ui-jqgrid td select, 
.ui-jqgrid td textarea { 
	margin: 0;
}
.ui-jqgrid td textarea {
	width:auto;
	height:auto;
}
.ui-jqgrid .ui-jqgrid-pager .ui-pager-table,
.ui-jqgrid .ui-jqgrid-toppager .ui-pager-table
{
	width:100%;
	table-layout:fixed;
	height:100%;
}
.ui-jqgrid .ui-jqgrid-pager .ui-paging-info,
.ui-jqgrid .ui-jqgrid-toppager .ui-paging-info
{ 
	font-weight: normal;
	height:auto; 
	margin-top:3px;
	margin-right:4px;
	display: inline;
}
.ui-jqgrid .ui-jqgrid-pager .ui-paging-pager,
.ui-jqgrid .ui-jqgrid-toppager .ui-paging-pager
{
	table-layout:auto;
	height:100%;
}
.ui-jqgrid .ui-jqgrid-pager .navtable,
.ui-jqgrid .ui-jqgrid-toppager .navtable
{
	float:left;
	table-layout:auto;
	height:100%;
}
/*Subgrid*/
.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {
	display: block;
}
.ui-jqgrid .ui-subgrid {
	margin:0;
	padding:0; 
	width:100%;
}
.ui-jqgrid .ui-subgrid table {
	table-layout: fixed;
}
.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {}
.ui-jqgrid .ui-subgrid td.subgrid-data {
	border-top:  0 none !important;
}
.ui-jqgrid .ui-subgrid td.subgrid-cell { 
	vertical-align: middle
}
.ui-jqgrid a.ui-sghref {
	text-decoration: none;
	color : #010101; //default
}
.ui-jqgrid .ui-th-subgrid {height:20px;}
.tablediv > .row { margin: 0 0}
/* loading */
.ui-jqgrid .loading {
	position: absolute; 
	top: 45%;
	left: 45%;
	width: auto;
	z-index:101;
	padding: 6px; 
	margin: 5px;
	text-align: center;
	display: none;
	border: 1px solid #ddd;  //default
	font-size: 14px;
	background-color: #d9edf7;
}
.ui-jqgrid .jqgrid-overlay { 
	display:none;
	z-index:100;
}
/* IE * html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');} */
* .jqgrid-overlay iframe {
	position:absolute;
	top:0;
	left:0;
	z-index:-1;
}
/* IE width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/
/* end loading div */
/* Toolbar */
.ui-jqgrid .ui-userdata {
	padding: 4px 0px; 
	overflow: hidden; 
	min-height: 32px; 
}
.ui-jqgrid .ui-userdata-top {
	border-left-width: 0px;    //default
	border-bottom: 1px solid #ddd;	
}
.ui-jqgrid .ui-userdata-bottom {
	border-left-width: 0px;    //default
	border-top: 1px solid #ddd;	
}
/*Modal Window */
.ui-jqdialog { }
.ui-jqdialog { 
	display: none; 
	width: 500px; 
	position: absolute; 
	//padding: 5px; 
	overflow:visible;
}
.ui-jqdialog .ui-jqdialog-titlebar {
	padding: .1em .1em; 
	min-height: 35px; 
}
.ui-jqdialog .ui-jqdialog-title { 
	margin: .3em 0 .2em;  
	font-weight: bold;
	padding-left :6px;
	padding-right:6px;
} 
.ui-jqdialog .ui-jqdialog-titlebar-close { 
	position: absolute;  
	top: 0%; 
	margin: 3px 5px 0 0; 
	padding: 8px;  
	cursor:pointer;
}
.ui-jqdialog .ui-jqdialog-titlebar-close span {  }
.ui-jqdialog .ui-jqdialog-titlebar-close:hover, 
.ui-jqdialog .ui-jqdialog-titlebar-close:focus { 
	padding: 8px; 
}
.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { 
	border: 0; 
	padding: .3em .2em; 
	background: none; 
	height:auto;
}
.ui-jqdialog .ui-jqconfirm {
	padding: .4em 1em; 
	border-width:3px;
	position:absolute;
	bottom:10px;
	right:10px;
	overflow:visible;
	display:none;
	height:120px;
	width:220px;
	text-align:center;
	background-color: #fff;
	border-radius: 4px;
	-webkit-border-radius: 4px;
	-moz-border-radius: 4px;
}
.ui-jqdialog>.ui-resizable-se { }
.ui-jqgrid>.ui-resizable-se { }
/* end Modal window*/
/* Form edit */
.ui-jqdialog-content .FormGrid { 
	margin: 0 8px 0 8px; 
	overflow:auto;
	position:relative;
}
.ui-jqdialog-content .EditTable { 
	width: 100%; 
	margin-bottom:0; 
}
.ui-jqdialog-content .DelTable { 
	width: 100%; 
	margin-bottom:0;
}
.EditTable td input, 
.EditTable td select, 
.EditTable td textarea { 
	width: 98%; 
	display: inline-block;
}
.EditTable td textarea { 
	width:auto; 
	height:auto;
}
.EditTable .FormData td { 
	height:37px !important;
}
.ui-jqdialog-content td.EditButton {
	text-align: right; 
	padding: 5px 5px 5px 0;
}
.ui-jqdialog-content td.navButton {
	text-align: center; 
	border-left: 0 none;
	border-top: 0 none;
	border-right: 0 none; 
	padding-bottom:5px; 
	padding-top:5px;
}
.ui-jqdialog-content input.FormElement {
	padding: .5em .3em; 
	margin-bottom: 5px
}
.ui-jqdialog-content select.FormElement {
	padding:.3em; 
	margin-bottom: 3px;
}
.ui-jqdialog-content .data-line {
	padding-top:.1em;
	border: 0 none;
}
.ui-jqdialog-content .CaptionTD {
	vertical-align: middle;
	border: 0 none; 
	padding: 2px;
	white-space: nowrap;
}
.ui-jqdialog-content .DataTD {
	padding: 2px; 
	border: 0 none; 
	vertical-align: top;
}
.ui-jqdialog-content .form-view-data {
	white-space:pre
}
.fm-button {  }
.fm-button-icon-left { 
	margin-left: 4px; 
	margin-right: 4px;  
}
.fm-button-icon-right { 
	margin-left: 4px; 
	margin-right: 4px; 
}
.fm-button-icon-left  {  }
.fm-button-icon-right  { }
#nData, #pData { 
	margin-left: 4px; 
	margin-right: 4px; 
}
#sData span, #cData span { 
	margin-left: 5px;
}
/* End Eorm edit */
/*.ui-jqgrid .edit-cell {}*/
.ui-jqgrid .selected-row, 
div.ui-jqgrid .selected-row td {
	font-style : normal;
}
/* inline edit actions button*/
.ui-inline-del, .ui-inline-cancel {
    margin-left: 14px;
}
.ui-jqgrid .inline-edit-cell {}
/* Tree Grid */
.ui-jqgrid .tree-wrap {
	float: left; 
	position: relative;
	height: 18px;
	white-space: nowrap;
	overflow: hidden;
}
.ui-jqgrid .tree-minus {
	position: absolute; 
	height: 18px; 
	width: 18px; 
	overflow: hidden;
}
.ui-jqgrid .tree-plus {
	position: absolute;	
	height: 18px; 
	width: 18px;	
	overflow: hidden;
}
.ui-jqgrid .tree-leaf {
	position: absolute;	
	height: 18px; 
	width: 18px;
	overflow: hidden;
}
.ui-jqgrid .treeclick {
	cursor: pointer;
}
/* moda dialog */
* iframe.jqm {
	position:absolute;
	top:0;
	left:0;
	z-index:-1;
}
/*	 width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/
.ui-jqgrid-dnd tr td {
	border-right-width: 1px;
	border-right-color: inherit;
	border-right-style: solid; 
	height:20px
}
/* RTL Support */
.ui-jqgrid .ui-jqgrid-caption-rtl {
	text-align: right;
}
.ui-jqgrid .ui-jqgrid-hbox-rtl {
	float: right; 
	padding-left: 20px;
}
.ui-jqgrid .ui-jqgrid-resize-ltr {
	float: right;
	margin: -2px -2px -2px 0;
	height:100%;
}
.ui-jqgrid .ui-jqgrid-resize-rtl {
	float: left;
	margin: -2px -2px -2px -0px;
}
.ui-jqgrid .ui-sort-rtl {
	
}
.ui-jqgrid .tree-wrap-ltr {
	float: left;
}
.ui-jqgrid .tree-wrap-rtl {
	float: right;
}
.ui-jqgrid .ui-ellipsis {
	-moz-text-overflow:ellipsis;
	text-overflow:ellipsis;
}
/* Toolbar Search Menu. Nav menu */
.ui-search-menu, 
.ui-nav-menu {
	position: absolute; 
	padding: 2px 5px; 
	z-index:99999;
}
.ui-search-menu.ui-menu .ui-menu-item,
.ui-nav-menu.ui-menu .ui-menu-item
{ 
	list-style-image: none; 
	padding-right: 0; 
	padding-left: 0; 
}
.ui-search-menu.ui-menu .ui-menu-item a, 
.ui-nav-menu.ui-menu .ui-menu-item a 
{ 
	display: block; 
}
.ui-search-menu.ui-menu .ui-menu-item a.g-menu-item:hover,
.ui-nav-menu.ui-menu .ui-menu-item a.g-menu-item:hover 
{ 
	margin: -1px; 
	font-weight: normal; 
}
.ui-jqgrid .ui-search-table { 
	padding: 0; 
	border: 0 none; 
	height:20px; 
	width:100%;
}
.ui-jqgrid .ui-search-table .ui-search-oper { 
	width:20px; 
}
a.g-menu-item, a.soptclass, a.clearsearchclass { 
	cursor: pointer; 
} 
.ui-jqgrid .ui-jqgrid-view input,
.ui-jqgrid .ui-jqgrid-view select,
.ui-jqgrid .ui-jqgrid-view textarea,
.ui-jqgrid .ui-jqgrid-view button {
    //font-size: 11px
}
.ui-jqgrid .ui-scroll-popup {
	width: 100px;
}
.ui-search-table select,
.ui-search-table input 
{
	padding: 4px 3px;
}
	
.ui-disabled {
	opacity: .35;
	filter:Alpha(Opacity=35); /* support: IE8 */
	background-image: none;
}
.ui-overlay {
	position: fixed;
	top: 0;
	left: 0;
	width: 100%;
	height: 100%;
	background-color: rgba(0,0,0,0.5);
	opacity: .3;
	filter: Alpha(Opacity=30); /* support: IE8 */
}
 
.ui-jqgrid-pager .ui-pg-table .ui-pg-button:hover,
.ui-jqgrid-toppager .ui-pg-table .ui-pg-button:hover
{
	background-color: #ddd;
}
.ui-jqgrid-corner  {
	 border-radius: 5px
}
.ui-resizable-handle {
	//position: absolute;
	display: block;
	left :97%;
}
.ui-jqdialog .ui-resizable-se {
	width: 12px;
	height: 12px;
	right: -5px;
	bottom: -5px;
	background-position: 16px 16px;
}
.ui-resizable-se {
	cursor: se-resize;
	width: 12px;
	height: 12px;
	right: 1px;
	bottom: 1px;
}
.ui-top-corner {
	border-top-left-radius: 5px;
	border-top-right-radius: 5px;
}
.ui-bottom-corner {
	border-bottom-left-radius: 5px;
	border-bottom-right-radius: 5px;
}
.ui-search-table {
	margin-bottom: 0;
}
.ui-search-table .columns, .ui-search-table .operators {
	padding-right: 5px;
}
.opsel {
	float :left;
	width : 100px;
	margin-right : 5px;
}
.add-group, .add-rule, .delete-group {
	width: 14%;	
	margin-right : 5px;
}
.delete-rule {
	width : 15px;
}
ul.ui-search-menu, ul.ui-nav-menu {
	 list-style-type:  none;
}
ul.ui-search-menu li a, 
ul.ui-nav-menu li a,
.soptclass, 
.clearsearchclass {
	text-decoration: none;
	color : #010101;
}
ul.ui-search-menu li a:hover, ul.ui-nav-menu li a:hover, a.soptclass:hover, a.clearsearchclass:hover {
	background-color: #ddd;
	padding: 1px 1px;
	text-decoration: none;
}
ul.ui-search-menu li, ul.ui-nav-menu li {
	padding : 5px 5px;
}
.ui-menu-item hr {
	margin-bottom: 0px;
	margin-top:0px;
}
.searchFilter .ui-search-table td,
.searchFilter .ui-search-table th
{
	border-top: 0px none !important;
}
.searchFilter .queryresult {
	margin-bottom: 5px;
}
.searchFilter .queryresult tr td{
	border-top: 0px none;
}
.ui-search-label { 
	padding-left: 5px;
}
.frozen-div, .frozen-bdiv {
	background-color: #fff;
}
/*
.ui-jqgrid .ui-jqgrid-caption,
.ui-jqgrid .ui-jqgrid-pager,
.ui-jqgrid .ui-jqgrid-toppager,
.ui-jqgrid .ui-jqgrid-htable thead th,
.ui-jqgrid .ui-userdata-top,
.ui-jqgrid .ui-userdata-bottom,
.ui-jqgrid .ui-jqgrid-hdiv,
.ui-jqdialog .ui-jqdialog-titlebar
{
    background-image: none, linear-gradient(to bottom, #fff 0px, #e0e0e0 100%);
    background-repeat: repeat-x;
    border-color: #ccc;
    text-shadow: 0 1px 0 #fff;
}
*/

BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/jsTree/32px.png


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/jsTree/style.min.css


BIN
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/jsTree/throbber.gif


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/markdown/bootstrap-markdown.min.css


+ 2 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/morris/morris-0.4.3.min.css

@ -0,0 +1,2 @@
.morris-hover{position:absolute;z-index:1000;}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255, 255, 255, 0.8);border:solid 2px rgba(230, 230, 230, 0.8);font-family:sans-serif;font-size:12px;text-align:center;}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0;}
.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0;}

+ 165 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/nouslider/jquery.nouislider.css

@ -0,0 +1,165 @@
/* Functional styling;
 * These styles are required for noUiSlider to function.
 * You don't need to change these rules to apply your design.
 */
.noUi-target,
.noUi-target * {
-webkit-touch-callout: none;
-webkit-user-select: none;
-ms-touch-action: none;
-ms-user-select: none;
-moz-user-select: none;
-moz-box-sizing: border-box;
	box-sizing: border-box;
}
.noUi-base {
	width: 100%;
	height: 100%;
	position: relative;
}
.noUi-origin {
	position: absolute;
	right: 0;
	top: 0;
	left: 0;
	bottom: 0;
}
.noUi-handle {
	position: relative;
	z-index: 1;
}
.noUi-stacking .noUi-handle {
/* This class is applied to the lower origin when
   its values is > 50%. */
	z-index: 10;
}
.noUi-stacking + .noUi-origin {
/* Fix stacking order in IE7, which incorrectly
   creates a new context for the origins. */
	*z-index: -1;
}
.noUi-state-tap .noUi-origin {
-webkit-transition: left 0.3s, top 0.3s;
	transition: left 0.3s, top 0.3s;
}
.noUi-state-drag * {
	cursor: inherit !important;
}
/* Slider size and handle placement;
 */
.noUi-horizontal {
	height: 18px;
}
.noUi-horizontal .noUi-handle {
	width: 34px;
	height: 28px;
	left: -17px;
	top: -6px;
}
.noUi-horizontal.noUi-extended {
	padding: 0 15px;
}
.noUi-horizontal.noUi-extended .noUi-origin  {
	right: -15px;
}
.noUi-vertical {
	width: 18px;
}
.noUi-vertical .noUi-handle {
	width: 28px;
	height: 34px;
	left: -6px;
	top: -17px;
}
.noUi-vertical.noUi-extended {
	padding: 15px 0;
}
.noUi-vertical.noUi-extended .noUi-origin  {
	bottom: -15px;
}
/* Styling;
 */
.noUi-background {
	background: #FAFAFA;
	box-shadow: inset 0 1px 1px #f0f0f0;
}
.noUi-connect {
	background: #3FB8AF;
	box-shadow: inset 0 0 3px rgba(51,51,51,0.45);
-webkit-transition: background 450ms;
	transition: background 450ms;
}
.noUi-origin {
	border-radius: 2px;
}
.noUi-target {
	border-radius: 4px;
	border: 1px solid #D3D3D3;
	box-shadow: inset 0 1px 1px #F0F0F0, 0 3px 6px -5px #BBB;
}
.noUi-target.noUi-connect {
	box-shadow: inset 0 0 3px rgba(51,51,51,0.45), 0 3px 6px -5px #BBB;
}
/* Handles and cursors;
 */
.noUi-dragable {
	cursor: w-resize;
}
.noUi-vertical .noUi-dragable {
	cursor: n-resize;
}
.noUi-handle {
	border: 1px solid #D9D9D9;
	border-radius: 3px;
	background: #FFF;
	cursor: default;
	box-shadow: inset 0 0 1px #FFF,
				inset 0 1px 7px #EBEBEB,
				0 3px 6px -3px #BBB;
}
.noUi-active {
	box-shadow: inset 0 0 1px #FFF,
				inset 0 1px 7px #DDD,
				0 3px 6px -3px #BBB;
}
/* Handle stripes;
 */
.noUi-handle:before,
.noUi-handle:after {
	content: "";
	display: block;
	position: absolute;
	height: 14px;
	width: 1px;
	background: #E8E7E6;
	left: 14px;
	top: 6px;
}
.noUi-handle:after {
	left: 17px;
}
.noUi-vertical .noUi-handle:before,
.noUi-vertical .noUi-handle:after {
	width: 14px;
	height: 1px;
	left: 6px;
	top: 14px;
}
.noUi-vertical .noUi-handle:after {
	top: 17px;
}
/* Disabled state;
 */
[disabled].noUi-connect,
[disabled] .noUi-connect {
	background: #B8B8B8;
}
[disabled] .noUi-handle {
	cursor: not-allowed;
}

+ 620 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/simditor/simditor.css

@ -0,0 +1,620 @@
.simditor {
  position: relative;
  border: 1px solid #c9d8db;
}
.simditor .simditor-wrapper {
  position: relative;
  background: #ffffff;
  overflow: hidden;
}
.simditor .simditor-wrapper .simditor-placeholder {
  display: none;
  position: absolute;
  left: 0;
  z-index: 0;
  padding: 22px 15px;
  font-size: 16px;
  font-family: arial, sans-serif;
  line-height: 1.5;
  color: #999999;
  background: transparent;
}
.simditor .simditor-wrapper.toolbar-floating .simditor-toolbar {
  position: fixed;
  top: 0;
  z-index: 10;
  box-shadow: 0 0 6px rgba(0, 0, 0, 0.1);
}
.simditor .simditor-wrapper .simditor-image-loading {
  width: 100%;
  height: 100%;
  background: rgba(0, 0, 0, 0.4);
  position: absolute;
  top: 0;
  left: 0;
  z-index: 2;
}
.simditor .simditor-wrapper .simditor-image-loading span {
  width: 30px;
  height: 30px;
  background: #ffffff url(../../../img/loading-upload.gif) no-repeat center center;
  border-radius: 30px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -15px 0 0 -15px;
  box-shadow: 0 0 8px rgba(0, 0, 0, 0.4);
}
.simditor .simditor-wrapper .simditor-image-loading.uploading span {
  background: #ffffff;
  color: #333333;
  font-size: 14px;
  line-height: 30px;
  text-align: center;
}
.simditor .simditor-body {
  padding: 22px 15px 40px;
  min-height: 300px;
  outline: none;
  cursor: text;
  position: relative;
  z-index: 1;
  background: transparent;
}
.simditor .simditor-body a.selected {
  background: #b3d4fd;
}
.simditor .simditor-body a.simditor-mention {
  cursor: pointer;
}
.simditor .simditor-body .simditor-table {
  position: relative;
}
.simditor .simditor-body .simditor-table.resizing {
  cursor: col-resize;
}
.simditor .simditor-body .simditor-table .simditor-resize-handle {
  position: absolute;
  left: 0;
  top: 0;
  width: 10px;
  height: 100%;
  cursor: col-resize;
}
.simditor .simditor-body pre {
  /*min-height: 28px;*/
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  word-wrap: break-word !important;
  white-space: pre-wrap !important;
}
.simditor .simditor-body img {
  cursor: pointer;
}
.simditor .simditor-body img.selected {
  box-shadow: 0 0 0 4px #cccccc;
}
.simditor .simditor-paste-area,
.simditor .simditor-clean-paste-area {
  background: transparent;
  border: none;
  outline: none;
  resize: none;
  padding: 0;
  margin: 0;
}
.simditor .simditor-toolbar {
  border-bottom: 1px solid #eeeeee;
  background: #ffffff;
  width: 100%;
}
.simditor .simditor-toolbar > ul {
  margin: 0;
  padding: 0 0 0 6px;
  list-style: none;
}
.simditor .simditor-toolbar > ul:after {
  content: "";
  display: table;
  clear: both;
}
.simditor .simditor-toolbar > ul > li {
  position: relative;
  float: left;
}
.simditor .simditor-toolbar > ul > li > span.separator {
  display: block;
  float: left;
  background: #cfcfcf;
  width: 1px;
  height: 18px;
  margin: 11px 15px;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item {
  display: block;
  float: left;
  width: 50px;
  height: 40px;
  outline: none;
  color: #333333;
  font-size: 15px;
  line-height: 40px;
  text-align: center;
  text-decoration: none;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item span {
  opacity: 0.6;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item span.fa {
  display: inline;
  line-height: normal;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item:hover span {
  opacity: 1;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.active {
  background: #eeeeee;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.active span {
  opacity: 1;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.disabled {
  cursor: default;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.disabled span {
  opacity: 0.3;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title span:before {
  content: "T";
  font-size: 19px;
  font-weight: bold;
  font-family: 'Times New Roman';
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h1 span:before {
  content: 'H1';
  font-size: 18px;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h2 span:before {
  content: 'H2';
  font-size: 18px;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-title.active-h3 span:before {
  content: 'H3';
  font-size: 18px;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color {
  font-size: 14px;
  position: relative;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color span:before {
  position: relative;
  top: -2px;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color:after {
  content: '';
  display: block;
  width: 14px;
  height: 4px;
  background: #cccccc;
  position: absolute;
  top: 26px;
  left: 50%;
  margin: 0 0 0 -7px;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color:hover:after {
  background: #999999;
}
.simditor .simditor-toolbar > ul > li > .toolbar-item.toolbar-item-color.disabled:after {
  background: #dfdfdf;
}
.simditor .simditor-toolbar > ul > li.menu-on .toolbar-item {
  position: relative;
  z-index: 21;
  background: #ffffff;
  box-shadow: 0 -3px 3px rgba(0, 0, 0, 0.2);
}
.simditor .simditor-toolbar > ul > li.menu-on .toolbar-item span {
  opacity: 1;
}
.simditor .simditor-toolbar > ul > li.menu-on .toolbar-item.toolbar-item-color:after {
  background: #999999;
}
.simditor .simditor-toolbar > ul > li.menu-on .toolbar-menu {
  display: block;
}
.simditor .simditor-toolbar .toolbar-menu {
  display: none;
  position: absolute;
  top: 40px;
  left: 0;
  z-index: 20;
  background: #ffffff;
  text-align: left;
  box-shadow: 0 0 3px rgba(0, 0, 0, 0.2);
}
.simditor .simditor-toolbar .toolbar-menu ul {
  min-width: 160px;
  list-style: none;
  margin: 0;
  padding: 10px 1px;
}
.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item {
  display: block;
  font-size: 16px;
  line-height: 2em;
  padding: 0 10px;
  text-decoration: none;
  color: #666666;
}
.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item:hover {
  background: #f6f6f6;
}
.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h1 {
  font-size: 24px;
  color: #333333;
}
.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h2 {
  font-size: 22px;
  color: #333333;
}
.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h3 {
  font-size: 20px;
  color: #333333;
}
.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h4 {
  font-size: 18px;
  color: #333333;
}
.simditor .simditor-toolbar .toolbar-menu ul > li .menu-item.menu-item-h5 {
  font-size: 16px;
  color: #333333;
}
.simditor .simditor-toolbar .toolbar-menu ul > li .separator {
  display: block;
  border-top: 1px solid #cccccc;
  height: 0;
  line-height: 0;
  font-size: 0;
  margin: 6px 0;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color {
  width: 96px;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list {
  height: 40px;
  margin: 10px 6px 6px 10px;
  padding: 0;
  min-width: 0;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li {
  float: left;
  margin: 0 4px 4px 0;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color {
  display: block;
  width: 16px;
  height: 16px;
  background: #dfdfdf;
  border-radius: 2px;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color:hover {
  opacity: 0.8;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color.font-color-default {
  background: #333333;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-1 {
  background: #E33737;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-2 {
  background: #e28b41;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-3 {
  background: #c8a732;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-4 {
  background: #209361;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-5 {
  background: #418caf;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-6 {
  background: #aa8773;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-color .color-list li .font-color-7 {
  background: #999999;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table {
  background: #ffffff;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table {
  border: none;
  border-collapse: collapse;
  border-spacing: 0;
  table-layout: fixed;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td {
  height: 16px;
  padding: 0;
  border: 2px solid #ffffff;
  background: #f3f3f3;
  cursor: pointer;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td:before {
  width: 16px;
  display: block;
  content: "";
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-create-table table td.selected {
  background: #cfcfcf;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table {
  display: none;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-table .menu-edit-table ul {
  min-width: 240px;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image {
  position: relative;
  overflow: hidden;
}
.simditor .simditor-toolbar .toolbar-menu.toolbar-menu-image .menu-item-upload-image input[type=file] {
  position: absolute;
  right: 0px;
  top: 0px;
  opacity: 0;
  font-size: 100px;
  cursor: pointer;
}
.simditor .simditor-popover {
  display: none;
  padding: 5px 8px 0;
  background: #ffffff;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.4);
  border-radius: 2px;
  position: absolute;
  z-index: 2;
}
.simditor .simditor-popover .settings-field {
  margin: 0 0 5px 0;
  font-size: 12px;
  height: 25px;
  line-height: 25px;
}
.simditor .simditor-popover .settings-field label {
  margin: 0 8px 0 0;
  float: left;
}
.simditor .simditor-popover .settings-field input[type=text] {
  float: left;
  width: 200px;
  box-sizing: border-box;
  font-size: 12px;
}
.simditor .simditor-popover .settings-field input[type=text].image-size {
  width: 87px;
}
.simditor .simditor-popover .settings-field .times {
  float: left;
  width: 26px;
  font-size: 12px;
  text-align: center;
}
.simditor .simditor-popover.link-popover .btn-unlink, .simditor .simditor-popover.image-popover .btn-upload, .simditor .simditor-popover.image-popover .btn-restore {
  float: left;
  margin: 0 0 0 8px;
  color: #333333;
  font-size: 14px;
  outline: 0;
}
.simditor .simditor-popover.link-popover .btn-unlink span, .simditor .simditor-popover.image-popover .btn-upload span, .simditor .simditor-popover.image-popover .btn-restore span {
  opacity: 0.6;
}
.simditor .simditor-popover.link-popover .btn-unlink:hover span, .simditor .simditor-popover.image-popover .btn-upload:hover span, .simditor .simditor-popover.image-popover .btn-restore:hover span {
  opacity: 1;
}
.simditor .simditor-popover.image-popover .btn-upload {
  position: relative;
  display: inline-block;
  overflow: hidden;
}
.simditor .simditor-popover.image-popover .btn-upload input[type=file] {
  position: absolute;
  right: 0px;
  top: 0px;
  opacity: 0;
  height: 100%;
  width: 28px;
}
.simditor.simditor-mobile .simditor-toolbar > ul > li > .toolbar-item {
  width: 46px;
}
.simditor.simditor-mobile .simditor-wrapper.toolbar-floating .simditor-toolbar {
  position: absolute;
  top: 0;
  z-index: 10;
  box-shadow: 0 0 6px rgba(0, 0, 0, 0.1);
}
.simditor .simditor-body, .editor-style {
  font-size: 16px;
  font-family: arial, sans-serif;
  line-height: 1.6;
  color: #333;
  outline: none;
  word-wrap: break-word;
}
.simditor .simditor-body > :first-child, .editor-style > :first-child {
  margin-top: 0 !important;
}
.simditor .simditor-body a, .editor-style a {
  color: #4298BA;
  text-decoration: none;
  word-break: break-all;
}
.simditor .simditor-body a:visited, .editor-style a:visited {
  color: #4298BA;
}
.simditor .simditor-body a:hover, .editor-style a:hover {
  color: #0F769F;
}
.simditor .simditor-body a:active, .editor-style a:active {
  color: #9E792E;
}
.simditor .simditor-body a:hover, .simditor .simditor-body a:active, .editor-style a:hover, .editor-style a:active {
  outline: 0;
}
.simditor .simditor-body h1, .simditor .simditor-body h2, .simditor .simditor-body h3, .simditor .simditor-body h4, .simditor .simditor-body h5, .simditor .simditor-body h6, .editor-style h1, .editor-style h2, .editor-style h3, .editor-style h4, .editor-style h5, .editor-style h6 {
  font-weight: normal;
  margin: 40px 0 20px;
  color: #000000;
}
.simditor .simditor-body h1, .editor-style h1 {
  font-size: 24px;
}
.simditor .simditor-body h2, .editor-style h2 {
  font-size: 22px;
}
.simditor .simditor-body h3, .editor-style h3 {
  font-size: 20px;
}
.simditor .simditor-body h4, .editor-style h4 {
  font-size: 18px;
}
.simditor .simditor-body h5, .editor-style h5 {
  font-size: 16px;
}
.simditor .simditor-body h6, .editor-style h6 {
  font-size: 16px;
}
.simditor .simditor-body p, .simditor .simditor-body div, .editor-style p, .editor-style div {
  word-wrap: break-word;
  margin: 0 0 15px 0;
  color: #333;
  word-wrap: break-word;
}
.simditor .simditor-body b, .simditor .simditor-body strong, .editor-style b, .editor-style strong {
  font-weight: bold;
}
.simditor .simditor-body i, .simditor .simditor-body em, .editor-style i, .editor-style em {
  font-style: italic;
}
.simditor .simditor-body u, .editor-style u {
  text-decoration: underline;
}
.simditor .simditor-body strike, .simditor .simditor-body del, .editor-style strike, .editor-style del {
  text-decoration: line-through;
}
.simditor .simditor-body ul, .simditor .simditor-body ol, .editor-style ul, .editor-style ol {
  list-style: disc outside none;
  margin: 15px 0;
  padding: 0 0 0 40px;
  line-height: 1.6;
}
.simditor .simditor-body ul ul, .simditor .simditor-body ul ol, .simditor .simditor-body ol ul, .simditor .simditor-body ol ol, .editor-style ul ul, .editor-style ul ol, .editor-style ol ul, .editor-style ol ol {
  padding-left: 30px;
}
.simditor .simditor-body ul ul, .simditor .simditor-body ol ul, .editor-style ul ul, .editor-style ol ul {
  list-style: circle outside none;
}
.simditor .simditor-body ul ul ul, .simditor .simditor-body ol ul ul, .editor-style ul ul ul, .editor-style ol ul ul {
  list-style: square outside none;
}
.simditor .simditor-body ol, .editor-style ol {
  list-style: decimal;
}
.simditor .simditor-body blockquote, .editor-style blockquote {
  border-left: 6px solid #ddd;
  padding: 5px 0 5px 10px;
  margin: 15px 0 15px 15px;
}
.simditor .simditor-body blockquote > :first-child, .editor-style blockquote > :first-child {
  margin-top: 0;
}
.simditor .simditor-body pre, .editor-style pre {
  padding: 10px 5px 10px 10px;
  margin: 15px 0;
  display: block;
  line-height: 18px;
  background: #F0F0F0;
  border-radius: 3px;
  font-size: 13px;
  font-family: 'monaco', 'Consolas', "Liberation Mono", Courier, monospace;
  overflow-x: auto;
  white-space: nowrap;
}
.simditor .simditor-body code, .editor-style code {
  display: inline-block;
  padding: 0 4px;
  margin: 0 5px;
  background: #eeeeee;
  border-radius: 3px;
  font-size: 13px;
  font-family: 'monaco', 'Consolas', "Liberation Mono", Courier, monospace;
}
.simditor .simditor-body hr, .editor-style hr {
  display: block;
  height: 0px;
  border: 0;
  border-top: 1px solid #ccc;
  margin: 15px 0;
  padding: 0;
}
.simditor .simditor-body table, .editor-style table {
  width: 100%;
  table-layout: fixed;
  border-collapse: collapse;
  border-spacing: 0;
  margin: 15px 0;
}
.simditor .simditor-body table thead, .editor-style table thead {
  background-color: #f9f9f9;
}
.simditor .simditor-body table td, .editor-style table td {
  min-width: 40px;
  height: 30px;
  border: 1px solid #ccc;
  vertical-align: top;
  padding: 2px 4px;
  box-sizing: border-box;
}
.simditor .simditor-body table td.active, .editor-style table td.active {
  background-color: #ffffee;
}
.simditor .simditor-body img, .editor-style img {
  margin: 0 5px;
  vertical-align: middle;
}
.simditor .simditor-body *[data-indent="0"], .editor-style *[data-indent="0"] {
  margin-left: 0px;
}
.simditor .simditor-body *[data-indent="1"], .editor-style *[data-indent="1"] {
  margin-left: 40px;
}
.simditor .simditor-body *[data-indent="2"], .editor-style *[data-indent="2"] {
  margin-left: 80px;
}
.simditor .simditor-body *[data-indent="3"], .editor-style *[data-indent="3"] {
  margin-left: 120px;
}
.simditor .simditor-body *[data-indent="4"], .editor-style *[data-indent="4"] {
  margin-left: 160px;
}
.simditor .simditor-body *[data-indent="5"], .editor-style *[data-indent="5"] {
  margin-left: 200px;
}
.simditor .simditor-body *[data-indent="6"], .editor-style *[data-indent="6"] {
  margin-left: 240px;
}
.simditor .simditor-body *[data-indent="7"], .editor-style *[data-indent="7"] {
  margin-left: 280px;
}
.simditor .simditor-body *[data-indent="8"], .editor-style *[data-indent="8"] {
  margin-left: 320px;
}
.simditor .simditor-body *[data-indent="9"], .editor-style *[data-indent="9"] {
  margin-left: 360px;
}
.simditor .simditor-body *[data-indent="10"], .editor-style *[data-indent="10"] {
  margin-left: 400px;
}

+ 380 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/steps/jquery.steps.css

@ -0,0 +1,380 @@
/*
    Common
*/
.wizard,
.tabcontrol
{
    display: block;
    width: 100%;
    overflow: hidden;
}
.wizard a,
.tabcontrol a
{
    outline: 0;
}
.wizard ul,
.tabcontrol ul
{
    list-style: none !important;
    padding: 0;
    margin: 0;
}
.wizard ul > li,
.tabcontrol ul > li
{
    display: block;
    padding: 0;
}
/* Accessibility */
.wizard > .steps .current-info,
.tabcontrol > .steps .current-info
{
    position: absolute;
    left: -999em;
}
.wizard > .content > .title,
.tabcontrol > .content > .title
{
    position: absolute;
    left: -999em;
}
/*
    Wizard
*/
.wizard > .steps
{
    position: relative;
    display: block;
    width: 100%;
}
.wizard.vertical > .steps
{
    display: inline;
    float: left;
    width: 30%;
}
.wizard > .steps > ul > li
{
    width: 25%;
}
.wizard > .steps > ul > li,
.wizard > .actions > ul > li
{
    float: left;
}
.wizard.vertical > .steps > ul > li
{
    float: none;
    width: 100%;
}
.wizard > .steps a,
.wizard > .steps a:hover,
.wizard > .steps a:active
{
    display: block;
    width: auto;
    margin: 0 0.5em 0.5em;
    padding: 8px;
    text-decoration: none;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
}
.wizard > .steps .disabled a,
.wizard > .steps .disabled a:hover,
.wizard > .steps .disabled a:active
{
    background: #eee;
    color: #aaa;
    cursor: default;
}
.wizard > .steps .current a,
.wizard > .steps .current a:hover,
.wizard > .steps .current a:active
{
    background: #1AB394;
    color: #fff;
    cursor: default;
}
.wizard > .steps .done a,
.wizard > .steps .done a:hover,
.wizard > .steps .done a:active
{
    background: #6fd1bd;
    color: #fff;
}
.wizard > .steps .error a,
.wizard > .steps .error a:hover,
.wizard > .steps .error a:active
{
    background: #ED5565 ;
    color: #fff;
}
.wizard > .content
{
    background: #eee;
    display: block;
    margin: 5px 5px 10px 5px;
    min-height: 120px;
    overflow: hidden;
    position: relative;
    width: auto;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
}
.wizard-big.wizard > .content {
    min-height: 320px;
}
.wizard.vertical > .content
{
    display: inline;
    float: left;
    margin: 0 2.5% 0.5em 2.5%;
    width: 65%;
}
.wizard > .content > .body
{
    float: left;
    position: absolute;
    width: 95%;
    height: 95%;
    padding: 2.5%;
}
.wizard > .content > .body ul
{
    list-style: disc !important;
}
.wizard > .content > .body ul > li
{
    display: list-item;
}
.wizard > .content > .body > iframe
{
    border: 0 none;
    width: 100%;
    height: 100%;
}
.wizard > .content > .body input
{
    display: block;
    border: 1px solid #ccc;
}
.wizard > .content > .body input[type="checkbox"]
{
    display: inline-block;
}
.wizard > .content > .body input.error
{
    background: rgb(251, 227, 228);
    border: 1px solid #fbc2c4;
    color: #8a1f11;
}
.wizard > .content > .body label
{
    display: inline-block;
    margin-bottom: 0.5em;
}
.wizard > .content > .body label.error
{
    color: #8a1f11;
    display: inline-block;
    margin-left: 1.5em;
}
.wizard > .actions
{
    position: relative;
    display: block;
    text-align: right;
    width: 100%;
}
.wizard.vertical > .actions
{
    display: inline;
    float: right;
    margin: 0 2.5%;
    width: 95%;
}
.wizard > .actions > ul
{
    display: inline-block;
    text-align: right;
}
.wizard > .actions > ul > li
{
    margin: 0 0.5em;
}
.wizard.vertical > .actions > ul > li
{
    margin: 0 0 0 1em;
}
.wizard > .actions a,
.wizard > .actions a:hover,
.wizard > .actions a:active
{
    background: #1AB394;
    color: #fff;
    display: block;
    padding: 0.5em 1em;
    text-decoration: none;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
}
.wizard > .actions .disabled a,
.wizard > .actions .disabled a:hover,
.wizard > .actions .disabled a:active
{
    background: #eee;
    color: #aaa;
}
.wizard > .loading
{
}
.wizard > .loading .spinner
{
}
/*
    Tabcontrol
*/
.tabcontrol > .steps
{
    position: relative;
    display: block;
    width: 100%;
}
.tabcontrol > .steps > ul
{
    position: relative;
    margin: 6px 0 0 0;
    top: 1px;
    z-index: 1;
}
.tabcontrol > .steps > ul > li
{
    float: left;
    margin: 5px 2px 0 0;
    padding: 1px;
    -webkit-border-top-left-radius: 5px;
    -webkit-border-top-right-radius: 5px;
    -moz-border-radius-topleft: 5px;
    -moz-border-radius-topright: 5px;
    border-top-left-radius: 5px;
    border-top-right-radius: 5px;
}
.tabcontrol > .steps > ul > li:hover
{
    background: #edecec;
    border: 1px solid #bbb;
    padding: 0;
}
.tabcontrol > .steps > ul > li.current
{
    background: #fff;
    border: 1px solid #bbb;
    border-bottom: 0 none;
    padding: 0 0 1px 0;
    margin-top: 0;
}
.tabcontrol > .steps > ul > li > a
{
    color: #5f5f5f;
    display: inline-block;
    border: 0 none;
    margin: 0;
    padding: 10px 30px;
    text-decoration: none;
}
.tabcontrol > .steps > ul > li > a:hover
{
    text-decoration: none;
}
.tabcontrol > .steps > ul > li.current > a
{
    padding: 15px 30px 10px 30px;
}
.tabcontrol > .content
{
    position: relative;
    display: inline-block;
    width: 100%;
    height: 35em;
    overflow: hidden;
    border-top: 1px solid #bbb;
    padding-top: 20px;
}
.tabcontrol > .content > .body
{
    float: left;
    position: absolute;
    width: 95%;
    height: 95%;
    padding: 2.5%;
}
.tabcontrol > .content > .body ul
{
    list-style: disc !important;
}
.tabcontrol > .content > .body ul > li
{
    display: list-item;
}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 5970 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/summernote/summernote-bs3.css


+ 446 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/summernote/summernote.css

@ -0,0 +1,446 @@
.note-editor {
    height: 300px;
}
.note-editor .note-dropzone {
    position: absolute;
    z-index: 1;
    display: none;
    color: #87cefa;
    background-color: white;
    border: 2px dashed #87cefa;
    opacity: .95;
    pointer-event: none
}
.note-editor .note-dropzone .note-dropzone-message {
    display: table-cell;
    font-size: 28px;
    font-weight: bold;
    text-align: center;
    vertical-align: middle
}
.note-editor .note-dropzone.hover {
    color: #098ddf;
    border: 2px dashed #098ddf
}
.note-editor.dragover .note-dropzone {
    display: table
}
.note-editor.fullscreen {
    position: fixed;
    top: 0;
    left: 0;
    z-index: 1050;
    width: 100%
}
.note-editor.fullscreen .note-editable {
    background-color: white
}
.note-editor.fullscreen .note-resizebar {
    display: none
}
.note-editor.codeview .note-editable {
    display: none
}
.note-editor.codeview .note-codable {
    display: block
}
.note-editor .note-toolbar {
    padding-bottom: 5px;
    padding-left: 10px;
    padding-top: 5px;
    margin: 0;
    background-color: #f5f5f5;
    border-bottom: 1px solid #E7EAEC
}
.note-editor .note-toolbar > .btn-group {
    margin-top: 5px;
    margin-right: 5px;
    margin-left: 0
}
.note-editor .note-toolbar .note-table .dropdown-menu {
    min-width: 0;
    padding: 5px
}
.note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker {
    font-size: 18px
}
.note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-mousecatcher {
    position: absolute !important;
    z-index: 3;
    width: 10em;
    height: 10em;
    cursor: pointer
}
.note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-unhighlighted {
    position: relative !important;
    z-index: 1;
    width: 5em;
    height: 5em;
    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat
}
.note-editor .note-toolbar .note-table .dropdown-menu .note-dimension-picker .note-dimension-picker-highlighted {
    position: absolute !important;
    z-index: 2;
    width: 1em;
    height: 1em;
    background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC') repeat
}
.note-editor .note-toolbar .note-style h1, .note-editor .note-toolbar .note-style h2, .note-editor .note-toolbar .note-style h3, .note-editor .note-toolbar .note-style h4, .note-editor .note-toolbar .note-style h5, .note-editor .note-toolbar .note-style h6, .note-editor .note-toolbar .note-style blockquote {
    margin: 0
}
.note-editor .note-toolbar .note-color .dropdown-toggle {
    width: 20px;
    padding-left: 5px
}
.note-editor .note-toolbar .note-color .dropdown-menu {
    min-width: 290px
}
.note-editor .note-toolbar .note-color .dropdown-menu .btn-group {
    margin: 0
}
.note-editor .note-toolbar .note-color .dropdown-menu .btn-group:first-child {
    margin: 0 5px
}
.note-editor .note-toolbar .note-color .dropdown-menu .btn-group .note-palette-title {
    margin: 2px 7px;
    font-size: 12px;
    text-align: center;
    border-bottom: 1px solid #eee
}
.note-editor .note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset {
    padding: 0 3px;
    margin: 5px;
    font-size: 12px;
    cursor: pointer;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px
}
.note-editor .note-toolbar .note-color .dropdown-menu .btn-group .note-color-reset:hover {
    background: #eee
}
.note-editor .note-toolbar .note-para .dropdown-menu {
    min-width: 216px;
    padding: 5px
}
.note-editor .note-toolbar .note-para .dropdown-menu > div:first-child {
    margin-right: 5px
}
.note-editor .note-statusbar {
    background-color: #f5f5f5
}
.note-editor .note-statusbar .note-resizebar {
    width: 100%;
    height: 8px;
    cursor: s-resize;
    border-top: 1px solid #a9a9a9
}
.note-editor .note-statusbar .note-resizebar .note-icon-bar {
    width: 20px;
    margin: 1px auto;
    border-top: 1px solid #a9a9a9
}
.note-editor .note-popover .popover {
    max-width: none
}
.note-editor .note-popover .popover .popover-content {
    padding: 5px
}
.note-editor .note-popover .popover .popover-content a {
    display: inline-block;
    max-width: 200px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    vertical-align: middle
}
.note-editor .note-popover .popover .popover-content .btn-group + .btn-group {
    margin-left: 5px
}
.note-editor .note-popover .popover .arrow {
    left: 20px
}
.note-editor .note-handle .note-control-selection {
    position: absolute;
    display: none;
    border: 1px solid black
}
.note-editor .note-handle .note-control-selection > div {
    position: absolute
}
.note-editor .note-handle .note-control-selection .note-control-selection-bg {
    width: 100%;
    height: 100%;
    background-color: black;
    -webkit-opacity: .3;
    -khtml-opacity: .3;
    -moz-opacity: .3;
    opacity: .3;
    -ms-filter: alpha(opacity=30);
    filter: alpha(opacity=30)
}
.note-editor .note-handle .note-control-selection .note-control-handle {
    width: 7px;
    height: 7px;
    border: 1px solid black
}
.note-editor .note-handle .note-control-selection .note-control-holder {
    width: 7px;
    height: 7px;
    border: 1px solid black
}
.note-editor .note-handle .note-control-selection .note-control-sizing {
    width: 7px;
    height: 7px;
    background-color: white;
    border: 1px solid black
}
.note-editor .note-handle .note-control-selection .note-control-nw {
    top: -5px;
    left: -5px;
    border-right: 0;
    border-bottom: 0
}
.note-editor .note-handle .note-control-selection .note-control-ne {
    top: -5px;
    right: -5px;
    border-bottom: 0;
    border-left: none
}
.note-editor .note-handle .note-control-selection .note-control-sw {
    bottom: -5px;
    left: -5px;
    border-top: 0;
    border-right: 0
}
.note-editor .note-handle .note-control-selection .note-control-se {
    right: -5px;
    bottom: -5px;
    cursor: se-resize
}
.note-editor .note-handle .note-control-selection .note-control-selection-info {
    right: 0;
    bottom: 0;
    padding: 5px;
    margin: 5px;
    font-size: 12px;
    color: white;
    background-color: black;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
    -webkit-opacity: .7;
    -khtml-opacity: .7;
    -moz-opacity: .7;
    opacity: .7;
    -ms-filter: alpha(opacity=70);
    filter: alpha(opacity=70)
}
.note-editor .note-dialog > div {
    display: none
}
.note-editor .note-dialog .note-image-dialog .note-dropzone {
    min-height: 100px;
    margin-bottom: 10px;
    font-size: 30px;
    line-height: 4;
    color: lightgray;
    text-align: center;
    border: 4px dashed lightgray
}
.note-editor .note-dialog .note-help-dialog {
    font-size: 12px;
    color: #ccc;
    background: transparent;
    background-color: #222 !important;
    border: 0;
    -webkit-opacity: .9;
    -khtml-opacity: .9;
    -moz-opacity: .9;
    opacity: .9;
    -ms-filter: alpha(opacity=90);
    filter: alpha(opacity=90)
}
.note-editor .note-dialog .note-help-dialog .modal-content {
    background: transparent;
    border: 1px solid white;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
    -webkit-box-shadow: none;
    -moz-box-shadow: none;
    box-shadow: none
}
.note-editor .note-dialog .note-help-dialog a {
    font-size: 12px;
    color: white
}
.note-editor .note-dialog .note-help-dialog .title {
    padding-bottom: 5px;
    font-size: 14px;
    font-weight: bold;
    color: white;
    border-bottom: white 1px solid
}
.note-editor .note-dialog .note-help-dialog .modal-close {
    font-size: 14px;
    color: #dd0;
    cursor: pointer
}
.note-editor .note-dialog .note-help-dialog .note-shortcut-layout {
    width: 100%
}
.note-editor .note-dialog .note-help-dialog .note-shortcut-layout td {
    vertical-align: top
}
.note-editor .note-dialog .note-help-dialog .note-shortcut {
    margin-top: 8px
}
.note-editor .note-dialog .note-help-dialog .note-shortcut th {
    font-size: 13px;
    color: #dd0;
    text-align: left
}
.note-editor .note-dialog .note-help-dialog .note-shortcut td:first-child {
    min-width: 110px;
    padding-right: 10px;
    font-family: "Courier New";
    color: #dd0;
    text-align: right
}
.note-editor .note-editable {
    padding: 20px;
    overflow: auto;
    outline: 0
}
.note-editor .note-editable[contenteditable="false"] {
    background-color: #e5e5e5
}
.note-editor .note-codable {
    display: none;
    width: 100%;
    padding: 10px;
    margin-bottom: 0;
    font-family: Menlo, Monaco, monospace, sans-serif;
    font-size: 14px;
    color: #ccc;
    background-color: #222;
    border: 0;
    -webkit-border-radius: 0;
    -moz-border-radius: 0;
    border-radius: 0;
    box-shadow: none;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    -ms-box-sizing: border-box;
    box-sizing: border-box;
    resize: none
}
.note-editor .dropdown-menu {
    min-width: 90px
}
.note-editor .dropdown-menu.right {
    right: 0;
    left: auto
}
.note-editor .dropdown-menu.right::before {
    right: 9px;
    left: auto !important
}
.note-editor .dropdown-menu.right::after {
    right: 10px;
    left: auto !important
}
.note-editor .dropdown-menu li a i {
    color: deepskyblue;
    visibility: hidden
}
.note-editor .dropdown-menu li a.checked i {
    visibility: visible
}
.note-editor .note-fontsize-10 {
    font-size: 10px
}
.note-editor .note-color-palette {
    line-height: 1
}
.note-editor .note-color-palette div .note-color-btn {
    width: 17px;
    height: 17px;
    padding: 0;
    margin: 0;
    border: 1px solid #fff
}
.note-editor .note-color-palette div .note-color-btn:hover {
    border: 1px solid #000
}

+ 715 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/sweetalert/sweetalert.css

@ -0,0 +1,715 @@
body.stop-scrolling {
  height: 100%;
  overflow: hidden; }
.sweet-overlay {
  background-color: black;
  /* IE8 */
  -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)";
  /* IE8 */
  background-color: rgba(0, 0, 0, 0.4);
  position: fixed;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  display: none;
  z-index: 10000; }
.sweet-alert {
  background-color: white;
  font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  width: 478px;
  padding: 17px;
  border-radius: 5px;
  text-align: center;
  position: fixed;
  left: 50%;
  top: 50%;
  margin-left: -256px;
  margin-top: -200px;
  overflow: hidden;
  display: none;
  z-index: 99999; }
  @media all and (max-width: 540px) {
    .sweet-alert {
      width: auto;
      margin-left: 0;
      margin-right: 0;
      left: 15px;
      right: 15px; } }
  .sweet-alert h2 {
    color: #575757;
    font-size: 30px;
    text-align: center;
    font-weight: 600;
    text-transform: none;
    position: relative;
    margin: 25px 0;
    padding: 0;
    line-height: 40px;
    display: block; }
  .sweet-alert p {
    color: #797979;
    font-size: 16px;
    text-align: center;
    font-weight: 300;
    position: relative;
    text-align: inherit;
    float: none;
    margin: 0;
    padding: 0;
    line-height: normal; }
  .sweet-alert fieldset {
    border: none;
    position: relative; }
  .sweet-alert .sa-error-container {
    background-color: #f1f1f1;
    margin-left: -17px;
    margin-right: -17px;
    overflow: hidden;
    padding: 0 10px;
    max-height: 0;
    webkit-transition: padding 0.15s, max-height 0.15s;
    transition: padding 0.15s, max-height 0.15s; }
    .sweet-alert .sa-error-container.show {
      padding: 10px 0;
      max-height: 100px;
      webkit-transition: padding 0.2s, max-height 0.2s;
      transition: padding 0.25s, max-height 0.25s; }
    .sweet-alert .sa-error-container .icon {
      display: inline-block;
      width: 24px;
      height: 24px;
      border-radius: 50%;
      background-color: #ea7d7d;
      color: white;
      line-height: 24px;
      text-align: center;
      margin-right: 3px; }
    .sweet-alert .sa-error-container p {
      display: inline-block; }
  .sweet-alert .sa-input-error {
    position: absolute;
    top: 29px;
    right: 26px;
    width: 20px;
    height: 20px;
    opacity: 0;
    -webkit-transform: scale(0.5);
    transform: scale(0.5);
    -webkit-transform-origin: 50% 50%;
    transform-origin: 50% 50%;
    -webkit-transition: all 0.1s;
    transition: all 0.1s; }
    .sweet-alert .sa-input-error::before, .sweet-alert .sa-input-error::after {
      content: "";
      width: 20px;
      height: 6px;
      background-color: #f06e57;
      border-radius: 3px;
      position: absolute;
      top: 50%;
      margin-top: -4px;
      left: 50%;
      margin-left: -9px; }
    .sweet-alert .sa-input-error::before {
      -webkit-transform: rotate(-45deg);
      transform: rotate(-45deg); }
    .sweet-alert .sa-input-error::after {
      -webkit-transform: rotate(45deg);
      transform: rotate(45deg); }
    .sweet-alert .sa-input-error.show {
      opacity: 1;
      -webkit-transform: scale(1);
      transform: scale(1); }
  .sweet-alert input {
    width: 100%;
    box-sizing: border-box;
    border-radius: 3px;
    border: 1px solid #d7d7d7;
    height: 43px;
    margin-top: 10px;
    margin-bottom: 17px;
    font-size: 18px;
    box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.06);
    padding: 0 12px;
    display: none;
    -webkit-transition: all 0.3s;
    transition: all 0.3s; }
    .sweet-alert input:focus {
      outline: none;
      box-shadow: 0px 0px 3px #c4e6f5;
      border: 1px solid #b4dbed; }
      .sweet-alert input:focus::-moz-placeholder {
        transition: opacity 0.3s 0.03s ease;
        opacity: 0.5; }
      .sweet-alert input:focus:-ms-input-placeholder {
        transition: opacity 0.3s 0.03s ease;
        opacity: 0.5; }
      .sweet-alert input:focus::-webkit-input-placeholder {
        transition: opacity 0.3s 0.03s ease;
        opacity: 0.5; }
    .sweet-alert input::-moz-placeholder {
      color: #bdbdbd; }
    .sweet-alert input:-ms-input-placeholder {
      color: #bdbdbd; }
    .sweet-alert input::-webkit-input-placeholder {
      color: #bdbdbd; }
  .sweet-alert.show-input input {
    display: block; }
  .sweet-alert button {
    background-color: #AEDEF4;
    color: white;
    border: none;
    box-shadow: none;
    font-size: 17px;
    font-weight: 500;
    -webkit-border-radius: 4px;
    border-radius: 5px;
    padding: 10px 32px;
    margin: 26px 5px 0 5px;
    cursor: pointer; }
    .sweet-alert button:focus {
      outline: none;
      box-shadow: 0 0 2px rgba(128, 179, 235, 0.5), inset 0 0 0 1px rgba(0, 0, 0, 0.05); }
    .sweet-alert button:hover {
      background-color: #a1d9f2; }
    .sweet-alert button:active {
      background-color: #81ccee; }
    .sweet-alert button.cancel {
      background-color: #D0D0D0; }
      .sweet-alert button.cancel:hover {
        background-color: #c8c8c8; }
      .sweet-alert button.cancel:active {
        background-color: #b6b6b6; }
      .sweet-alert button.cancel:focus {
        box-shadow: rgba(197, 205, 211, 0.8) 0px 0px 2px, rgba(0, 0, 0, 0.0470588) 0px 0px 0px 1px inset !important; }
    .sweet-alert button::-moz-focus-inner {
      border: 0; }
  .sweet-alert[data-has-cancel-button=false] button {
    box-shadow: none !important; }
  .sweet-alert[data-has-confirm-button=false][data-has-cancel-button=false] {
    padding-bottom: 40px; }
  .sweet-alert .sa-icon {
    width: 80px;
    height: 80px;
    border: 4px solid gray;
    -webkit-border-radius: 40px;
    border-radius: 40px;
    border-radius: 50%;
    margin: 20px auto;
    padding: 0;
    position: relative;
    box-sizing: content-box; }
    .sweet-alert .sa-icon.sa-error {
      border-color: #F27474; }
      .sweet-alert .sa-icon.sa-error .sa-x-mark {
        position: relative;
        display: block; }
      .sweet-alert .sa-icon.sa-error .sa-line {
        position: absolute;
        height: 5px;
        width: 47px;
        background-color: #F27474;
        display: block;
        top: 37px;
        border-radius: 2px; }
        .sweet-alert .sa-icon.sa-error .sa-line.sa-left {
          -webkit-transform: rotate(45deg);
          transform: rotate(45deg);
          left: 17px; }
        .sweet-alert .sa-icon.sa-error .sa-line.sa-right {
          -webkit-transform: rotate(-45deg);
          transform: rotate(-45deg);
          right: 16px; }
    .sweet-alert .sa-icon.sa-warning {
      border-color: #F8BB86; }
      .sweet-alert .sa-icon.sa-warning .sa-body {
        position: absolute;
        width: 5px;
        height: 47px;
        left: 50%;
        top: 10px;
        -webkit-border-radius: 2px;
        border-radius: 2px;
        margin-left: -2px;
        background-color: #F8BB86; }
      .sweet-alert .sa-icon.sa-warning .sa-dot {
        position: absolute;
        width: 7px;
        height: 7px;
        -webkit-border-radius: 50%;
        border-radius: 50%;
        margin-left: -3px;
        left: 50%;
        bottom: 10px;
        background-color: #F8BB86; }
    .sweet-alert .sa-icon.sa-info {
      border-color: #C9DAE1; }
      .sweet-alert .sa-icon.sa-info::before {
        content: "";
        position: absolute;
        width: 5px;
        height: 29px;
        left: 50%;
        bottom: 17px;
        border-radius: 2px;
        margin-left: -2px;
        background-color: #C9DAE1; }
      .sweet-alert .sa-icon.sa-info::after {
        content: "";
        position: absolute;
        width: 7px;
        height: 7px;
        border-radius: 50%;
        margin-left: -3px;
        top: 19px;
        background-color: #C9DAE1; }
    .sweet-alert .sa-icon.sa-success {
      border-color: #A5DC86; }
      .sweet-alert .sa-icon.sa-success::before, .sweet-alert .sa-icon.sa-success::after {
        content: '';
        -webkit-border-radius: 40px;
        border-radius: 40px;
        border-radius: 50%;
        position: absolute;
        width: 60px;
        height: 120px;
        background: white;
        -webkit-transform: rotate(45deg);
        transform: rotate(45deg); }
      .sweet-alert .sa-icon.sa-success::before {
        -webkit-border-radius: 120px 0 0 120px;
        border-radius: 120px 0 0 120px;
        top: -7px;
        left: -33px;
        -webkit-transform: rotate(-45deg);
        transform: rotate(-45deg);
        -webkit-transform-origin: 60px 60px;
        transform-origin: 60px 60px; }
      .sweet-alert .sa-icon.sa-success::after {
        -webkit-border-radius: 0 120px 120px 0;
        border-radius: 0 120px 120px 0;
        top: -11px;
        left: 30px;
        -webkit-transform: rotate(-45deg);
        transform: rotate(-45deg);
        -webkit-transform-origin: 0px 60px;
        transform-origin: 0px 60px; }
      .sweet-alert .sa-icon.sa-success .sa-placeholder {
        width: 80px;
        height: 80px;
        border: 4px solid rgba(165, 220, 134, 0.2);
        -webkit-border-radius: 40px;
        border-radius: 40px;
        border-radius: 50%;
        box-sizing: content-box;
        position: absolute;
        left: -4px;
        top: -4px;
        z-index: 2; }
      .sweet-alert .sa-icon.sa-success .sa-fix {
        width: 5px;
        height: 90px;
        background-color: white;
        position: absolute;
        left: 28px;
        top: 8px;
        z-index: 1;
        -webkit-transform: rotate(-45deg);
        transform: rotate(-45deg); }
      .sweet-alert .sa-icon.sa-success .sa-line {
        height: 5px;
        background-color: #A5DC86;
        display: block;
        border-radius: 2px;
        position: absolute;
        z-index: 2; }
        .sweet-alert .sa-icon.sa-success .sa-line.sa-tip {
          width: 25px;
          left: 14px;
          top: 46px;
          -webkit-transform: rotate(45deg);
          transform: rotate(45deg); }
        .sweet-alert .sa-icon.sa-success .sa-line.sa-long {
          width: 47px;
          right: 8px;
          top: 38px;
          -webkit-transform: rotate(-45deg);
          transform: rotate(-45deg); }
    .sweet-alert .sa-icon.sa-custom {
      background-size: contain;
      border-radius: 0;
      border: none;
      background-position: center center;
      background-repeat: no-repeat; }
/*
 * Animations
 */
@-webkit-keyframes showSweetAlert {
  0% {
    transform: scale(0.7);
    -webkit-transform: scale(0.7); }
  45% {
    transform: scale(1.05);
    -webkit-transform: scale(1.05); }
  80% {
    transform: scale(0.95);
    -webkit-transform: scale(0.95); }
  100% {
    transform: scale(1);
    -webkit-transform: scale(1); } }
@keyframes showSweetAlert {
  0% {
    transform: scale(0.7);
    -webkit-transform: scale(0.7); }
  45% {
    transform: scale(1.05);
    -webkit-transform: scale(1.05); }
  80% {
    transform: scale(0.95);
    -webkit-transform: scale(0.95); }
  100% {
    transform: scale(1);
    -webkit-transform: scale(1); } }
@-webkit-keyframes hideSweetAlert {
  0% {
    transform: scale(1);
    -webkit-transform: scale(1); }
  100% {
    transform: scale(0.5);
    -webkit-transform: scale(0.5); } }
@keyframes hideSweetAlert {
  0% {
    transform: scale(1);
    -webkit-transform: scale(1); }
  100% {
    transform: scale(0.5);
    -webkit-transform: scale(0.5); } }
@-webkit-keyframes slideFromTop {
  0% {
    top: 0%; }
  100% {
    top: 50%; } }
@keyframes slideFromTop {
  0% {
    top: 0%; }
  100% {
    top: 50%; } }
@-webkit-keyframes slideToTop {
  0% {
    top: 50%; }
  100% {
    top: 0%; } }
@keyframes slideToTop {
  0% {
    top: 50%; }
  100% {
    top: 0%; } }
@-webkit-keyframes slideFromBottom {
  0% {
    top: 70%; }
  100% {
    top: 50%; } }
@keyframes slideFromBottom {
  0% {
    top: 70%; }
  100% {
    top: 50%; } }
@-webkit-keyframes slideToBottom {
  0% {
    top: 50%; }
  100% {
    top: 70%; } }
@keyframes slideToBottom {
  0% {
    top: 50%; }
  100% {
    top: 70%; } }
.showSweetAlert[data-animation=pop] {
  -webkit-animation: showSweetAlert 0.3s;
  animation: showSweetAlert 0.3s; }
.showSweetAlert[data-animation=none] {
  -webkit-animation: none;
  animation: none; }
.showSweetAlert[data-animation=slide-from-top] {
  -webkit-animation: slideFromTop 0.3s;
  animation: slideFromTop 0.3s; }
.showSweetAlert[data-animation=slide-from-bottom] {
  -webkit-animation: slideFromBottom 0.3s;
  animation: slideFromBottom 0.3s; }
.hideSweetAlert[data-animation=pop] {
  -webkit-animation: hideSweetAlert 0.2s;
  animation: hideSweetAlert 0.2s; }
.hideSweetAlert[data-animation=none] {
  -webkit-animation: none;
  animation: none; }
.hideSweetAlert[data-animation=slide-from-top] {
  -webkit-animation: slideToTop 0.4s;
  animation: slideToTop 0.4s; }
.hideSweetAlert[data-animation=slide-from-bottom] {
  -webkit-animation: slideToBottom 0.3s;
  animation: slideToBottom 0.3s; }
@-webkit-keyframes animateSuccessTip {
  0% {
    width: 0;
    left: 1px;
    top: 19px; }
  54% {
    width: 0;
    left: 1px;
    top: 19px; }
  70% {
    width: 50px;
    left: -8px;
    top: 37px; }
  84% {
    width: 17px;
    left: 21px;
    top: 48px; }
  100% {
    width: 25px;
    left: 14px;
    top: 45px; } }
@keyframes animateSuccessTip {
  0% {
    width: 0;
    left: 1px;
    top: 19px; }
  54% {
    width: 0;
    left: 1px;
    top: 19px; }
  70% {
    width: 50px;
    left: -8px;
    top: 37px; }
  84% {
    width: 17px;
    left: 21px;
    top: 48px; }
  100% {
    width: 25px;
    left: 14px;
    top: 45px; } }
@-webkit-keyframes animateSuccessLong {
  0% {
    width: 0;
    right: 46px;
    top: 54px; }
  65% {
    width: 0;
    right: 46px;
    top: 54px; }
  84% {
    width: 55px;
    right: 0px;
    top: 35px; }
  100% {
    width: 47px;
    right: 8px;
    top: 38px; } }
@keyframes animateSuccessLong {
  0% {
    width: 0;
    right: 46px;
    top: 54px; }
  65% {
    width: 0;
    right: 46px;
    top: 54px; }
  84% {
    width: 55px;
    right: 0px;
    top: 35px; }
  100% {
    width: 47px;
    right: 8px;
    top: 38px; } }
@-webkit-keyframes rotatePlaceholder {
  0% {
    transform: rotate(-45deg);
    -webkit-transform: rotate(-45deg); }
  5% {
    transform: rotate(-45deg);
    -webkit-transform: rotate(-45deg); }
  12% {
    transform: rotate(-405deg);
    -webkit-transform: rotate(-405deg); }
  100% {
    transform: rotate(-405deg);
    -webkit-transform: rotate(-405deg); } }
@keyframes rotatePlaceholder {
  0% {
    transform: rotate(-45deg);
    -webkit-transform: rotate(-45deg); }
  5% {
    transform: rotate(-45deg);
    -webkit-transform: rotate(-45deg); }
  12% {
    transform: rotate(-405deg);
    -webkit-transform: rotate(-405deg); }
  100% {
    transform: rotate(-405deg);
    -webkit-transform: rotate(-405deg); } }
.animateSuccessTip {
  -webkit-animation: animateSuccessTip 0.75s;
  animation: animateSuccessTip 0.75s; }
.animateSuccessLong {
  -webkit-animation: animateSuccessLong 0.75s;
  animation: animateSuccessLong 0.75s; }
.sa-icon.sa-success.animate::after {
  -webkit-animation: rotatePlaceholder 4.25s ease-in;
  animation: rotatePlaceholder 4.25s ease-in; }
@-webkit-keyframes animateErrorIcon {
  0% {
    transform: rotateX(100deg);
    -webkit-transform: rotateX(100deg);
    opacity: 0; }
  100% {
    transform: rotateX(0deg);
    -webkit-transform: rotateX(0deg);
    opacity: 1; } }
@keyframes animateErrorIcon {
  0% {
    transform: rotateX(100deg);
    -webkit-transform: rotateX(100deg);
    opacity: 0; }
  100% {
    transform: rotateX(0deg);
    -webkit-transform: rotateX(0deg);
    opacity: 1; } }
.animateErrorIcon {
  -webkit-animation: animateErrorIcon 0.5s;
  animation: animateErrorIcon 0.5s; }
@-webkit-keyframes animateXMark {
  0% {
    transform: scale(0.4);
    -webkit-transform: scale(0.4);
    margin-top: 26px;
    opacity: 0; }
  50% {
    transform: scale(0.4);
    -webkit-transform: scale(0.4);
    margin-top: 26px;
    opacity: 0; }
  80% {
    transform: scale(1.15);
    -webkit-transform: scale(1.15);
    margin-top: -6px; }
  100% {
    transform: scale(1);
    -webkit-transform: scale(1);
    margin-top: 0;
    opacity: 1; } }
@keyframes animateXMark {
  0% {
    transform: scale(0.4);
    -webkit-transform: scale(0.4);
    margin-top: 26px;
    opacity: 0; }
  50% {
    transform: scale(0.4);
    -webkit-transform: scale(0.4);
    margin-top: 26px;
    opacity: 0; }
  80% {
    transform: scale(1.15);
    -webkit-transform: scale(1.15);
    margin-top: -6px; }
  100% {
    transform: scale(1);
    -webkit-transform: scale(1);
    margin-top: 0;
    opacity: 1; } }
.animateXMark {
  -webkit-animation: animateXMark 0.5s;
  animation: animateXMark 0.5s; }
@-webkit-keyframes pulseWarning {
  0% {
    border-color: #F8D486; }
  100% {
    border-color: #F8BB86; } }
@keyframes pulseWarning {
  0% {
    border-color: #F8D486; }
  100% {
    border-color: #F8BB86; } }
.pulseWarning {
  -webkit-animation: pulseWarning 0.75s infinite alternate;
  animation: pulseWarning 0.75s infinite alternate; }
@-webkit-keyframes pulseWarningIns {
  0% {
    background-color: #F8D486; }
  100% {
    background-color: #F8BB86; } }
@keyframes pulseWarningIns {
  0% {
    background-color: #F8D486; }
  100% {
    background-color: #F8BB86; } }
.pulseWarningIns {
  -webkit-animation: pulseWarningIns 0.75s infinite alternate;
  animation: pulseWarningIns 0.75s infinite alternate; }
/* Internet Explorer 9 has some special quirks that are fixed here */
/* The icons are not animated. */
/* This file is automatically merged into sweet-alert.min.js through Gulp */
/* Error icon */
.sweet-alert .sa-icon.sa-error .sa-line.sa-left {
  -ms-transform: rotate(45deg) \9; }
.sweet-alert .sa-icon.sa-error .sa-line.sa-right {
  -ms-transform: rotate(-45deg) \9; }
/* Success icon */
.sweet-alert .sa-icon.sa-success {
  border-color: transparent\9; }
.sweet-alert .sa-icon.sa-success .sa-line.sa-tip {
  -ms-transform: rotate(45deg) \9; }
.sweet-alert .sa-icon.sa-success .sa-line.sa-long {
  -ms-transform: rotate(-45deg) \9; }

+ 32 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/switchery/switchery.css

@ -0,0 +1,32 @@
/*
 *
 * Main stylesheet for Switchery.
 * http://abpetkov.github.io/switchery/
 *
 */
.switchery {
    background-color: #fff;
    border: 1px solid #dfdfdf;
    border-radius: 20px;
    cursor: pointer;
    display: inline-block;
    height: 30px;
    position: relative;
    vertical-align: middle;
    width: 50px;
    -webkit-box-sizing: content-box;
    -moz-box-sizing: content-box;
    box-sizing: content-box;
}
.switchery > small {
    background: #fff;
    border-radius: 100%;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
    height: 30px;
    position: absolute;
    top: 0;
    width: 30px;
}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 222 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/toastr/toastr.min.css


+ 0 - 0
admin/admin-server-ui-starter/src/main/resources/admin/common/css/bootstrap/plugins/treeview/bootstrap-treeview.css


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio