xueli.xue 10 years ago
parent
commit
65243e7649
100 changed files with 17163 additions and 8 deletions
  1. 2 1
      xxl-job-admin/pom.xml
  2. 19 6
      xxl-job-admin/src/main/java/com/xxl/controller/IndexController.java
  3. 7 0
      xxl-job-admin/src/main/java/com/xxl/quartz/DynamicSchedulerUtil.java
  4. 2 1
      xxl-job-admin/src/main/resources/springmvc-context.xml
  5. 1 0
      xxl-job-admin/src/main/webapp/500.html
  6. 39 0
      xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.exception.ftl
  7. 328 0
      xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl
  8. 1 0
      xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.result.ftl
  9. 53 0
      xxl-job-admin/src/main/webapp/WEB-INF/template/job/help.ftl
  10. 49 0
      xxl-job-admin/src/main/webapp/WEB-INF/template/job/index.ftl
  11. 8 0
      xxl-job-admin/src/main/webapp/WEB-INF/web.xml
  12. 10 0
      xxl-job-admin/src/main/webapp/static/.gitignore
  13. 17 0
      xxl-job-admin/src/main/webapp/static/.jshintrc
  14. 6800 0
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/css/bootstrap.css
  15. 1 0
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/css/bootstrap.css.map
  16. 5 0
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/css/bootstrap.min.css
  17. BIN
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.eot
  18. 288 0
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.svg
  19. BIN
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.ttf
  20. BIN
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.woff
  21. BIN
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.woff2
  22. 2317 0
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/js/bootstrap.js
  23. 7 0
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/js/bootstrap.min.js
  24. 13 0
      xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/js/npm.js
  25. 36 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins.less
  26. 14 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/alerts.less
  27. 9 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/background-variant.less
  28. 21 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/border-radius.less
  29. 68 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/buttons.less
  30. 7 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/center-block.less
  31. 22 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/clearfix.less
  32. 84 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/forms.less
  33. 59 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/gradients.less
  34. 102 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/grid-framework.less
  35. 134 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/grid.less
  36. 21 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/hide-text.less
  37. 25 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/image.less
  38. 12 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/labels.less
  39. 30 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/list-group.less
  40. 10 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/nav-divider.less
  41. 9 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/nav-vertical-align.less
  42. 8 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/opacity.less
  43. 24 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/pagination.less
  44. 24 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/panels.less
  45. 10 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/progress-bar.less
  46. 8 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/reset-filter.less
  47. 18 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/reset-text.less
  48. 6 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/resize.less
  49. 21 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/responsive-visibility.less
  50. 10 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/size.less
  51. 9 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/tab-focus.less
  52. 28 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/table-row.less
  53. 9 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/text-emphasis.less
  54. 8 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/text-overflow.less
  55. 254 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/vendor-prefixes.less
  56. 841 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/variables.less
  57. 23 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/.csslintrc
  58. 36 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/404_500_errors.less
  59. 61 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/AdminLTE.less
  60. 47 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/alerts.less
  61. 172 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/bootstrap-social.less
  62. 485 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/boxes.less
  63. 168 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/buttons.less
  64. 48 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/callout.less
  65. 18 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/carousel.less
  66. 289 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/control-sidebar.less
  67. 174 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/core.less
  68. 194 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/direct-chat.less
  69. 350 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/dropdown.less
  70. 96 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/forms.less
  71. 100 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/fullcalendar.less
  72. 248 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/header.less
  73. 75 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/info-box.less
  74. 16 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/invoice.less
  75. 28 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/labels.less
  76. 73 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/lockscreen.less
  77. 52 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/login_and_register.less
  78. 88 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/mailbox.less
  79. 606 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/miscellaneous.less
  80. 313 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/mixins.less
  81. 80 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/modal.less
  82. 226 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/navs.less
  83. 54 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/print.less
  84. 45 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/products.less
  85. 31 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/profile.less
  86. 111 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/progress-bars.less
  87. 117 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/select2.less
  88. 141 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/sidebar-mini.less
  89. 158 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/sidebar.less
  90. 13 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/_all-skins.less
  91. 64 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-black-light.less
  92. 64 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-black.less
  93. 61 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-blue-light.less
  94. 58 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-blue.less
  95. 55 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-green-light.less
  96. 55 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-green.less
  97. 54 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-purple-light.less
  98. 54 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-purple.less
  99. 54 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-red-light.less
  100. 0 0
      xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-red.less

+ 2 - 1
xxl-job-admin/pom.xml

@@ -128,12 +128,13 @@
 			<artifactId>quartz</artifactId>
 			<version>2.2.1</version>
 		</dependency>
-		<!-- xxl-mq-core -->
+		<!-- xxl-mq-core 
 		<dependency>
 			<groupId>com.xxl</groupId>
 			<artifactId>xxl-job-core</artifactId>
 			<version>0.0.1-SNAPSHOT</version>
 		</dependency>
+		-->
 
 	</dependencies>
 

+ 19 - 6
xxl-job-admin/src/main/java/com/xxl/controller/IndexController.java

@@ -1,16 +1,29 @@
 package com.xxl.controller;
 
+import java.util.Set;
+
+import org.quartz.JobKey;
 import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.xxl.quartz.DynamicSchedulerUtil;
 
 @Controller
-@RequestMapping("/")
+@RequestMapping("/job")
 public class IndexController {
 
-	@RequestMapping("")
-	@ResponseBody
-	private String index() {
-		return "hehe";
+	
+	@RequestMapping("index")
+	public String index(Model model) {
+		Set<JobKey> list = DynamicSchedulerUtil.getJobKeys();
+		model.addAttribute("jobList", list);
+		return "job/index";
+	}
+	
+	@RequestMapping("/help")
+	public String help(Model model) {
+		return "job/help";
 	}
+	
 }

+ 7 - 0
xxl-job-admin/src/main/java/com/xxl/quartz/DynamicSchedulerUtil.java

@@ -47,6 +47,13 @@ public final class DynamicSchedulerUtil implements InitializingBean {
 			return null;
 		}
 	}
+	
+	public static void getJobDetail(String triggerKeyName){
+		// TriggerKey : name + group
+    	String group = Scheduler.DEFAULT_GROUP;
+        TriggerKey triggerKey = TriggerKey.triggerKey(triggerKeyName, group);
+        
+	}
 
 	// addJob 新增
     public static boolean addJob(String triggerKeyName, String cronExpression, Class<? extends Job> jobClass, Map<String, Object> jobData) throws SchedulerException {

+ 2 - 1
xxl-job-admin/src/main/resources/springmvc-context.xml

@@ -24,7 +24,8 @@
 	<context:component-scan base-package="com.xxl.controller" />
 	
 	<mvc:resources mapping="/favicon.ico" location="/favicon.ico" />
-	<mvc:resources mapping="/static/**" location="/static/" />
+	<mvc:resources mapping="/static/**" location="/static/" />			<!-- 不拦截static目录下 -->
+	<mvc:resources mapping="/**/*.html" location="/" />					<!-- 不拦截.html后缀 -->
 	
 	<bean id="viewResolver"	class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
 		<property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />	<!-- 解析视图模板类 -->

+ 1 - 0
xxl-job-admin/src/main/webapp/500.html

@@ -0,0 +1 @@
+500

+ 39 - 0
xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.exception.ftl

@@ -0,0 +1,39 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta charset="UTF-8">
+	<title>应用程序异常 (500)</title> 
+    <style type="text/css"> 
+        body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
+        div.dialog {
+            width: 80%;
+            padding: 1em 4em;
+            margin: 4em auto 0 auto;
+            border: 1px solid #ccc;
+            border-right-color: #999;
+            border-bottom-color: #999;
+        }
+        h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
+    </style>
+    
+</head> 
+</head>
+<body> 
+
+	<div class="dialog"> 
+	    <h1>应用程序异常</h1> 
+	    <p>抱歉!您访问的页面出现异常,请稍后重试或联系管理员。</p> 
+	    <p><a href="javascript:showErr();">详 情</a> 
+		<a href="javascript:window.location.href='${request.contextPath}'">返 回</a> 
+	    </p> 
+	    <div style="display:none;text-align: left;" id="err">${exceptionMsg}</div>
+	</div>
+  
+<script type="text/javascript">
+function showErr(){
+	document.getElementById("err").style.display = "";
+}
+</script>
+
+</body>
+</html>

+ 328 - 0
xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.macro.ftl

@@ -0,0 +1,328 @@
+<#macro commonStyle>
+
+	<meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <!-- Tell the browser to be responsive to screen width -->
+    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
+    <!-- Bootstrap 3.3.5 -->
+    <link rel="stylesheet" href="${request.contextPath}/static/adminlte/bootstrap/css/bootstrap.min.css">
+    <!-- Font Awesome -->
+    <!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"> -->
+    <link rel="stylesheet" href="${request.contextPath}/static/plugins/font-awesome-4.3.0/css/font-awesome.min.css">
+    <!-- Ionicons -->
+    <!-- <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css"> -->
+    <link rel="stylesheet" href="${request.contextPath}/static/plugins/ionicons-2.0.1/css/ionicons.min.css">
+    <!-- jvectormap -->
+    <link rel="stylesheet" href="${request.contextPath}/static/adminlte/plugins/jvectormap/jquery-jvectormap-1.2.2.css">
+    <!-- Theme style -->
+    <link rel="stylesheet" href="${request.contextPath}/static/adminlte/dist/css/AdminLTE.min.css">
+    <!-- AdminLTE Skins. Choose a skin from the css/skins folder instead of downloading all of them to reduce the load. -->
+    <link rel="stylesheet" href="${request.contextPath}/static/adminlte/dist/css/skins/_all-skins.min.css">
+      
+	<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
+    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
+    <!--[if lt IE 9]>
+    <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
+    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+    <![endif]-->
+  
+	<!-- scrollup -->
+	<link rel="stylesheet" href="${request.contextPath}/static/plugins/scrollup/image.css">
+</#macro>
+
+<#macro commonScript>
+	<!-- jQuery 2.1.4 -->
+	<script src="${request.contextPath}/static/adminlte/plugins/jQuery/jQuery-2.1.4.min.js"></script>
+	<!-- Bootstrap 3.3.5 -->
+	<script src="${request.contextPath}/static/adminlte/bootstrap/js/bootstrap.min.js"></script>
+	<!-- FastClick -->
+	<script src="${request.contextPath}/static/adminlte/plugins/fastclick/fastclick.js"></script>
+	<!-- AdminLTE App -->
+	<script src="${request.contextPath}/static/adminlte/dist/js/app.min.js"></script>
+	<!-- Sparkline -->
+	<script src="${request.contextPath}/static/adminlte/plugins/sparkline/jquery.sparkline.min.js"></script>
+	<!-- jvectormap -->
+	<script src="${request.contextPath}/static/adminlte/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js"></script>
+	<script src="${request.contextPath}/static/adminlte/plugins/jvectormap/jquery-jvectormap-world-mill-en.js"></script>
+	<!-- SlimScroll 1.3.0 -->
+	<script src="${request.contextPath}/static/adminlte/plugins/slimScroll/jquery.slimscroll.min.js"></script>
+	<!-- ChartJS 1.0.1 -->
+	<script src="${request.contextPath}/static/adminlte/plugins/chartjs/Chart.min.js"></script>
+
+    <!-- scrollup -->
+    <script src="${request.contextPath}/static/plugins/scrollup/jquery.scrollUp.min.js"></script>
+    <script src="${request.contextPath}/static/js/common.1.js"></script>
+</#macro>
+
+<#macro commonHeader>
+	<header class="main-header">
+	
+		<!-- Logo -->
+		<a href="${request.contextPath}/" class="logo"> <!-- mini logo for sidebar mini 50x50 pixels -->
+			<span class="logo-mini"><b>X</b>XL</span> <!-- logo for regular state and mobile devices -->
+			<span class="logo-lg"><b>调度</b>中心</span>
+		</a>
+	
+		<!-- Header Navbar: style can be found in header.less -->
+		<nav class="navbar navbar-static-top" role="navigation">
+			<!-- Sidebar toggle button-->
+			<a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"><span class="sr-only">切换导航</span></a>
+			<!-- Navbar Right Menu -->
+			<div class="navbar-custom-menu">
+				<ul class="nav navbar-nav">
+					<!-- 通知: style can be found in dropdown.less -->
+					<li class="dropdown notifications-menu">
+						<a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-bell-o"></i> <span class="label label-warning">5</span></a>
+						<ul class="dropdown-menu">
+							<li class="header">您有5条通知</li>
+							<li>
+								<!-- inner menu: contains the actual data -->
+								<ul class="menu">
+									<li><a href="#"> <i class="fa fa-warning text-yellow"></i>
+										这是一个不错的应用
+									</a></li>
+									<li><a href="#"> <i class="fa fa-warning text-yellow"></i>
+										这是一个很不错的应用
+									</a></li>
+									<li><a href="#"> <i class="fa fa-warning text-yellow"></i>
+										这是一个非常不错的应用
+									</a></li>
+									<li><a href="#"> <i class="fa fa-warning text-yellow"></i> 
+										这是一个非常非常不错的应用
+									</a></li>
+									<li><a href="#"> <i class="fa fa-warning text-yellow"></i>
+										这是一个非常非常非常不错的应用
+									</a></li>
+								</ul>
+							</li>
+							<li class="footer"><a href="#">查看全部</a></li>
+						</ul>
+					</li>
+					<!-- 账号: style can be found in dropdown.less -->
+					<li class="dropdown user user-menu">
+						<a href="#"	class="dropdown-toggle" data-toggle="dropdown"> 
+							<i class="fa fa-user text-aqua"></i><span class="hidden-xs">${loginIdentity.userName}</span>
+						</a>
+						<ul class="dropdown-menu">
+							<!-- User image -->
+							<li class="user-header">
+								<p>
+									${loginIdentity.realName} - 前端研发
+									<small>注册于 2012-11-20</small>
+								</p>
+							</li>
+							<!-- Menu Body 
+							<li class="user-body">
+								<div class="col-xs-4 text-center"><a href="#">Followers</a></div>
+								<div class="col-xs-4 text-center"><a href="#">Sales</a></div>
+								<div class="col-xs-4 text-center"><a href="#">Friends</a></div>
+							</li>-->
+							<!-- Menu Footer-->
+							<li class="user-footer">
+								<div class="pull-left"><a href="#" class="btn btn-default btn-flat">资料</a></div>
+								<div class="pull-right"><a href="javascript:;" class="btn btn-default btn-flat" id="logoutBtn" >注销</a></div>
+							</li>
+						</ul></li>
+					<!-- Control Sidebar Toggle Button -->
+					<li><a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a></li>
+				</ul>
+			</div>
+	
+		</nav>
+	</header>
+	
+</#macro>
+
+<#macro commonLeft>
+	<!-- Left side column. contains the logo and sidebar -->
+	<aside class="main-sidebar">
+		<!-- sidebar: style can be found in sidebar.less -->
+		<section class="sidebar">
+			<!-- sidebar menu: : style can be found in sidebar.less -->
+			<ul class="sidebar-menu">
+				
+				<li class="header">常用模块</li>
+				<li class="nav-click" ><a href="${request.contextPath}/job/index"><i class="fa fa-circle-o text-red"></i> <span>调度管理</span></a></li>
+				<li class="nav-click" ><a href="${request.contextPath}/job/help"><i class="fa fa-circle-o text-yellow"></i><span>使用教程</span></a></li>
+				
+				<li class="header">全部模块</li>
+				<li class="treeview nav-click">
+					<a href="#"><i class="fa fa-dashboard"></i> <span>调度中心</span><i class="fa fa-angle-left pull-right"></i></a>
+					<ul class="treeview-menu">
+						<li class="nav-click" ><a href="${request.contextPath}/job/index"><i class="fa fa-circle-o"></i>调度管理</a></li>
+						<li class="nav-click" ><a href="${request.contextPath}/job/help"><i class="fa fa-circle-o"></i>使用教程</a></li>
+					</ul>
+				</li>
+				
+			</ul>
+		</section>
+		<!-- /.sidebar -->
+	</aside>
+</#macro>
+
+<#macro commonControl >
+	<!-- Control Sidebar -->
+	<aside class="control-sidebar control-sidebar-dark">
+		<!-- Create the tabs -->
+		<ul class="nav nav-tabs nav-justified control-sidebar-tabs">
+			<li class="active"><a href="#control-sidebar-home-tab" data-toggle="tab"><i class="fa fa-home"></i></a></li>
+			<li><a href="#control-sidebar-settings-tab" data-toggle="tab"><i class="fa fa-gears"></i></a></li>
+		</ul>
+		<!-- Tab panes -->
+		<div class="tab-content">
+			<!-- Home tab content -->
+			<div class="tab-pane active" id="control-sidebar-home-tab">
+				<h3 class="control-sidebar-heading">近期活动</h3>
+				<ul class="control-sidebar-menu">
+					<li>
+						<a href="javascript::;">
+							<i class="menu-icon fa fa-birthday-cake bg-red"></i>
+							<div class="menu-info">
+								<h4 class="control-sidebar-subheading">张三今天过生日</h4>
+								<p>2015-09-10</p>
+							</div>
+						</a>
+					</li>
+					<li>
+						<a href="javascript::;"> 
+							<i class="menu-icon fa fa-user bg-yellow"></i>
+							<div class="menu-info">
+								<h4 class="control-sidebar-subheading">Frodo 更新了资料</h4>
+								<p>更新手机号码 +1(800)555-1234</p>
+							</div>
+						</a>
+					</li>
+					<li>
+						<a href="javascript::;"> 
+							<i class="menu-icon fa fa-envelope-o bg-light-blue"></i>
+							<div class="menu-info">
+								<h4 class="control-sidebar-subheading">Nora 加入邮件列表</h4>
+								<p>nora@example.com</p>
+							</div>
+						</a>
+					</li>
+					<li>
+						<a href="javascript::;">
+						<i class="menu-icon fa fa-file-code-o bg-green"></i>
+						<div class="menu-info">
+							<h4 class="control-sidebar-subheading">001号定时作业调度</h4>
+							<p>5秒前执行</p>
+						</div>
+						</a>
+					</li>
+				</ul>
+				<!-- /.control-sidebar-menu -->
+			</div>
+			<!-- /.tab-pane -->
+
+			<!-- Settings tab content -->
+			<div class="tab-pane" id="control-sidebar-settings-tab">
+				<form method="post">
+					<h3 class="control-sidebar-heading">个人设置</h3>
+					<div class="form-group">
+						<label class="control-sidebar-subheading"> 左侧菜单自适应
+							<input type="checkbox" class="pull-right" checked>
+						</label>
+						<p>左侧菜单栏样式自适应</p>
+					</div>
+					<!-- /.form-group -->
+
+				</form>
+			</div>
+			<!-- /.tab-pane -->
+		</div>
+	</aside>
+	<!-- /.control-sidebar -->
+	<!-- Add the sidebar's background. This div must be placed immediately after the control sidebar -->
+	<div class="control-sidebar-bg"></div>
+</#macro>
+
+<#macro commonFooter >
+	<footer class="main-footer">
+		<div class="pull-right hidden-xs">
+			<b>Version</b> 1.0
+		</div>
+		<strong>Copyright &copy; 2015-2015 &nbsp;
+			<a href="https://github.com/xuxueli/" target="_blank" >github</a>&nbsp;
+			<a href="http://www.cnblogs.com/xuxueli/" target="_blank" >cnblog</a>.
+		</strong> All rights reserved.
+	</footer>
+</#macro>
+
+<#macro comAlert >
+	<!-- ComAlert.模态框Modal -->
+	<div class="modal fade" id="ComAlert" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+		<div class="modal-dialog">
+			<div class="modal-content">
+				<!--	<div class="modal-header"><h4 class="modal-title"><strong>提示:</strong></h4></div>	-->
+	         	<div class="modal-body"><div class="alert alert-success"></div></div>
+	         	<div class="modal-footer">
+	         		<div class="text-center" >
+	            		<button type="button" class="btn btn-default ok" data-dismiss="modal" >确认</button>
+	            	</div>
+	         	</div>
+			</div>
+		</div>
+	</div>
+	<!-- ComConfirm.模态框Modal -->
+	<div class="modal fade" id="ComConfirm" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+		<div class="modal-dialog">
+			<div class="modal-content">
+	         	<div class="modal-body"><div class="alert alert-success"></div></div>
+	         	<div class="modal-footer">
+	         		<div class="text-center" >
+	            		<button type="button" class="btn btn-primary ok" data-dismiss="modal" >确认</button>
+	            		<button type="button" class="btn btn-default cancel" data-dismiss="modal" >取消</button>
+	            	</div>
+	         	</div>
+			</div>
+		</div>
+	</div>
+	<script>
+		// 通用提示
+		var ComAlert = {
+			show:function(type, msg, callback){
+				// 弹框初始
+				if (type == 1) {
+					$('#ComAlert .alert').attr('class', 'alert alert-success');
+				} else {
+					$('#ComAlert .alert').attr('class', 'alert alert-warning');
+				}
+				$('#ComAlert .alert').html(msg);
+				$('#ComAlert').modal('show');
+				
+				$('#ComAlert .ok').click(function(){
+					$('#ComAlert').modal('hide');
+					if(typeof callback == 'function') {
+						callback();
+					}
+				});
+				
+				// $("#ComAlert").on('hide.bs.modal', function () {	});	// 监听关闭
+			}
+		};
+		// 通用确认弹框
+		var ComConfirm = {
+			show:function(msg, callback){
+				// 弹框初始
+				$('#ComConfirm .alert').attr('class', 'alert alert-warning');
+				$('#ComConfirm .alert').html(msg);
+				$('#ComConfirm').modal('show');
+				
+				$('#ComConfirm .ok').unbind("click");	// 解绑陈旧事件
+				$('#ComConfirm .ok').click(function(){
+					$('#ComConfirm').modal('hide');
+					if(typeof callback == 'function') {
+						callback();
+						return;
+					}
+				});
+				
+				$('#ComConfirm .cancel').click(function(){
+					$('#ComConfirm').modal('hide');
+					return;
+				});
+			}
+		};
+	</script>
+</#macro>

+ 1 - 0
xxl-job-admin/src/main/webapp/WEB-INF/template/common/common.result.ftl

@@ -0,0 +1 @@
+${result?if_exists}

+ 53 - 0
xxl-job-admin/src/main/webapp/WEB-INF/template/job/help.ftl

@@ -0,0 +1,53 @@
+<!DOCTYPE html>
+<html>
+<head>
+  	<title>AdminLTE 2 | Dashboard</title>
+  	<#import "/common/common.macro.ftl" as netCommon>
+	<@netCommon.commonStyle />
+</head>
+<body class="hold-transition skin-blue sidebar-mini">
+<div class="wrapper">
+	<!-- header -->
+	<@netCommon.commonHeader />
+	<!-- left -->
+	<@netCommon.commonLeft />
+	
+	<!-- Content Wrapper. Contains page content -->
+	<div class="content-wrapper">
+		<!-- Content Header (Page header) -->
+		<section class="content-header">
+			<h1>使用教程<small>调度管理平台</small></h1>
+			<ol class="breadcrumb">
+				<li><a><i class="fa fa-dashboard"></i>调度中心</a></li>
+				<li class="active">使用教程</li>
+			</ol>
+		</section>
+
+		<!-- Main content -->
+		<section class="content">
+			<div class="callout callout-info">
+				<h4>简介:xxl-job</h4>
+				<p>分布式配置管理平台:一套完整的基于zookeeper的分布式配置统一解决方案.</p>
+				<p></p>
+            </div>
+            
+            <div class="callout callout-info">
+				<h4>主要目标:</h4>
+				<p>1、简化部署:同一个上线包,无须改动配置,即可在 多个环境中(研发RD/测试QA/线上PRODUCTION) 上线.</p>
+				<p>2、动态部署:更改配置,无需重新打包或重启,即可 实时生效.</p>
+				<p>3、统一管理:提供web平台,统一管理 多个环境(RD/QA/PRODUCTION)、多个产品 的所有配置.</p>
+            </div>
+            
+		</section>
+		<!-- /.content -->
+	</div>
+	<!-- /.content-wrapper -->
+	
+	<!-- footer -->
+	<@netCommon.commonFooter />
+	<!-- control -->
+	<@netCommon.commonControl />
+</div>
+<@netCommon.commonScript />
+</body>
+</html>

+ 49 - 0
xxl-job-admin/src/main/webapp/WEB-INF/template/job/index.ftl

@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<head>
+  	<title>调度中心</title>
+  	<#import "/common/common.macro.ftl" as netCommon>
+	<@netCommon.commonStyle />
+</head>
+<body class="hold-transition skin-blue sidebar-mini">
+<div class="wrapper">
+	<!-- header -->
+	<@netCommon.commonHeader />
+	<!-- left -->
+	<@netCommon.commonLeft />
+	
+	<!-- Content Wrapper. Contains page content -->
+	<div class="content-wrapper">
+		<!-- Content Header (Page header) -->
+		<section class="content-header">
+			<h1>使用教程<small>调度管理平台</small></h1>
+			<ol class="breadcrumb">
+				<li><a><i class="fa fa-dashboard"></i>调度中心</a></li>
+				<li class="active">使用教程</li>
+			</ol>
+		</section>
+
+		<!-- Main content -->
+		<section class="content">
+            <div class="callout callout-info">
+				<h4>在线任务:</h4>
+				<#if jobList?exists && jobList?size gt 0>
+				<#list jobList as item>
+				<p>${item}</p>
+				</#list>
+				</#if>
+            </div>
+            
+		</section>
+		<!-- /.content -->
+	</div>
+	<!-- /.content-wrapper -->
+	
+	<!-- footer -->
+	<@netCommon.commonFooter />
+	<!-- control -->
+	<@netCommon.commonControl />
+</div>
+<@netCommon.commonScript />
+</body>
+</html>

+ 8 - 0
xxl-job-admin/src/main/webapp/WEB-INF/web.xml

@@ -51,5 +51,13 @@
 	<welcome-file-list>
 		<welcome-file>index.html</welcome-file>
 	</welcome-file-list>
+	<error-page>
+		<error-code>404</error-code>
+		<location>/500.html</location>
+	</error-page>
+	<error-page>
+		<error-code>500</error-code>
+		<location>/500.html</location>
+	</error-page>
 
 </web-app>

+ 10 - 0
xxl-job-admin/src/main/webapp/static/.gitignore

@@ -0,0 +1,10 @@
+*.DS_Store
+*.log
+*.zip
+.idea
+/nbproject/
+/nbproject/private/
+/node_modules/
+ad.js
+TODO
+test.html

+ 17 - 0
xxl-job-admin/src/main/webapp/static/.jshintrc

@@ -0,0 +1,17 @@
+{
+  "asi"      : true,
+  "browser"  : true,
+  "eqeqeq"   : false,
+  "eqnull"   : true,
+  "es3"      : true,
+  "expr"     : true,
+  "jquery"   : true,
+  "latedef"  : "nofunc",
+  "laxbreak" : true,
+  "nonbsp"   : true,
+  "strict"   : true,
+  "undef"    : true,
+  "unused"   : true,
+  // External variabls and plugins
+  "predef":  [ "AdminLTEOptions", "FastClick", "moment", "Morris", "Chart" ]
+}

File diff suppressed because it is too large
+ 6800 - 0
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/css/bootstrap.css


File diff suppressed because it is too large
+ 1 - 0
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/css/bootstrap.css.map


File diff suppressed because it is too large
+ 5 - 0
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/css/bootstrap.min.css


BIN
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.eot


File diff suppressed because it is too large
+ 288 - 0
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.svg


BIN
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.ttf


BIN
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.woff


BIN
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/fonts/glyphicons-halflings-regular.woff2


File diff suppressed because it is too large
+ 2317 - 0
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/js/bootstrap.js


File diff suppressed because it is too large
+ 7 - 0
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/js/bootstrap.min.js


+ 13 - 0
xxl-job-admin/src/main/webapp/static/adminlte/bootstrap/js/npm.js

@@ -0,0 +1,13 @@
+// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.
+require('../../js/transition.js')
+require('../../js/alert.js')
+require('../../js/button.js')
+require('../../js/carousel.js')
+require('../../js/collapse.js')
+require('../../js/dropdown.js')
+require('../../js/modal.js')
+require('../../js/tooltip.js')
+require('../../js/popover.js')
+require('../../js/scrollspy.js')
+require('../../js/tab.js')
+require('../../js/affix.js')

+ 36 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins.less

@@ -0,0 +1,36 @@
+// Mixins
+// --------------------------------------------------
+// Utilities
+@import "mixins/hide-text.less";
+@import "mixins/opacity.less";
+@import "mixins/image.less";
+@import "mixins/labels.less";
+@import "mixins/reset-filter.less";
+@import "mixins/resize.less";
+@import "mixins/responsive-visibility.less";
+@import "mixins/size.less";
+@import "mixins/tab-focus.less";
+@import "mixins/reset-text.less";
+@import "mixins/text-emphasis.less";
+@import "mixins/text-overflow.less";
+@import "mixins/vendor-prefixes.less";
+// Components
+@import "mixins/alerts.less";
+@import "mixins/buttons.less";
+@import "mixins/panels.less";
+@import "mixins/pagination.less";
+@import "mixins/list-group.less";
+@import "mixins/nav-divider.less";
+@import "mixins/forms.less";
+@import "mixins/progress-bar.less";
+@import "mixins/table-row.less";
+// Skins
+@import "mixins/background-variant.less";
+@import "mixins/border-radius.less";
+@import "mixins/gradients.less";
+// Layout
+@import "mixins/clearfix.less";
+@import "mixins/center-block.less";
+@import "mixins/nav-vertical-align.less";
+@import "mixins/grid-framework.less";
+@import "mixins/grid.less";

+ 14 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/alerts.less

@@ -0,0 +1,14 @@
+// Alerts
+
+.alert-variant(@background; @border; @text-color) {
+  background-color: @background;
+  border-color: @border;
+  color: @text-color;
+
+  hr {
+    border-top-color: darken(@border, 5%);
+  }
+  .alert-link {
+    color: darken(@text-color, 10%);
+  }
+}

+ 9 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/background-variant.less

@@ -0,0 +1,9 @@
+// Contextual backgrounds
+
+.bg-variant(@color) {
+  background-color: @color;
+  a&:hover,
+  a&:focus {
+    background-color: darken(@color, 10%);
+  }
+}

+ 21 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/border-radius.less

@@ -0,0 +1,21 @@
+// Single side border-radius
+
+.border-top-radius(@radius) {
+  border-top-right-radius: @radius;
+  border-top-left-radius: @radius;
+}
+
+.border-right-radius(@radius) {
+  border-bottom-right-radius: @radius;
+  border-top-right-radius: @radius;
+}
+
+.border-bottom-radius(@radius) {
+  border-bottom-right-radius: @radius;
+  border-bottom-left-radius: @radius;
+}
+
+.border-left-radius(@radius) {
+  border-bottom-left-radius: @radius;
+  border-top-left-radius: @radius;
+}

+ 68 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/buttons.less

@@ -0,0 +1,68 @@
+// Button variants
+//
+// Easily pump out default styles, as well as :hover, :focus, :active,
+// and disabled options for all buttons
+
+.button-variant(@color; @background; @border) {
+  color: @color;
+  background-color: @background;
+  border-color: @border;
+
+  &:focus,
+  &.focus {
+    color: @color;
+    background-color: darken(@background, 10%);
+    border-color: darken(@border, 25%);
+  }
+  &:hover {
+    color: @color;
+    background-color: darken(@background, 10%);
+    border-color: darken(@border, 12%);
+  }
+  &:active,
+  &.active,
+  .open > .dropdown-toggle& {
+    color: @color;
+    background-color: darken(@background, 10%);
+    border-color: darken(@border, 12%);
+
+    &:hover,
+    &:focus,
+    &.focus {
+      color: @color;
+      background-color: darken(@background, 17%);
+      border-color: darken(@border, 25%);
+    }
+  }
+  &:active,
+  &.active,
+  .open > .dropdown-toggle& {
+    background-image: none;
+  }
+  &.disabled,
+  &[disabled],
+  fieldset[disabled] & {
+    &,
+    &:hover,
+    &:focus,
+    &.focus,
+    &:active,
+    &.active {
+      background-color: @background;
+      border-color: @border;
+    }
+  }
+
+  .badge {
+    color: @background;
+    background-color: @color;
+  }
+}
+
+// Button sizes
+.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
+  padding: @padding-vertical @padding-horizontal;
+  font-size: @font-size;
+  line-height: @line-height;
+  border-radius: @border-radius;
+}

+ 7 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/center-block.less

@@ -0,0 +1,7 @@
+// Center-align a block level element
+
+.center-block() {
+  display: block;
+  margin-left: auto;
+  margin-right: auto;
+}

+ 22 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/clearfix.less

@@ -0,0 +1,22 @@
+// Clearfix
+//
+// For modern browsers
+// 1. The space content is one way to avoid an Opera bug when the
+//    contenteditable attribute is included anywhere else in the document.
+//    Otherwise it causes space to appear at the top and bottom of elements
+//    that are clearfixed.
+// 2. The use of `table` rather than `block` is only necessary if using
+//    `:before` to contain the top-margins of child elements.
+//
+// Source: http://nicolasgallagher.com/micro-clearfix-hack/
+
+.clearfix() {
+  &:before,
+  &:after {
+    content: " "; // 1
+    display: table; // 2
+  }
+  &:after {
+    clear: both;
+  }
+}

+ 84 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/forms.less

@@ -0,0 +1,84 @@
+// Form validation states
+//
+// Used in forms.less to generate the form validation CSS for warnings, errors,
+// and successes.
+
+.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
+  // Color the label and help text
+  .help-block,
+  .control-label,
+  .radio,
+  .checkbox,
+  .radio-inline,
+  .checkbox-inline,
+  &.radio label,
+  &.checkbox label,
+  &.radio-inline label,
+  &.checkbox-inline label {
+    color: @text-color;
+  }
+  // Set the border and box shadow on specific inputs to match
+  .form-control {
+    border-color: @border-color;
+    .box-shadow(inset 0 1px 1px rgba(0, 0, 0, .075)); // Redeclare so transitions work
+    &:focus {
+      border-color: darken(@border-color, 10%);
+      @shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px lighten(@border-color, 20%);
+      .box-shadow(@shadow);
+    }
+  }
+  // Set validation states also for addons
+  .input-group-addon {
+    color: @text-color;
+    border-color: @border-color;
+    background-color: @background-color;
+  }
+  // Optional feedback icon
+  .form-control-feedback {
+    color: @text-color;
+  }
+}
+
+// Form control focus state
+//
+// Generate a customized focus state and for any input with the specified color,
+// which defaults to the `@input-border-focus` variable.
+//
+// We highly encourage you to not customize the default value, but instead use
+// this to tweak colors on an as-needed basis. This aesthetic change is based on
+// WebKit's default styles, but applicable to a wider range of browsers. Its
+// usability and accessibility should be taken into account with any change.
+//
+// Example usage: change the default blue border and shadow to white for better
+// contrast against a dark gray background.
+.form-control-focus(@color: @input-border-focus) {
+  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
+  &:focus {
+    border-color: @color;
+    outline: 0;
+    .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
+  }
+}
+
+// Form control sizing
+//
+// Relative text size, padding, and border-radii changes for form controls. For
+// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
+// element gets special love because it's special, and that's a fact!
+.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
+  height: @input-height;
+  padding: @padding-vertical @padding-horizontal;
+  font-size: @font-size;
+  line-height: @line-height;
+  border-radius: @border-radius;
+
+  select& {
+    height: @input-height;
+    line-height: @input-height;
+  }
+
+  textarea&,
+  select[multiple] & {
+    height: auto;
+  }
+}

+ 59 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/gradients.less

@@ -0,0 +1,59 @@
+// Gradients
+
+#gradient {
+
+  // Horizontal gradient, from left to right
+  //
+  // Creates two color stops, start and end, by specifying a color and position for each color stop.
+  // Color stops are not available in IE9 and below.
+  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
+    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+
+    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12
+    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+    background-repeat: repeat-x;
+    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)", argb(@start-color), argb(@end-color))); // IE9 and down
+  }
+
+  // Vertical gradient, from top to bottom
+  //
+  // Creates two color stops, start and end, by specifying a color and position for each color stop.
+  // Color stops are not available in IE9 and below.
+  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
+    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+
+    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12
+    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+    background-repeat: repeat-x;
+    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)", argb(@start-color), argb(@end-color))); // IE9 and down
+  }
+
+  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
+    background-repeat: repeat-x;
+    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+
+    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12
+    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+  }
+  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
+    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
+    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
+    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
+    background-repeat: no-repeat;
+    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
+  }
+  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
+    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
+    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
+    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
+    background-repeat: no-repeat;
+    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
+  }
+  .radial(@inner-color: #555; @outer-color: #333) {
+    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
+    background-image: radial-gradient(circle, @inner-color, @outer-color);
+    background-repeat: no-repeat;
+  }
+  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {
+    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
+    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
+    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
+  }
+}

+ 102 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/grid-framework.less

@@ -0,0 +1,102 @@
+// Framework grid generation
+//
+// Used only by Bootstrap to generate the correct number of grid classes given
+// any value of `@grid-columns`.
+
+.make-grid-columns() {
+  // Common styles for all sizes of grid columns, widths 1-12
+  .col(@index) {
+    // initial
+    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
+    .col((@index + 1), @item);
+  }
+  .col(@index, @list) when (@index =< @grid-columns) {
+    // general; "=<" isn't a typo
+    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
+    .col((@index + 1), ~"@{list}, @{item}");
+  }
+  .col(@index, @list) when (@index > @grid-columns) {
+    // terminal
+    @{list} {
+      position: relative;
+      // Prevent columns from collapsing when empty
+      min-height: 1px;
+      // Inner gutter via padding
+      padding-left: (@grid-gutter-width / 2);
+      padding-right: (@grid-gutter-width / 2);
+    }
+  }
+  .col(1); // kickstart it
+}
+
+.float-grid-columns(@class) {
+  .col(@index) {
+    // initial
+    @item: ~".col-@{class}-@{index}";
+    .col((@index + 1), @item);
+  }
+  .col(@index, @list) when (@index =< @grid-columns) {
+    // general
+    @item: ~".col-@{class}-@{index}";
+    .col((@index + 1), ~"@{list}, @{item}");
+  }
+  .col(@index, @list) when (@index > @grid-columns) {
+    // terminal
+    @{list} {
+      float: left;
+    }
+  }
+  .col(1); // kickstart it
+}
+
+.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {
+  .col-@{class}-@{index} {
+    width: percentage((@index / @grid-columns));
+  }
+}
+
+.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {
+  .col-@{class}-push-@{index} {
+    left: percentage((@index / @grid-columns));
+  }
+}
+
+.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {
+  .col-@{class}-push-0 {
+    left: auto;
+  }
+}
+
+.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {
+  .col-@{class}-pull-@{index} {
+    right: percentage((@index / @grid-columns));
+  }
+}
+
+.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {
+  .col-@{class}-pull-0 {
+    right: auto;
+  }
+}
+
+.calc-grid-column(@index, @class, @type) when (@type = offset) {
+  .col-@{class}-offset-@{index} {
+    margin-left: percentage((@index / @grid-columns));
+  }
+}
+
+// Basic looping in LESS
+.loop-grid-columns(@index, @class, @type) when (@index >= 0) {
+  .calc-grid-column(@index, @class, @type);
+  // next iteration
+  .loop-grid-columns((@index - 1), @class, @type);
+}
+
+// Create grid for specific class
+.make-grid(@class) {
+  .float-grid-columns(@class);
+  .loop-grid-columns(@grid-columns, @class, width);
+  .loop-grid-columns(@grid-columns, @class, pull);
+  .loop-grid-columns(@grid-columns, @class, push);
+  .loop-grid-columns(@grid-columns, @class, offset);
+}

+ 134 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/grid.less

@@ -0,0 +1,134 @@
+// Grid system
+//
+// Generate semantic grid columns with these mixins.
+
+// Centered container element
+.container-fixed(@gutter: @grid-gutter-width) {
+  margin-right: auto;
+  margin-left: auto;
+  padding-left: (@gutter / 2);
+  padding-right: (@gutter / 2);
+  &:extend(.clearfix all);
+}
+
+// Creates a wrapper for a series of columns
+.make-row(@gutter: @grid-gutter-width) {
+  margin-left: ceil((@gutter / -2));
+  margin-right: floor((@gutter / -2));
+  &:extend(.clearfix all);
+}
+
+// Generate the extra small columns
+.make-xs-column(@columns; @gutter: @grid-gutter-width) {
+  position: relative;
+  float: left;
+  width: percentage((@columns / @grid-columns));
+  min-height: 1px;
+  padding-left: (@gutter / 2);
+  padding-right: (@gutter / 2);
+}
+
+.make-xs-column-offset(@columns) {
+  margin-left: percentage((@columns / @grid-columns));
+}
+
+.make-xs-column-push(@columns) {
+  left: percentage((@columns / @grid-columns));
+}
+
+.make-xs-column-pull(@columns) {
+  right: percentage((@columns / @grid-columns));
+}
+
+// Generate the small columns
+.make-sm-column(@columns; @gutter: @grid-gutter-width) {
+  position: relative;
+  min-height: 1px;
+  padding-left: (@gutter / 2);
+  padding-right: (@gutter / 2);
+
+  @media (min-width: @screen-sm-min) {
+    float: left;
+    width: percentage((@columns / @grid-columns));
+  }
+}
+
+.make-sm-column-offset(@columns) {
+  @media (min-width: @screen-sm-min) {
+    margin-left: percentage((@columns / @grid-columns));
+  }
+}
+
+.make-sm-column-push(@columns) {
+  @media (min-width: @screen-sm-min) {
+    left: percentage((@columns / @grid-columns));
+  }
+}
+
+.make-sm-column-pull(@columns) {
+  @media (min-width: @screen-sm-min) {
+    right: percentage((@columns / @grid-columns));
+  }
+}
+
+// Generate the medium columns
+.make-md-column(@columns; @gutter: @grid-gutter-width) {
+  position: relative;
+  min-height: 1px;
+  padding-left: (@gutter / 2);
+  padding-right: (@gutter / 2);
+
+  @media (min-width: @screen-md-min) {
+    float: left;
+    width: percentage((@columns / @grid-columns));
+  }
+}
+
+.make-md-column-offset(@columns) {
+  @media (min-width: @screen-md-min) {
+    margin-left: percentage((@columns / @grid-columns));
+  }
+}
+
+.make-md-column-push(@columns) {
+  @media (min-width: @screen-md-min) {
+    left: percentage((@columns / @grid-columns));
+  }
+}
+
+.make-md-column-pull(@columns) {
+  @media (min-width: @screen-md-min) {
+    right: percentage((@columns / @grid-columns));
+  }
+}
+
+// Generate the large columns
+.make-lg-column(@columns; @gutter: @grid-gutter-width) {
+  position: relative;
+  min-height: 1px;
+  padding-left: (@gutter / 2);
+  padding-right: (@gutter / 2);
+
+  @media (min-width: @screen-lg-min) {
+    float: left;
+    width: percentage((@columns / @grid-columns));
+  }
+}
+
+.make-lg-column-offset(@columns) {
+  @media (min-width: @screen-lg-min) {
+    margin-left: percentage((@columns / @grid-columns));
+  }
+}
+
+.make-lg-column-push(@columns) {
+  @media (min-width: @screen-lg-min) {
+    left: percentage((@columns / @grid-columns));
+  }
+}
+
+.make-lg-column-pull(@columns) {
+  @media (min-width: @screen-lg-min) {
+    right: percentage((@columns / @grid-columns));
+  }
+}

+ 21 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/hide-text.less

@@ -0,0 +1,21 @@
+// CSS image replacement
+//
+// Heads up! v3 launched with only `.hide-text()`, but per our pattern for
+// mixins being reused as classes with the same name, this doesn't hold up. As
+// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
+//
+// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
+
+// Deprecated as of v3.0.1 (will be removed in v4)
+.hide-text() {
+  font: ~"0/0" a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+// New mixin to use as of v3.0.1
+.text-hide() {
+  .hide-text();
+}

+ 25 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/image.less

@@ -0,0 +1,25 @@
+// Image Mixins
+// - Responsive image
+// - Retina image
+
+// Responsive image
+//
+// Keep images from scaling beyond the width of their parents.
+.img-responsive(@display: block) {
+  display: @display;
+  max-width: 100%; // Part 1: Set a maximum relative to the parent
+  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
+}
+
+// Retina image
+//
+// Short retina mixin for setting background-image and -size. Note that the
+// spelling of `min--moz-device-pixel-ratio` is intentional.
+.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
+  background-image: url("@{file-1x}");
+
+  @media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (   min--moz-device-pixel-ratio: 2), only screen and (     -o-min-device-pixel-ratio: 2/1), only screen and (        min-device-pixel-ratio: 2), only screen and (                min-resolution: 192dpi), only screen and (                min-resolution: 2dppx) {
+    background-image: url("@{file-2x}");
+    background-size: @width-1x @height-1x;
+  }
+}

+ 12 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/labels.less

@@ -0,0 +1,12 @@
+// Labels
+
+.label-variant(@color) {
+  background-color: @color;
+
+  &[href] {
+    &:hover,
+    &:focus {
+      background-color: darken(@color, 10%);
+    }
+  }
+}

+ 30 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/list-group.less

@@ -0,0 +1,30 @@
+// List Groups
+
+.list-group-item-variant(@state; @background; @color) {
+  .list-group-item-@{state} {
+    color: @color;
+    background-color: @background;
+
+    a&,
+    button& {
+      color: @color;
+
+      .list-group-item-heading {
+        color: inherit;
+      }
+
+      &:hover,
+      &:focus {
+        color: @color;
+        background-color: darken(@background, 5%);
+      }
+      &.active,
+      &.active:hover,
+      &.active:focus {
+        color: #fff;
+        background-color: @color;
+        border-color: @color;
+      }
+    }
+  }
+}

+ 10 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/nav-divider.less

@@ -0,0 +1,10 @@
+// Horizontal dividers
+//
+// Dividers (basically an hr) within dropdowns and nav lists
+
+.nav-divider(@color: #e5e5e5) {
+  height: 1px;
+  margin: ((@line-height-computed / 2) - 1) 0;
+  overflow: hidden;
+  background-color: @color;
+}

+ 9 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/nav-vertical-align.less

@@ -0,0 +1,9 @@
+// Navbar vertical align
+//
+// Vertically center elements in the navbar.
+// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
+
+.navbar-vertical-align(@element-height) {
+  margin-top: ((@navbar-height - @element-height) / 2);
+  margin-bottom: ((@navbar-height - @element-height) / 2);
+}

+ 8 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/opacity.less

@@ -0,0 +1,8 @@
+// Opacity
+
+.opacity(@opacity) {
+  opacity: @opacity;
+  // IE8 filter
+  @opacity-ie: (@opacity * 100);
+  filter: ~"alpha(opacity=@{opacity-ie})";
+}

+ 24 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/pagination.less

@@ -0,0 +1,24 @@
+// Pagination
+
+.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
+  > li {
+    > a,
+    > span {
+      padding: @padding-vertical @padding-horizontal;
+      font-size: @font-size;
+      line-height: @line-height;
+    }
+    &:first-child {
+      > a,
+      > span {
+        .border-left-radius(@border-radius);
+      }
+    }
+    &:last-child {
+      > a,
+      > span {
+        .border-right-radius(@border-radius);
+      }
+    }
+  }
+}

+ 24 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/panels.less

@@ -0,0 +1,24 @@
+// Panels
+
+.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {
+  border-color: @border;
+
+  & > .panel-heading {
+    color: @heading-text-color;
+    background-color: @heading-bg-color;
+    border-color: @heading-border;
+
+    + .panel-collapse > .panel-body {
+      border-top-color: @border;
+    }
+    .badge {
+      color: @heading-bg-color;
+      background-color: @heading-text-color;
+    }
+  }
+  & > .panel-footer {
+    + .panel-collapse > .panel-body {
+      border-bottom-color: @border;
+    }
+  }
+}

+ 10 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/progress-bar.less

@@ -0,0 +1,10 @@
+// Progress bars
+
+.progress-bar-variant(@color) {
+  background-color: @color;
+
+  // Deprecated parent class requirement as of v3.2.0
+  .progress-striped & {
+    #gradient > .striped();
+  }
+}

+ 8 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/reset-filter.less

@@ -0,0 +1,8 @@
+// Reset filters for IE
+//
+// When you need to remove a gradient background, do not forget to use this to reset
+// the IE filter for IE9 and below.
+
+.reset-filter() {
+  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
+}

+ 18 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/reset-text.less

@@ -0,0 +1,18 @@
+.reset-text() {
+  font-family: @font-family-base;
+  // We deliberately do NOT reset font-size.
+  font-style: normal;
+  font-weight: normal;
+  letter-spacing: normal;
+  line-break: auto;
+  line-height: @line-height-base;
+  text-align: left; // Fallback for where `start` is not supported
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  white-space: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+}

+ 6 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/resize.less

@@ -0,0 +1,6 @@
+// Resize anything
+
+.resizable(@direction) {
+  resize: @direction; // Options: horizontal, vertical, both
+  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
+}

+ 21 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/responsive-visibility.less

@@ -0,0 +1,21 @@
+// Responsive utilities
+
+//
+// More easily include all the states for responsive-utilities.less.
+.responsive-visibility() {
+  display: block !important;
+  table& {
+    display: table !important;
+  }
+  tr& {
+    display: table-row !important;
+  }
+  th&,
+  td& {
+    display: table-cell !important;
+  }
+}
+
+.responsive-invisibility() {
+  display: none !important;
+}

+ 10 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/size.less

@@ -0,0 +1,10 @@
+// Sizing shortcuts
+
+.size(@width; @height) {
+  width: @width;
+  height: @height;
+}
+
+.square(@size) {
+  .size(@size; @size);
+}

+ 9 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/tab-focus.less

@@ -0,0 +1,9 @@
+// WebKit-style focus
+
+.tab-focus() {
+  // Default
+  outline: thin dotted;
+  // WebKit
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}

+ 28 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/table-row.less

@@ -0,0 +1,28 @@
+// Tables
+
+.table-row-variant(@state; @background) {
+  // Exact selectors below required to override `.table-striped` and prevent
+  // inheritance to nested tables.
+  .table > thead > tr,
+  .table > tbody > tr,
+  .table > tfoot > tr {
+    > td.@{state},
+    > th.@{state},
+    &.@{state} > td,
+    &.@{state} > th {
+      background-color: @background;
+    }
+  }
+
+  // Hover states for `.table-hover`
+  // Note: this is not available for cells or rows within `thead` or `tfoot`.
+  .table-hover > tbody > tr {
+    > td.@{state}:hover,
+    > th.@{state}:hover,
+    &.@{state}:hover > td,
+    &:hover > .@{state},
+    &.@{state}:hover > th {
+      background-color: darken(@background, 5%);
+    }
+  }
+}

+ 9 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/text-emphasis.less

@@ -0,0 +1,9 @@
+// Typography
+
+.text-emphasis-variant(@color) {
+  color: @color;
+  a&:hover,
+  a&:focus {
+    color: darken(@color, 10%);
+  }
+}

+ 8 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/text-overflow.less

@@ -0,0 +1,8 @@
+// Text overflow
+// Requires inline-block or block for proper styling
+
+.text-overflow() {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}

+ 254 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/mixins/vendor-prefixes.less

@@ -0,0 +1,254 @@
+// Vendor Prefixes
+//
+// All vendor mixins are deprecated as of v3.2.0 due to the introduction of
+// Autoprefixer in our Gruntfile. They will be removed in v4.
+
+// - Animations
+// - Backface visibility
+// - Box shadow
+// - Box sizing
+// - Content columns
+// - Hyphens
+// - Placeholder text
+// - Transformations
+// - Transitions
+// - User Select
+
+// Animations
+.animation(@animation) {
+  -webkit-animation: @animation;
+  -o-animation: @animation;
+  animation: @animation;
+}
+
+.animation-name(@name) {
+  -webkit-animation-name: @name;
+  animation-name: @name;
+}
+
+.animation-duration(@duration) {
+  -webkit-animation-duration: @duration;
+  animation-duration: @duration;
+}
+
+.animation-timing-function(@timing-function) {
+  -webkit-animation-timing-function: @timing-function;
+  animation-timing-function: @timing-function;
+}
+
+.animation-delay(@delay) {
+  -webkit-animation-delay: @delay;
+  animation-delay: @delay;
+}
+
+.animation-iteration-count(@iteration-count) {
+  -webkit-animation-iteration-count: @iteration-count;
+  animation-iteration-count: @iteration-count;
+}
+
+.animation-direction(@direction) {
+  -webkit-animation-direction: @direction;
+  animation-direction: @direction;
+}
+
+.animation-fill-mode(@fill-mode) {
+  -webkit-animation-fill-mode: @fill-mode;
+  animation-fill-mode: @fill-mode;
+}
+
+// Backface visibility
+// Prevent browsers from flickering when using CSS 3D transforms.
+// Default value is `visible`, but can be changed to `hidden`
+
+.backface-visibility(@visibility) {
+  -webkit-backface-visibility: @visibility;
+  -moz-backface-visibility: @visibility;
+  backface-visibility: @visibility;
+}
+
+// Drop shadows
+//
+// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
+// supported browsers that have box shadow capabilities now support it.
+
+.box-shadow(@shadow) {
+  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
+  box-shadow: @shadow;
+}
+
+// Box sizing
+.box-sizing(@boxmodel) {
+  -webkit-box-sizing: @boxmodel;
+  -moz-box-sizing: @boxmodel;
+  box-sizing: @boxmodel;
+}
+
+// CSS3 Content Columns
+.content-columns(@column-count; @column-gap: @grid-gutter-width) {
+  -webkit-column-count: @column-count;
+  -moz-column-count: @column-count;
+  column-count: @column-count;
+  -webkit-column-gap: @column-gap;
+  -moz-column-gap: @column-gap;
+  column-gap: @column-gap;
+}
+
+// Optional hyphenation
+.hyphens(@mode: auto) {
+  word-wrap: break-word;
+  -webkit-hyphens: @mode;
+  -moz-hyphens: @mode;
+  -ms-hyphens: @mode; // IE10+
+  -o-hyphens: @mode;
+  hyphens: @mode;
+}
+
+// Placeholder text
+.placeholder(@color: @input-color-placeholder) {
+  // Firefox
+  &::-moz-placeholder {
+    color: @color;
+    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526
+  }
+  &:-ms-input-placeholder {
+    color: @color;
+  }
+  // Internet Explorer 10+
+  &::-webkit-input-placeholder {
+    color: @color;
+  }
+  // Safari and Chrome
+}
+
+// Transformations
+.scale(@ratio) {
+  -webkit-transform: scale(@ratio);
+  -ms-transform: scale(@ratio); // IE9 only
+  -o-transform: scale(@ratio);
+  transform: scale(@ratio);
+}
+
+.scale(@ratioX; @ratioY) {
+  -webkit-transform: scale(@ratioX, @ratioY);
+  -ms-transform: scale(@ratioX, @ratioY); // IE9 only
+  -o-transform: scale(@ratioX, @ratioY);
+  transform: scale(@ratioX, @ratioY);
+}
+
+.scaleX(@ratio) {
+  -webkit-transform: scaleX(@ratio);
+  -ms-transform: scaleX(@ratio); // IE9 only
+  -o-transform: scaleX(@ratio);
+  transform: scaleX(@ratio);
+}
+
+.scaleY(@ratio) {
+  -webkit-transform: scaleY(@ratio);
+  -ms-transform: scaleY(@ratio); // IE9 only
+  -o-transform: scaleY(@ratio);
+  transform: scaleY(@ratio);
+}
+
+.skew(@x; @y) {
+  -webkit-transform: skewX(@x) skewY(@y);
+  -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
+  -o-transform: skewX(@x) skewY(@y);
+  transform: skewX(@x) skewY(@y);
+}
+
+.translate(@x; @y) {
+  -webkit-transform: translate(@x, @y);
+  -ms-transform: translate(@x, @y); // IE9 only
+  -o-transform: translate(@x, @y);
+  transform: translate(@x, @y);
+}
+
+.translate3d(@x; @y; @z) {
+  -webkit-transform: translate3d(@x, @y, @z);
+  transform: translate3d(@x, @y, @z);
+}
+
+.rotate(@degrees) {
+  -webkit-transform: rotate(@degrees);
+  -ms-transform: rotate(@degrees); // IE9 only
+  -o-transform: rotate(@degrees);
+  transform: rotate(@degrees);
+}
+
+.rotateX(@degrees) {
+  -webkit-transform: rotateX(@degrees);
+  -ms-transform: rotateX(@degrees); // IE9 only
+  -o-transform: rotateX(@degrees);
+  transform: rotateX(@degrees);
+}
+
+.rotateY(@degrees) {
+  -webkit-transform: rotateY(@degrees);
+  -ms-transform: rotateY(@degrees); // IE9 only
+  -o-transform: rotateY(@degrees);
+  transform: rotateY(@degrees);
+}
+
+.perspective(@perspective) {
+  -webkit-perspective: @perspective;
+  -moz-perspective: @perspective;
+  perspective: @perspective;
+}
+
+.perspective-origin(@perspective) {
+  -webkit-perspective-origin: @perspective;
+  -moz-perspective-origin: @perspective;
+  perspective-origin: @perspective;
+}
+
+.transform-origin(@origin) {
+  -webkit-transform-origin: @origin;
+  -moz-transform-origin: @origin;
+  -ms-transform-origin: @origin; // IE9 only
+  transform-origin: @origin;
+}
+
+// Transitions
+
+.transition(@transition) {
+  -webkit-transition: @transition;
+  -o-transition: @transition;
+  transition: @transition;
+}
+
+.transition-property(@transition-property) {
+  -webkit-transition-property: @transition-property;
+  transition-property: @transition-property;
+}
+
+.transition-delay(@transition-delay) {
+  -webkit-transition-delay: @transition-delay;
+  transition-delay: @transition-delay;
+}
+
+.transition-duration(@transition-duration) {
+  -webkit-transition-duration: @transition-duration;
+  transition-duration: @transition-duration;
+}
+
+.transition-timing-function(@timing-function) {
+  -webkit-transition-timing-function: @timing-function;
+  transition-timing-function: @timing-function;
+}
+
+.transition-transform(@transition) {
+  -webkit-transition: -webkit-transform @transition;
+  -moz-transition: -moz-transform @transition;
+  -o-transition: -o-transform @transition;
+  transition: transform @transition;
+}
+
+// User select
+// For selecting text on the page
+
+.user-select(@select) {
+  -webkit-user-select: @select;
+  -moz-user-select: @select;
+  -ms-user-select: @select; // IE10+
+  user-select: @select;
+}

+ 841 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/bootstrap-less/variables.less

@@ -0,0 +1,841 @@
+//
+// Variables
+// --------------------------------------------------
+
+//== Colors
+//
+//## Gray and brand colors for use across Bootstrap.
+
+@gray-base: #000;
+@gray-darker: lighten(@gray-base, 13.5%);
+// #222
+@gray-dark: lighten(@gray-base, 20%);
+// #333
+@gray: lighten(@gray-base, 33.5%);
+// #555
+@gray-light: lighten(@gray-base, 46.7%);
+// #777
+@gray-lighter: lighten(@gray-base, 93.5%);
+// #eee
+
+@brand-primary: darken(#428bca, 6.5%);
+// #337ab7
+@brand-success: #5cb85c;
+@brand-info: #5bc0de;
+@brand-warning: #f0ad4e;
+@brand-danger: #d9534f;
+
+//== Scaffolding
+//
+//## Settings for some of the most global styles.
+
+//** Background color for `<body>`.
+@body-bg: #fff;
+//** Global text color on `<body>`.
+@text-color: @gray-dark;
+
+//** Global textual link color.
+@link-color: @brand-primary;
+//** Link hover color set via `darken()` function.
+@link-hover-color: darken(@link-color, 15%);
+//** Link hover decoration.
+@link-hover-decoration: underline;
+
+//== Typography
+//
+//## Font, line-height, and color for body text, headings, and more.
+
+@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
+@font-family-serif: Georgia, "Times New Roman", Times, serif;
+//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
+@font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace;
+@font-family-base: @font-family-sans-serif;
+
+@font-size-base: 14px;
+@font-size-large: ceil((@font-size-base * 1.25));
+// ~18px
+@font-size-small: ceil((@font-size-base * 0.85));
+// ~12px
+
+@font-size-h1: floor((@font-size-base * 2.6));
+// ~36px
+@font-size-h2: floor((@font-size-base * 2.15));
+// ~30px
+@font-size-h3: ceil((@font-size-base * 1.7));
+// ~24px
+@font-size-h4: ceil((@font-size-base * 1.25));
+// ~18px
+@font-size-h5: @font-size-base;
+@font-size-h6: ceil((@font-size-base * 0.85));
+// ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+@line-height-base: 1.428571429;
+// 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+@line-height-computed: floor((@font-size-base * @line-height-base));
+// ~20px
+
+//** By default, this inherits from the `<body>`.
+@headings-font-family: inherit;
+@headings-font-weight: 500;
+@headings-line-height: 1.1;
+@headings-color: inherit;
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+@icon-font-path: "../fonts/";
+//** File name for all font files.
+@icon-font-name: "glyphicons-halflings-regular";
+//** Element ID within SVG icon file.
+@icon-font-svg-id: "glyphicons_halflingsregular";
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+@padding-base-vertical: 6px;
+@padding-base-horizontal: 12px;
+
+@padding-large-vertical: 10px;
+@padding-large-horizontal: 16px;
+
+@padding-small-vertical: 5px;
+@padding-small-horizontal: 10px;
+
+@padding-xs-vertical: 1px;
+@padding-xs-horizontal: 5px;
+
+@line-height-large: 1.3333333;
+// extra decimals for Win 8.1 Chrome
+@line-height-small: 1.5;
+
+@border-radius-base: 4px;
+@border-radius-large: 6px;
+@border-radius-small: 3px;
+
+//** Global color for active items (e.g., navs or dropdowns).
+@component-active-color: #fff;
+//** Global background color for active items (e.g., navs or dropdowns).
+@component-active-bg: @brand-primary;
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+@caret-width-base: 4px;
+//** Carets increase slightly in size for larger components.
+@caret-width-large: 5px;
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for `<th>`s and `<td>`s.
+@table-cell-padding: 8px;
+//** Padding for cells in `.table-condensed`.
+@table-condensed-cell-padding: 5px;
+
+//** Default background color used for all tables.
+@table-bg: transparent;
+//** Background color used for `.table-striped`.
+@table-bg-accent: #f9f9f9;
+//** Background color used for `.table-hover`.
+@table-bg-hover: #f5f5f5;
+@table-bg-active: @table-bg-hover;
+
+//** Border color for table and cell borders.
+@table-border-color: #ddd;
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+@btn-font-weight: normal;
+
+@btn-default-color: #333;
+@btn-default-bg: #fff;
+@btn-default-border: #ccc;
+
+@btn-primary-color: #fff;
+@btn-primary-bg: @brand-primary;
+@btn-primary-border: darken(@btn-primary-bg, 5%);
+
+@btn-success-color: #fff;
+@btn-success-bg: @brand-success;
+@btn-success-border: darken(@btn-success-bg, 5%);
+
+@btn-info-color: #fff;
+@btn-info-bg: @brand-info;
+@btn-info-border: darken(@btn-info-bg, 5%);
+
+@btn-warning-color: #fff;
+@btn-warning-bg: @brand-warning;
+@btn-warning-border: darken(@btn-warning-bg, 5%);
+
+@btn-danger-color: #fff;
+@btn-danger-bg: @brand-danger;
+@btn-danger-border: darken(@btn-danger-bg, 5%);
+
+@btn-link-disabled-color: @gray-light;
+
+//== Forms
+//
+//##
+
+//** `<input>` background color
+@input-bg: #fff;
+//** `<input disabled>` background color
+@input-bg-disabled: @gray-lighter;
+
+//** Text color for `<input>`s
+@input-color: @gray;
+//** `<input>` border color
+@input-border: #ccc;
+
+// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
+@input-border-radius: @border-radius-base;
+//** Large `.form-control` border radius
+@input-border-radius-large: @border-radius-large;
+//** Small `.form-control` border radius
+@input-border-radius-small: @border-radius-small;
+
+//** Border color for inputs on focus
+@input-border-focus: #66afe9;
+
+//** Placeholder text color
+@input-color-placeholder: #999;
+
+//** Default `.form-control` height
+@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2);
+//** Large `.form-control` height
+@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);
+//** Small `.form-control` height
+@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);
+
+//** `.form-group` margin
+@form-group-margin-bottom: 15px;
+
+@legend-color: @gray-dark;
+@legend-border-color: #e5e5e5;
+
+//** Background color for textual input addons
+@input-group-addon-bg: @gray-lighter;
+//** Border color for textual input addons
+@input-group-addon-border-color: @input-border;
+
+//** Disabled cursor for form controls and buttons.
+@cursor-disabled: not-allowed;
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+@dropdown-bg: #fff;
+//** Dropdown menu `border-color`.
+@dropdown-border: rgba(0, 0, 0, .15);
+//** Dropdown menu `border-color` **for IE8**.
+@dropdown-fallback-border: #ccc;
+//** Divider color for between dropdown items.
+@dropdown-divider-bg: #e5e5e5;
+
+//** Dropdown link text color.
+@dropdown-link-color: @gray-dark;
+//** Hover color for dropdown links.
+@dropdown-link-hover-color: darken(@gray-dark, 5%);
+//** Hover background for dropdown links.
+@dropdown-link-hover-bg: #f5f5f5;
+
+//** Active dropdown menu item text color.
+@dropdown-link-active-color: @component-active-color;
+//** Active dropdown menu item background color.
+@dropdown-link-active-bg: @component-active-bg;
+
+//** Disabled dropdown menu item background color.
+@dropdown-link-disabled-color: @gray-light;
+
+//** Text color for headers within dropdown menus.
+@dropdown-header-color: @gray-light;
+
+//** Deprecated `@dropdown-caret-color` as of v3.1.0
+@dropdown-caret-color: #000;
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+@zindex-navbar: 1000;
+@zindex-dropdown: 1000;
+@zindex-popover: 1060;
+@zindex-tooltip: 1070;
+@zindex-navbar-fixed: 1030;
+@zindex-modal-background: 1040;
+@zindex-modal: 1050;
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `@screen-xs` as of v3.0.1
+@screen-xs: 480px;
+//** Deprecated `@screen-xs-min` as of v3.2.0
+@screen-xs-min: @screen-xs;
+//** Deprecated `@screen-phone` as of v3.0.1
+@screen-phone: @screen-xs-min;
+
+// Small screen / tablet
+//** Deprecated `@screen-sm` as of v3.0.1
+@screen-sm: 768px;
+@screen-sm-min: @screen-sm;
+//** Deprecated `@screen-tablet` as of v3.0.1
+@screen-tablet: @screen-sm-min;
+
+// Medium screen / desktop
+//** Deprecated `@screen-md` as of v3.0.1
+@screen-md: 992px;
+@screen-md-min: @screen-md;
+//** Deprecated `@screen-desktop` as of v3.0.1
+@screen-desktop: @screen-md-min;
+
+// Large screen / wide desktop
+//** Deprecated `@screen-lg` as of v3.0.1
+@screen-lg: 1200px;
+@screen-lg-min: @screen-lg;
+//** Deprecated `@screen-lg-desktop` as of v3.0.1
+@screen-lg-desktop: @screen-lg-min;
+
+// So media queries don't overlap when required, provide a maximum
+@screen-xs-max: (@screen-sm-min - 1);
+@screen-sm-max: (@screen-md-min - 1);
+@screen-md-max: (@screen-lg-min - 1);
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+@grid-columns: 12;
+//** Padding between columns. Gets divided in half for the left and right.
+@grid-gutter-width: 30px;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+@grid-float-breakpoint: @screen-sm-min;
+//** Point at which the navbar begins collapsing.
+@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+@container-tablet: (720px + @grid-gutter-width);
+//** For `@screen-sm-min` and up.
+@container-sm: @container-tablet;
+
+// Medium screen / desktop
+@container-desktop: (940px + @grid-gutter-width);
+//** For `@screen-md-min` and up.
+@container-md: @container-desktop;
+
+// Large screen / wide desktop
+@container-large-desktop: (1140px + @grid-gutter-width);
+//** For `@screen-lg-min` and up.
+@container-lg: @container-large-desktop;
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+@navbar-height: 50px;
+@navbar-margin-bottom: @line-height-computed;
+@navbar-border-radius: @border-radius-base;
+@navbar-padding-horizontal: floor((@grid-gutter-width / 2));
+@navbar-padding-vertical: ((@navbar-height - @line-height-computed) / 2);
+@navbar-collapse-max-height: 340px;
+
+@navbar-default-color: #777;
+@navbar-default-bg: #f8f8f8;
+@navbar-default-border: darken(@navbar-default-bg, 6.5%);
+
+// Navbar links
+@navbar-default-link-color: #777;
+@navbar-default-link-hover-color: #333;
+@navbar-default-link-hover-bg: transparent;
+@navbar-default-link-active-color: #555;
+@navbar-default-link-active-bg: darken(@navbar-default-bg, 6.5%);
+@navbar-default-link-disabled-color: #ccc;
+@navbar-default-link-disabled-bg: transparent;
+
+// Navbar brand label
+@navbar-default-brand-color: @navbar-default-link-color;
+@navbar-default-brand-hover-color: darken(@navbar-default-brand-color, 10%);
+@navbar-default-brand-hover-bg: transparent;
+
+// Navbar toggle
+@navbar-default-toggle-hover-bg: #ddd;
+@navbar-default-toggle-icon-bar-bg: #888;
+@navbar-default-toggle-border-color: #ddd;
+
+// Inverted navbar
+// Reset inverted navbar basics
+@navbar-inverse-color: lighten(@gray-light, 15%);
+@navbar-inverse-bg: #222;
+@navbar-inverse-border: darken(@navbar-inverse-bg, 10%);
+
+// Inverted navbar links
+@navbar-inverse-link-color: lighten(@gray-light, 15%);
+@navbar-inverse-link-hover-color: #fff;
+@navbar-inverse-link-hover-bg: transparent;
+@navbar-inverse-link-active-color: @navbar-inverse-link-hover-color;
+@navbar-inverse-link-active-bg: darken(@navbar-inverse-bg, 10%);
+@navbar-inverse-link-disabled-color: #444;
+@navbar-inverse-link-disabled-bg: transparent;
+
+// Inverted navbar brand label
+@navbar-inverse-brand-color: @navbar-inverse-link-color;
+@navbar-inverse-brand-hover-color: #fff;
+@navbar-inverse-brand-hover-bg: transparent;
+
+// Inverted navbar toggle
+@navbar-inverse-toggle-hover-bg: #333;
+@navbar-inverse-toggle-icon-bar-bg: #fff;
+@navbar-inverse-toggle-border-color: #333;
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+@nav-link-padding: 10px 15px;
+@nav-link-hover-bg: @gray-lighter;
+
+@nav-disabled-link-color: @gray-light;
+@nav-disabled-link-hover-color: @gray-light;
+
+//== Tabs
+@nav-tabs-border-color: #ddd;
+
+@nav-tabs-link-hover-border-color: @gray-lighter;
+
+@nav-tabs-active-link-hover-bg: @body-bg;
+@nav-tabs-active-link-hover-color: @gray;
+@nav-tabs-active-link-hover-border-color: #ddd;
+
+@nav-tabs-justified-link-border-color: #ddd;
+@nav-tabs-justified-active-link-border-color: @body-bg;
+
+//== Pills
+@nav-pills-border-radius: @border-radius-base;
+@nav-pills-active-link-hover-bg: @component-active-bg;
+@nav-pills-active-link-hover-color: @component-active-color;
+
+//== Pagination
+//
+//##
+
+@pagination-color: @link-color;
+@pagination-bg: #fff;
+@pagination-border: #ddd;
+
+@pagination-hover-color: @link-hover-color;
+@pagination-hover-bg: @gray-lighter;
+@pagination-hover-border: #ddd;
+
+@pagination-active-color: #fff;
+@pagination-active-bg: @brand-primary;
+@pagination-active-border: @brand-primary;
+
+@pagination-disabled-color: @gray-light;
+@pagination-disabled-bg: #fff;
+@pagination-disabled-border: #ddd;
+
+//== Pager
+//
+//##
+
+@pager-bg: @pagination-bg;
+@pager-border: @pagination-border;
+@pager-border-radius: 15px;
+
+@pager-hover-bg: @pagination-hover-bg;
+
+@pager-active-bg: @pagination-active-bg;
+@pager-active-color: @pagination-active-color;
+
+@pager-disabled-color: @pagination-disabled-color;
+
+//== Jumbotron
+//
+//##
+
+@jumbotron-padding: 30px;
+@jumbotron-color: inherit;
+@jumbotron-bg: @gray-lighter;
+@jumbotron-heading-color: inherit;
+@jumbotron-font-size: ceil((@font-size-base * 1.5));
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+@state-success-text: #3c763d;
+@state-success-bg: #dff0d8;
+@state-success-border: darken(spin(@state-success-bg, -10), 5%);
+
+@state-info-text: #31708f;
+@state-info-bg: #d9edf7;
+@state-info-border: darken(spin(@state-info-bg, -10), 7%);
+
+@state-warning-text: #8a6d3b;
+@state-warning-bg: #fcf8e3;
+@state-warning-border: darken(spin(@state-warning-bg, -10), 5%);
+
+@state-danger-text: #a94442;
+@state-danger-bg: #f2dede;
+@state-danger-border: darken(spin(@state-danger-bg, -10), 5%);
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+@tooltip-max-width: 200px;
+//** Tooltip text color
+@tooltip-color: #fff;
+//** Tooltip background color
+@tooltip-bg: #000;
+@tooltip-opacity: .9;
+
+//** Tooltip arrow width
+@tooltip-arrow-width: 5px;
+//** Tooltip arrow color
+@tooltip-arrow-color: @tooltip-bg;
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+@popover-bg: #fff;
+//** Popover maximum width
+@popover-max-width: 276px;
+//** Popover border color
+@popover-border-color: rgba(0, 0, 0, .2);
+//** Popover fallback border color
+@popover-fallback-border-color: #ccc;
+
+//** Popover title background color
+@popover-title-bg: darken(@popover-bg, 3%);
+
+//** Popover arrow width
+@popover-arrow-width: 10px;
+//** Popover arrow color
+@popover-arrow-color: @popover-bg;
+
+//** Popover outer arrow width
+@popover-arrow-outer-width: (@popover-arrow-width + 1);
+//** Popover outer arrow color
+@popover-arrow-outer-color: fadein(@popover-border-color, 5%);
+//** Popover outer arrow fallback color
+@popover-arrow-outer-fallback-color: darken(@popover-fallback-border-color, 20%);
+
+//== Labels
+//
+//##
+
+//** Default label background color
+@label-default-bg: @gray-light;
+//** Primary label background color
+@label-primary-bg: @brand-primary;
+//** Success label background color
+@label-success-bg: @brand-success;
+//** Info label background color
+@label-info-bg: @brand-info;
+//** Warning label background color
+@label-warning-bg: @brand-warning;
+//** Danger label background color
+@label-danger-bg: @brand-danger;
+
+//** Default label text color
+@label-color: #fff;
+//** Default text color of a linked label
+@label-link-hover-color: #fff;
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+@modal-inner-padding: 15px;
+
+//** Padding applied to the modal title
+@modal-title-padding: 15px;
+//** Modal title line-height
+@modal-title-line-height: @line-height-base;
+
+//** Background color of modal content area
+@modal-content-bg: #fff;
+//** Modal content border color
+@modal-content-border-color: rgba(0, 0, 0, .2);
+//** Modal content border color **for IE8**
+@modal-content-fallback-border-color: #999;
+
+//** Modal backdrop background color
+@modal-backdrop-bg: #000;
+//** Modal backdrop opacity
+@modal-backdrop-opacity: .5;
+//** Modal header border color
+@modal-header-border-color: #e5e5e5;
+//** Modal footer border color
+@modal-footer-border-color: @modal-header-border-color;
+
+@modal-lg: 900px;
+@modal-md: 600px;
+@modal-sm: 300px;
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+@alert-padding: 15px;
+@alert-border-radius: @border-radius-base;
+@alert-link-font-weight: bold;
+
+@alert-success-bg: @state-success-bg;
+@alert-success-text: @state-success-text;
+@alert-success-border: @state-success-border;
+
+@alert-info-bg: @state-info-bg;
+@alert-info-text: @state-info-text;
+@alert-info-border: @state-info-border;
+
+@alert-warning-bg: @state-warning-bg;
+@alert-warning-text: @state-warning-text;
+@alert-warning-border: @state-warning-border;
+
+@alert-danger-bg: @state-danger-bg;
+@alert-danger-text: @state-danger-text;
+@alert-danger-border: @state-danger-border;
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+@progress-bg: #f5f5f5;
+//** Progress bar text color
+@progress-bar-color: #fff;
+//** Variable for setting rounded corners on progress bar.
+@progress-border-radius: @border-radius-base;
+
+//** Default progress bar color
+@progress-bar-bg: @brand-primary;
+//** Success progress bar color
+@progress-bar-success-bg: @brand-success;
+//** Warning progress bar color
+@progress-bar-warning-bg: @brand-warning;
+//** Danger progress bar color
+@progress-bar-danger-bg: @brand-danger;
+//** Info progress bar color
+@progress-bar-info-bg: @brand-info;
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+@list-group-bg: #fff;
+//** `.list-group-item` border color
+@list-group-border: #ddd;
+//** List group border radius
+@list-group-border-radius: @border-radius-base;
+
+//** Background color of single list items on hover
+@list-group-hover-bg: #f5f5f5;
+//** Text color of active list items
+@list-group-active-color: @component-active-color;
+//** Background color of active list items
+@list-group-active-bg: @component-active-bg;
+//** Border color of active list elements
+@list-group-active-border: @list-group-active-bg;
+//** Text color for content within active list items
+@list-group-active-text-color: lighten(@list-group-active-bg, 40%);
+
+//** Text color of disabled list items
+@list-group-disabled-color: @gray-light;
+//** Background color of disabled list items
+@list-group-disabled-bg: @gray-lighter;
+//** Text color for content within disabled list items
+@list-group-disabled-text-color: @list-group-disabled-color;
+
+@list-group-link-color: #555;
+@list-group-link-hover-color: @list-group-link-color;
+@list-group-link-heading-color: #333;
+
+//== Panels
+//
+//##
+
+@panel-bg: #fff;
+@panel-body-padding: 15px;
+@panel-heading-padding: 10px 15px;
+@panel-footer-padding: @panel-heading-padding;
+@panel-border-radius: @border-radius-base;
+
+//** Border color for elements within panels
+@panel-inner-border: #ddd;
+@panel-footer-bg: #f5f5f5;
+
+@panel-default-text: @gray-dark;
+@panel-default-border: #ddd;
+@panel-default-heading-bg: #f5f5f5;
+
+@panel-primary-text: #fff;
+@panel-primary-border: @brand-primary;
+@panel-primary-heading-bg: @brand-primary;
+
+@panel-success-text: @state-success-text;
+@panel-success-border: @state-success-border;
+@panel-success-heading-bg: @state-success-bg;
+
+@panel-info-text: @state-info-text;
+@panel-info-border: @state-info-border;
+@panel-info-heading-bg: @state-info-bg;
+
+@panel-warning-text: @state-warning-text;
+@panel-warning-border: @state-warning-border;
+@panel-warning-heading-bg: @state-warning-bg;
+
+@panel-danger-text: @state-danger-text;
+@panel-danger-border: @state-danger-border;
+@panel-danger-heading-bg: @state-danger-bg;
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+@thumbnail-padding: 4px;
+//** Thumbnail background color
+@thumbnail-bg: @body-bg;
+//** Thumbnail border color
+@thumbnail-border: #ddd;
+//** Thumbnail border radius
+@thumbnail-border-radius: @border-radius-base;
+
+//** Custom text color for thumbnail captions
+@thumbnail-caption-color: @text-color;
+//** Padding around the thumbnail caption
+@thumbnail-caption-padding: 9px;
+
+//== Wells
+//
+//##
+
+@well-bg: #f5f5f5;
+@well-border: darken(@well-bg, 7%);
+
+//== Badges
+//
+//##
+
+@badge-color: #fff;
+//** Linked badge text color on hover
+@badge-link-hover-color: #fff;
+@badge-bg: @gray-light;
+
+//** Badge text color in active nav link
+@badge-active-color: @link-color;
+//** Badge background color in active nav link
+@badge-active-bg: #fff;
+
+@badge-font-weight: bold;
+@badge-line-height: 1;
+@badge-border-radius: 10px;
+
+//== Breadcrumbs
+//
+//##
+
+@breadcrumb-padding-vertical: 8px;
+@breadcrumb-padding-horizontal: 15px;
+//** Breadcrumb background color
+@breadcrumb-bg: #f5f5f5;
+//** Breadcrumb text color
+@breadcrumb-color: #ccc;
+//** Text color of current page in the breadcrumb
+@breadcrumb-active-color: @gray-light;
+//** Textual separator for between breadcrumb elements
+@breadcrumb-separator: "/";
+
+//== Carousel
+//
+//##
+
+@carousel-text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+
+@carousel-control-color: #fff;
+@carousel-control-width: 15%;
+@carousel-control-opacity: .5;
+@carousel-control-font-size: 20px;
+
+@carousel-indicator-active-bg: #fff;
+@carousel-indicator-border-color: #fff;
+
+@carousel-caption-color: #fff;
+
+//== Close
+//
+//##
+
+@close-font-weight: bold;
+@close-color: #000;
+@close-text-shadow: 0 1px 0 #fff;
+
+//== Code
+//
+//##
+
+@code-color: #c7254e;
+@code-bg: #f9f2f4;
+
+@kbd-color: #fff;
+@kbd-bg: #333;
+
+@pre-bg: #f5f5f5;
+@pre-color: @gray-dark;
+@pre-border-color: #ccc;
+@pre-scrollable-max-height: 340px;
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+@component-offset-horizontal: 180px;
+//** Text muted color
+@text-muted: @gray-light;
+//** Abbreviations and acronyms border color
+@abbr-border-color: @gray-light;
+//** Headings small color
+@headings-small-color: @gray-light;
+//** Blockquote small color
+@blockquote-small-color: @gray-light;
+//** Blockquote font size
+@blockquote-font-size: (@font-size-base * 1.25);
+//** Blockquote border color
+@blockquote-border-color: @gray-lighter;
+//** Page header border color
+@page-header-border-color: @gray-lighter;
+//** Width of horizontal description list titles
+@dl-horizontal-offset: @component-offset-horizontal;
+//** Horizontal line color.
+@hr-border: @gray-lighter;

+ 23 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/.csslintrc

@@ -0,0 +1,23 @@
+{
+  "adjoining-classes": false,
+  "box-sizing": false,
+  "box-model": false,
+  "compatible-vendor-prefixes": false,
+  "floats": false,
+  "font-sizes": false,
+  "gradients": false,
+  "important": false,
+  "known-properties": false,
+  "outline-none": false,
+  "qualified-headings": false,
+  "regex-selectors": false,
+  "shorthand": false,
+  "text-indent": false,
+  "unique-headings": false,
+  "universal-selector": false,
+  "unqualified-attributes": false,
+  "ids": false,
+  "fallback-colors": false,
+  "vendor-prefix": false,
+  "import": false
+}

+ 36 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/404_500_errors.less

@@ -0,0 +1,36 @@
+/*
+ * Page: 400 and 500 error pages
+ * ------------------------------
+ */
+.error-page {
+  width: 600px;
+  margin: 20px auto 0 auto;
+  @media (max-width: @screen-sm-max) {
+    width: 100%;
+  }
+  //For the error number e.g: 404
+  > .headline {
+    float: left;
+    font-size: 100px;
+    font-weight: 300;
+    @media (max-width: @screen-sm-max) {
+      float: none;
+      text-align: center;
+    }
+  }
+  //For the message
+  > .error-content {
+    margin-left: 190px;
+    @media (max-width: @screen-sm-max) {
+      margin-left: 0;
+    }
+    > h3 {
+      font-weight: 300;
+      font-size: 25px;
+      @media (max-width: @screen-sm-max) {
+        text-align: center;
+      }
+    }
+    display: block;
+  }
+}

+ 61 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/AdminLTE.less

@@ -0,0 +1,61 @@
+/*!
+ *   AdminLTE v2.3.2
+ *   Author: Almsaeed Studio
+ *	 Website: Almsaeed Studio <http://almsaeedstudio.com>
+ *   License: Open source - MIT
+ *           Please visit http://opensource.org/licenses/MIT for more information
+!*/
+//google fonts
+@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);
+//Bootstrap Variables & Mixins
+//The core bootstrap code have not been modified. These files
+//are included only for reference.
+@import (reference) "../bootstrap-less/mixins.less";
+@import (reference) "../bootstrap-less/variables.less";
+//MISC
+//----
+@import "core.less";
+@import "variables.less";
+@import "mixins.less";
+//COMPONENTS
+//-----------
+@import "header.less";
+@import "sidebar.less";
+@import "sidebar-mini.less";
+@import "control-sidebar.less";
+@import "dropdown.less";
+@import "forms.less";
+@import "progress-bars.less";
+@import "small-box.less";
+@import "boxes.less";
+@import "info-box.less";
+@import "timeline.less";
+@import "buttons.less";
+@import "callout.less";
+@import "alerts.less";
+@import "navs.less";
+@import "products.less";
+@import "table.less";
+@import "labels.less";
+@import "direct-chat.less";
+@import "users-list.less";
+@import "carousel.less";
+@import "modal.less";
+@import "social-widgets.less";
+//PAGES
+//------
+@import "mailbox.less";
+@import "lockscreen.less";
+@import "login_and_register.less";
+@import "404_500_errors.less";
+@import "invoice.less";
+@import "profile";
+//Plugins
+//--------
+@import "bootstrap-social.less";
+@import "fullcalendar.less";
+@import "select2.less";
+//Miscellaneous
+//-------------
+@import "miscellaneous.less";
+@import "print.less";

+ 47 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/alerts.less

@@ -0,0 +1,47 @@
+/*
+ * Component: alert
+ * ----------------
+ */
+
+.alert {
+  .border-radius(3px);
+  h4 {
+    font-weight: 600;
+  }
+  .icon {
+    margin-right: 10px;
+  }
+  .close {
+    color: #000;
+    .opacity(.2);
+    &:hover {
+      .opacity(.5);
+    }
+  }
+  a {
+    color: #fff;
+    text-decoration: underline;
+  }
+}
+
+//Alert Variants
+.alert-success {
+  &:extend(.bg-green);
+  border-color: darken(@green, 5%);
+}
+
+.alert-danger,
+.alert-error {
+  &:extend(.bg-red);
+  border-color: darken(@red, 5%);
+}
+
+.alert-warning {
+  &:extend(.bg-yellow);
+  border-color: darken(@yellow, 5%);
+}
+
+.alert-info {
+  &:extend(.bg-aqua);
+  border-color: darken(@aqua, 5%);
+}

+ 172 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/bootstrap-social.less

@@ -0,0 +1,172 @@
+/*
+ * Social Buttons for Bootstrap
+ *
+ * Copyright 2013-2015 Panayiotis Lipiridis
+ * Licensed under the MIT License
+ *
+ * https://github.com/lipis/bootstrap-social
+ */
+
+@bs-height-base: (@line-height-computed + @padding-base-vertical * 2);
+@bs-height-lg: (floor(@font-size-large * @line-height-base) + @padding-large-vertical * 2);
+@bs-height-sm: (floor(@font-size-small * 1.5) + @padding-small-vertical * 2);
+@bs-height-xs: (floor(@font-size-small * 1.2) + @padding-small-vertical + 1);
+
+.btn-social {
+  position: relative;
+  padding-left: (@bs-height-base + @padding-base-horizontal);
+  text-align: left;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  > :first-child {
+    position: absolute;
+    left: 0;
+    top: 0;
+    bottom: 0;
+    width: @bs-height-base;
+    line-height: (@bs-height-base + 2);
+    font-size: 1.6em;
+    text-align: center;
+    border-right: 1px solid rgba(0, 0, 0, 0.2);
+  }
+  &.btn-lg {
+    padding-left: (@bs-height-lg + @padding-large-horizontal);
+    > :first-child {
+      line-height: @bs-height-lg;
+      width: @bs-height-lg;
+      font-size: 1.8em;
+    }
+  }
+  &.btn-sm {
+    padding-left: (@bs-height-sm + @padding-small-horizontal);
+    > :first-child {
+      line-height: @bs-height-sm;
+      width: @bs-height-sm;
+      font-size: 1.4em;
+    }
+  }
+  &.btn-xs {
+    padding-left: (@bs-height-xs + @padding-small-horizontal);
+    > :first-child {
+      line-height: @bs-height-xs;
+      width: @bs-height-xs;
+      font-size: 1.2em;
+    }
+  }
+}
+
+.btn-social-icon {
+  .btn-social;
+  height: (@bs-height-base + 2);
+  width: (@bs-height-base + 2);
+  padding: 0;
+  > :first-child {
+    border: none;
+    text-align: center;
+    width: 100%;
+  }
+  &.btn-lg {
+    height: @bs-height-lg;
+    width: @bs-height-lg;
+    padding-left: 0;
+    padding-right: 0;
+  }
+  &.btn-sm {
+    height: (@bs-height-sm + 2);
+    width: (@bs-height-sm + 2);
+    padding-left: 0;
+    padding-right: 0;
+  }
+  &.btn-xs {
+    height: (@bs-height-xs + 2);
+    width: (@bs-height-xs + 2);
+    padding-left: 0;
+    padding-right: 0;
+  }
+}
+
+.btn-social(@color-bg, @color: #fff) {
+  background-color: @color-bg;
+  .button-variant(@color, @color-bg, rgba(0, 0, 0, .2));
+}
+
+.btn-adn {
+  .btn-social(#d87a68);
+}
+
+.btn-bitbucket {
+  .btn-social(#205081);
+}
+
+.btn-dropbox {
+  .btn-social(#1087dd);
+}
+
+.btn-facebook {
+  .btn-social(#3b5998);
+}
+
+.btn-flickr {
+  .btn-social(#ff0084);
+}
+
+.btn-foursquare {
+  .btn-social(#f94877);
+}
+
+.btn-github {
+  .btn-social(#444444);
+}
+
+.btn-google {
+  .btn-social(#dd4b39);
+}
+
+.btn-instagram {
+  .btn-social(#3f729b);
+}
+
+.btn-linkedin {
+  .btn-social(#007bb6);
+}
+
+.btn-microsoft {
+  .btn-social(#2672ec);
+}
+
+.btn-openid {
+  .btn-social(#f7931e);
+}
+
+.btn-pinterest {
+  .btn-social(#cb2027);
+}
+
+.btn-reddit {
+  .btn-social(#eff7ff, #000);
+}
+
+.btn-soundcloud {
+  .btn-social(#ff5500);
+}
+
+.btn-tumblr {
+  .btn-social(#2c4762);
+}
+
+.btn-twitter {
+  .btn-social(#55acee);
+}
+
+.btn-vimeo {
+  .btn-social(#1ab7ea);
+}
+
+.btn-vk {
+  .btn-social(#587ea3);
+}
+
+.btn-yahoo {
+  .btn-social(#720e9e);
+}

+ 485 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/boxes.less

@@ -0,0 +1,485 @@
+/*
+ * Component: Box
+ * --------------
+ */
+.box {
+  position: relative;
+  .border-radius(@box-border-radius);
+  background: #ffffff;
+  border-top: 3px solid @box-default-border-top-color;
+  margin-bottom: 20px;
+  width: 100%;
+  box-shadow: @box-boxshadow;
+
+  // Box color variations
+  &.box-primary {
+    border-top-color: @light-blue;
+  }
+  &.box-info {
+    border-top-color: @aqua;
+  }
+  &.box-danger {
+    border-top-color: @red;
+  }
+  &.box-warning {
+    border-top-color: @yellow;
+  }
+  &.box-success {
+    border-top-color: @green;
+  }
+  &.box-default {
+    border-top-color: @gray;
+  }
+
+  // collapsed mode
+  &.collapsed-box {
+    .box-body,
+    .box-footer {
+      display: none;
+    }
+  }
+
+  .nav-stacked {
+    > li {
+      border-bottom: 1px solid @box-border-color;
+      margin: 0;
+      &:last-of-type {
+        border-bottom: none;
+      }
+    }
+  }
+
+  // fixed height to 300px
+  &.height-control {
+    .box-body {
+      max-height: 300px;
+      overflow: auto;
+    }
+  }
+
+  .border-right {
+    border-right: 1px solid @box-border-color;
+  }
+  .border-left {
+    border-left: 1px solid @box-border-color;
+  }
+
+  //SOLID BOX
+  //---------
+  //use this class to get a colored header and borders
+
+  &.box-solid {
+    border-top: 0;
+    > .box-header {
+      .btn.btn-default {
+        background: transparent;
+      }
+      .btn,
+      a {
+        &:hover {
+          background: rgba(0, 0, 0, 0.1);
+        }
+      }
+    }
+
+    // Box color variations
+    &.box-default {
+      .box-solid-variant(@gray, #444);
+    }
+    &.box-primary {
+      .box-solid-variant(@light-blue);
+    }
+    &.box-info {
+      .box-solid-variant(@aqua);
+    }
+    &.box-danger {
+      .box-solid-variant(@red);
+    }
+    &.box-warning {
+      .box-solid-variant(@yellow);
+    }
+    &.box-success {
+      .box-solid-variant(@green);
+    }
+
+    > .box-header > .box-tools .btn {
+      border: 0;
+      box-shadow: none;
+    }
+
+    // Fix font color for tiles
+    &[class*='bg'] {
+      > .box-header {
+        color: #fff;
+      }
+    }
+
+  }
+
+  //BOX GROUP
+  .box-group {
+    > .box {
+      margin-bottom: 5px;
+    }
+  }
+
+  // jQuery Knob in a box
+  .knob-label {
+    text-align: center;
+    color: #333;
+    font-weight: 100;
+    font-size: 12px;
+    margin-bottom: 0.3em;
+  }
+}
+
+.box,
+.overlay-wrapper {
+  // Box overlay for LOADING STATE effect
+  > .overlay,
+  > .loading-img {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+  }
+
+  .overlay {
+    z-index: 50;
+    background: rgba(255, 255, 255, 0.7);
+    .border-radius(@box-border-radius);
+    > .fa {
+      position: absolute;
+      top: 50%;
+      left: 50%;
+      margin-left: -15px;
+      margin-top: -15px;
+      color: #000;
+      font-size: 30px;
+    }
+  }
+
+  .overlay.dark {
+    background: rgba(0, 0, 0, 0.5);
+  }
+}
+
+//Add clearfix to header, body and footer
+.box-header,
+.box-body,
+.box-footer {
+  .clearfix();
+}
+
+//Box header
+.box-header {
+  color: #444;
+  display: block;
+  padding: @box-padding;
+  position: relative;
+
+  //Add bottom border
+  &.with-border {
+    border-bottom: 1px solid @box-border-color;
+    .collapsed-box & {
+      border-bottom: none;
+    }
+  }
+
+  //Icons and box title
+  > .fa,
+  > .glyphicon,
+  > .ion,
+  .box-title {
+    display: inline-block;
+    font-size: 18px;
+    margin: 0;
+    line-height: 1;
+  }
+  > .fa,
+  > .glyphicon,
+  > .ion {
+    margin-right: 5px;
+  }
+  > .box-tools {
+    position: absolute;
+    right: 10px;
+    top: 5px;
+    [data-toggle="tooltip"] {
+      position: relative;
+    }
+
+    &.pull-right {
+      .dropdown-menu {
+        right: 0;
+        left: auto;
+      }
+    }
+  }
+}
+
+//Box Tools Buttons
+.btn-box-tool {
+  padding: 5px;
+  font-size: 12px;
+  background: transparent;
+  color: darken(@box-default-border-top-color, 20%);
+  .open &,
+  &:hover {
+    color: darken(@box-default-border-top-color, 40%);
+  }
+  &.btn:active {
+    box-shadow: none;
+  }
+}
+
+//Box Body
+.box-body {
+  .border-radius(0; 0; @box-border-radius; @box-border-radius);
+  padding: @box-padding;
+  .no-header & {
+    .border-top-radius(@box-border-radius);
+  }
+  // Tables within the box body
+  > .table {
+    margin-bottom: 0;
+  }
+
+  // Calendar within the box body
+  .fc {
+    margin-top: 5px;
+  }
+
+  .full-width-chart {
+    margin: -19px;
+  }
+  &.no-padding .full-width-chart {
+    margin: -9px;
+  }
+
+  .box-pane {
+    .border-radius(0; 0; @box-border-radius; 0);
+  }
+  .box-pane-right {
+    .border-radius(0; 0; 0; @box-border-radius);
+  }
+}
+
+//Box footer
+.box-footer {
+  .border-radius(0; 0; @box-border-radius; @box-border-radius);
+  border-top: 1px solid @box-border-color;
+  padding: @box-padding;
+  background-color: @box-footer-bg;
+}
+
+.chart-legend {
+  &:extend(.list-unstyled);
+  margin: 10px 0;
+  > li {
+    @media (max-width: @screen-sm-max) {
+      float: left;
+      margin-right: 10px;
+    }
+  }
+}
+
+//Comment Box
+.box-comments {
+  background: #f7f7f7;
+  .box-comment {
+    .clearfix();
+    padding: 8px 0;
+    border-bottom: 1px solid #eee;
+    &:last-of-type {
+      border-bottom: 0;
+    }
+    &:first-of-type {
+      padding-top: 0;
+    }
+    img {
+      &:extend(.img-sm);
+      float: left;
+    }
+  }
+  .comment-text {
+    margin-left: 40px;
+    color: #555;
+  }
+  .username {
+    color: #444;
+    display: block;
+    font-weight: 600;
+  }
+  .text-muted {
+    font-weight: 400;
+    font-size: 12px;
+  }
+}
+
+//Widgets
+//-----------
+
+/* Widget: TODO LIST */
+
+.todo-list {
+  margin: 0;
+  padding: 0;
+  list-style: none;
+  overflow: auto;
+  // Todo list element
+  > li {
+    .border-radius(2px);
+    padding: 10px;
+    background: #f4f4f4;
+    margin-bottom: 2px;
+    border-left: 2px solid #e6e7e8;
+    color: #444;
+    &:last-of-type {
+      margin-bottom: 0;
+    }
+
+    > input[type='checkbox'] {
+      margin: 0 10px 0 5px;
+    }
+
+    .text {
+      display: inline-block;
+      margin-left: 5px;
+      font-weight: 600;
+    }
+
+    // Time labels
+    .label {
+      margin-left: 10px;
+      font-size: 9px;
+    }
+
+    // Tools and options box
+    .tools {
+      display: none;
+      float: right;
+      color: @red;
+      // icons
+      > .fa, > .glyphicon, > .ion {
+        margin-right: 5px;
+        cursor: pointer;
+      }
+
+    }
+    &:hover .tools {
+      display: inline-block;
+    }
+
+    &.done {
+      color: #999;
+      .text {
+        text-decoration: line-through;
+        font-weight: 500;
+      }
+
+      .label {
+        background: @gray !important;
+      }
+    }
+  }
+
+  // Color varaity
+  .danger {
+    border-left-color: @red;
+  }
+  .warning {
+    border-left-color: @yellow;
+  }
+  .info {
+    border-left-color: @aqua;
+  }
+  .success {
+    border-left-color: @green;
+  }
+  .primary {
+    border-left-color: @light-blue;
+  }
+
+  .handle {
+    display: inline-block;
+    cursor: move;
+    margin: 0 5px;
+  }
+
+}
+
+// END TODO WIDGET
+
+/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/
+.chat {
+  padding: 5px 20px 5px 10px;
+
+  .item {
+    .clearfix();
+    margin-bottom: 10px;
+    // The image
+    > img {
+      width: 40px;
+      height: 40px;
+      border: 2px solid transparent;
+      .border-radius(50%);
+    }
+
+    > .online {
+      border: 2px solid @green;
+    }
+    > .offline {
+      border: 2px solid @red;
+    }
+
+    // The message body
+    > .message {
+      margin-left: 55px;
+      margin-top: -40px;
+      > .name {
+        display: block;
+        font-weight: 600;
+      }
+    }
+
+    // The attachment
+    > .attachment {
+      .border-radius(@attachment-border-radius);
+      background: #f4f4f4;
+      margin-left: 65px;
+      margin-right: 15px;
+      padding: 10px;
+      > h4 {
+        margin: 0 0 5px 0;
+        font-weight: 600;
+        font-size: 14px;
+      }
+      > p, > .filename {
+        font-weight: 600;
+        font-size: 13px;
+        font-style: italic;
+        margin: 0;
+
+      }
+      .clearfix();
+    }
+  }
+
+}
+
+//END CHAT WIDGET
+
+//Input in box
+.box-input {
+  max-width: 200px;
+}
+
+//A fix for panels body text color when placed within
+// a modal
+.modal {
+  .panel-body {
+    color: #444;
+  }
+}

+ 168 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/buttons.less

@@ -0,0 +1,168 @@
+/*
+ * Component: Button
+ * -----------------
+ */
+
+.btn {
+  .border-radius(@btn-border-radius);
+  .box-shadow(@btn-boxshadow);
+  border: 1px solid transparent;
+
+  &.uppercase {
+    text-transform: uppercase
+  }
+
+  // Flat buttons
+  &.btn-flat {
+    .border-radius(0);
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+    border-width: 1px;
+  }
+
+  // Active state
+  &:active {
+    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+    -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+    box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+  }
+
+  &:focus {
+    outline: none;
+  }
+
+  // input file btn
+  &.btn-file {
+    position: relative;
+    overflow: hidden;
+    > input[type='file'] {
+      position: absolute;
+      top: 0;
+      right: 0;
+      min-width: 100%;
+      min-height: 100%;
+      font-size: 100px;
+      text-align: right;
+      .opacity(0);
+      outline: none;
+      background: white;
+      cursor: inherit;
+      display: block;
+    }
+  }
+}
+
+//Button color variations
+.btn-default {
+  background-color: #f4f4f4;
+  color: #444;
+  border-color: #ddd;
+  &:hover,
+  &:active,
+  &.hover {
+    background-color: darken(#f4f4f4, 5%);
+  }
+}
+
+.btn-primary {
+  background-color: @light-blue;
+  border-color: darken(@light-blue, 5%);
+  &:hover, &:active, &.hover {
+    background-color: darken(@light-blue, 5%);
+  }
+}
+
+.btn-success {
+  background-color: @green;
+  border-color: darken(@green, 5%);
+  &:hover, &:active, &.hover {
+    background-color: darken(@green, 5%);
+  }
+}
+
+.btn-info {
+  background-color: @aqua;
+  border-color: darken(@aqua, 5%);
+  &:hover, &:active, &.hover {
+    background-color: darken(@aqua, 5%);
+  }
+}
+
+.btn-danger {
+  background-color: @red;
+  border-color: darken(@red, 5%);
+  &:hover, &:active, &.hover {
+    background-color: darken(@red, 5%);
+  }
+}
+
+.btn-warning {
+  background-color: @yellow;
+  border-color: darken(@yellow, 5%);
+  &:hover, &:active, &.hover {
+    background-color: darken(@yellow, 5%);
+  }
+}
+
+.btn-outline {
+  border: 1px solid #fff;
+  background: transparent;
+  color: #fff;
+  &:hover,
+  &:focus,
+  &:active {
+    color: rgba(255, 255, 255, .7);
+    border-color: rgba(255, 255, 255, .7);
+  }
+}
+
+.btn-link {
+  .box-shadow(none);
+}
+
+//General .btn with bg class
+.btn[class*='bg-']:hover {
+  .box-shadow(inset 0 0 100px rgba(0, 0, 0, 0.2));
+}
+
+// Application buttons
+.btn-app {
+  .border-radius(3px);
+  position: relative;
+  padding: 15px 5px;
+  margin: 0 0 10px 10px;
+  min-width: 80px;
+  height: 60px;
+  text-align: center;
+  color: #666;
+  border: 1px solid #ddd;
+  background-color: #f4f4f4;
+  font-size: 12px;
+  //Icons within the btn
+  > .fa, > .glyphicon, > .ion {
+    font-size: 20px;
+    display: block;
+  }
+
+  &:hover {
+    background: #f4f4f4;
+    color: #444;
+    border-color: #aaa;
+  }
+
+  &:active, &:focus {
+    -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+    -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+    box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+  }
+
+  //The badge
+  > .badge {
+    position: absolute;
+    top: -3px;
+    right: -10px;
+    font-size: 10px;
+    font-weight: 400;
+  }
+}

+ 48 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/callout.less

@@ -0,0 +1,48 @@
+/*
+ * Component: Callout
+ * ------------------
+ */
+
+// Base styles (regardless of theme)
+.callout {
+  .border-radius(3px);
+  margin: 0 0 20px 0;
+  padding: 15px 30px 15px 15px;
+  border-left: 5px solid #eee;
+  a {
+    color: #fff;
+    text-decoration: underline;
+    &:hover {
+      color: #eee;
+    }
+  }
+  h4 {
+    margin-top: 0;
+    font-weight: 600;
+  }
+  p:last-child {
+    margin-bottom: 0;
+  }
+  code,
+  .highlight {
+    background-color: #fff;
+  }
+
+  // Themes for different contexts
+  &.callout-danger {
+    &:extend(.bg-red);
+    border-color: darken(@red, 10%);
+  }
+  &.callout-warning {
+    &:extend(.bg-yellow);
+    border-color: darken(@yellow, 10%);
+  }
+  &.callout-info {
+    &:extend(.bg-aqua);
+    border-color: darken(@aqua, 10%);
+  }
+  &.callout-success {
+    &:extend(.bg-green);
+    border-color: darken(@green, 10%);
+  }
+}

+ 18 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/carousel.less

@@ -0,0 +1,18 @@
+/*
+ * Component: Carousel
+ * -------------------
+ */
+.carousel-control {
+  &.left,
+  &.right {
+    background-image: none;
+  }
+  > .fa {
+    font-size: 40px;
+    position: absolute;
+    top: 50%;
+    z-index: 5;
+    display: inline-block;
+    margin-top: -20px;
+  }
+}

+ 289 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/control-sidebar.less

@@ -0,0 +1,289 @@
+/*
+ * Component: Control sidebar. By default, this is the right sidebar.
+ */
+//The sidebar's background control class
+//This is a hack to make the background visible while scrolling
+.control-sidebar-bg {
+  position: fixed;
+  z-index: 1000;
+  bottom: 0;
+}
+
+//Transitions
+.control-sidebar-bg,
+.control-sidebar {
+  top: 0;
+  right: -@control-sidebar-width;
+  width: @control-sidebar-width;
+  .transition(right @transition-speed ease-in-out);
+}
+
+//The sidebar
+.control-sidebar {
+  position: absolute;
+  padding-top: @navbar-height;
+  z-index: 1010;
+  //Fix position after header collapse
+  @media (max-width: @screen-sm) {
+    padding-top: @navbar-height + 50;
+  }
+  //Tab panes
+  > .tab-content {
+    padding: 10px 15px;
+  }
+  //Open state with slide over content effect
+  &.control-sidebar-open {
+    &,
+    + .control-sidebar-bg {
+      right: 0;
+    }
+  }
+}
+
+//Open without slide over content
+.control-sidebar-open {
+  .control-sidebar-bg,
+  .control-sidebar {
+    right: 0;
+  }
+  @media (min-width: @screen-sm) {
+    .content-wrapper,
+    .right-side,
+    .main-footer {
+      margin-right: @control-sidebar-width;
+    }
+  }
+}
+
+//Control sidebar tabs
+.nav-tabs.control-sidebar-tabs {
+  > li {
+    &:first-of-type > a {
+      &,
+      &:hover,
+      &:focus {
+        border-left-width: 0;
+      }
+    }
+    > a {
+      .border-radius(0);
+
+      //Hover and active states
+      &,
+      &:hover {
+        border-top: none;
+        border-right: none;
+        border-left: 1px solid transparent;
+        border-bottom: 1px solid transparent;
+      }
+      .icon {
+        font-size: 16px;
+      }
+    }
+    //Active state
+    &.active {
+      > a {
+        &,
+        &:hover,
+        &:focus,
+        &:active {
+          border-top: none;
+          border-right: none;
+          border-bottom: none;
+        }
+      }
+    }
+  }
+  //Remove responsiveness on small screens
+  @media (max-width: @screen-sm) {
+    display: table;
+    > li {
+      display: table-cell;
+    }
+  }
+}
+
+//Headings in the sidebar content
+.control-sidebar-heading {
+  font-weight: 400;
+  font-size: 16px;
+  padding: 10px 0;
+  margin-bottom: 10px;
+}
+
+//Subheadings
+.control-sidebar-subheading {
+  display: block;
+  font-weight: 400;
+  font-size: 14px;
+}
+
+//Control Sidebar Menu
+.control-sidebar-menu {
+  list-style: none;
+  padding: 0;
+  margin: 0 -15px;
+  > li > a {
+    .clearfix();
+    display: block;
+    padding: 10px 15px;
+    > .control-sidebar-subheading {
+      margin-top: 0;
+    }
+  }
+  .menu-icon {
+    float: left;
+    width: 35px;
+    height: 35px;
+    border-radius: 50%;
+    text-align: center;
+    line-height: 35px;
+  }
+  .menu-info {
+    margin-left: 45px;
+    margin-top: 3px;
+    > .control-sidebar-subheading {
+      margin: 0;
+    }
+    > p {
+      margin: 0;
+      font-size: 11px;
+    }
+  }
+  .progress {
+    margin: 0;
+  }
+}
+
+//Dark skin
+.control-sidebar-dark {
+  color: @sidebar-dark-color;
+  // Background
+  &,
+  + .control-sidebar-bg {
+    background: @sidebar-dark-bg;
+  }
+  // Sidebar tabs
+  .nav-tabs.control-sidebar-tabs {
+    border-bottom: darken(@sidebar-dark-bg, 3%);
+    > li {
+      > a {
+        background: darken(@sidebar-dark-bg, 5%);
+        color: @sidebar-dark-color;
+        //Hover and active states
+        &,
+        &:hover,
+        &:focus {
+          border-left-color: darken(@sidebar-dark-bg, 7%);
+          border-bottom-color: darken(@sidebar-dark-bg, 7%);
+        }
+        &:hover,
+        &:focus,
+        &:active {
+          background: darken(@sidebar-dark-bg, 3%);
+        }
+        &:hover {
+          color: #fff;
+        }
+      }
+      //Active state
+      &.active {
+        > a {
+          &,
+          &:hover,
+          &:focus,
+          &:active {
+            background: @sidebar-dark-bg;
+            color: #fff;
+          }
+        }
+      }
+    }
+  }
+  //Heading & subheading
+  .control-sidebar-heading,
+  .control-sidebar-subheading {
+    color: #fff;
+  }
+  //Sidebar list
+  .control-sidebar-menu {
+    > li {
+      > a {
+        &:hover {
+          background: @sidebar-dark-hover-bg;
+        }
+        .menu-info {
+          > p {
+            color: @sidebar-dark-color;
+          }
+        }
+      }
+    }
+  }
+}
+
+//Light skin
+.control-sidebar-light {
+  color: lighten(@sidebar-light-color, 10%);
+  // Background
+  &,
+  + .control-sidebar-bg {
+    background: @sidebar-light-bg;
+    border-left: 1px solid @gray;
+  }
+  // Sidebar tabs
+  .nav-tabs.control-sidebar-tabs {
+    border-bottom: @gray;
+    > li {
+      > a {
+        background: darken(@sidebar-light-bg, 5%);
+        color: @sidebar-light-color;
+        //Hover and active states
+        &,
+        &:hover,
+        &:focus {
+          border-left-color: @gray;
+          border-bottom-color: @gray;
+        }
+        &:hover,
+        &:focus,
+        &:active {
+          background: darken(@sidebar-light-bg, 3%);
+        }
+      }
+      //Active state
+      &.active {
+        > a {
+          &,
+          &:hover,
+          &:focus,
+          &:active {
+            background: @sidebar-light-bg;
+            color: #111;
+          }
+        }
+      }
+    }
+  }
+  //Heading & subheading
+  .control-sidebar-heading,
+  .control-sidebar-subheading {
+    color: #111;
+  }
+  //Sidebar list
+  .control-sidebar-menu {
+    margin-left: -14px;
+    > li {
+      > a {
+        &:hover {
+          background: @sidebar-light-hover-bg;
+        }
+        .menu-info {
+          > p {
+            color: lighten(@sidebar-light-color, 10%);
+          }
+        }
+      }
+    }
+  }
+}

+ 174 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/core.less

@@ -0,0 +1,174 @@
+/*
+ * Core: General Layout Style
+ * -------------------------
+ */
+html,
+body {
+  min-height: 100%;
+  .layout-boxed & {
+    height: 100%;
+  }
+}
+
+body {
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+  font-weight: 400;
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+/* Layout */
+.wrapper {
+  .clearfix();
+  min-height: 100%;
+  position: relative;
+  overflow: hidden;
+  .layout-boxed & {
+    max-width: 1250px;
+    margin: 0 auto;
+    min-height: 100%;
+    box-shadow: 0 0 8px rgba(0, 0, 0, 0.5);
+    position: relative;
+  }
+}
+
+.layout-boxed {
+  background: url('@{boxed-layout-bg-image-path}') repeat fixed;
+}
+
+/*
+ * Content Wrapper - contains the main content
+ * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper  ```
+ */
+.content-wrapper,
+.right-side,
+.main-footer {
+  //Using disposable variable to join statements with a comma
+  @transition-rule: @transition-speed @transition-fn,
+  margin @transition-speed @transition-fn;
+  .transition-transform(@transition-rule);
+  margin-left: @sidebar-width;
+  z-index: 820;
+  //Top nav layout
+  .layout-top-nav & {
+    margin-left: 0;
+  }
+  @media (max-width: @screen-xs-max) {
+    margin-left: 0;
+  }
+  //When opening the sidebar on large screens
+  .sidebar-collapse & {
+    @media (min-width: @screen-sm) {
+      margin-left: 0;
+    }
+  }
+  //When opening the sidebar on small screens
+  .sidebar-open & {
+    @media (max-width: @screen-xs-max) {
+      .translate(@sidebar-width, 0);
+    }
+  }
+}
+
+.content-wrapper,
+.right-side {
+  min-height: 100%;
+  background-color: @body-bg;
+  z-index: 800;
+}
+
+.main-footer {
+  background: #fff;
+  padding: 15px;
+  color: #444;
+  border-top: 1px solid @gray;
+}
+
+/* Fixed layout */
+.fixed {
+  .main-header,
+  .main-sidebar,
+  .left-side {
+    position: fixed;
+  }
+  .main-header {
+    top: 0;
+    right: 0;
+    left: 0;
+  }
+  .content-wrapper,
+  .right-side {
+    padding-top: 50px;
+    @media (max-width: @screen-header-collapse) {
+      padding-top: 100px;
+    }
+  }
+  &.layout-boxed {
+    .wrapper {
+      max-width: 100%;
+    }
+  }
+}
+
+body.hold-transition {
+  .content-wrapper,
+  .right-side,
+  .main-footer,
+  .main-sidebar,
+  .left-side,
+  .main-header > .navbar,
+  .main-header .logo {
+    /* Fix for IE */
+    .transition(none);
+  }
+}
+
+/* Content */
+.content {
+  min-height: 250px;
+  padding: 15px;
+  .container-fixed(@grid-gutter-width);
+}
+
+/* H1 - H6 font */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+  font-family: 'Source Sans Pro', sans-serif;
+}
+
+/* General Links */
+a {
+  color: @link-color;
+}
+
+a:hover,
+a:active,
+a:focus {
+  outline: none;
+  text-decoration: none;
+  color: @link-hover-color;
+}
+
+/* Page Header */
+.page-header {
+  margin: 10px 0 20px 0;
+  font-size: 22px;
+
+  > small {
+    color: #666;
+    display: block;
+    margin-top: 5px;
+  }
+}

+ 194 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/direct-chat.less

@@ -0,0 +1,194 @@
+/*
+ * Component: Direct Chat
+ * ----------------------
+ */
+.direct-chat {
+  .box-body {
+    .border-bottom-radius(0);
+    position: relative;
+    overflow-x: hidden;
+    padding: 0;
+  }
+  &.chat-pane-open {
+    .direct-chat-contacts {
+      .translate(0, 0);
+    }
+  }
+}
+
+.direct-chat-messages {
+  .translate(0, 0);
+  padding: 10px;
+  height: 250px;
+  overflow: auto;
+}
+
+.direct-chat-msg,
+.direct-chat-text {
+  display: block;
+}
+
+.direct-chat-msg {
+  .clearfix();
+  margin-bottom: 10px;
+}
+
+.direct-chat-messages,
+.direct-chat-contacts {
+  .transition-transform(.5s ease-in-out);
+}
+
+.direct-chat-text {
+  .border-radius(5px);
+  position: relative;
+  padding: 5px 10px;
+  background: @direct-chat-default-msg-bg;
+  border: 1px solid @direct-chat-default-msg-border-color;
+  margin: 5px 0 0 50px;
+  color: @direct-chat-default-font-color;
+
+  //Create the arrow
+  &:after,
+  &:before {
+    position: absolute;
+    right: 100%;
+    top: 15px;
+    border: solid transparent;
+    border-right-color: @direct-chat-default-msg-border-color;
+    content: ' ';
+    height: 0;
+    width: 0;
+    pointer-events: none;
+  }
+
+  &:after {
+    border-width: 5px;
+    margin-top: -5px;
+  }
+  &:before {
+    border-width: 6px;
+    margin-top: -6px;
+  }
+  .right & {
+    margin-right: 50px;
+    margin-left: 0;
+    &:after,
+    &:before {
+      right: auto;
+      left: 100%;
+      border-right-color: transparent;
+      border-left-color: @direct-chat-default-msg-border-color;
+    }
+  }
+}
+
+.direct-chat-img {
+  .border-radius(50%);
+  float: left;
+  width: 40px;
+  height: 40px;
+  .right & {
+    float: right;
+  }
+}
+
+.direct-chat-info {
+  display: block;
+  margin-bottom: 2px;
+  font-size: 12px;
+}
+
+.direct-chat-name {
+  font-weight: 600;
+}
+
+.direct-chat-timestamp {
+  color: #999;
+}
+
+//Direct chat contacts pane
+.direct-chat-contacts-open {
+  .direct-chat-contacts {
+    .translate(0, 0);
+  }
+}
+
+.direct-chat-contacts {
+  .translate(101%, 0);
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  height: 250px;
+  width: 100%;
+  background: #222d32;
+  color: #fff;
+  overflow: auto;
+}
+
+//Contacts list -- for displaying contacts in direct chat contacts pane
+.contacts-list {
+  &:extend(.list-unstyled);
+  > li {
+    .clearfix();
+    border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+    padding: 10px;
+    margin: 0;
+    &:last-of-type {
+      border-bottom: none;
+    }
+  }
+}
+
+.contacts-list-img {
+  .border-radius(50%);
+  width: 40px;
+  float: left;
+}
+
+.contacts-list-info {
+  margin-left: 45px;
+  color: #fff;
+}
+
+.contacts-list-name,
+.contacts-list-status {
+  display: block;
+}
+
+.contacts-list-name {
+  font-weight: 600;
+}
+
+.contacts-list-status {
+  font-size: 12px;
+}
+
+.contacts-list-date {
+  color: #aaa;
+  font-weight: normal;
+}
+
+.contacts-list-msg {
+  color: #999;
+}
+
+//Direct Chat Variants
+.direct-chat-danger {
+  .direct-chat-variant(@red);
+}
+
+.direct-chat-primary {
+  .direct-chat-variant(@light-blue);
+}
+
+.direct-chat-warning {
+  .direct-chat-variant(@yellow);
+}
+
+.direct-chat-info {
+  .direct-chat-variant(@aqua);
+}
+
+.direct-chat-success {
+  .direct-chat-variant(@green);
+}

+ 350 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/dropdown.less

@@ -0,0 +1,350 @@
+/*
+ * Component: Dropdown menus
+ * -------------------------
+ */
+
+/*Dropdowns in general*/
+.dropdown-menu {
+  box-shadow: none;
+  border-color: #eee;
+  > li > a {
+    color: #777;
+  }
+  > li > a > .glyphicon,
+  > li > a > .fa,
+  > li > a > .ion {
+    margin-right: 10px;
+  }
+  > li > a:hover {
+    background-color: lighten(@gray, 5%);
+    color: #333;
+  }
+  > .divider {
+    background-color: #eee;
+  }
+}
+
+//Navbar custom dropdown menu
+.navbar-nav > .notifications-menu,
+.navbar-nav > .messages-menu,
+.navbar-nav > .tasks-menu {
+  //fix width and padding
+  > .dropdown-menu {
+    > li {
+      position: relative;
+    }
+    width: 280px;
+    //Remove padding and margins
+    padding: 0 0 0 0;
+    margin: 0;
+    top: 100%;
+  }
+  //Define header class
+  > .dropdown-menu > li.header {
+    .border-radius(4px; 4px; 0; 0);
+    background-color: #ffffff;
+    padding: 7px 10px;
+    border-bottom: 1px solid #f4f4f4;
+    color: #444444;
+    font-size: 14px;
+  }
+
+  //Define footer class
+  > .dropdown-menu > li.footer > a {
+    .border-radius(0; 0; 4px; 4px);
+    font-size: 12px;
+    background-color: #fff;
+    padding: 7px 10px;
+    border-bottom: 1px solid #eeeeee;
+    color: #444 !important;
+    @media (max-width: @screen-sm-max) {
+      background: #fff !important;
+      color: #444 !important;
+    }
+    text-align: center;
+    //Hover state
+    &:hover {
+      text-decoration: none;
+      font-weight: normal;
+    }
+  }
+
+  //Clear inner menu padding and margins
+  > .dropdown-menu > li .menu {
+    max-height: 200px;
+    margin: 0;
+    padding: 0;
+    list-style: none;
+    overflow-x: hidden;
+    > li > a {
+      display: block;
+      white-space: nowrap; /* Prevent text from breaking */
+      border-bottom: 1px solid #f4f4f4;
+      // Hove state
+      &:hover {
+        background: #f4f4f4;
+        text-decoration: none;
+      }
+    }
+  }
+}
+
+//Notifications menu
+.navbar-nav > .notifications-menu {
+  > .dropdown-menu > li .menu {
+    // Links inside the menu
+    > li > a {
+      color: #444444;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      padding: 10px;
+      // Icons inside the menu
+      > .glyphicon,
+      > .fa,
+      > .ion {
+        width: 20px;
+      }
+    }
+
+  }
+}
+
+//Messages menu
+.navbar-nav > .messages-menu {
+  //Inner menu
+  > .dropdown-menu > li .menu {
+    // Messages menu item
+    > li > a {
+      margin: 0;
+      //line-height: 20px;
+      padding: 10px 10px;
+      // User image
+      > div > img {
+        margin: auto 10px auto auto;
+        width: 40px;
+        height: 40px;
+      }
+      // Message heading
+      > h4 {
+        padding: 0;
+        margin: 0 0 0 45px;
+        color: #444444;
+        font-size: 15px;
+        position: relative;
+        // Small for message time display
+        > small {
+          color: #999999;
+          font-size: 10px;
+          position: absolute;
+          top: 0;
+          right: 0;
+        }
+      }
+
+      > p {
+        margin: 0 0 0 45px;
+        font-size: 12px;
+        color: #888888;
+      }
+
+      .clearfix();
+
+    }
+
+  }
+}
+
+//Tasks menu
+.navbar-nav > .tasks-menu {
+  > .dropdown-menu > li .menu {
+    > li > a {
+      padding: 10px;
+
+      > h3 {
+        font-size: 14px;
+        padding: 0;
+        margin: 0 0 10px 0;
+        color: #666666;
+      }
+
+      > .progress {
+        padding: 0;
+        margin: 0;
+      }
+    }
+  }
+}
+
+//User menu
+.navbar-nav > .user-menu {
+  > .dropdown-menu {
+    .border-top-radius(0);
+    padding: 1px 0 0 0;
+    border-top-width: 0;
+    width: 280px;
+
+    &,
+    > .user-body {
+      .border-bottom-radius(4px);
+    }
+    // Header menu
+    > li.user-header {
+      height: 175px;
+      padding: 10px;
+      text-align: center;
+      // User image
+      > img {
+        z-index: 5;
+        height: 90px;
+        width: 90px;
+        border: 3px solid;
+        border-color: transparent;
+        border-color: rgba(255, 255, 255, 0.2);
+      }
+      > p {
+        z-index: 5;
+        color: #fff;
+        color: rgba(255, 255, 255, 0.8);
+        font-size: 17px;
+        //text-shadow: 2px 2px 3px #333333;
+        margin-top: 10px;
+        > small {
+          display: block;
+          font-size: 12px;
+        }
+      }
+    }
+
+    // Menu Body
+    > .user-body {
+      padding: 15px;
+      border-bottom: 1px solid #f4f4f4;
+      border-top: 1px solid #dddddd;
+      .clearfix();
+      a {
+        color: #444 !important;
+        @media (max-width: @screen-sm-max) {
+          background: #fff !important;
+          color: #444 !important;
+        }
+      }
+    }
+
+    // Menu Footer
+    > .user-footer {
+      background-color: #f9f9f9;
+      padding: 10px;
+      .clearfix();
+      .btn-default {
+        color: #666666;
+        &:hover {
+          @media (max-width: @screen-sm-max) {
+            background-color: #f9f9f9;
+          }
+        }
+      }
+    }
+  }
+  .user-image {
+    float: left;
+    width: 25px;
+    height: 25px;
+    border-radius: 50%;
+    margin-right: 10px;
+    margin-top: -2px;
+    @media (max-width: @screen-xs-max) {
+      float: none;
+      margin-right: 0;
+      margin-top: -8px;
+      line-height: 10px;
+    }
+  }
+}
+
+/* Add fade animation to dropdown menus by appending
+ the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/
+.open:not(.dropup) > .animated-dropdown-menu {
+  backface-visibility: visible !important;
+  .animation(flipInX .7s both);
+
+}
+
+@keyframes flipInX {
+  0% {
+    transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+    transition-timing-function: ease-in;
+    opacity: 0;
+  }
+
+  40% {
+    transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+    transition-timing-function: ease-in;
+  }
+
+  60% {
+    transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+    opacity: 1;
+  }
+
+  80% {
+    transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+  }
+
+  100% {
+    transform: perspective(400px);
+  }
+}
+
+@-webkit-keyframes flipInX {
+  0% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+    -webkit-transition-timing-function: ease-in;
+    opacity: 0;
+  }
+
+  40% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+    -webkit-transition-timing-function: ease-in;
+  }
+
+  60% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+    opacity: 1;
+  }
+
+  80% {
+    -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+  }
+
+  100% {
+    -webkit-transform: perspective(400px);
+  }
+}
+
+/* Fix dropdown menu in navbars */
+.navbar-custom-menu > .navbar-nav {
+  > li {
+    position: relative;
+    > .dropdown-menu {
+      position: absolute;
+      right: 0;
+      left: auto;
+    }
+  }
+}
+
+@media (max-width: @screen-sm-max) {
+  .navbar-custom-menu > .navbar-nav {
+    float: right;
+    > li {
+      position: static;
+      > .dropdown-menu {
+        position: absolute;
+        right: 5%;
+        left: auto;
+        border: 1px solid #ddd;
+        background: #fff;
+      }
+    }
+  }
+}

+ 96 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/forms.less

@@ -0,0 +1,96 @@
+/*
+ * Component: Form
+ * ---------------
+ */
+.form-control {
+  .border-radius(@input-radius);
+  box-shadow: none;
+  border-color: @gray;
+  &:focus {
+    border-color: @light-blue;
+    box-shadow: none;
+  }
+  &::-moz-placeholder,
+  &:-ms-input-placeholder,
+  &::-webkit-input-placeholder {
+    color: #bbb;
+    opacity: 1;
+  }
+
+  &:not(select) {
+    -webkit-appearance: none;
+    -moz-appearance: none;
+    appearance: none;
+  }
+}
+
+.form-group {
+  &.has-success {
+    label {
+      color: @green;
+    }
+    .form-control {
+      border-color: @green;
+      box-shadow: none;
+    }
+  }
+
+  &.has-warning {
+    label {
+      color: @yellow;
+    }
+    .form-control {
+      border-color: @yellow;
+      box-shadow: none;
+    }
+  }
+
+  &.has-error {
+    label {
+      color: @red;
+    }
+    .form-control {
+      border-color: @red;
+      box-shadow: none;
+    }
+  }
+}
+
+/* Input group */
+.input-group {
+  .input-group-addon {
+    .border-radius(@input-radius);
+    border-color: @gray;
+    background-color: #fff;
+  }
+}
+
+/* button groups */
+.btn-group-vertical {
+  .btn {
+    &.btn-flat:first-of-type, &.btn-flat:last-of-type {
+      .border-radius(0);
+    }
+  }
+}
+
+.icheck > label {
+  padding-left: 0;
+}
+
+/* support Font Awesome icons in form-control */
+.form-control-feedback.fa {
+  line-height: @input-height-base;
+}
+
+.input-lg + .form-control-feedback.fa,
+.input-group-lg + .form-control-feedback.fa,
+.form-group-lg .form-control + .form-control-feedback.fa {
+  line-height: @input-height-large;
+}
+
+.input-sm + .form-control-feedback.fa,
+.input-group-sm + .form-control-feedback.fa,
+.form-group-sm .form-control + .form-control-feedback.fa {
+  line-height: @input-height-small;
+}

+ 100 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/fullcalendar.less

@@ -0,0 +1,100 @@
+/*
+ * Plugin: Full Calendar
+ * ---------------------
+ */
+//Fullcalendar buttons
+.fc-button {
+  background: #f4f4f4;
+  background-image: none;
+  color: #444;
+  border-color: #ddd;
+  border-bottom-color: #ddd;
+  &:hover,
+  &:active,
+  &.hover {
+    background-color: #e9e9e9;
+  }
+}
+
+// Calendar title
+.fc-header-title h2 {
+  font-size: 15px;
+  line-height: 1.6em;
+  color: #666;
+  margin-left: 10px;
+}
+
+.fc-header-right {
+  padding-right: 10px;
+}
+
+.fc-header-left {
+  padding-left: 10px;
+}
+
+// Calendar table header cells
+.fc-widget-header {
+  background: #fafafa;
+}
+
+.fc-grid {
+  width: 100%;
+  border: 0;
+}
+
+.fc-widget-header:first-of-type,
+.fc-widget-content:first-of-type {
+  border-left: 0;
+  border-right: 0;
+}
+
+.fc-widget-header:last-of-type,
+.fc-widget-content:last-of-type {
+  border-right: 0;
+}
+
+.fc-toolbar {
+  padding: @box-padding;
+  margin: 0;
+}
+
+.fc-day-number {
+  font-size: 20px;
+  font-weight: 300;
+  padding-right: 10px;
+}
+
+.fc-color-picker {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  > li {
+    float: left;
+    font-size: 30px;
+    margin-right: 5px;
+    line-height: 30px;
+    .fa {
+      .transition-transform(linear .3s);
+      &:hover {
+        .rotate(30deg);
+      }
+    }
+  }
+}
+
+#add-new-event {
+  .transition(all linear .3s);
+}
+
+.external-event {
+  padding: 5px 10px;
+  font-weight: bold;
+  margin-bottom: 4px;
+  box-shadow: @box-boxshadow;
+  text-shadow: @box-boxshadow;
+  border-radius: @box-border-radius;
+  cursor: move;
+  &:hover {
+    box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2);
+  }
+}

+ 248 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/header.less

@@ -0,0 +1,248 @@
+/*
+ * Component: Main Header
+ * ----------------------
+ */
+
+.main-header {
+  position: relative;
+  max-height: 100px;
+  z-index: 1030;
+  //Navbar
+  > .navbar {
+    .transition(margin-left @transition-speed @transition-fn);
+    margin-bottom: 0;
+    margin-left: @sidebar-width;
+    border: none;
+    min-height: @navbar-height;
+    border-radius: 0;
+    .layout-top-nav & {
+      margin-left: 0;
+    }
+  }
+  //Navbar search text input
+  #navbar-search-input.form-control {
+    background: rgba(255, 255, 255, .2);
+    border-color: transparent;
+    &:focus,
+    &:active {
+      border-color: rgba(0, 0, 0, .1);
+      background: rgba(255, 255, 255, .9);
+    }
+    &::-moz-placeholder {
+      color: #ccc;
+      opacity: 1;
+    }
+    &:-ms-input-placeholder {
+      color: #ccc;
+    }
+    &::-webkit-input-placeholder {
+      color: #ccc;
+    }
+  }
+  //Navbar Right Menu
+  .navbar-custom-menu,
+  .navbar-right {
+    float: right;
+    @media (max-width: @screen-sm-max) {
+      a {
+        color: inherit;
+        background: transparent;
+      }
+    }
+  }
+  .navbar-right {
+    @media (max-width: @screen-header-collapse) {
+      float: none;
+      .navbar-collapse & {
+        margin: 7.5px -15px;
+      }
+
+      > li {
+        color: inherit;
+        border: 0;
+      }
+    }
+  }
+  //Navbar toggle button
+  .sidebar-toggle {
+    float: left;
+    background-color: transparent;
+    background-image: none;
+    padding: @navbar-padding-vertical @navbar-padding-horizontal;
+    //Add the fontawesome bars icon
+    font-family: fontAwesome;
+    &:before {
+      content: "\f0c9";
+    }
+    &:hover {
+      color: #fff;
+    }
+    &:focus,
+    &:active {
+      background: transparent;
+    }
+  }
+  .sidebar-toggle .icon-bar {
+    display: none;
+  }
+  //Navbar User Menu
+  .navbar .nav > li.user > a {
+    > .fa,
+    > .glyphicon,
+    > .ion {
+      margin-right: 5px;
+    }
+  }
+
+  //Labels in navbar
+  .navbar .nav > li > a > .label {
+    position: absolute;
+    top: 9px;
+    right: 7px;
+    text-align: center;
+    font-size: 9px;
+    padding: 2px 3px;
+    line-height: .9;
+  }
+
+  //Logo bar
+  .logo {
+    .transition(width @transition-speed @transition-fn);
+    display: block;
+    float: left;
+    height: @navbar-height;
+    font-size: 20px;
+    line-height: 50px;
+    text-align: center;
+    width: @sidebar-width;
+    font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+    padding: 0 15px;
+    font-weight: 300;
+    overflow: hidden;
+    //Add support to sidebar mini by allowing the user to create
+    //2 logo designs. mini and lg
+    .logo-lg {
+      //should be visibile when sidebar isn't collapsed
+      display: block;
+    }
+    .logo-mini {
+      display: none;
+    }
+  }
+  //Navbar Brand. Alternative logo with layout-top-nav
+  .navbar-brand {
+    color: #fff;
+  }
+}
+
+// Content Header
+.content-header {
+  position: relative;
+  padding: 15px 15px 0 15px;
+  // Header Text
+  > h1 {
+    margin: 0;
+    font-size: 24px;
+    > small {
+      font-size: 15px;
+      display: inline-block;
+      padding-left: 4px;
+      font-weight: 300;
+    }
+  }
+
+  > .breadcrumb {
+    float: right;
+    background: transparent;
+    margin-top: 0;
+    margin-bottom: 0;
+    font-size: 12px;
+    padding: 7px 5px;
+    position: absolute;
+    top: 15px;
+    right: 10px;
+    .border-radius(2px);
+    > li > a {
+      color: #444;
+      text-decoration: none;
+      display: inline-block;
+      > .fa, > .glyphicon, > .ion {
+        margin-right: 5px;
+      }
+    }
+    > li + li:before {
+      content: '>\00a0';
+    }
+  }
+
+  @media (max-width: @screen-sm-max) {
+    > .breadcrumb {
+      position: relative;
+      margin-top: 5px;
+      top: 0;
+      right: 0;
+      float: none;
+      background: @gray;
+      padding-left: 10px;
+      li:before {
+        color: darken(@gray, 20%);
+      }
+    }
+  }
+}
+
+.navbar-toggle {
+  color: #fff;
+  border: 0;
+  margin: 0;
+  padding: @navbar-padding-vertical @navbar-padding-horizontal;
+}
+
+//Control navbar scaffolding on x-small screens
+@media (max-width: @screen-sm-max) {
+  .navbar-custom-menu .navbar-nav > li {
+    float: left;
+  }
+
+  //Dont't let links get full width
+  .navbar-custom-menu .navbar-nav {
+    margin: 0;
+    float: left;
+  }
+
+  .navbar-custom-menu .navbar-nav > li > a {
+    padding-top: 15px;
+    padding-bottom: 15px;
+    line-height: 20px;
+  }
+}
+
+// Collapse header
+@media (max-width: @screen-header-collapse) {
+  .main-header {
+    position: relative;
+    .logo,
+    .navbar {
+      width: 100%;
+      float: none;
+    }
+    .navbar {
+      margin: 0;
+    }
+    .navbar-custom-menu {
+      float: right;
+    }
+  }
+}
+
+.navbar-collapse.pull-left {
+  @media (max-width: @screen-sm-max) {
+    float: none !important;
+    + .navbar-custom-menu {
+      display: block;
+      position: absolute;
+      top: 0;
+      right: 40px;
+    }
+  }
+}

+ 75 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/info-box.less

@@ -0,0 +1,75 @@
+/*
+ * Component: Info Box
+ * -------------------
+ */
+.info-box {
+  display: block;
+  min-height: 90px;
+  background: #fff;
+  width: 100%;
+  box-shadow: @box-boxshadow;
+  .border-radius(2px);
+  margin-bottom: 15px;
+  small {
+    font-size: 14px;
+  }
+  .progress {
+    background: rgba(0, 0, 0, .2);
+    margin: 5px -10px 5px -10px;
+    height: 2px;
+    &,
+    & .progress-bar {
+      .border-radius(0);
+    }
+    .progress-bar {
+      background: #fff;
+    }
+  }
+}
+
+.info-box-icon {
+  .border-radius(2px; 0; 2px; 0);
+  display: block;
+  float: left;
+  height: 90px;
+  width: 90px;
+  text-align: center;
+  font-size: 45px;
+  line-height: 90px;
+  background: rgba(0, 0, 0, 0.2);
+  > img {
+    max-width: 100%;
+  }
+}
+
+.info-box-content {
+  padding: 5px 10px;
+  margin-left: 90px;
+}
+
+.info-box-number {
+  display: block;
+  font-weight: bold;
+  font-size: 18px;
+}
+
+.progress-description,
+.info-box-text {
+  display: block;
+  font-size: 14px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+
+.info-box-text {
+  text-transform: uppercase;
+}
+
+.info-box-more {
+  display: block;
+}
+
+.progress-description {
+  margin: 0;
+}

+ 16 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/invoice.less

@@ -0,0 +1,16 @@
+/*
+ * Page: Invoice
+ * -------------
+ */
+
+.invoice {
+  position: relative;
+  background: #fff;
+  border: 1px solid #f4f4f4;
+  padding: 20px;
+  margin: 10px 25px;
+}
+
+.invoice-title {
+  margin-top: 0;
+}

+ 28 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/labels.less

@@ -0,0 +1,28 @@
+/*
+ * Component: Label
+ * ----------------
+ */
+.label-default {
+  background-color: @gray;
+  color: #444;
+}
+
+.label-danger {
+  &:extend(.bg-red);
+}
+
+.label-info {
+  &:extend(.bg-aqua);
+}
+
+.label-warning {
+  &:extend(.bg-yellow);
+}
+
+.label-primary {
+  &:extend(.bg-light-blue);
+}
+
+.label-success {
+  &:extend(.bg-green);
+}

+ 73 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/lockscreen.less

@@ -0,0 +1,73 @@
+/*
+ * Page: Lock Screen
+ * -----------------
+ */
+/* ADD THIS CLASS TO THE <BODY> TAG */
+.lockscreen {
+  background: @gray;
+}
+
+.lockscreen-logo {
+  font-size: 35px;
+  text-align: center;
+  margin-bottom: 25px;
+  font-weight: 300;
+  a {
+    color: #444;
+  }
+}
+
+.lockscreen-wrapper {
+  max-width: 400px;
+  margin: 0 auto;
+  margin-top: 10%;
+}
+
+/* User name [optional] */
+.lockscreen .lockscreen-name {
+  text-align: center;
+  font-weight: 600;
+}
+
+/* Will contain the image and the sign in form */
+.lockscreen-item {
+  .border-radius(4px);
+  padding: 0;
+  background: #fff;
+  position: relative;
+  margin: 10px auto 30px auto;
+  width: 290px;
+}
+
+/* User image */
+.lockscreen-image {
+  .border-radius(50%);
+  position: absolute;
+  left: -10px;
+  top: -25px;
+  background: #fff;
+  padding: 5px;
+  z-index: 10;
+  > img {
+    .border-radius(50%);
+    width: 70px;
+    height: 70px;
+  }
+}
+
+/* Contains the password input and the login button */
+.lockscreen-credentials {
+  margin-left: 70px;
+  .form-control {
+    border: 0;
+  }
+  .btn {
+    background-color: #fff;
+    border: 0;
+    padding: 0 10px;
+  }
+}
+
+.lockscreen-footer {
+  margin-top: 10px;
+}

+ 52 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/login_and_register.less

@@ -0,0 +1,52 @@
+/*
+ * Page: Login & Register
+ * ----------------------
+ */
+
+.login-logo,
+.register-logo {
+  font-size: 35px;
+  text-align: center;
+  margin-bottom: 25px;
+  font-weight: 300;
+  a {
+    color: #444;
+  }
+}
+
+.login-page,
+.register-page {
+  background: @gray;
+}
+
+.login-box,
+.register-box {
+  width: 360px;
+  margin: 7% auto;
+  @media (max-width: @screen-sm) {
+    width: 90%;
+    margin-top: 20px;
+  }
+}
+
+.login-box-body,
+.register-box-body {
+  background: #fff;
+  padding: 20px;
+  border-top: 0;
+  color: #666;
+  .form-control-feedback {
+    color: #777;
+  }
+}
+
+.login-box-msg,
+.register-box-msg {
+  margin: 0;
+  text-align: center;
+  padding: 0 20px 20px 20px;
+}
+
+.social-auth-links {
+  margin: 10px 0;
+}

+ 88 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/mailbox.less

@@ -0,0 +1,88 @@
+/*
+ * Page: Mailbox
+ * -------------
+ */
+.mailbox-messages {
+  > .table {
+    margin: 0;
+  }
+}
+
+.mailbox-controls {
+  padding: 5px;
+  &.with-border {
+    border-bottom: 1px solid @box-border-color;
+  }
+}
+
+.mailbox-read-info {
+  border-bottom: 1px solid @box-border-color;
+  padding: 10px;
+  h3 {
+    font-size: 20px;
+    margin: 0;
+  }
+  h5 {
+    margin: 0;
+    padding: 5px 0 0 0;
+  }
+}
+
+.mailbox-read-time {
+  color: #999;
+  font-size: 13px;
+}
+
+.mailbox-read-message {
+  padding: 10px;
+}
+
+.mailbox-attachments {
+  &:extend(.list-unstyled);
+  li {
+    float: left;
+    width: 200px;
+    border: 1px solid #eee;
+    margin-bottom: 10px;
+    margin-right: 10px;
+  }
+}
+
+.mailbox-attachment-name {
+  font-weight: bold;
+  color: #666;
+}
+
+.mailbox-attachment-icon,
+.mailbox-attachment-info,
+.mailbox-attachment-size {
+  display: block;
+}
+
+.mailbox-attachment-info {
+  padding: 10px;
+  background: #f4f4f4;
+}
+
+.mailbox-attachment-size {
+  color: #999;
+  font-size: 12px;
+}
+
+.mailbox-attachment-icon {
+  text-align: center;
+  font-size: 65px;
+  color: #666;
+  padding: 20px 10px;
+  &.has-img {
+    padding: 0;
+    > img {
+      max-width: 100%;
+      height: auto;
+    }
+  }
+}
+
+.mailbox-attachment-close {
+  &:extend(.close);
+}

+ 606 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/miscellaneous.less

@@ -0,0 +1,606 @@
+/*
+ * General: Miscellaneous
+ * ----------------------
+ */
+// 10px padding and margins
+.pad {
+  padding: 10px;
+}
+
+.margin {
+  margin: 10px;
+}
+
+.margin-bottom {
+  margin-bottom: 20px;
+}
+
+.margin-bottom-none {
+  margin-bottom: 0;
+}
+
+.margin-r-5 {
+  margin-right: 5px;
+}
+
+// Display inline
+.inline {
+  display: inline;
+}
+
+// Description Blocks
+.description-block {
+  display: block;
+  margin: 10px 0;
+  text-align: center;
+  &.margin-bottom {
+    margin-bottom: 25px;
+  }
+  > .description-header {
+    margin: 0;
+    padding: 0;
+    font-weight: 600;
+    font-size: 16px;
+  }
+  > .description-text {
+    text-transform: uppercase;
+  }
+}
+
+// Background colors
+.bg-red,
+.bg-yellow,
+.bg-aqua,
+.bg-blue,
+.bg-light-blue,
+.bg-green,
+.bg-navy,
+.bg-teal,
+.bg-olive,
+.bg-lime,
+.bg-orange,
+.bg-fuchsia,
+.bg-purple,
+.bg-maroon,
+.bg-black,
+.bg-red-active,
+.bg-yellow-active,
+.bg-aqua-active,
+.bg-blue-active,
+.bg-light-blue-active,
+.bg-green-active,
+.bg-navy-active,
+.bg-teal-active,
+.bg-olive-active,
+.bg-lime-active,
+.bg-orange-active,
+.bg-fuchsia-active,
+.bg-purple-active,
+.bg-maroon-active,
+.bg-black-active {
+  color: #fff !important;
+}
+
+.bg-gray {
+  color: #000;
+  background-color: @gray !important;
+}
+
+.bg-gray-light {
+  background-color: #f7f7f7;
+}
+
+.bg-black {
+  background-color: @black !important;
+}
+
+.bg-red {
+  background-color: @red !important;
+}
+
+.bg-yellow {
+  background-color: @yellow !important;
+}
+
+.bg-aqua {
+  background-color: @aqua !important;
+}
+
+.bg-blue {
+  background-color: @blue !important;
+}
+
+.bg-light-blue {
+  background-color: @light-blue !important;
+}
+
+.bg-green {
+  background-color: @green !important;
+}
+
+.bg-navy {
+  background-color: @navy !important;
+}
+
+.bg-teal {
+  background-color: @teal !important;
+}
+
+.bg-olive {
+  background-color: @olive !important;
+}
+
+.bg-lime {
+  background-color: @lime !important;
+}
+
+.bg-orange {
+  background-color: @orange !important;
+}
+
+.bg-fuchsia {
+  background-color: @fuchsia !important;
+}
+
+.bg-purple {
+  background-color: @purple !important;
+}
+
+.bg-maroon {
+  background-color: @maroon !important;
+}
+
+//Set of Active Background Colors
+.bg-gray-active {
+  color: #000;
+  background-color: darken(@gray, 10%) !important;
+}
+
+.bg-black-active {
+  background-color: darken(@black, 10%) !important;
+}
+
+.bg-red-active {
+  background-color: darken(@red , 6%) !important;
+}
+
+.bg-yellow-active {
+  background-color: darken(@yellow , 6%) !important;
+}
+
+.bg-aqua-active {
+  background-color: darken(@aqua , 6%) !important;
+}
+
+.bg-blue-active {
+  background-color: darken(@blue , 10%) !important;
+}
+
+.bg-light-blue-active {
+  background-color: darken(@light-blue , 6%) !important;
+}
+
+.bg-green-active {
+  background-color: darken(@green , 5%) !important;
+}
+
+.bg-navy-active {
+  background-color: darken(@navy , 2%) !important;
+}
+
+.bg-teal-active {
+  background-color: darken(@teal , 5%) !important;
+}
+
+.bg-olive-active {
+  background-color: darken(@olive , 5%) !important;
+}
+
+.bg-lime-active {
+  background-color: darken(@lime , 5%) !important;
+}
+
+.bg-orange-active {
+  background-color: darken(@orange , 5%) !important;
+}
+
+.bg-fuchsia-active {
+  background-color: darken(@fuchsia , 5%) !important;
+}
+
+.bg-purple-active {
+  background-color: darken(@purple , 5%) !important;
+}
+
+.bg-maroon-active {
+  background-color: darken(@maroon , 3%) !important;
+}
+
+//Disabled!
+[class^="bg-"].disabled {
+  .opacity(.65);
+}
+
+// Text colors
+.text-red {
+  color: @red !important;
+}
+
+.text-yellow {
+  color: @yellow !important;
+}
+
+.text-aqua {
+  color: @aqua !important;
+}
+
+.text-blue {
+  color: @blue !important;
+}
+
+.text-black {
+  color: @black !important;
+}
+
+.text-light-blue {
+  color: @light-blue !important;
+}
+
+.text-green {
+  color: @green !important;
+}
+
+.text-gray {
+  color: @gray !important;
+}
+
+.text-navy {
+  color: @navy !important;
+}
+
+.text-teal {
+  color: @teal !important;
+}
+
+.text-olive {
+  color: @olive !important;
+}
+
+.text-lime {
+  color: @lime !important;
+}
+
+.text-orange {
+  color: @orange !important;
+}
+
+.text-fuchsia {
+  color: @fuchsia !important;
+}
+
+.text-purple {
+  color: @purple !important;
+}
+
+.text-maroon {
+  color: @maroon !important;
+}
+
+.link-muted {
+  color: darken(@gray, 30%);
+  &:hover,
+  &:focus {
+    color: darken(@gray, 40%);
+  }
+}
+
+.link-black {
+  color: #666;
+  &:hover,
+  &:focus {
+    color: #999;
+  }
+}
+
+// Hide elements by display none only
+.hide {
+  display: none !important;
+}
+
+// Remove borders
+.no-border {
+  border: 0 !important;
+}
+
+// Remove padding
+.no-padding {
+  padding: 0 !important;
+}
+
+// Remove margins
+.no-margin {
+  margin: 0 !important;
+}
+
+// Remove box shadow
+.no-shadow {
+  box-shadow: none !important;
+}
+
+// Unstyled List
+.list-unstyled {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+
+.list-group-unbordered {
+  > .list-group-item {
+    border-left: 0;
+    border-right: 0;
+    border-radius: 0;
+    padding-left: 0;
+    padding-right: 0;
+  }
+}
+
+// Remove border radius
+.flat {
+  .border-radius(0) !important;
+}
+
+.text-bold {
+  &, &.table td, &.table th {
+    font-weight: 700;
+  }
+}
+
+.text-sm {
+  font-size: 12px;
+}
+
+// _fix for sparkline tooltip
+.jqstooltip {
+  padding: 5px !important;
+  width: auto !important;
+  height: auto !important;
+}
+
+// Gradient Background colors
+.bg-teal-gradient {
+  .gradient(@teal; @teal; lighten(@teal, 16%)) !important;
+  color: #fff;
+}
+
+.bg-light-blue-gradient {
+  .gradient(@light-blue; @light-blue; lighten(@light-blue, 12%)) !important;
+  color: #fff;
+}
+
+.bg-blue-gradient {
+  .gradient(@blue; @blue; lighten(@blue, 7%)) !important;
+  color: #fff;
+}
+
+.bg-aqua-gradient {
+  .gradient(@aqua; @aqua; lighten(@aqua, 7%)) !important;
+  color: #fff;
+}
+
+.bg-yellow-gradient {
+  .gradient(@yellow; @yellow; lighten(@yellow, 16%)) !important;
+  color: #fff;
+}
+
+.bg-purple-gradient {
+  .gradient(@purple; @purple; lighten(@purple, 16%)) !important;
+  color: #fff;
+}
+
+.bg-green-gradient {
+  .gradient(@green; @green; lighten(@green, 7%)) !important;
+  color: #fff;
+}
+
+.bg-red-gradient {
+  .gradient(@red; @red; lighten(@red, 10%)) !important;
+  color: #fff;
+}
+
+.bg-black-gradient {
+  .gradient(@black; @black; lighten(@black, 10%)) !important;
+  color: #fff;
+}
+
+.bg-maroon-gradient {
+  .gradient(@maroon; @maroon; lighten(@maroon, 10%)) !important;
+  color: #fff;
+}
+
+//Description Block Extension
+.description-block {
+  .description-icon {
+    font-size: 16px;
+  }
+}
+
+//Remove top padding
+.no-pad-top {
+  padding-top: 0;
+}
+
+//Make position static
+.position-static {
+  position: static !important;
+}
+
+//List utility classes
+.list-header {
+  font-size: 15px;
+  padding: 10px 4px;
+  font-weight: bold;
+  color: #666;
+}
+
+.list-seperator {
+  height: 1px;
+  background: @box-border-color;
+  margin: 15px 0 9px 0;
+}
+
+.list-link {
+  > a {
+    padding: 4px;
+    color: #777;
+    &:hover {
+      color: #222;
+    }
+  }
+}
+
+//Light font weight
+.font-light {
+  font-weight: 300;
+}
+
+//User block
+.user-block {
+  .clearfix();
+  img {
+    width: 40px;
+    height: 40px;
+    float: left;
+  }
+  .username,
+  .description,
+  .comment {
+    display: block;
+    margin-left: 50px;
+  }
+  .username {
+    font-size: 16px;
+    font-weight: 600;
+  }
+  .description {
+    color: #999;
+    font-size: 13px;
+  }
+  &.user-block-sm {
+    img {
+      &:extend(.img-sm);
+    }
+    .username,
+    .description,
+    .comment {
+      margin-left: 40px;
+    }
+    .username {
+      font-size: 14px;
+    }
+  }
+}
+
+//Image sizes
+.img-sm,
+.img-md,
+.img-lg {
+  float: left;
+}
+
+.img-sm {
+  width: 30px !important;
+  height: 30px !important;
+  + .img-push {
+    margin-left: 40px;
+  }
+}
+
+.img-md {
+  width: 60px;
+  height: 60px;
+  + .img-push {
+    margin-left: 70px;
+  }
+}
+
+.img-lg {
+  width: 100px;
+  height: 100px;
+  + .img-push {
+    margin-left: 110px;
+  }
+}
+
+// Image bordered
+.img-bordered {
+  border: 3px solid @gray;
+  padding: 3px;
+}
+
+.img-bordered-sm {
+  border: 2px solid @gray;
+  padding: 2px;
+}
+
+//General attachemnt block
+.attachment-block {
+  border: 1px solid @box-border-color;
+  padding: 5px;
+  margin-bottom: 10px;
+  background: #f7f7f7;
+
+  .attachment-img {
+    max-width: 100px;
+    max-height: 100px;
+    height: auto;
+    float: left;
+  }
+  .attachment-pushed {
+    margin-left: 110px;
+  }
+  .attachment-heading {
+    margin: 0;
+  }
+  .attachment-text {
+    color: #555;
+  }
+}
+
+.connectedSortable {
+  min-height: 100px;
+}
+
+.ui-helper-hidden-accessible {
+  border: 0;
+  clip: rect(0 0 0 0);
+  height: 1px;
+  margin: -1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px;
+}
+
+.sort-highlight {
+  background: #f4f4f4;
+  border: 1px dashed #ddd;
+  margin-bottom: 10px;
+}
+
+.full-opacity-hover {
+  .opacity(.65);
+  &:hover {
+    .opacity(1);
+  }
+}
+
+// Charts
+.chart {
+  position: relative;
+  overflow: hidden;
+  width: 100%;
+  svg,
+  canvas {
+    width: 100% !important;
+  }
+}

+ 313 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/mixins.less

@@ -0,0 +1,313 @@
+//AdminLTE mixins
+//===============
+
+//Changes the color and the hovering properties of the navbar
+.navbar-variant(@color; @font-color: rgba(255, 255, 255, 0.8); @hover-color: #f6f6f6; @hover-bg: rgba(0, 0, 0, 0.1)) {
+  background-color: @color;
+  //Navbar links
+  .nav > li > a {
+    color: @font-color;
+  }
+
+  .nav > li > a:hover,
+  .nav > li > a:active,
+  .nav > li > a:focus,
+  .nav .open > a,
+  .nav .open > a:hover,
+  .nav .open > a:focus,
+  .nav > .active > a {
+    background: @hover-bg;
+    color: @hover-color;
+  }
+
+  //Add color to the sidebar toggle button
+  .sidebar-toggle {
+    color: @font-color;
+    &:hover {
+      color: @hover-color;
+      background: @hover-bg;
+    }
+  }
+}
+
+//Logo color variation
+.logo-variant(@bg-color; @color: #fff; @border-bottom-color: transparent; @border-bottom-width: 0) {
+  background-color: @bg-color;
+  color: @color;
+  border-bottom: @border-bottom-width solid @border-bottom-color;
+
+  &:hover {
+    background-color: darken(@bg-color, 1%);
+  }
+}
+
+//Box solid color variantion creator
+.box-solid-variant(@color; @text-color: #fff) {
+  border: 1px solid @color;
+  > .box-header {
+    color: @text-color;
+    background: @color;
+    background-color: @color;
+    a,
+    .btn {
+      color: @text-color;
+    }
+  }
+}
+
+//Direct Chat Variant
+.direct-chat-variant(@bg-color; @color: #fff) {
+  .right > .direct-chat-text {
+    background: @bg-color;
+    border-color: @bg-color;
+    color: @color;
+    &:after,
+    &:before {
+      border-left-color: @bg-color;
+    }
+  }
+}
+
+//border radius creator
+.border-radius(@radius) {
+  border-radius: @radius;
+}
+
+//Different radius each side
+.border-radius(@top-left;
+@top-right
+;
+@bottom-left
+;
+@bottom-right
+)
+{
+  border-top-left-radius: @top-left
+;
+  border-top-right-radius: @top-right
+;
+  border-bottom-right-radius: @bottom-right
+;
+  border-bottom-left-radius: @bottom-left
+;
+}
+
+//Gradient background
+.gradient(@color: #F5F5F5, @start: #EEE, @stop: #FFF) {
+  background: @color;
+  background: -webkit-gradient(linear,
+  left bottom,
+  left top,
+  color-stop(0, @start),
+  color-stop(1, @stop));
+  background: -ms-linear-gradient(bottom,
+  @start,
+  @stop);
+  background: -moz-linear-gradient(center bottom,
+  @start 0%,
+  @stop 100%);
+  background: -o-linear-gradient(@stop,
+  @start);
+  filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@stop,@start));
+}
+
+//Added 2.1.0
+//Skins Mixins
+
+//Dark Sidebar Mixin
+.skin-dark-sidebar(@link-hover-border-color) {
+  // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color)
+  .wrapper,
+  .main-sidebar,
+  .left-side {
+    background-color: @sidebar-dark-bg;
+  }
+  //User Panel (resides in the sidebar)
+  .user-panel {
+    > .info, > .info > a {
+      color: #fff;
+    }
+  }
+  //Sidebar Menu. First level links
+  .sidebar-menu > li {
+    //Section Headning
+    &.header {
+      color: lighten(@sidebar-dark-bg, 20%);
+      background: darken(@sidebar-dark-bg, 4%);
+    }
+    //links
+    > a {
+      border-left: 3px solid transparent;
+    }
+    //Hover and active states
+    &:hover > a, &.active > a {
+      color: @sidebar-dark-hover-color;
+      background: @sidebar-dark-hover-bg;
+      border-left-color: @link-hover-border-color;
+    }
+    //First Level Submenu
+    > .treeview-menu {
+      margin: 0 1px;
+      background: @sidebar-dark-submenu-bg;
+    }
+  }
+  //All links within the sidebar menu
+  .sidebar a {
+    color: @sidebar-dark-color;
+    &:hover {
+      text-decoration: none;
+    }
+  }
+  //All submenus
+  .treeview-menu {
+    > li {
+      > a {
+        color: @sidebar-dark-submenu-color;
+      }
+      &.active > a, > a:hover {
+        color: @sidebar-dark-submenu-hover-color;
+      }
+    }
+  }
+  //The sidebar search form
+  .sidebar-form {
+    .border-radius(3px);
+    border: 1px solid lighten(@sidebar-dark-bg, 10%);
+    margin: 10px 10px;
+    input[type="text"], .btn {
+      box-shadow: none;
+      background-color: lighten(@sidebar-dark-bg, 10%);
+      border: 1px solid transparent;
+      height: 35px;
+      .transition(all @transition-speed @transition-fn);
+    }
+    input[type="text"] {
+      color: #666;
+      .border-radius(2px, 0, 2px, 0);
+      &:focus, &:focus + .input-group-btn .btn {
+        background-color: #fff;
+        color: #666;
+      }
+      &:focus + .input-group-btn .btn {
+        border-left-color: #fff;
+      }
+    }
+    .btn {
+      color: #999;
+      .border-radius(0, 2px, 0, 2px);
+    }
+  }
+}
+
+//Light Sidebar Mixin
+.skin-light-sidebar(@icon-active-color) {
+  // Sidebar background color (Both .wrapper and .left-side are responsible for sidebar bg color)
+  .wrapper,
+  .main-sidebar,
+  .left-side {
+    background-color: @sidebar-light-bg;
+  }
+  .content-wrapper,
+  .main-footer {
+    border-left: 1px solid @gray;
+  }
+  //User Panel (resides in the sidebar)
+  .user-panel {
+    > .info, > .info > a {
+      color: @sidebar-light-color;
+    }
+  }
+  //Sidebar Menu. First level links
+  .sidebar-menu > li {
+    .transition(border-left-color .3s ease);
+    //border-left: 3px solid transparent;
+    //Section Headning
+    &.header {
+      color: lighten(@sidebar-light-color, 25%);
+      background: @sidebar-light-bg;
+    }
+    //links
+    > a {
+      border-left: 3px solid transparent;
+      font-weight: 600;
+    }
+    //Hover and active states
+    &:hover > a,
+    &.active > a {
+      color: @sidebar-light-hover-color;
+      background: @sidebar-light-hover-bg;
+    }
+    &:hover > a {
+
+    }
+    &.active {
+      border-left-color: @icon-active-color;
+      > a {
+        font-weight: 600;
+      }
+    }
+    //First Level Submenu
+    > .treeview-menu {
+      background: @sidebar-light-submenu-bg;
+    }
+  }
+  //All links within the sidebar menu
+  .sidebar a {
+    color: @sidebar-light-color;
+    &:hover {
+      text-decoration: none;
+    }
+  }
+  //All submenus
+  .treeview-menu {
+    > li {
+      > a {
+        color: @sidebar-light-submenu-color;
+      }
+      &.active > a,
+      > a:hover {
+        color: @sidebar-light-submenu-hover-color;
+      }
+      &.active > a {
+        font-weight: 600;
+      }
+    }
+  }
+  //The sidebar search form
+  .sidebar-form {
+    .border-radius(3px);
+    border: 1px solid @gray; //darken(@sidebar-light-bg, 5%);
+    margin: 10px 10px;
+    input[type="text"],
+    .btn {
+      box-shadow: none;
+      background-color: #fff; //darken(@sidebar-light-bg, 3%);
+      border: 1px solid transparent;
+      height: 35px;
+      .transition(all @transition-speed @transition-fn);
+    }
+    input[type="text"] {
+      color: #666;
+      .border-radius(2px, 0, 2px, 0);
+      &:focus,
+      &:focus + .input-group-btn .btn {
+        background-color: #fff;
+        color: #666;
+      }
+      &:focus + .input-group-btn .btn {
+        border-left-color: #fff;
+      }
+    }
+    .btn {
+      color: #999;
+      .border-radius(0, 2px, 0, 2px);
+    }
+  }
+  @media (min-width: @screen-sm-min) {
+    &.sidebar-mini.sidebar-collapse {
+      .sidebar-menu > li > .treeview-menu {
+        border-left: 1px solid @gray;
+      }
+    }
+  }
+}

+ 80 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/modal.less

@@ -0,0 +1,80 @@
+/*
+ * Component: modal
+ * ----------------
+ */
+.modal {
+  background: rgba(0, 0, 0, .3);
+}
+
+.modal-content {
+  .border-radius(0);
+  .box-shadow(0 2px 3px rgba(0, 0, 0, .125));
+  border: 0;
+  @media (min-width: @screen-sm-min) {
+    .box-shadow(0 2px 3px rgba(0, 0, 0, .125));
+  }
+}
+
+.modal-header {
+  border-bottom-color: @box-border-color;
+}
+
+.modal-footer {
+  border-top-color: @box-border-color;
+}
+
+//Modal variants
+.modal-primary {
+  .modal-body {
+    &:extend(.bg-light-blue);
+  }
+  .modal-header,
+  .modal-footer {
+    &:extend(.bg-light-blue-active);
+    border-color: darken(@light-blue, 10%);
+  }
+}
+
+.modal-warning {
+  .modal-body {
+    &:extend(.bg-yellow);
+  }
+  .modal-header,
+  .modal-footer {
+    &:extend(.bg-yellow-active);
+    border-color: darken(@yellow, 10%);
+  }
+}
+
+.modal-info {
+  .modal-body {
+    &:extend(.bg-aqua);
+  }
+  .modal-header,
+  .modal-footer {
+    &:extend(.bg-aqua-active);
+    border-color: darken(@aqua, 10%);
+  }
+}
+
+.modal-success {
+  .modal-body {
+    &:extend(.bg-green);
+  }
+  .modal-header,
+  .modal-footer {
+    &:extend(.bg-green-active);
+    border-color: darken(@green, 10%);
+  }
+}
+
+.modal-danger {
+  .modal-body {
+    &:extend(.bg-red);
+  }
+  .modal-header,
+  .modal-footer {
+    &:extend(.bg-red-active);
+    border-color: darken(@red, 10%);
+  }
+}

+ 226 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/navs.less

@@ -0,0 +1,226 @@
+/*
+ * Component: Nav
+ * --------------
+ */
+
+.nav {
+  > li > a:hover,
+  > li > a:active,
+  > li > a:focus {
+    color: #444;
+    background: #f7f7f7;
+  }
+}
+
+/* NAV PILLS */
+.nav-pills {
+  > li > a {
+    .border-radius(0);
+    border-top: 3px solid transparent;
+    color: #444;
+    > .fa,
+    > .glyphicon,
+    > .ion {
+      margin-right: 5px;
+    }
+  }
+  > li.active > a,
+  > li.active > a:hover,
+  > li.active > a:focus {
+    border-top-color: @light-blue;
+  }
+  > li.active > a {
+    font-weight: 600;
+  }
+}
+
+/* NAV STACKED */
+.nav-stacked {
+  > li > a {
+    .border-radius(0);
+    border-top: 0;
+    border-left: 3px solid transparent;
+    color: #444;
+  }
+  > li.active > a,
+  > li.active > a:hover {
+    background: transparent;
+    color: #444;
+    border-top: 0;
+    border-left-color: @light-blue;
+  }
+
+  > li.header {
+    border-bottom: 1px solid #ddd;
+    color: #777;
+    margin-bottom: 10px;
+    padding: 5px 10px;
+    text-transform: uppercase;
+  }
+}
+
+/* NAV TABS */
+.nav-tabs-custom {
+  margin-bottom: 20px;
+  background: #fff;
+  box-shadow: @box-boxshadow;
+  border-radius: @box-border-radius;
+  > .nav-tabs {
+    margin: 0;
+    border-bottom-color: #f4f4f4;
+    .border-top-radius(@box-border-radius);
+    > li {
+      border-top: 3px solid transparent;
+      margin-bottom: -2px;
+      > a {
+        color: #444;
+        .border-radius(0);
+        &.text-muted {
+          color: #999;
+        }
+        &,
+        &:hover {
+          background: transparent;
+          margin: 0;
+        }
+        &:hover {
+          color: #999;
+        }
+      }
+      &:not(.active) {
+        > a:hover,
+        > a:focus,
+        > a:active {
+          border-color: transparent;
+        }
+      }
+      margin-right: 5px;
+    }
+
+    > li.active {
+      border-top-color: @light-blue;
+      & > a,
+      &:hover > a {
+        background-color: #fff;
+        color: #444;
+      }
+      > a {
+        border-top-color: transparent;
+        border-left-color: #f4f4f4;
+        border-right-color: #f4f4f4;
+      }
+
+    }
+
+    > li:first-of-type {
+      margin-left: 0;
+      &.active {
+        > a {
+          border-left-color: transparent;
+        }
+      }
+    }
+
+    //Pulled to the right
+    &.pull-right {
+      float: none !important;
+      > li {
+        float: right;
+      }
+      > li:first-of-type {
+        margin-right: 0;
+        > a {
+          border-left-width: 1px;
+        }
+        &.active {
+          > a {
+            border-left-color: #f4f4f4;
+            border-right-color: transparent;
+          }
+        }
+      }
+    }
+
+    > li.header {
+      line-height: 35px;
+      padding: 0 10px;
+      font-size: 20px;
+      color: #444;
+      > .fa,
+      > .glyphicon,
+      > .ion {
+        margin-right: 5px;
+      }
+    }
+  }
+
+  > .tab-content {
+    background: #fff;
+    padding: 10px;
+    .border-bottom-radius(@box-border-radius);
+  }
+
+  .dropdown.open > a {
+    &:active,
+    &:focus {
+      background: transparent;
+      color: #999;
+    }
+  }
+  // Tab color variations
+  &.tab-primary {
+    > .nav-tabs {
+      > li.active {
+        border-top-color: @light-blue;
+      }
+    }
+  }
+  &.tab-info {
+    > .nav-tabs {
+      > li.active {
+        border-top-color: @aqua;
+      }
+    }
+  }
+  &.tab-danger {
+    > .nav-tabs {
+      > li.active {
+        border-top-color: @red;
+      }
+    }
+  }
+  &.tab-warning {
+    > .nav-tabs {
+      > li.active {
+        border-top-color: @yellow;
+      }
+    }
+  }
+  &.tab-success {
+    > .nav-tabs {
+      > li.active {
+        border-top-color: @green;
+      }
+    }
+  }
+  &.tab-default {
+    > .nav-tabs {
+      > li.active {
+        border-top-color: @gray;
+      }
+    }
+  }
+}
+
+/* PAGINATION */
+.pagination {
+  > li > a {
+    background: #fafafa;
+    color: #666;
+  }
+  &.pagination-flat {
+    > li > a {
+      .border-radius(0) !important;
+    }
+  }
+}

+ 54 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/print.less

@@ -0,0 +1,54 @@
+/*
+ * Misc: print
+ * -----------
+ */
+@media print {
+  //Add to elements that you do not want to show when printing
+  .no-print {
+    display: none !important;
+  }
+
+  //Elements that we want to hide when printing
+  .main-sidebar,
+  .left-side,
+  .main-header,
+  .content-header {
+    &:extend(.no-print);
+  }
+
+  //This is the only element that should appear, so let's remove the margins
+  .content-wrapper,
+  .right-side,
+  .main-footer {
+    margin-left: 0 !important;
+    min-height: 0 !important;
+    .translate(0, 0) !important;
+  }
+
+  .fixed .content-wrapper,
+  .fixed .right-side {
+    padding-top: 0 !important;
+  }
+
+  //Invoice printing
+  .invoice {
+    width: 100%;
+    border: 0;
+    margin: 0;
+    padding: 0;
+  }
+
+  .invoice-col {
+    float: left;
+    width: 33.3333333%;
+  }
+
+  //Make sure table content displays properly
+  .table-responsive {
+    overflow: auto;
+    > .table tr th,
+    > .table tr td {
+      white-space: normal !important;
+    }
+  }
+}

+ 45 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/products.less

@@ -0,0 +1,45 @@
+/*
+ * Component: Products List
+ * ------------------------
+ */
+.products-list {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  > .item {
+    .border-radius(@box-border-radius);
+    .box-shadow(@box-boxshadow);
+    .clearfix();
+    padding: 10px 0;
+    background: #fff;
+  }
+  .product-img {
+    float: left;
+    img {
+      width: 50px;
+      height: 50px;
+    }
+  }
+  .product-info {
+    margin-left: 60px;
+  }
+  .product-title {
+    font-weight: 600;
+  }
+  .product-description {
+    display: block;
+    color: #999;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+  }
+}
+
+.product-list-in-box > .item {
+  .box-shadow(none);
+  .border-radius(0);
+  border-bottom: 1px solid @box-border-color;
+  &:last-of-type {
+    border-bottom-width: 0;
+  }
+}

+ 31 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/profile.less

@@ -0,0 +1,31 @@
+/*
+ * Page: Profile
+ * -------------
+ */
+
+.profile-user-img {
+  margin: 0 auto;
+  width: 100px;
+  padding: 3px;
+  border: 3px solid @gray;
+}
+
+.profile-username {
+  font-size: 21px;
+  margin-top: 5px;
+}
+
+.post {
+  border-bottom: 1px solid @gray;
+  margin-bottom: 15px;
+  padding-bottom: 15px;
+  color: #666;
+  &:last-of-type {
+    border-bottom: 0;
+    margin-bottom: 0;
+    padding-bottom: 0;
+  }
+  .user-block {
+    margin-bottom: 15px;
+  }
+}

+ 111 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/progress-bars.less

@@ -0,0 +1,111 @@
+/*
+ * Component: Progress Bar
+ * -----------------------
+ */
+
+//General CSS
+.progress,
+.progress > .progress-bar {
+  .box-shadow(none);
+  &, .progress-bar {
+    .border-radius(@progress-bar-border-radius);
+  }
+}
+
+/* size variation */
+.progress.sm,
+.progress-sm {
+  height: 10px;
+  &, .progress-bar {
+    .border-radius(@progress-bar-sm-border-radius);
+  }
+}
+
+.progress.xs,
+.progress-xs {
+  height: 7px;
+  &, .progress-bar {
+    .border-radius(@progress-bar-xs-border-radius);
+  }
+}
+
+.progress.xxs,
+.progress-xxs {
+  height: 3px;
+  &, .progress-bar {
+    .border-radius(@progress-bar-xs-border-radius);
+  }
+}
+
+/* Vertical bars */
+.progress.vertical {
+  position: relative;
+  width: 30px;
+  height: 200px;
+  display: inline-block;
+  margin-right: 10px;
+  > .progress-bar {
+    width: 100%;
+    position: absolute;
+    bottom: 0;
+  }
+
+  //Sizes
+  &.sm,
+  &.progress-sm {
+    width: 20px;
+  }
+
+  &.xs,
+  &.progress-xs {
+    width: 10px;
+  }
+  &.xxs,
+  &.progress-xxs {
+    width: 3px;
+  }
+}
+
+//Progress Groups
+.progress-group {
+  .progress-text {
+    font-weight: 600;
+  }
+  .progress-number {
+    float: right;
+  }
+}
+
+/* Remove margins from progress bars when put in a table */
+.table {
+  tr > td .progress {
+    margin: 0;
+  }
+}
+
+// Variations
+// -------------------------
+.progress-bar-light-blue,
+.progress-bar-primary {
+  .progress-bar-variant(@light-blue);
+}
+
+.progress-bar-green,
+.progress-bar-success {
+  .progress-bar-variant(@green);
+}
+
+.progress-bar-aqua,
+.progress-bar-info {
+  .progress-bar-variant(@aqua);
+}
+
+.progress-bar-yellow,
+.progress-bar-warning {
+  .progress-bar-variant(@yellow);
+}
+
+.progress-bar-red,
+.progress-bar-danger {
+  .progress-bar-variant(@red);
+}

+ 117 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/select2.less

@@ -0,0 +1,117 @@
+/*
+ * Plugin: Select2
+ * ---------------
+ */
+
+//Signle select
+.select2-container--default,
+.select2-selection {
+  &.select2-container--focus,
+  &:focus,
+  &:active {
+    outline: none;
+  }
+  .select2-selection--single {
+    border: 1px solid @gray;
+    border-radius: @input-radius;
+    padding: 6px 12px;
+    height: 34px;
+  }
+}
+
+.select2-container--default.select2-container--open {
+  border-color: @light-blue;
+}
+
+.select2-dropdown {
+  border: 1px solid @gray;
+  border-radius: @input-radius;
+}
+
+.select2-container--default .select2-results__option--highlighted[aria-selected] {
+  background-color: @light-blue;
+  color: white;
+}
+
+.select2-results__option {
+  padding: 6px 12px;
+  user-select: none;
+  -webkit-user-select: none;
+}
+
+.select2-container .select2-selection--single .select2-selection__rendered {
+  padding-left: 0;
+  padding-right: 0;
+  height: auto;
+  margin-top: -4px;
+}
+
+.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
+  padding-right: 6px;
+  padding-left: 20px;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__arrow {
+  height: 28px;
+  right: 3px;
+}
+
+.select2-container--default .select2-selection--single .select2-selection__arrow b {
+  margin-top: 0;
+}
+
+.select2-dropdown,
+.select2-search--inline {
+  .select2-search__field {
+    border: 1px solid @gray;
+    &:focus {
+      outline: none;
+      border: 1px solid @light-blue;
+    }
+  }
+}
+
+.select2-container--default .select2-results__option[aria-disabled=true] {
+  color: #999;
+}
+
+.select2-container--default .select2-results__option[aria-selected=true] {
+  background-color: #ddd;
+  &,
+  &:hover {
+    color: #444;
+  }
+}
+
+//Multiple select
+.select2-container--default {
+  .select2-selection--multiple {
+    border: 1px solid @gray;
+    border-radius: @input-radius;
+    &:focus {
+      border-color: @light-blue;
+    }
+  }
+  &.select2-container--focus .select2-selection--multiple {
+    border-color: @gray;
+  }
+}
+
+.select2-container--default .select2-selection--multiple .select2-selection__choice {
+  background-color: @light-blue;
+  border-color: darken(@light-blue, 5%);
+  padding: 1px 10px;
+  color: #fff;
+}
+
+.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
+  margin-right: 5px;
+  color: rgba(255, 255, 255, .7);
+  &:hover {
+    color: #fff;
+  }
+}
+
+.select2-container .select2-selection--single .select2-selection__rendered {
+  padding-right: 10px;
+}

+ 141 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/sidebar-mini.less

@@ -0,0 +1,141 @@
+/*
+ * Component: Sidebar Mini
+ */
+
+//Add sidebar-mini class to the body tag to activate this feature
+.sidebar-mini {
+  //Sidebar mini should work only on devices larger than @screen-sm
+  @media (min-width: @screen-sm) {
+    //When the sidebar is collapsed...
+    &.sidebar-collapse {
+
+      //Apply the new margining to the main content and footer
+      .content-wrapper,
+      .right-side,
+      .main-footer {
+        margin-left: 50px !important;
+        z-index: 840;
+      }
+
+      //Modify the sidebar to shrink instead of disappearing
+      .main-sidebar {
+        //Don't go away! Just shrink
+        .translate(0, 0);
+        width: 50px !important;
+        z-index: 850;
+      }
+
+      .sidebar-menu {
+        > li {
+          position: relative;
+          > a {
+            margin-right: 0;
+          }
+          > a > span {
+            border-top-right-radius: 4px;
+          }
+
+          &:not(.treeview) {
+            > a > span {
+              border-bottom-right-radius: 4px;
+            }
+          }
+
+          > .treeview-menu {
+            //Add some padding to the treeview menu
+            padding-top: 5px;
+            padding-bottom: 5px;
+            border-bottom-right-radius: 4px;
+          }
+
+          //Show menu items on hover
+          &:hover {
+            > a {
+              //overflow: visible;
+            }
+            > a > span:not(.pull-right),
+            > .treeview-menu {
+              display: block !important;
+              position: absolute;
+              width: @sidebar-width - 50;
+              left: 50px;
+            }
+
+            //position the header & treeview menus
+            > a > span {
+              top: 0;
+              margin-left: -3px;
+              padding: 12px 5px 12px 20px;
+              background-color: inherit;
+            }
+            > .treeview-menu {
+              top: 44px;
+              margin-left: 0;
+            }
+          }
+        }
+      }
+
+      //Make the sidebar links, menus, labels, badges
+      //and angle icons disappear
+      .main-sidebar .user-panel > .info,
+      .sidebar-form,
+      .sidebar-menu > li > a > span,
+      .sidebar-menu > li > .treeview-menu,
+      .sidebar-menu > li > a > .pull-right,
+      .sidebar-menu li.header {
+        display: none !important;
+        -webkit-transform: translateZ(0);
+      }
+
+      .main-header {
+        //Let's make the logo also shrink and the mini logo to appear
+        .logo {
+          width: 50px;
+          > .logo-mini {
+            display: block;
+            margin-left: -15px;
+            margin-right: -15px;
+            font-size: 18px;
+          }
+          > .logo-lg {
+            display: none;
+          }
+        }
+
+        //Since the logo got smaller, we need to fix the navbar's position
+        .navbar {
+          margin-left: 50px;
+        }
+      }
+    }
+  }
+}
+
+//A fix for text overflow while transitioning from sidebar mini to full sidebar
+.sidebar-menu,
+.main-sidebar .user-panel,
+.sidebar-menu > li.header {
+  white-space: nowrap;
+  overflow: hidden;
+}
+
+.sidebar-menu:hover {
+  overflow: visible;
+}
+
+.sidebar-form,
+.sidebar-menu > li.header {
+  overflow: hidden;
+  text-overflow: clip;
+}
+
+.sidebar-menu li > a {
+  position: relative;
+  > .pull-right {
+    position: absolute;
+    right: 10px;
+    top: 50%;
+    margin-top: -7px;
+  }
+}

+ 158 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/sidebar.less

@@ -0,0 +1,158 @@
+/*
+ * Component: Sidebar
+ * ------------------
+ */
+//Main Sidebar
+// ``` .left-side has been deprecated as of 2.0.0 in favor of .main-sidebar ```
+
+.main-sidebar,
+.left-side {
+  position: absolute;
+  top: 0;
+  left: 0;
+  padding-top: 50px;
+  min-height: 100%;
+  width: @sidebar-width;
+  z-index: 810;
+  //Using disposable variable to join statements with a comma
+  @transition-rule: @transition-speed @transition-fn,
+  width @transition-speed @transition-fn;
+  .transition-transform(@transition-rule);
+  @media (max-width: @screen-header-collapse) {
+    padding-top: 100px;
+  }
+  @media (max-width: @screen-xs-max) {
+    .translate(-@sidebar-width, 0);
+  }
+  .sidebar-collapse & {
+    @media (min-width: @screen-sm) {
+      .translate(-@sidebar-width, 0);
+    }
+  }
+  .sidebar-open & {
+    @media (max-width: @screen-xs-max) {
+      .translate(0, 0);
+    }
+  }
+}
+
+.sidebar {
+  padding-bottom: 10px;
+}
+
+// remove border from form
+.sidebar-form {
+  input:focus {
+    border-color: transparent;
+  }
+}
+
+//Sidebar user panel
+.user-panel {
+  position: relative;
+  width: 100%;
+  padding: 10px;
+  overflow: hidden;
+  .clearfix();
+  > .image > img {
+    width: 100%;
+    max-width: 45px;
+    height: auto;
+  }
+  > .info {
+    padding: 5px 5px 5px 15px;
+    line-height: 1;
+    position: absolute;
+    left: 55px;
+    > p {
+      font-weight: 600;
+      margin-bottom: 9px;
+    }
+    > a {
+      text-decoration: none;
+      padding-right: 5px;
+      margin-top: 3px;
+      font-size: 11px;
+      > .fa,
+      > .ion,
+      > .glyphicon {
+        margin-right: 3px;
+      }
+    }
+  }
+}
+
+// Sidebar menu
+.sidebar-menu {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  //First Level
+  > li {
+    position: relative;
+    margin: 0;
+    padding: 0;
+    > a {
+      padding: 12px 5px 12px 15px;
+      display: block;
+      > .fa,
+      > .glyphicon,
+      > .ion {
+        width: 20px;
+      }
+    }
+    .label,
+    .badge {
+      margin-top: 3px;
+      margin-right: 5px;
+    }
+  }
+  li.header {
+    padding: 10px 25px 10px 15px;
+    font-size: 12px;
+  }
+  li > a > .fa-angle-left {
+    width: auto;
+    height: auto;
+    padding: 0;
+    margin-right: 10px;
+    margin-top: 3px;
+  }
+  li.active {
+    > a > .fa-angle-left {
+      .rotate(-90deg);
+    }
+    > .treeview-menu {
+      display: block;
+    }
+  }
+
+  // Tree view menu
+  .treeview-menu {
+    display: none;
+    list-style: none;
+    padding: 0;
+    margin: 0;
+    padding-left: 5px;
+    .treeview-menu {
+      padding-left: 20px;
+    }
+    > li {
+      margin: 0;
+      > a {
+        padding: 5px 5px 5px 15px;
+        display: block;
+        font-size: 14px;
+        > .fa,
+        > .glyphicon,
+        > .ion {
+          width: 20px;
+        }
+        > .fa-angle-left,
+        > .fa-angle-down {
+          width: auto;
+        }
+      }
+    }
+  }
+}

+ 13 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/_all-skins.less

@@ -0,0 +1,13 @@
+//All skins in one file
+@import "skin-blue.less";
+@import "skin-blue-light.less";
+@import "skin-black.less";
+@import "skin-black-light.less";
+@import "skin-green.less";
+@import "skin-green-light.less";
+@import "skin-red.less";
+@import "skin-red-light.less";
+@import "skin-yellow.less";
+@import "skin-yellow-light.less";
+@import "skin-purple.less";
+@import "skin-purple-light.less";

+ 64 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-black-light.less

@@ -0,0 +1,64 @@
+/*
+ * Skin: Black
+ * -----------
+ */
+@import "../../bootstrap-less/mixins.less";
+@import "../../bootstrap-less/variables.less";
+@import "../variables.less";
+@import "../mixins.less";
+
+/* skin-black navbar */
+.skin-black-light {
+  //Navbar & Logo
+  .main-header {
+    .box-shadow(0px 1px 1px rgba(0, 0, 0, 0.05));
+    .navbar-toggle {
+      color: #333;
+    }
+    .navbar-brand {
+      color: #333;
+      border-right: 1px solid #eee;
+    }
+    > .navbar {
+      .navbar-variant(#fff; #333; #999; #fff);
+      > .sidebar-toggle {
+        color: #333;
+        border-right: 1px solid #eee;
+      }
+      .navbar-nav {
+        > li > a {
+          border-right: 1px solid #eee;
+        }
+      }
+      .navbar-custom-menu .navbar-nav,
+      .navbar-right {
+        > li {
+          > a {
+            border-left: 1px solid #eee;
+            border-right-width: 0;
+          }
+        }
+      }
+    }
+    > .logo {
+      .logo-variant(#fff; #333);
+      border-right: 1px solid #eee;
+      @media (max-width: @screen-header-collapse) {
+        .logo-variant(#222; #fff);
+        border-right: none;
+      }
+    }
+
+    li.user-header {
+      background-color: #222;
+    }
+  }
+
+  //Content Header
+  .content-header {
+    background: transparent;
+    box-shadow: none;
+  }
+  //Create the sidebar skin
+  .skin-light-sidebar(#fff);
+}

+ 64 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-black.less

@@ -0,0 +1,64 @@
+/*
+ * Skin: Black
+ * -----------
+ */
+@import "../../bootstrap-less/mixins.less";
+@import "../../bootstrap-less/variables.less";
+@import "../variables.less";
+@import "../mixins.less";
+
+/* skin-black navbar */
+.skin-black {
+  //Navbar & Logo
+  .main-header {
+    .box-shadow(0px 1px 1px rgba(0, 0, 0, 0.05));
+    .navbar-toggle {
+      color: #333;
+    }
+    .navbar-brand {
+      color: #333;
+      border-right: 1px solid #eee;
+    }
+    > .navbar {
+      .navbar-variant(#fff; #333; #999; #fff);
+      > .sidebar-toggle {
+        color: #333;
+        border-right: 1px solid #eee;
+      }
+      .navbar-nav {
+        > li > a {
+          border-right: 1px solid #eee;
+        }
+      }
+      .navbar-custom-menu .navbar-nav,
+      .navbar-right {
+        > li {
+          > a {
+            border-left: 1px solid #eee;
+            border-right-width: 0;
+          }
+        }
+      }
+    }
+    > .logo {
+      .logo-variant(#fff; #333);
+      border-right: 1px solid #eee;
+      @media (max-width: @screen-header-collapse) {
+        .logo-variant(#222; #fff);
+        border-right: none;
+      }
+    }
+
+    li.user-header {
+      background-color: #222;
+    }
+  }
+
+  //Content Header
+  .content-header {
+    background: transparent;
+    box-shadow: none;
+  }
+  //Create the sidebar skin
+  .skin-dark-sidebar(#fff);
+}

+ 61 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-blue-light.less

@@ -0,0 +1,61 @@
+/*
+ * Skin: Blue
+ * ----------
+ */
+@import "../../bootstrap-less/mixins.less";
+@import "../../bootstrap-less/variables.less";
+@import "../variables.less";
+@import "../mixins.less";
+
+.skin-blue-light {
+  //Navbar
+  .main-header {
+    .navbar {
+      .navbar-variant(@light-blue; #fff);
+      .sidebar-toggle {
+        color: #fff;
+        &:hover {
+          background-color: darken(@light-blue, 5%);
+        }
+      }
+      @media (max-width: @screen-header-collapse) {
+        .dropdown-menu {
+          li {
+            &.divider {
+              background-color: rgba(255, 255, 255, 0.1);
+            }
+            a {
+              color: #fff;
+              &:hover {
+                background: darken(@light-blue, 5%);
+              }
+            }
+          }
+        }
+      }
+    }
+    //Logo
+    .logo {
+      .logo-variant(@light-blue);
+    }
+
+    li.user-header {
+      background-color: @light-blue;
+    }
+  }
+
+  //Content Header
+  .content-header {
+    background: transparent;
+  }
+
+  //Create the sidebar skin
+  .skin-light-sidebar(@light-blue);
+  .main-footer {
+    border-top-color: @gray;
+  }
+}
+
+.skin-blue.layout-top-nav .main-header > .logo {
+  .logo-variant(@light-blue);
+}

+ 58 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-blue.less

@@ -0,0 +1,58 @@
+/*
+ * Skin: Blue
+ * ----------
+ */
+@import "../../bootstrap-less/mixins.less";
+@import "../../bootstrap-less/variables.less";
+@import "../variables.less";
+@import "../mixins.less";
+
+.skin-blue {
+  //Navbar
+  .main-header {
+    .navbar {
+      .navbar-variant(@light-blue; #fff);
+      .sidebar-toggle {
+        color: #fff;
+        &:hover {
+          background-color: darken(@light-blue, 5%);
+        }
+      }
+      @media (max-width: @screen-header-collapse) {
+        .dropdown-menu {
+          li {
+            &.divider {
+              background-color: rgba(255, 255, 255, 0.1);
+            }
+            a {
+              color: #fff;
+              &:hover {
+                background: darken(@light-blue, 5%);
+              }
+            }
+          }
+        }
+      }
+    }
+    //Logo
+    .logo {
+      .logo-variant(darken(@light-blue, 5%));
+    }
+
+    li.user-header {
+      background-color: @light-blue;
+    }
+  }
+
+  //Content Header
+  .content-header {
+    background: transparent;
+  }
+
+  //Create the sidebar skin
+  .skin-dark-sidebar(@light-blue);
+}
+
+.skin-blue.layout-top-nav .main-header > .logo {
+  .logo-variant(@light-blue);
+}

+ 55 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-green-light.less

@@ -0,0 +1,55 @@
+/*
+ * Skin: Green
+ * -----------
+ */
+@import "../../bootstrap-less/mixins.less";
+@import "../../bootstrap-less/variables.less";
+@import "../variables.less";
+@import "../mixins.less";
+
+.skin-green-light {
+  //Navbar
+  .main-header {
+    .navbar {
+      .navbar-variant(@green; #fff);
+      .sidebar-toggle {
+        color: #fff;
+        &:hover {
+          background-color: darken(@green, 5%);
+        }
+      }
+      @media (max-width: @screen-header-collapse) {
+        .dropdown-menu {
+          li {
+            &.divider {
+              background-color: rgba(255, 255, 255, 0.1);
+            }
+            a {
+              color: #fff;
+              &:hover {
+                background: darken(@green, 5%);
+              }
+            }
+          }
+        }
+      }
+    }
+    //Logo
+    .logo {
+      .logo-variant(@green);
+    }
+
+    li.user-header {
+      background-color: @green;
+    }
+  }
+
+  //Content Header
+  .content-header {
+    background: transparent;
+  }
+
+  //Create the sidebar skin
+  .skin-light-sidebar(@green);
+
+}

+ 55 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-green.less

@@ -0,0 +1,55 @@
+/*
+ * Skin: Green
+ * -----------
+ */
+@import "../../bootstrap-less/mixins.less";
+@import "../../bootstrap-less/variables.less";
+@import "../variables.less";
+@import "../mixins.less";
+
+.skin-green {
+  //Navbar
+  .main-header {
+    .navbar {
+      .navbar-variant(@green; #fff);
+      .sidebar-toggle {
+        color: #fff;
+        &:hover {
+          background-color: darken(@green, 5%);
+        }
+      }
+      @media (max-width: @screen-header-collapse) {
+        .dropdown-menu {
+          li {
+            &.divider {
+              background-color: rgba(255, 255, 255, 0.1);
+            }
+            a {
+              color: #fff;
+              &:hover {
+                background: darken(@green, 5%);
+              }
+            }
+          }
+        }
+      }
+    }
+    //Logo
+    .logo {
+      .logo-variant(darken(@green, 5%));
+    }
+
+    li.user-header {
+      background-color: @green;
+    }
+  }
+
+  //Content Header
+  .content-header {
+    background: transparent;
+  }
+
+  //Create the sidebar skin
+  .skin-dark-sidebar(@green);
+
+}

+ 54 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-purple-light.less

@@ -0,0 +1,54 @@
+/*
+ * Skin: Purple
+ * ------------
+ */
+@import "../../bootstrap-less/mixins.less";
+@import "../../bootstrap-less/variables.less";
+@import "../variables.less";
+@import "../mixins.less";
+
+.skin-purple-light {
+  //Navbar
+  .main-header {
+    .navbar {
+      .navbar-variant(@purple; #fff);
+      .sidebar-toggle {
+        color: #fff;
+        &:hover {
+          background-color: darken(@purple, 5%);
+        }
+      }
+      @media (max-width: @screen-header-collapse) {
+        .dropdown-menu {
+          li {
+            &.divider {
+              background-color: rgba(255, 255, 255, 0.1);
+            }
+            a {
+              color: #fff;
+              &:hover {
+                background: darken(@purple, 5%);
+              }
+            }
+          }
+        }
+      }
+    }
+    //Logo
+    .logo {
+      .logo-variant(@purple);
+    }
+
+    li.user-header {
+      background-color: @purple;
+    }
+  }
+
+  //Content Header
+  .content-header {
+    background: transparent;
+  }
+
+  //Create the sidebar skin
+  .skin-light-sidebar(@purple);
+}

+ 54 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-purple.less

@@ -0,0 +1,54 @@
+/*
+ * Skin: Purple
+ * ------------
+ */
+@import "../../bootstrap-less/mixins.less";
+@import "../../bootstrap-less/variables.less";
+@import "../variables.less";
+@import "../mixins.less";
+
+.skin-purple {
+  //Navbar
+  .main-header {
+    .navbar {
+      .navbar-variant(@purple; #fff);
+      .sidebar-toggle {
+        color: #fff;
+        &:hover {
+          background-color: darken(@purple, 5%);
+        }
+      }
+      @media (max-width: @screen-header-collapse) {
+        .dropdown-menu {
+          li {
+            &.divider {
+              background-color: rgba(255, 255, 255, 0.1);
+            }
+            a {
+              color: #fff;
+              &:hover {
+                background: darken(@purple, 5%);
+              }
+            }
+          }
+        }
+      }
+    }
+    //Logo
+    .logo {
+      .logo-variant(darken(@purple, 5%));
+    }
+
+    li.user-header {
+      background-color: @purple;
+    }
+  }
+
+  //Content Header
+  .content-header {
+    background: transparent;
+  }
+
+  //Create the sidebar skin
+  .skin-dark-sidebar(@purple);
+}

+ 54 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-red-light.less

@@ -0,0 +1,54 @@
+/*
+ * Skin: Red
+ * ---------
+ */
+@import "../../bootstrap-less/mixins.less";
+@import "../../bootstrap-less/variables.less";
+@import "../variables.less";
+@import "../mixins.less";
+
+.skin-red-light {
+  //Navbar
+  .main-header {
+    .navbar {
+      .navbar-variant(@red; #fff);
+      .sidebar-toggle {
+        color: #fff;
+        &:hover {
+          background-color: darken(@red, 5%);
+        }
+      }
+      @media (max-width: @screen-header-collapse) {
+        .dropdown-menu {
+          li {
+            &.divider {
+              background-color: rgba(255, 255, 255, 0.1);
+            }
+            a {
+              color: #fff;
+              &:hover {
+                background: darken(@red, 5%);
+              }
+            }
+          }
+        }
+      }
+    }
+    //Logo
+    .logo {
+      .logo-variant(@red);
+    }
+
+    li.user-header {
+      background-color: @red;
+    }
+  }
+
+  //Content Header
+  .content-header {
+    background: transparent;
+  }
+
+  //Create the sidebar skin
+  .skin-light-sidebar(@red);
+}

+ 0 - 0
xxl-job-admin/src/main/webapp/static/adminlte/build/less/skins/skin-red.less


Some files were not shown because too many files changed in this diff