diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
index d846c25..e881f2c 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/FunctionDao.java
@@ -2,8 +2,13 @@
 
 import com.supwisdom.dlpay.framework.domain.TFunction;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface FunctionDao extends JpaRepository<TFunction, String> {
+  @Query("select distinct t from TFunction t,TRoleFunction a, TOperRole b where t.id=a.functionId and a.roleId=b.roleId and b.operid=?1 order by t.orderNum ")
+  List<TFunction> getTFunctionsByOperid(String operid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
index 7ccab75..5b7beab 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TFunction.java
@@ -28,6 +28,9 @@
   @Column(name="ORDER_NUM", precision = 9)
   private Integer orderNum;
 
+  @Column(name="MENU_ICON", precision = 9)
+  private String menuIcon;
+
   @Column(name="CREATETIME", length = 14)
   private String createtime;
 
@@ -82,6 +85,14 @@
     this.orderNum = orderNum;
   }
 
+  public String getMenuIcon() {
+    return menuIcon;
+  }
+
+  public void setMenuIcon(String menuIcon) {
+    this.menuIcon = menuIcon;
+  }
+
   public String getCreatetime() {
     return createtime;
   }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
index 83885d3..6285302 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
@@ -41,6 +41,25 @@
   @Transient
   private Collection<? extends GrantedAuthority> authorities;  //权限
 
+  public TOperator() {
+  }
+
+  public TOperator(String opercode, String opername) {
+    this.opercode = opercode;
+    this.opername = opername;
+  }
+
+  public TOperator(String opercode, String opertype, String opername, String operpwd, String status, String opendate, String closedate, Collection<? extends GrantedAuthority> authorities) {
+    this.opercode = opercode;
+    this.opertype = opertype;
+    this.opername = opername;
+    this.operpwd = operpwd;
+    this.status = status;
+    this.opendate = opendate;
+    this.closedate = closedate;
+    this.authorities = authorities;
+  }
+
   public String getOperid() {
     return operid;
   }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/OperUtil.java b/src/main/java/com/supwisdom/dlpay/framework/security/OperUtil.java
new file mode 100644
index 0000000..d576b41
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/OperUtil.java
@@ -0,0 +1,68 @@
+package com.supwisdom.dlpay.framework.security;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+import java.util.Collection;
+
+public class OperUtil {
+
+  public static TOperator getCurrentOper() {
+    Authentication au = SecurityContextHolder.getContext()
+        .getAuthentication();
+    if (au == null)
+      return null;
+    if (au.getPrincipal() == null)
+      return null;
+    if (au != null && au.getPrincipal() instanceof TOperator) {
+      return (TOperator) au.getPrincipal();
+    } else {
+      TOperator oper = new TOperator();
+      oper.setOpername(au.getPrincipal().toString());
+      oper.setOperpwd(au.getCredentials() == null ? null : au
+          .getCredentials().toString());
+      return oper;
+    }
+  }
+
+  public static String getCurrentOperid() {
+    TOperator oper = getCurrentOper();
+    if (oper == null)
+      return null;
+    return oper.getOperid() == null ? oper.getOpercode() : oper.getOperid();
+  }
+
+  public static boolean isLogined() {
+    Authentication au = SecurityContextHolder.getContext()
+        .getAuthentication();
+    if (au == null)
+      return false;
+    if (au.getPrincipal() == null)
+      return false;
+    if (au.getPrincipal() instanceof TOperator)
+      return true;
+    return false;
+  }
+
+  public static boolean isAdmin() {
+    TOperator loginOper = OperUtil.getCurrentOper();
+    if (loginOper != null) {
+      Collection<? extends GrantedAuthority> gas = loginOper.getAuthorities();
+      if (gas == null) {
+        return false;
+      }
+      boolean flag = false;
+      for (GrantedAuthority grantedAuthority : gas) {
+        if ("ROLE_ADMIN".equals(grantedAuthority.getAuthority())) {
+          flag = true;
+        }
+      }
+      return flag;
+    } else {
+      return false;
+    }
+  }
+
+}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
index e1c06aa..4df76c6 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/controller/security_controller.kt
@@ -7,9 +7,13 @@
 import com.supwisdom.dlpay.framework.security.validate.ImageCodeUtil
 import com.supwisdom.dlpay.framework.security.validate.VerifyCode
 import com.supwisdom.dlpay.framework.domain.ApiClientRedis
+import com.supwisdom.dlpay.framework.domain.TOperator
 import com.supwisdom.dlpay.framework.redisrepo.ApiClientRepository
+import com.supwisdom.dlpay.framework.security.OperUtil
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.HmacUtil
+import com.supwisdom.dlpay.system.service.CommonService
+import com.supwisdom.dlpay.system.service.FunctionService
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.HttpStatus
 import org.springframework.http.ResponseEntity
@@ -17,9 +21,9 @@
 import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler
 import org.springframework.social.connect.web.HttpSessionSessionStrategy
 import org.springframework.stereotype.Controller
+import org.springframework.ui.Model
 import org.springframework.web.bind.annotation.*
 import org.springframework.web.context.request.ServletWebRequest
-import sun.plugin.liveconnect.SecurityContextHelper
 import java.util.*
 import javax.imageio.ImageIO
 import javax.servlet.http.HttpServletRequest
@@ -119,13 +123,15 @@
 
 @Controller
 class WebHomeController {
-
-    @GetMapping("/index")
-    fun homeView() = "index"
+    @Autowired
+    lateinit var functionService: FunctionService
+    @Autowired
+    lateinit var commonService: CommonService
 
     @GetMapping("/login")
     fun loginView() = "login"
 
+
     @PostMapping("/login/form")
     fun loginForm(form: LoginForm): ResponseEntity<Any> {
         return ResponseEntity.ok(ResponseBodyBuilder.create()
@@ -139,4 +145,13 @@
         }
         return "redirect:/login?logout"
     }
+
+    @GetMapping("/index")
+    fun homeView(model: Model): String {
+        model.addAttribute("loginOper", TOperator("111","开发测试"))
+        val funclist = functionService.getFunctionsByOperid("111")
+        model.addAttribute("menus", functionService.getMenuTree(funclist, "-1"))
+        model.addAttribute("payapiVersion",commonService.getSystemVersion())
+        return "index"
+    }
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/security.kt b/src/main/kotlin/com/supwisdom/dlpay/security.kt
index 7998f23..7347908 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/security.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -131,6 +131,8 @@
                         .anyRequest().hasRole("THIRD_COMMON")
                         .and()
                         .csrf().ignoringAntMatchers("/api/**")
+//                        .anyRequest().authenticated()
+                // 注册 filter
             }
         }
 
diff --git a/src/main/kotlin/com/supwisdom/dlpay/system/controller/system_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/system/controller/system_controller.kt
new file mode 100644
index 0000000..7477a8f
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/system/controller/system_controller.kt
@@ -0,0 +1 @@
+package com.supwisdom.dlpay.system.controller
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/system/service/impl/system_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/system/service/impl/system_service_impl.kt
new file mode 100644
index 0000000..8e017d5
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/system/service/impl/system_service_impl.kt
@@ -0,0 +1,52 @@
+package com.supwisdom.dlpay.system.service.impl
+
+import com.jcabi.manifests.Manifests
+import com.supwisdom.dlpay.framework.dao.FunctionDao
+import com.supwisdom.dlpay.framework.domain.TFunction
+import com.supwisdom.dlpay.system.service.CommonService
+import com.supwisdom.dlpay.system.service.FunctionService
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+import java.util.HashMap
+
+@Service
+class CommonServiceImpl : CommonService {
+    override fun getSystemVersion(): String {
+        try {
+            return Manifests.read("Payapi-Version") ?: "version 1.0"
+        } catch (ex: Exception) {
+            ex.printStackTrace()
+            return "unknown"
+        }
+    }
+}
+
+@Service
+class FunctionServiceImpl : FunctionService {
+    @Autowired
+    lateinit var functionDao: FunctionDao
+
+    override fun getFunctionsByOperid(operid: String): List<TFunction> {
+        return functionDao.getTFunctionsByOperid(operid) ?: ArrayList(0)
+    }
+
+    override fun getMenuTree(funcList: List<TFunction>, parentId: String): List<Map<String, Any>> {
+        val list = java.util.ArrayList<Map<String, Any>>()
+        for (func in funcList) {
+            if (parentId == func.parentId) {
+                val map = HashMap<String, Any>()
+                map["menuName"] = func.name
+                map["menuIcon"] = func.menuIcon
+                if ("#" == func.menuUrl) {
+                    map["menuUrl"] = "javascript:;"
+                } else {
+                    map["menuUrl"] = func.menuUrl
+                }
+                map["subMenus"] = getMenuTree(funcList, func.id)
+                list.add(map)
+            }
+        }
+        return list
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/system/service/system_service.kt b/src/main/kotlin/com/supwisdom/dlpay/system/service/system_service.kt
new file mode 100644
index 0000000..7133732
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/system/service/system_service.kt
@@ -0,0 +1,19 @@
+package com.supwisdom.dlpay.system.service
+
+import com.supwisdom.dlpay.framework.domain.TFunction
+import org.springframework.transaction.annotation.Propagation
+import org.springframework.transaction.annotation.Transactional
+
+interface CommonService{
+    fun getSystemVersion(): String;
+}
+
+interface FunctionService {
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+    fun getFunctionsByOperid(operid: String): List<TFunction>
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+    fun getMenuTree(funcList: List<TFunction>, parentId: String): List<Map<String, Any>>
+
+
+}
\ No newline at end of file
diff --git a/src/main/resources/static/custom/css/admin.css b/src/main/resources/static/custom/css/admin.css
new file mode 100755
index 0000000..608c847
--- /dev/null
+++ b/src/main/resources/static/custom/css/admin.css
@@ -0,0 +1,704 @@
+/** EasyWeb */
+html {
+    background-color: #f2f2f2;
+    color: #666;
+}
+
+/** header样式 */
+/** 导航栏下面的线条 */
+.layui-layout-admin .layui-header .layui-nav .layui-this:after, .layui-layout-admin .layui-header .layui-nav-bar {
+    height: 2px;
+    background-color: #03152A;
+    top: 0 !important;
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-item {
+    line-height: 50px; /** 高度重写 */
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-item .layui-nav-child {
+    top: 55px;
+}
+
+.layui-layout-admin .layui-header .layui-nav-item .layui-icon {
+    font-size: 16px; /** 图标大小 */
+}
+
+.layui-layout-admin .layui-header .layui-layout-left {
+    left: 220px;
+    padding: 0 10px;
+    transition: all .3s;
+}
+
+.layui-layout-admin .layui-header .layui-layout-right {
+    padding: 0;
+}
+
+/** 重写header的背景色和字体颜色 */
+.layui-layout-admin .layui-header {
+    background-color: #fff;
+    height: 50px;
+    box-shadow: 0 1px 4px 0 rgba(0, 21, 41, .08);
+}
+
+.layui-layout-admin .layui-header a {
+    color: #333;
+    padding: 0 15px;
+}
+
+.layui-layout-admin .layui-header a:hover {
+    color: #333;
+}
+
+.layui-layout-admin .layui-header .layui-nav-child a {
+    color: #333 !important;
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-more {
+    border-color: #666 transparent transparent;
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-mored {
+    border-color: transparent transparent #666;
+}
+
+/** logo部分样式 */
+.layui-layout-admin .layui-header .layui-logo {
+    width: 220px;
+    background-color: #001529;
+    box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .15);
+    color: #eee;
+    font-size: 16px;
+    font-family: Myriad Pro, Helvetica Neue, Arial, Helvetica, sans-serif;
+    font-weight: 300;
+    overflow: hidden;
+    line-height: 50px;
+    transition: all .3s;
+}
+
+.layui-layout-admin .layui-header .layui-logo img {
+    height: 40px;
+}
+
+.layui-layout-admin .layui-header .layui-logo cite {
+    font-style: normal;
+}
+
+.layui-layout-admin .layui-header .layui-nav-img {
+    margin-right: 5px;
+}
+
+.layui-layout-admin .layui-header .layui-nav-img + cite {
+    margin-right: 5px;
+}
+
+.layui-layout-admin .layui-header .layui-nav-child dd {
+    text-align: center;
+}
+
+.layui-layout-admin .layui-header a {
+    cursor: pointer;
+}
+
+/** //header样式结束 */
+
+/** 侧边栏样式 */
+.layui-layout-admin .layui-side .layui-side-scroll {
+    width: 240px;
+}
+
+.layui-layout-admin .layui-side {
+    top: 50px;
+    width: 220px;
+    background-color: #001529;
+    transition: all .3s;
+    -webkit-transition: all .3s;
+}
+
+.layui-layout-admin .layui-side .layui-nav {
+    width: 220px;
+    background-color: transparent;
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-item > a:hover {
+    background: transparent;
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-item > .layui-nav-child {
+    padding: 5px 0;
+    background-color: rgba(0, 0, 0, .3) !important;
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-more {
+    right: 15px;
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child a {
+    padding-left: 50px; /** 导航字体位置 */
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child .layui-nav-child a {
+    padding-left: 70px;
+}
+
+.layui-layout-admin .layui-side .layui-nav .layui-nav-item > a {
+    padding-top: 8px;
+    padding-bottom: 8px;
+}
+
+/** 侧边栏样式结束 */
+
+/** 主体部分样式 */
+.layui-layout-admin .layui-body {
+    left: 220px;
+    top: 50px;
+    transition: left .3s;
+    overflow-y: scroll;
+    padding: 15px;
+}
+
+/** //主体部分样式结束 */
+
+/** 底部样式 */
+.layui-layout-admin .layui-footer {
+    left: 220px;
+    background: #fff;
+    transition: all .3s;
+}
+
+/** 底部样式结束 */
+
+/** 侧导航折叠样式PC */
+.layui-layout-admin.admin-nav-mini .layui-header .layui-logo {
+    width: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-header .layui-logo cite {
+    display: none;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-header .layui-layout-left {
+    left: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side {
+    width: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav {
+    width: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side-scroll {
+    width: 80px;
+}
+
+/** 侧导航隐藏文字 */
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a > cite {
+    display: none;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a .layui-nav-more {
+    display: none;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a {
+    overflow: visible;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-itemed .layui-nav-child {
+    display: none;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-body {
+    left: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-footer {
+    left: 60px;
+}
+
+.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-itemed > a {
+    background: rgba(0, 0, 0, .3);
+}
+
+/** 修改折叠的图标 */
+.layui-layout-admin.admin-nav-mini .layui-header .layui-icon-shrink-right:before {
+    content: "\e66b";
+}
+
+/** //侧导航折叠样式结束 */
+
+/** 移动设备样式 */
+@media screen and (max-width: 750px) {
+    .layui-layout-admin .layui-side {
+        position: fixed;
+        left: -260px;
+        z-index: 10000;
+    }
+
+    .layui-layout-admin .layui-body {
+        left: 0;
+    }
+
+    .layui-layout-admin .layui-footer {
+        left: 0;
+    }
+
+    .layui-layout-admin .layui-header .layui-logo {
+        left: -260px;
+    }
+
+    .layui-layout-admin .layui-header .layui-layout-left {
+        left: 0;
+    }
+
+    .layui-layout-admin .layui-header .layui-icon-shrink-right:before {
+        content: "\e66b";
+    }
+
+    /* 移动设备侧导航折叠样式 */
+    .layui-layout-admin.admin-nav-mini .layui-header .layui-logo {
+        width: 220px;
+        left: 0;
+        z-index: 10001;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-header {
+        z-index: auto;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-header .layui-logo cite {
+        display: inline-block;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-header .layui-layout-left {
+        left: 0;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-side {
+        width: 220px;
+        left: 0;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-side .layui-nav {
+        width: 220px;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-side-scroll {
+        width: 240px;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a > cite {
+        display: inline-block;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a .layui-nav-more {
+        display: inline-block;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item > a {
+        overflow: hidden;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-itemed > .layui-nav-child {
+        display: block;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-body {
+        left: 0;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-footer {
+        left: 0;
+    }
+
+    /** 移动设备遮罩层 */
+    .layui-layout-admin.admin-nav-mini .site-mobile-shade {
+        content: '';
+        position: fixed;
+        top: 0;
+        bottom: 0;
+        left: 0;
+        right: 0;
+        background-color: rgba(0, 0, 0, .2);
+        z-index: 9999;
+        cursor: pointer;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-itemed > a {
+        background: transparent;
+    }
+
+    .layui-layout-admin.admin-nav-mini .layui-header .layui-icon-shrink-right:before {
+        content: "\e668";
+    }
+}
+
+/** //移动设备样式结束 */
+
+/** 右侧弹窗样式 */
+.layui-layer.layui-layer-adminRight {
+    top: 50px !important;
+    bottom: 0;
+    box-shadow: 1px 1px 10px rgba(0, 0, 0, .1);
+    border-radius: 0;
+    overflow: auto;
+}
+
+/** 消息列表样式 */
+.message-list {
+}
+
+.message-list-item {
+    padding: 10px 24px;
+    border-bottom: 1px solid #e8e8e8;
+    -ms-flex-align: start;
+    align-items: flex-start;
+    display: flex;
+    -ms-flex: 1 1;
+    flex: 1 1;
+}
+
+.message-list-item:hover {
+    background: #F2F2F2;
+}
+
+.message-item-icon {
+    width: 40px;
+    height: 40px;
+    margin-right: 16px;
+    display: block;
+    margin-top: 4px;
+}
+
+.message-item-right {
+    display: block;
+    flex: 1 0;
+}
+
+.message-item-title {
+    font-size: 14px;
+    color: rgba(0, 0, 0, .65);
+}
+
+.message-item-text {
+    color: rgba(0, 0, 0, .45);
+    font-size: 12px;
+}
+
+/** //消息列表样式结束 */
+
+/** 主体部分标题样式 */
+.layui-card-header .header-title {
+    display: inline;
+    font-size: 16px;
+}
+
+/** 表格搜索框样式 */
+.search-input {
+    width: 150px;
+    display: inline-block;
+    height: 36px;
+    vertical-align: middle;
+    padding: 3px 6px;
+}
+
+/** 重写layui默认按钮的高度，因为按钮跟输入框不一样高特别丑 */
+.layui-btn:not(.layui-btn-lg ):not(.layui-btn-sm):not(.layui-btn-xs) {
+    height: 34px;
+    line-height: 34px;
+}
+
+/** 如果按钮加图标减少内边距 */
+.icon-btn {
+    padding: 0 8px;
+}
+
+.layui-form.toolbar .layui-btn + .layui-btn {
+    margin-left: 15px;
+}
+
+.model-form-footer .layui-btn + .layui-btn {
+    margin-left: 15px;
+}
+
+.layui-table-cell .layui-btn + .layui-btn {
+    margin-left: 5px;
+}
+
+/** 表格上方工具栏样式 */
+.layui-form.toolbar {
+    color: #333;
+}
+
+.layui-form.toolbar .layui-form-select input {
+    height: 35px;
+    line-height: 35px;
+    width: 150px;
+    overflow: hidden;
+}
+
+.layui-form.toolbar .layui-form-select {
+    display: inline-block;
+}
+
+/* 表单弹窗样式 */
+.model-form {
+    padding-top: 30px;
+    padding-right: 45px;
+}
+
+.model-form-footer {
+    text-align: right;
+}
+
+/** dialog超出显示 */
+.layui-layout-body .layui-layer-page .layui-layer-content {
+    overflow: visible;
+}
+
+/* layui文档官网右侧弹窗目录列表的样式 */
+.site-dir li {
+    line-height: 26px;
+    margin-left: 20px;
+    overflow: visible;
+    list-style-type: disc;
+}
+
+/** laydate加图标 */
+.date-icon {
+    background-image: url(../images/icon_date.png);
+    background-repeat: no-repeat;
+    background-position: right center;
+}
+
+/** 辅助样式 */
+.layui-link {
+    color: #029789 !important;
+}
+
+.layui-link:hover {
+    opacity: .8;
+}
+
+.pull-right {
+    float: right;
+}
+
+.inline-block {
+    display: inline-block;
+}
+
+/** 卡片header里面的徽章样式调整 */
+.layui-card .layui-card-header .layui-badge.pull-right {
+    top: 50%;
+    margin-top: -9px;
+}
+
+/** 特大字体 */
+.lay-big-font {
+    font-size: 36px;
+    color: #666;
+    line-height: 36px;
+    padding: 5px 0 10px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    word-break: break-all;
+    white-space: nowrap;
+}
+
+/** 超链接样式 */
+.layui-text a:not(.layui-btn) {
+    color: #01AAED;
+}
+
+.layui-text a:not(.layui-btn):hover {
+    text-decoration: underline;
+}
+
+/** loading组件样式 */
+.admin-loading {
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    margin: -16px -15px;
+    font-size: 30px;
+    color: #c2c2c2
+}
+
+/** admin选项卡样式 */
+/** 调整header阴影 */
+.layui-layout-admin.open-tab .layui-header {
+    box-shadow: 0 1px 1px 0 rgba(0, 21, 41, .05);
+}
+
+.layui-layout-admin.open-tab .layui-body {
+    padding: 0;
+    overflow: hidden;
+}
+
+.layui-layout-admin .layui-body .layui-tab {
+    margin: 0;
+    overflow: hidden;
+}
+
+/** 开启选项卡后让tab-content样式为以前的layui-body样式 */
+.layui-layout-admin .layui-body .layui-tab .layui-tab-content .layui-tab-item {
+    position: absolute;
+    bottom: 0;
+    overflow-y: scroll;
+    padding: 15px;
+    right: 0;
+    top: 40px;
+    left: 0;
+}
+
+/** 选项卡标题样式 */
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title {
+    height: 40px;
+    line-height: 40px;
+    padding: 0 80px 0 40px;
+    background-color: #fff;
+    box-shadow: 0 1px 2px 0 rgba(0, 0, 0, .1);
+    position: absolute;
+    right: 0;
+    z-index: 999;
+    border: none;
+    overflow: hidden;
+}
+
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li {
+    min-width: 0;
+    line-height: 40px;
+    max-width: 160px;
+    text-overflow: ellipsis;
+    overflow: hidden;
+    border-right: 1px solid #f6f6f6;
+    vertical-align: top;
+}
+
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title .layui-tab-bar {
+    display: none;
+}
+
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li.layui-this,
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:hover {
+    background-color: #f6f6f6;
+}
+
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li.layui-this:after {
+    width: 100%;
+    border: none;
+    height: 2px;
+    background-color: #292B34;
+    border-radius: 0;
+}
+
+/** tab关闭按钮样式 */
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li .layui-tab-close {
+    width: 16px;
+    height: 16px;
+    line-height: 16px;
+    border-radius: 50%;
+    font-size: 12px;
+}
+
+.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:first-child .layui-tab-close {
+    display: none; /** 第一个选项卡不可关闭 */
+}
+
+/** 选项卡其他操作按钮样式 */
+.layui-layout-admin .layui-body .admin-tabs-control {
+    position: absolute;
+    top: 0;
+    width: 40px;
+    height: 40px;
+    line-height: 40px;
+    text-align: center;
+    cursor: pointer;
+    transition: all .3s;
+    box-sizing: border-box;
+    border-left: 1px solid #f6f6f6;
+    z-index: 1000;
+    visibility: hidden; /** 默认隐藏 */
+    background-color: white;
+}
+
+.layui-layout-admin.open-tab .layui-body .admin-tabs-control {
+    visibility: visible;
+}
+
+.layui-layout-admin .layui-body .admin-tabs-control:hover {
+    background-color: #f6f6f6
+}
+
+.layui-layout-admin .layui-body .layui-icon-prev {
+    left: 0;
+    border-left: none;
+    border-right: 1px solid #f6f6f6;
+}
+
+.layui-layout-admin .layui-body .layui-icon-next {
+    right: 40px;
+}
+
+.layui-layout-admin .layui-body .layui-icon-down {
+    right: 0;
+}
+
+.admin-tabs-select.layui-nav {
+    position: absolute;
+    left: 0;
+    top: 0;
+    width: 100%;
+    height: 100%;
+    padding: 0;
+    background: 0 0;
+}
+
+.admin-tabs-select.layui-nav .layui-nav-item {
+    line-height: 40px
+}
+
+.admin-tabs-select.layui-nav .layui-nav-item > a {
+    height: 40px
+}
+
+.admin-tabs-select.layui-nav .layui-nav-item a {
+    color: #666
+}
+
+.admin-tabs-select.layui-nav .layui-nav-child {
+    top: 40px;
+    left: auto;
+    right: 0
+}
+
+.admin-tabs-select.layui-nav .layui-nav-child dd.layui-this,
+.admin-tabs-select.layui-nav .layui-nav-child dd.layui-this a {
+    background-color: #f2f2f2 !important;
+    color: #333
+}
+
+.admin-tabs-select.layui-nav .layui-nav-bar, .admin-tabs-select.layui-nav .layui-nav-more {
+    display: none;
+}
+
+.layui-fluid {
+    padding: 15px;
+}
+
+body.layui-fluid {
+    overflow-y: scroll;
+}
+
+.admin-iframe {
+    width: 100%;
+    height: 100%;
+}
+
+.layui-layout-admin .layui-body.admin-iframe-body {
+    padding: 0;
+    overflow: hidden;
+}
diff --git a/src/main/resources/static/payapi/css/login.css b/src/main/resources/static/custom/css/login.css
similarity index 100%
rename from src/main/resources/static/payapi/css/login.css
rename to src/main/resources/static/custom/css/login.css
diff --git a/src/main/resources/static/custom/css/theme-blue.css b/src/main/resources/static/custom/css/theme-blue.css
new file mode 100755
index 0000000..476b1bd
--- /dev/null
+++ b/src/main/resources/static/custom/css/theme-blue.css
@@ -0,0 +1,102 @@
+/** logo部分样式 */
+.layui-layout-admin .layui-header .layui-logo {
+    background-color: #0085E8;
+    color: #fff;
+}
+
+/** header样式 */
+.layui-layout-admin .layui-header {
+    background-color: #1E9FFF;
+}
+
+.layui-layout-admin .layui-header a {
+    color: #fff;
+}
+
+.layui-layout-admin .layui-header a:hover {
+    color: #fff;
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-more {
+    border-color: #fff transparent transparent;
+}
+
+.layui-layout-admin .layui-header .layui-nav .layui-nav-mored {
+    border-color: transparent transparent #fff;
+}
+
+/** 导航栏下面的线条 */
+.layui-layout-admin .layui-header .layui-nav .layui-this:after, .layui-layout-admin .layui-header .layui-nav-bar {
+    background-color: #fff;
+}
+
+/** 侧边栏样式 */
+.layui-layout-admin .layui-side {
+    background-color: #344058;
+}
+
+.layui-nav-tree .layui-nav-child dd.layui-this, .layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-this, .layui-nav-tree .layui-this > a, .layui-nav-tree .layui-this > a:hover {
+    background-color: #1E9FFF;
+}
+
+.layui-nav-tree .layui-nav-bar {
+    background-color: #1E9FFF;
+}
+
+/** 主题颜色 */
+
+/** 按钮 */
+.layui-btn:not(.layui-btn-primary):not(.layui-btn-normal):not(.layui-btn-warm):not(.layui-btn-danger):not(.layui-btn-disabled) {
+    background-color: #1E9FFF;
+}
+
+.layui-btn.layui-btn-primary:hover {
+    border-color: #1E9FFF;
+}
+
+/** 开关 */
+.layui-form-onswitch {
+    border-color: #1E9FFF;
+    background-color: #1E9FFF;
+}
+
+/** 分页插件 */
+.layui-laypage .layui-laypage-curr .layui-laypage-em {
+    background-color: #1E9FFF;
+}
+
+.layui-table-page .layui-laypage input:focus {
+    border-color: #1E9FFF !important;
+}
+
+.layui-table-view select:focus {
+    border-color: #1E9FFF !important;
+}
+
+.layui-table-page .layui-laypage a:hover {
+    color: #1E9FFF;
+}
+
+/** 单选按钮 */
+.layui-form-radio > i:hover, .layui-form-radioed > i {
+    color: #1E9FFF;
+}
+
+/** 下拉条目选中 */
+.layui-form-select dl dd.layui-this {
+    background-color: #1E9FFF;
+}
+
+/** 选项卡 */
+.layui-tab-brief > .layui-tab-title .layui-this {
+    color: #1E9FFF;
+}
+
+.layui-tab-brief > .layui-tab-more li.layui-this:after, .layui-tab-brief > .layui-tab-title .layui-this:after {
+    border-color: #1E9FFF !important;
+}
+
+/** 面包屑导航 */
+.layui-breadcrumb a:hover {
+    color: #1E9FFF !important;
+}
\ No newline at end of file
diff --git a/src/main/resources/static/payapi/images/bg_login.png b/src/main/resources/static/custom/images/bg_login.png
similarity index 100%
rename from src/main/resources/static/payapi/images/bg_login.png
rename to src/main/resources/static/custom/images/bg_login.png
Binary files differ
diff --git a/src/main/resources/static/custom/images/head.png b/src/main/resources/static/custom/images/head.png
new file mode 100755
index 0000000..e298c8a
--- /dev/null
+++ b/src/main/resources/static/custom/images/head.png
Binary files differ
diff --git a/src/main/resources/static/payapi/images/logo.png b/src/main/resources/static/custom/images/logo.png
similarity index 100%
rename from src/main/resources/static/payapi/images/logo.png
rename to src/main/resources/static/custom/images/logo.png
Binary files differ
diff --git a/src/main/resources/static/custom/module/admin.js b/src/main/resources/static/custom/module/admin.js
new file mode 100755
index 0000000..898ce05
--- /dev/null
+++ b/src/main/resources/static/custom/module/admin.js
@@ -0,0 +1,327 @@
+layui.define(['layer'], function (exports) {
+    var layer = layui.layer;
+    var popupRightIndex, popupCenterIndex, popupCenterParam;
+
+    var admin = {
+        isRefresh: false,
+        // 设置侧栏折叠
+        flexible: function (expand) {
+            var isExapnd = $('.layui-layout-admin').hasClass('admin-nav-mini');
+            if (isExapnd == !expand) {
+                return;
+            }
+            if (expand) {
+                $('.layui-layout-admin').removeClass('admin-nav-mini');
+            } else {
+                $('.layui-layout-admin').addClass('admin-nav-mini');
+            }
+        },
+        // 设置导航栏选中
+        activeNav: function (url) {
+            $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item .layui-nav-child dd').removeClass('layui-this');
+            $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item').removeClass('layui-this');
+            if (url && url != '') {
+                $('.layui-layout-admin .layui-side .layui-nav .layui-nav-item').removeClass('layui-nav-itemed');
+                var $a = $('.layui-layout-admin .layui-side .layui-nav a[href="#!' + url + '"]');
+                $a.parent('li').addClass('layui-this');
+                $a.parent('dd').addClass('layui-this');
+                $a.parent('dd').parent('.layui-nav-child').parent('.layui-nav-item').addClass('layui-nav-itemed');
+            }
+        },
+        // 右侧弹出
+        popupRight: function (path) {
+            var param = new Object();
+            param.path = path;
+            param.id = 'adminPopupR';
+            param.title = false;
+            param.anim = 2;
+            param.isOutAnim = false;
+            param.closeBtn = false;
+            param.offset = 'r';
+            param.shadeClose = true;
+            param.area = '336px';
+            param.skin = 'layui-layer-adminRight';
+            param.end = function () {
+                layer.closeAll('tips');
+            };
+            popupRightIndex = admin.open(param);
+            return popupRightIndex;
+        },
+        // 关闭右侧弹出
+        closePopupRight: function () {
+            layer.close(popupRightIndex);
+        },
+        // 中间弹出
+        popupCenter: function (param) {
+            param.id = 'adminPopupC';
+            popupCenterParam = param;
+            popupCenterIndex = admin.open(param);
+            return popupCenterIndex;
+        },
+        // 关闭中间弹出并且触发finish回调
+        finishPopupCenter: function () {
+            layer.close(popupCenterIndex);
+            popupCenterParam.finish ? popupCenterParam.finish() : '';
+        },
+        // 关闭中间弹出
+        closePopupCenter: function () {
+            layer.close(popupCenterIndex);
+        },
+        // 封装layer.open
+        open: function (param) {
+            var sCallBack = param.success;
+            param.type = 1;
+            param.area = param.area ? param.area : '450px';
+            param.offset = param.offset ? param.offset : '120px';
+            param.resize ? param.resize : false;
+            param.shade ? param.shade : .2;
+            param.success = function (layero, index) {
+                sCallBack ? sCallBack(layero, index) : '';
+                admin.ajax({
+                    url: param.path,
+                    type: 'GET',
+                    dataType: 'html',
+                    success: function (result, status, xhr) {
+                        $(layero).children('.layui-layer-content').html(result);
+                    }
+                });
+            };
+            return layer.open(param);
+        },
+        
+        go:function(url,data,success){
+        	  $.ajax({
+        		  url: url,
+        		  data: data,
+        		  async: false,
+        		  dataType: 'json',
+        		  type: 'post',
+        		   success: success
+        	  })
+        },
+        dgo:function(url,data,success){
+      	  $.ajax({
+      		  url: url,
+      		  data: data,
+      		  async: false,
+      		  dataType: 'json',
+      		  type: 'get',
+      		   success: success
+      	  })
+      },
+        // 封装ajax请求，返回数据类型为json
+        req: function (url, data, success, method) {
+            admin.ajax({
+                url: url,
+                data: data,
+                async: false,
+                type: method,
+                dataType: 'json',
+                success: success
+            });
+        },
+        // 封装ajax请求
+        ajax: function (param) {
+        	console.log(param);
+            var successCallback = param.success;
+            param.success = function (result, status, xhr) {
+                // 判断登录过期和没有权限
+                var jsonRs;
+                if ('json' == param.dataType.toLowerCase()) {
+                    jsonRs = result;
+                } else if ('html' == param.dataType.toLowerCase() || 'text' == param.dataType.toLowerCase()) {
+                    jsonRs = admin.parseJSON(result);
+                }
+                if (jsonRs) {
+                    if (jsonRs.code == 401) {
+                        layer.msg(jsonRs.msg, {icon: 2, time: 1500}, function () {
+                            location.replace('/login');
+                        }, 1000);
+                        return;
+                    } else if ('html' == param.dataType.toLowerCase() && jsonRs.code == 403) {
+                        layer.msg(jsonRs.msg, {icon: 2});
+                    }
+                }
+                successCallback(result, status, xhr);
+            };
+            param.error = function (xhr) {
+                param.success({code: xhr.status, msg: xhr.statusText});
+            };
+            $.ajax(param);
+        },
+        // 显示加载动画
+        showLoading: function (element) {
+            $(element).append('<i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop admin-loading"></i>');
+        },
+        // 移除加载动画
+        removeLoading: function (element) {
+            $(element + '>.admin-loading').remove();
+        },
+        // 缓存临时数据
+        putTempData: function (key, value) {
+            if (value) {
+                layui.sessionData('tempData', {key: key, value: value});
+            } else {
+                layui.sessionData('tempData', {key: key, remove: true});
+            }
+        },
+        // 获取缓存临时数据
+        getTempData: function (key) {
+            return layui.sessionData('tempData')[key];
+        },
+        // 滑动选项卡
+        rollPage: function (d) {
+            var $tabTitle = $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title');
+            var left = $tabTitle.scrollLeft();
+            if ('left' === d) {
+                $tabTitle.scrollLeft(left - 120);
+            } else if ('auto' === d) {
+                var autoLeft = 0;
+                $tabTitle.children("li").each(function () {
+                    if ($(this).hasClass('layui-this')) {
+                        return false;
+                    } else {
+                        autoLeft += $(this).outerWidth();
+                    }
+                });
+                $tabTitle.scrollLeft(autoLeft - 47);
+            } else {
+                $tabTitle.scrollLeft(left + 120);
+            }
+        },
+        // 刷新主题部分
+        refresh: function () {
+            admin.isRefresh = true;
+            Q.refresh();
+        },
+        // 判断是否为json
+        parseJSON: function (str) {
+            if (typeof str == 'string') {
+                try {
+                    var obj = JSON.parse(str);
+                    if (typeof obj == 'object' && obj) {
+                        return obj;
+                    }
+                } catch (e) {
+                }
+            }
+        }
+    };
+
+    // ewAdmin提供的事件
+    admin.events = {
+        // 折叠侧导航
+        flexible: function (e) {
+            var expand = $('.layui-layout-admin').hasClass('admin-nav-mini');
+            admin.flexible(expand);
+        },
+        // 刷新主体部分
+        refresh: function () {
+            admin.refresh();
+        },
+        //后退
+        back: function () {
+            history.back();
+        },
+        // 设置主题
+        theme: function () {
+            admin.popupRight('home/theme');
+        },
+        // 全屏
+        fullScreen: function (e) {
+            var ac = 'layui-icon-screen-full', ic = 'layui-icon-screen-restore';
+            var ti = $(this).find('i');
+
+            var isFullscreen = document.fullscreenElement || document.msFullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || false;
+            if (isFullscreen) {
+                var efs = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen;
+                if (efs) {
+                    efs.call(document);
+                } else if (window.ActiveXObject) {
+                    var ws = new ActiveXObject('WScript.Shell');
+                    ws && ws.SendKeys('{F11}');
+                }
+                ti.addClass(ac).removeClass(ic);
+            } else {
+                var el = document.documentElement;
+                var rfs = el.requestFullscreen || el.webkitRequestFullscreen || el.mozRequestFullScreen || el.msRequestFullscreen;
+                if (rfs) {
+                    rfs.call(el);
+                } else if (window.ActiveXObject) {
+                    var ws = new ActiveXObject('WScript.Shell');
+                    ws && ws.SendKeys('{F11}');
+                }
+                ti.addClass(ic).removeClass(ac);
+            }
+        },
+        // 左滑动tab
+        leftPage: function () {
+            admin.rollPage("left");
+        },
+        // 右滑动tab
+        rightPage: function () {
+            admin.rollPage();
+        },
+        // 关闭当前选项卡
+        closeThisTabs: function () {
+            var $title = $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title');
+            if ($title.find('li').first().hasClass('layui-this')) {
+                return;
+            }
+            $title.find('li.layui-this').find(".layui-tab-close").trigger("click");
+        },
+        // 关闭其他选项卡
+        closeOtherTabs: function () {
+            $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:gt(0):not(.layui-this)').find('.layui-tab-close').trigger('click');
+        },
+        // 关闭所有选项卡
+        closeAllTabs: function () {
+            $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title li:gt(0)').find('.layui-tab-close').trigger('click');
+        },
+        // 关闭所有弹窗
+        closeDialog: function () {
+            layer.closeAll('page');
+        }
+    };
+
+    // 所有ew-event
+    $('body').on('click', '*[ew-event]', function () {
+        var event = $(this).attr('ew-event');
+        var te = admin.events[event];
+        te && te.call(this, $(this));
+    });
+
+    // 移动设备遮罩层点击事件
+    $('.site-mobile-shade').click(function () {
+        admin.flexible(true);
+    });
+
+    // 侧导航折叠状态下鼠标经过显示提示
+    $('body').on('mouseenter', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {
+        var tipText = $(this).find('cite').text();
+        if (document.body.clientWidth > 750) {
+            layer.tips(tipText, this);
+        }
+    }).on('mouseleave', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {
+        layer.closeAll('tips');
+    });
+
+    // 侧导航折叠状态下点击展开
+    $('body').on('click', '.layui-layout-admin.admin-nav-mini .layui-side .layui-nav .layui-nav-item>a', function () {
+        if (document.body.clientWidth > 750) {
+            layer.closeAll('tips');
+            admin.flexible(true);
+        }
+    });
+
+    // 所有lay-tips处理
+    $('body').on('mouseenter', '*[lay-tips]', function () {
+        var tipText = $(this).attr('lay-tips');
+        var dt = $(this).attr('lay-direction');
+        layer.tips(tipText, this, {tips: dt || 1, time: -1});
+    }).on('mouseleave', '*[lay-tips]', function () {
+        layer.closeAll('tips');
+    });
+
+    exports('admin', admin);
+});
diff --git a/src/main/resources/static/custom/module/formSelects/formSelects-v4.all.js b/src/main/resources/static/custom/module/formSelects/formSelects-v4.all.js
new file mode 100755
index 0000000..6599c17
--- /dev/null
+++ b/src/main/resources/static/custom/module/formSelects/formSelects-v4.all.js
@@ -0,0 +1,1415 @@
+'use strict';
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+/**
+ * name: formSelects
+ * 基于Layui Select多选
+ * version: 4.0.0.formSelects
+ * http://sun.faysunshine.com/layui/formSelects-v4/dist/formSelects-v4.js
+ */
+(function (layui, window, factory) {
+	if ((typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object') {
+		// 支持 CommonJS
+		module.exports = factory();
+	} else if (typeof define === 'function' && define.amd) {
+		// 支持 AMD
+		define(factory);
+	} else if (window.layui && layui.define) {
+		//layui加载
+		layui.define(['jquery'], function (exports) {
+			exports('formSelects', factory());
+		});
+	} else {
+		window.formSelects = factory();
+	}
+})(typeof layui == 'undefined' ? null : layui, window, function () {
+	var v = '4.0.0.formSelects',
+	    NAME = 'xm-select',
+	    PNAME = 'xm-select-parent',
+	    INPUT = 'xm-select-input',
+	    TDIV = 'xm-select--suffix',
+	    THIS = 'xm-select-this',
+	    LABEL = 'xm-select-label',
+	    SEARCH = 'xm-select-search',
+	    CREATE = 'xm-select-create',
+	    CREATE_LONG = 'xm-select-create-long',
+	    MAX = 'xm-select-max',
+	    SKIN = 'xm-select-skin',
+	    DIRECTION = "xm-select-direction",
+	    HEIGHT = 'xm-select-height',
+	    DISABLED = 'xm-dis-disabled',
+	    DIS = 'xm-select-dis',
+	    TEMP = 'xm-select-temp',
+	    RADIO = 'xm-select-radio',
+	    LINKAGE = 'xm-select-linkage',
+	    DL = 'xm-select-dl',
+	    HIDE_INPUT = 'xm-hide-input',
+	    SANJIAO = 'xm-select-sj',
+	    ICON_CLOSE = 'xm-icon-close',
+	    FORM_TITLE = 'xm-select-title',
+	    FORM_SELECT = 'xm-form-select',
+	    FORM_SELECTED = 'xm-form-selected',
+	    FORM_NONE = 'xm-select-none',
+	    FORM_EMPTY = 'xm-select-empty',
+	    FORM_INPUT = 'xm-input',
+	    FORM_SELECT_TIPS = 'xm-select-tips',
+	    CHECKBOX_YES = 'xm-icon-yes',
+	    CZ = 'xm-cz',
+	    CZ_GROUP = 'xm-cz-group',
+	    TIPS = '请选择',
+	    data = {},
+	    events = {
+		on: {},
+		filter: {},
+		maxTips: {}
+	},
+	    ajax = {
+		type: 'get',
+		header: {},
+		first: true,
+		data: {},
+		searchUrl: '',
+		searchName: 'keyword',
+		searchVal: null,
+		keyName: 'name',
+		keyVal: 'value',
+		keySel: 'selected',
+		keyDis: 'disabled',
+		keyChildren: 'children',
+		dataType: '',
+		delay: 500,
+		beforeSuccess: null,
+		success: null,
+		error: null,
+		beforeSearch: null,
+		clearInput: false
+	},
+	    quickBtns = [{ icon: 'iconfont icon-quanxuan', name: '全选', click: function click(id, cm) {
+			cm.selectAll(id, true, true);
+		} }, { icon: 'iconfont icon-qingkong', name: '清空', click: function click(id, cm) {
+			cm.removeAll(id, true, true);
+		} }, { icon: 'iconfont icon-fanxuan', name: '反选', click: function click(id, cm) {
+			cm.reverse(id, true, true);
+		} }, { icon: 'iconfont icon-pifu', name: '换肤', click: function click(id, cm) {
+			cm.skin(id);
+		} }],
+	    $ = window.$ || window.layui && window.layui.jquery,
+	    $win = $(window),
+	    ajaxs = {},
+	    FormSelects = function FormSelects(options) {
+		var _this = this;
+
+		this.config = {
+			name: null, //xm-select="xxx"
+			max: null,
+			maxTips: function maxTips(vals, val, max) {
+				var ipt = $('[xid="' + _this.config.name + '"]').prev().find('.' + NAME);
+				if (ipt.parents('.layui-form-item[pane]').length) {
+					ipt = ipt.parents('.layui-form-item[pane]');
+				}
+				ipt.attr('style', 'border-color: red !important');
+				setTimeout(function () {
+					ipt.removeAttr('style');
+				}, 300);
+			},
+			init: null, //初始化的选择值,
+			on: null, //select值发生变化
+			filter: function filter(id, inputVal, val, isDisabled) {
+				return val.name.indexOf(inputVal) == -1;
+			},
+			clearid: -1,
+			direction: 'auto',
+			height: null,
+			isEmpty: false,
+			btns: [quickBtns[0], quickBtns[1], quickBtns[2]]
+		};
+		this.select = null;
+		this.values = [];
+		$.extend(true, this.config, options);
+	};
+
+	//一些简单的处理方法
+	var Common = function Common() {
+		this.loadingCss();
+		this.appender();
+		this.init();
+		this.on();
+		this.initVal();
+		this.onreset();
+		this.listening();
+	};
+
+	Common.prototype.appender = function () {
+		//针对IE做的一些拓展
+		if (!Array.prototype.map) {
+			Array.prototype.map = function (callback, thisArg) {
+				var T,
+				    A,
+				    k,
+				    O = Object(this),
+				    len = O.length >>> 0;
+				if (thisArg) {
+					T = thisArg;
+				}
+				A = new Array(len);
+				k = 0;
+				while (k < len) {
+					var kValue, mappedValue;
+					if (k in O) {
+						kValue = O[k];
+						mappedValue = callback.call(T, kValue, k, O);
+						A[k] = mappedValue;
+					}
+					k++;
+				}
+				return A;
+			};
+		}
+		if (!Array.prototype.forEach) {
+			Array.prototype.forEach = function forEach(callback, thisArg) {
+				var T, k;
+				if (this == null) {
+					throw new TypeError("this is null or not defined");
+				}
+				var O = Object(this);
+				var len = O.length >>> 0;
+				if (typeof callback !== "function") {
+					throw new TypeError(callback + " is not a function");
+				}
+				if (arguments.length > 1) {
+					T = thisArg;
+				}
+				k = 0;
+				while (k < len) {
+					var kValue;
+					if (k in O) {
+
+						kValue = O[k];
+						callback.call(T, kValue, k, O);
+					}
+					k++;
+				}
+			};
+		}
+	};
+
+	Common.prototype.init = function (target) {
+		var _this2 = this;
+
+		//初始化页面上已有的select
+		$(target ? target : 'select[' + NAME + ']').each(function (index, select) {
+			var othis = $(select),
+			    id = othis.attr(NAME),
+			    hasRender = othis.next('.layui-form-select'),
+			    disabled = select.disabled,
+			    max = othis.attr(MAX) - 0,
+			    isSearch = othis.attr(SEARCH) != undefined,
+			    searchUrl = isSearch ? othis.attr(SEARCH) : null,
+			    isCreate = othis.attr(CREATE) != undefined,
+			    isRadio = othis.attr(RADIO) != undefined,
+			    skin = othis.attr(SKIN),
+			    direction = othis.attr(DIRECTION),
+			    optionsFirst = select.options[0],
+			    height = othis.attr(HEIGHT),
+			    formname = othis.attr('name'),
+			    layverify = othis.attr('lay-verify'),
+			    placeholder = optionsFirst ? optionsFirst.value ? TIPS : optionsFirst.innerHTML || TIPS : TIPS,
+			    value = othis.find('option[selected]').toArray().map(function (option) {
+				//获取已选中的数据
+				return {
+					name: option.innerHTML,
+					val: option.value
+				};
+			}),
+			    fs = new FormSelects();
+			data[id] = fs;
+			//先取消layui对select的渲染
+			hasRender[0] && hasRender.remove();
+
+			//包裹一个div
+			othis.wrap('<div class="' + PNAME + '"></div>');
+
+			//构造渲染div
+			var dinfo = _this2.renderSelect(id, placeholder, select);
+			var heightStyle = height ? 'style="height: ' + height + ';"' : '';
+			var inputHtml = height ? ['<div class="' + LABEL + '" style="margin-right: 50px;"></div>', '<input type="text" fsw class="' + FORM_INPUT + ' ' + INPUT + '" ' + (isSearch ? '' : 'style="display: none;"') + ' autocomplete="off" debounce="0" style="position: absolute;right: 10px;top: 3px;"/>'] : ['<div class="' + LABEL + '">', '<input type="text" fsw class="' + FORM_INPUT + ' ' + INPUT + '" ' + (isSearch ? '' : 'style="display: none;"') + ' autocomplete="off" debounce="0" />', '</div>'];
+			var reElem = $('<div class="' + FORM_SELECT + '" ' + SKIN + '="' + skin + '">\n\t\t\t\t\t<input type="hidden" class="' + HIDE_INPUT + '" value="" name="' + formname + '" lay-verify="' + layverify + '"/>\n\t\t\t\t\t<div class="' + FORM_TITLE + ' ' + (disabled ? DIS : '') + '">\n\t\t\t\t\t\t<div class="' + FORM_INPUT + ' ' + NAME + '" ' + heightStyle + '>\n\t\t\t\t\t\t\t' + inputHtml.join('') + '\n\t\t\t\t\t\t\t<i class="' + SANJIAO + '"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="' + TDIV + '">\n\t\t\t\t\t\t\t<input type="text" autocomplete="off" placeholder="' + placeholder + '" readonly="readonly" unselectable="on" class="' + FORM_INPUT + '">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<dl xid="' + id + '" class="' + DL + ' ' + (isRadio ? RADIO : '') + '">' + dinfo + '</dl>\n\t\t\t\t</div>');
+			othis.after(reElem);
+			fs.select = othis.remove(); //去掉layui.form.render
+			fs.values = value;
+			fs.config.name = id;
+			fs.config.init = value.concat([]);
+			fs.config.direction = direction;
+			fs.config.height = height;
+			fs.config.radio = isRadio;
+
+			if (max) {
+				//有最大值
+				fs.config.max = max;
+			}
+
+			//如果可搜索, 加上事件
+			if (isSearch) {
+				reElem.find('.' + INPUT).on('input propertychange', function (e) {
+					var input = e.target,
+					    inputValue = $.trim(input.value),
+					    keyCode = e.keyCode;
+					if (keyCode === 9 || keyCode === 13 || keyCode === 37 || keyCode === 38 || keyCode === 39 || keyCode === 40) {
+						return false;
+					}
+
+					//过滤一下tips
+					_this2.changePlaceHolder($(input));
+
+					var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+					searchUrl = ajaxConfig.searchUrl || searchUrl;
+					//如果开启了远程搜索
+					if (searchUrl) {
+						if (ajaxConfig.searchVal) {
+							inputValue = ajaxConfig.searchVal;
+							ajaxConfig.searchVal = '';
+						}
+						if (!ajaxConfig.beforeSearch || ajaxConfig.beforeSearch && ajaxConfig.beforeSearch instanceof Function && ajaxConfig.beforeSearch(id, searchUrl, inputValue)) {
+							var delay = ajaxConfig.delay;
+							if (ajaxConfig.first) {
+								ajaxConfig.first = false;
+								delay = 10;
+							}
+							clearTimeout(fs.clearid);
+							fs.clearid = setTimeout(function () {
+								reElem.find('dl > *:not(.' + FORM_SELECT_TIPS + ')').remove();
+								reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('请求中');
+								_this2.ajax(id, searchUrl, inputValue, false, null, true);
+							}, delay);
+						}
+					} else {
+						reElem.find('dl .layui-hide').removeClass('layui-hide');
+						//遍历选项, 选择可以显示的值
+						reElem.find('dl dd:not(.' + FORM_SELECT_TIPS + ')').each(function (idx, item) {
+							var _item = $(item);
+							var searchFun = data[id].config.filter || events.filter[id];
+							if (searchFun && searchFun(id, inputValue, {
+								name: _item.find('span').text(),
+								val: _item.attr('lay-value')
+							}, _item.hasClass(DISABLED)) == true) {
+								_item.addClass('layui-hide');
+							}
+						});
+						//控制分组名称
+						reElem.find('dl dt').each(function (index, item) {
+							if (!$(item).nextUntil('dt', ':not(.layui-hide)').length) {
+								$(item).addClass('layui-hide');
+							}
+						});
+						//动态创建
+						_this2.create(id, isCreate, inputValue);
+						var shows = reElem.find('dl dd:not(.' + FORM_SELECT_TIPS + '):not(.layui-hide)');
+						if (!shows.length) {
+							reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('无匹配项');
+						} else {
+							reElem.find('dd.' + FORM_NONE).removeClass(FORM_EMPTY);
+						}
+					}
+				});
+				if (searchUrl) {
+					//触发第一次请求事件
+					_this2.triggerSearch(reElem, true);
+				}
+			}
+		});
+	};
+
+	Common.prototype.isArray = function (obj) {
+		return Object.prototype.toString.call(obj) == "[object Array]";
+	};
+
+	Common.prototype.triggerSearch = function (div, isCall) {
+		(div ? [div] : $('.' + FORM_SELECT).toArray()).forEach(function (reElem, index) {
+			reElem = $(reElem);
+			var id = reElem.find('dl').attr('xid');
+			if (id && data[id] && data[id].config.isEmpty || isCall) {
+				var obj_caller = reElem.find('.' + INPUT)[0];
+				if (document.createEventObject) {
+					obj_caller.fireEvent("onchange");
+				} else {
+					var evt = document.createEvent("HTMLEvents");
+					evt.initEvent("input", false, true);
+					obj_caller.dispatchEvent(evt);
+				}
+			}
+		});
+	};
+
+	Common.prototype.ajax = function (id, searchUrl, inputValue, isLinkage, linkageWidth, isSearch) {
+		var _this3 = this;
+
+		var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+		if (!reElem[0] || !searchUrl) {
+			return;
+		}
+
+		var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+		var ajaxData = $.extend(true, {}, ajaxConfig.data);
+		ajaxData[ajaxConfig.searchName] = inputValue;
+		ajaxData['_'] = Date.now();
+		$.ajax({
+			type: ajaxConfig.type,
+			headers: ajaxConfig.header,
+			url: searchUrl,
+			data: ajaxConfig.dataType == 'json' ? JSON.stringify(ajaxData) : ajaxData,
+			success: function success(res) {
+				if (typeof res == 'string') {
+					res = JSON.parse(res);
+				}
+				ajaxConfig.beforeSuccess && ajaxConfig.beforeSuccess instanceof Function && (res = ajaxConfig.beforeSuccess(id, searchUrl, inputValue, res));
+				if (_this3.isArray(res)) {
+					res = {
+						code: 0,
+						msg: "",
+						data: res
+					};
+				}
+				if (res.code != 0) {
+					reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text(res.msg);
+				} else {
+					reElem.find('dd.' + FORM_NONE).removeClass(FORM_EMPTY);
+					//获得已选择的values
+					_this3.renderData(id, res.data, isLinkage, linkageWidth, isSearch);
+					data[id].config.isEmpty = res.data.length == 0;
+				}
+				ajaxConfig.success && ajaxConfig.success instanceof Function && ajaxConfig.success(id, searchUrl, inputValue, res);
+			},
+			error: function error(err) {
+				reElem.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + ')').remove();
+				reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('服务异常');
+				ajaxConfig.error && ajaxConfig.error instanceof Function && ajaxConfig.error(id, searchUrl, inputValue, err);
+			}
+		});
+	};
+
+	Common.prototype.renderData = function (id, dataArr, linkage, linkageWidth, isSearch) {
+		var _this4 = this;
+
+		if (linkage) {
+			var _ret = function () {
+				//渲染多级联动
+				var result = [],
+				    index = 0,
+				    temp = { "0": dataArr },
+				    ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+
+				var _loop = function _loop() {
+					var group = result[index++] = [],
+					    _temp = temp;
+					temp = {};
+					$.each(_temp, function (pid, arr) {
+						$.each(arr, function (idx, item) {
+							var val = {
+								pid: pid,
+								name: item[ajaxConfig.keyName],
+								val: item[ajaxConfig.keyVal]
+							};
+							group.push(val);
+							var children = item[ajaxConfig.keyChildren];
+							if (children && children.length) {
+								temp[val.val] = children;
+							}
+						});
+					});
+				};
+
+				do {
+					_loop();
+				} while (Object.getOwnPropertyNames(temp).length);
+
+				var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+				var html = ['<div class="xm-select-linkage">'];
+
+				$.each(result, function (idx, arr) {
+					var groupDiv = ['<div style="left: ' + (linkageWidth - 0) * idx + 'px;" class="xm-select-linkage-group xm-select-linkage-group' + (idx + 1) + ' ' + (idx != 0 ? 'xm-select-linkage-hide' : '') + '">'];
+					$.each(arr, function (idx2, item) {
+						var span = '<li title="' + item.name + '" pid="' + item.pid + '" value="' + item.val + '"><span>' + item.name + '</span></li>';
+						groupDiv.push(span);
+					});
+					groupDiv.push('</div>');
+					html = html.concat(groupDiv);
+				});
+				//			<li class="xm-select-this xm-select-active"><span>123</span></li>
+				html.push('<div style="clear: both; height: 288px;"></div>');
+				html.push('</div>');
+				reElem.find('dl').html(html.join(''));
+				reElem.find('.' + INPUT).css('display', 'none'); //联动暂时不支持搜索
+				return {
+					v: void 0
+				};
+			}();
+
+			if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
+		}
+
+		var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+		var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+		var pcInput = reElem.find('.' + TDIV + ' input');
+
+		var values = [];
+		reElem.find('dl').html(this.renderSelect(id, pcInput.attr('placeholder') || pcInput.attr('back'), dataArr.map(function (item) {
+			if (item[ajaxConfig.keySel]) {
+				values.push({
+					name: item[ajaxConfig.keyName],
+					val: item[ajaxConfig.keyVal]
+				});
+			}
+			return {
+				innerHTML: item[ajaxConfig.keyName],
+				value: item[ajaxConfig.keyVal],
+				sel: item[ajaxConfig.keySel],
+				disabled: item[ajaxConfig.keyDis],
+				type: item.type,
+				name: item.name
+			};
+		})));
+
+		var label = reElem.find('.' + LABEL);
+		var dl = reElem.find('dl[xid]');
+		if (isSearch) {
+			//如果是远程搜索, 这里需要判重
+			var oldVal = data[id].values;
+			oldVal.forEach(function (item, index) {
+				dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+			});
+			values.forEach(function (item, index) {
+				if (_this4.indexOf(oldVal, item) == -1) {
+					_this4.addLabel(id, label, item);
+					dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+					oldVal.push(item);
+				}
+			});
+		} else {
+			values.forEach(function (item, index) {
+				_this4.addLabel(id, label, item);
+				dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+			});
+			data[id].values = values;
+		}
+		this.commonHanler(id, label);
+	};
+
+	Common.prototype.create = function (id, isCreate, inputValue) {
+		if (isCreate && inputValue) {
+			var fs = data[id],
+			    dl = $('[xid="' + id + '"]'),
+			    tips = dl.find('dd.' + FORM_SELECT_TIPS + ':first'),
+			    tdd = null,
+			    temp = dl.find('dd.' + TEMP);
+			dl.find('dd:not(.' + FORM_SELECT_TIPS + '):not(.' + TEMP + ')').each(function (index, item) {
+				if (inputValue == $(item).find('span').text()) {
+					tdd = item;
+				}
+			});
+			if (!tdd) {
+				//如果不存在, 则创建
+				if (temp[0]) {
+					temp.attr('lay-value', inputValue);
+					temp.find('span').text(inputValue);
+					temp.removeClass('layui-hide');
+				} else {
+					tips.after($(this.createDD({
+						innerHTML: inputValue,
+						value: Date.now()
+					}, TEMP + ' ' + CREATE_LONG)));
+				}
+			}
+		} else {
+			$('[xid=' + id + '] dd.' + TEMP).remove();
+		}
+	};
+
+	Common.prototype.createDD = function (item, clz) {
+		return '<dd lay-value="' + item.value + '" class="' + (item.disabled ? DISABLED : '') + ' ' + (clz ? clz : '') + '">\n\t\t\t\t\t<div class="xm-unselect xm-form-checkbox ' + (item.disabled ? 'layui-checkbox-disbaled ' + DISABLED : '') + '" lay-skin="primary">\n\t\t\t\t\t\t<span>' + $.trim(item.innerHTML) + '</span>\n\t\t\t\t\t\t<i class="' + CHECKBOX_YES + '"></i>\n\t\t\t\t\t</div>\n\t\t\t\t</dd>';
+	};
+
+	Common.prototype.createQuickBtn = function (obj, right) {
+		return '<div class="' + CZ + '" method="' + obj.name + '" title="' + obj.name + '" ' + (right ? 'style="margin-right: ' + right + '"' : '') + '><i class="' + obj.icon + '"></i><span>' + obj.name + '</span></div>';
+	};
+
+	Common.prototype.renderBtns = function (id, show, right) {
+		var _this5 = this;
+
+		var quickBtn = [];
+		var dl = $('dl[xid="' + id + '"]');
+		quickBtn.push('<div class="' + CZ_GROUP + '" show="' + show + '" style="max-width: ' + (dl.prev().width() - 54) + 'px;">');
+		$.each(data[id].config.btns, function (index, item) {
+			quickBtn.push(_this5.createQuickBtn(item, right));
+		});
+		quickBtn.push('</div>');
+		quickBtn.push(this.createQuickBtn({ icon: 'iconfont icon-caidan', name: '' }));
+		return quickBtn.join('');
+	};
+
+	Common.prototype.renderSelect = function (id, tips, select) {
+		var _this6 = this;
+
+		var arr = [];
+		if (data[id].config.btns.length) {
+			setTimeout(function () {
+				var dl = $('dl[xid="' + id + '"]');
+				dl.find('.' + CZ_GROUP).css('max-width', dl.prev().width() - 54 + 'px');
+			}, 10);
+			arr.push(['<dd lay-value="" class="' + FORM_SELECT_TIPS + '" style="background-color: #FFF!important;">', this.renderBtns(id, null, '30px'), '</dd>'].join(''));
+		} else {
+			arr.push('<dd lay-value="" class="' + FORM_SELECT_TIPS + '">' + tips + '</dd>');
+		}
+		if (this.isArray(select)) {
+			$(select).each(function (index, item) {
+				if (item.type === 'optgroup') {
+					arr.push('<dt>' + item.name + '</dt>');
+				} else {
+					arr.push(_this6.createDD(item));
+				}
+			});
+		} else {
+			$(select).find('*').each(function (index, item) {
+				if (item.tagName.toLowerCase() == 'option' && index == 0 && !item.value) {
+					return;
+				}
+				if (item.tagName.toLowerCase() === 'optgroup') {
+					arr.push('<dt>' + item.label + '</dt>');
+				} else {
+					arr.push(_this6.createDD(item));
+				}
+			});
+		}
+		arr.push('<dt style="display:none;"> </dt>');
+		arr.push('<dd class="' + FORM_SELECT_TIPS + ' ' + FORM_NONE + ' ' + (arr.length === 2 ? FORM_EMPTY : '') + '">\u6CA1\u6709\u9009\u9879</dd>');
+		return arr.join('');
+	};
+
+	Common.prototype.on = function () {
+		var _this7 = this;
+
+		//事件绑定
+		this.one();
+
+		$(document).on('click', function (e) {
+			if (!$(e.target).parents('.' + FORM_TITLE)[0]) {
+				//清空input中的值
+				$('.' + INPUT).val('');
+				$('.' + PNAME + ' dl .layui-hide').removeClass('layui-hide');
+				$('.' + PNAME + ' dl dd.' + TEMP).remove();
+				_this7.triggerSearch();
+			}
+			$('.' + PNAME + ' .' + FORM_SELECTED).removeClass(FORM_SELECTED);
+		});
+	};
+
+	Common.prototype.one = function (target) {
+		var _this8 = this;
+
+		//一次性事件绑定
+		$(target ? target : document).find('.' + FORM_TITLE).off('click').on('click', function (e) {
+			var othis = $(e.target),
+			    title = othis.is(FORM_TITLE) ? othis : othis.parents('.' + FORM_TITLE),
+			    dl = title.next(),
+			    id = dl.attr('xid');
+
+			//清空非本select的input val
+			$('dl[xid]').not(dl).prev().find('.' + INPUT).val('');
+			$('dl[xid]').not(dl).find('dd.layui-hide').removeClass('layui-hide');
+
+			//如果是disabled select
+			if (title.hasClass(DIS)) {
+				return false;
+			}
+			//如果点击的是右边的三角或者只读的input
+			if (othis.is('.' + SANJIAO) || othis.is('.' + INPUT + '[readonly]')) {
+				_this8.changeShow(title, !title.parents('.' + FORM_SELECT).hasClass(FORM_SELECTED));
+				return false;
+			}
+			//如果点击的是input的右边, focus一下
+			if (title.find('.' + INPUT + ':not(readonly)')[0]) {
+				var input = title.find('.' + INPUT),
+				    epos = { x: e.pageX, y: e.pageY },
+				    pos = _this8.getPosition(title[0]),
+				    width = title.width();
+				while (epos.x > pos.x) {
+					if ($(document.elementFromPoint(epos.x, epos.y)).is(input)) {
+						input.focus();
+						_this8.changeShow(title, true);
+						return false;
+					}
+					epos.x -= 50;
+				}
+			}
+
+			//如果点击的是可搜索的input
+			if (othis.is('.' + INPUT)) {
+				_this8.changeShow(title, true);
+				return false;
+			}
+			//如果点击的是x按钮
+			if (othis.is('i[fsw="' + NAME + '"]')) {
+				var val = {
+					name: othis.prev().text(),
+					val: othis.parent().attr("value")
+				},
+				    dd = dl.find('dd[lay-value=\'' + val.val + '\']');
+				if (dd.hasClass(DISABLED)) {
+					//如果是disabled状态, 不可选, 不可删
+					return false;
+				}
+				_this8.handlerLabel(id, dd, false, val);
+				return false;
+			}
+
+			_this8.changeShow(title, !title.parents('.' + FORM_SELECT).hasClass(FORM_SELECTED));
+			return false;
+		});
+		$(target ? target : document).find('dl.' + DL).off('click').on('click', function (e) {
+			var othis = $(e.target);
+			if (othis.is('.' + LINKAGE) || othis.parents('.' + LINKAGE)[0]) {
+				//linkage的处理
+				othis = othis.is('li') ? othis : othis.parents('li');
+				var _group = othis.parents('.xm-select-linkage-group'),
+				    _id = othis.parents('dl').attr('xid');
+				//激活li
+				_group.find('.xm-select-active').removeClass('xm-select-active');
+				othis.addClass('xm-select-active');
+				//激活下一个group, 激活前显示对应数据
+				_group.nextAll('.xm-select-linkage-group').addClass('xm-select-linkage-hide');
+				var nextGroup = _group.next('.xm-select-linkage-group');
+				nextGroup.find('li').addClass('xm-select-linkage-hide');
+				nextGroup.find('li[pid="' + othis.attr('value') + '"]').removeClass('xm-select-linkage-hide');
+				//如果没有下一个group, 或没有对应的值
+				if (!nextGroup[0] || nextGroup.find('li:not(.xm-select-linkage-hide)').length == 0) {
+					var vals = [],
+					    index = 0,
+					    _isAdd = !othis.hasClass('xm-select-this');
+					if (data[_id].config.radio) {
+						othis.parents('.xm-select-linkage').find('.xm-select-this').removeClass('xm-select-this');
+					}
+					do {
+						vals[index++] = {
+							name: othis.find('span').text(),
+							val: othis.attr('value')
+							/*isAdd ? (
+       	othis.addClass('xm-select-this')
+       ) : (
+       	!othis.parent('.xm-select-linkage-group').next().find(`li[pid="${othis.attr('value')}"].xm-select-this`).length && othis.removeClass('xm-select-this')
+       );*/
+						};othis = othis.parents('.xm-select-linkage-group').prev().find('li[value="' + othis.attr('pid') + '"]');
+					} while (othis.length);
+					vals.reverse();
+					var val = {
+						name: vals.map(function (item) {
+							return item.name;
+						}).join('/'),
+						val: vals.map(function (item) {
+							return item.val;
+						}).join('/')
+					};
+					_this8.handlerLabel(_id, null, _isAdd, val);
+				} else {
+					nextGroup.removeClass('xm-select-linkage-hide');
+				}
+				return false;
+			} //xm-select-this xm-select-active
+
+			if (othis.is('dt') || othis.is('dl')) {
+				return false;
+			}
+			var dd = othis.is('dd') ? othis : othis.parents('dd');
+			var id = dd.parent('dl').attr('xid');
+			if (dd.hasClass(DISABLED)) {
+				//被禁用选项的处理
+				return false;
+			}
+			if (dd.hasClass(FORM_SELECT_TIPS)) {
+				//tips的处理
+				var btn = othis.is('.' + CZ) ? othis : othis.parents('.' + CZ);
+				if (!btn[0]) {
+					return false;
+				}
+				//TODO 快捷操作
+				var method = btn.attr('method');
+				var obj = data[id].config.btns.filter(function (bean) {
+					return bean.name == method;
+				})[0];
+				obj && obj.click && obj.click instanceof Function && obj.click(id, _this8);
+				return false;
+			}
+			var isAdd = !dd.hasClass(THIS);
+			_this8.handlerLabel(id, dd, isAdd);
+			return false;
+		});
+	};
+
+	Common.prototype.linkageAdd = function (id, val) {
+		var dl = $('dl[xid="' + id + '"]');
+		dl.find('.xm-select-active').removeClass('xm-select-active');
+		var vs = val.val.split('/');
+		var pid = void 0,
+		    li = void 0,
+		    index = 0;
+		var lis = [];
+		do {
+			pid = vs[index];
+			li = dl.find('.xm-select-linkage-group' + (index + 1) + ' li[value="' + pid + '"]');
+			li[0] && lis.push(li);
+			index++;
+		} while (li.length && pid != undefined);
+		if (lis.length == vs.length) {
+			$.each(lis, function (idx, item) {
+				item.addClass('xm-select-this');
+			});
+		}
+	};
+
+	Common.prototype.linkageDel = function (id, val) {
+		var dl = $('dl[xid="' + id + '"]');
+		var vs = val.val.split('/');
+		var pid = void 0,
+		    li = void 0,
+		    index = vs.length - 1;
+		do {
+			pid = vs[index];
+			li = dl.find('.xm-select-linkage-group' + (index + 1) + ' li[value="' + pid + '"]');
+			if (!li.parent().next().find('li[pid=' + pid + '].xm-select-this').length) {
+				li.removeClass('xm-select-this');
+			}
+			index--;
+		} while (li.length && pid != undefined);
+	};
+
+	Common.prototype.valToName = function (id, val) {
+		var dl = $('dl[xid="' + id + '"]');
+		var vs = (val + "").split('/');
+		var names = [];
+		$.each(vs, function (idx, item) {
+			var name = dl.find('.xm-select-linkage-group' + (idx + 1) + ' li[value="' + item + '"] span').text();
+			names.push(name);
+		});
+		return names.length == vs.length ? names.join('/') : null;
+	};
+
+	Common.prototype.commonHanler = function (key, label) {
+		//计算input的提示语
+		this.changePlaceHolder(label);
+		//计算高度
+		this.retop(label.parents('.' + FORM_SELECT));
+		this.checkHideSpan(label);
+		this.calcLeft(key, label);
+		//表单默认值
+		label.parents('.' + PNAME).find('.' + HIDE_INPUT).val(data[key].values.map(function (val) {
+			return val.val;
+		}).join(','));
+		//title值
+		label.parents('.' + FORM_TITLE + ' .' + NAME).attr('title', data[key].values.map(function (val) {
+			return val.name;
+		}).join(','));
+	};
+
+	Common.prototype.initVal = function (id) {
+		var _this9 = this;
+
+		var target = {};
+		if (id) {
+			target[id] = data[id];
+		} else {
+			target = data;
+		}
+		$.each(target, function (key, val) {
+			var values = val.values,
+			    div = $('dl[xid="' + key + '"]').parent(),
+			    label = div.find('.' + LABEL),
+			    dl = div.find('dl');
+			dl.find('dd.' + THIS).removeClass(THIS);
+
+			var _vals = values.concat([]);
+			_vals.concat([]).forEach(function (item, index) {
+				_this9.addLabel(key, label, item);
+				dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+			});
+			if (val.config.radio) {
+				_vals.length && values.push(_vals[_vals.length - 1]);
+			}
+			_this9.commonHanler(key, label);
+		});
+	};
+
+	Common.prototype.handlerLabel = function (id, dd, isAdd, oval, notOn) {
+		var div = $('[xid="' + id + '"]').prev().find('.' + LABEL),
+		    val = dd && {
+			name: dd.find('span').text(),
+			val: dd.attr('lay-value')
+		},
+		    vals = data[id].values,
+		    on = data[id].config.on || events.on[id];
+		if (oval) {
+			val = oval;
+		}
+		var fs = data[id];
+		if (isAdd && fs.config.max && fs.values.length >= fs.config.max) {
+			var maxTipsFun = data[id].config.maxTips || events.maxTips[id];
+			maxTipsFun && maxTipsFun(id, vals.concat([]), val, fs.max);
+			return;
+		}
+		if (!notOn) {
+			if (on && on instanceof Function && on(id, vals.concat([]), val, isAdd, dd && dd.hasClass(DISABLED) == false)) {
+				return;
+			}
+		}
+		var dl = $('dl[xid="' + id + '"]');
+		isAdd ? (dd && dd[0] ? (dd.addClass(THIS), dd.removeClass(TEMP)) : dl.find('.xm-select-linkage')[0] && this.linkageAdd(id, val), this.addLabel(id, div, val), vals.push(val)) : (dd && dd[0] ? dd.removeClass(THIS) : dl.find('.xm-select-linkage')[0] && this.linkageDel(id, val), this.delLabel(id, div, val), this.remove(vals, val));
+		if (!div[0]) return;
+		//单选选完后直接关闭选择域
+		if (fs.config.radio) {
+			this.changeShow(div, false);
+		}
+		//移除表单验证的红色边框
+		div.parents('.' + FORM_TITLE).prev().removeClass('layui-form-danger');
+
+		//清空搜索值
+		fs.config.clearInput && div.parents('.' + PNAME).find('.' + INPUT).val('');
+
+		this.commonHanler(id, div);
+	};
+
+	Common.prototype.addLabel = function (id, div, val) {
+		if (!val) return;
+		var tips = 'fsw="' + NAME + '"';
+		var _ref = [$('<span ' + tips + ' value="' + val.val + '"><font ' + tips + '>' + val.name + '</font></span>'), $('<i ' + tips + ' class="xm-icon-close">\xD7</i>')],
+		    $label = _ref[0],
+		    $close = _ref[1];
+
+		$label.append($close);
+		//如果是radio模式
+		var fs = data[id];
+		if (fs.config.radio) {
+			fs.values.length = 0;
+			$('dl[xid="' + id + '"]').find('dd.' + THIS + ':not([lay-value="' + val.val + '"])').removeClass(THIS);
+			div.find('span').remove();
+		}
+		//如果是固定高度
+		if (fs.config.height) {
+			div.append($label);
+		} else {
+			div.find('input').css('width', '50px');
+			div.find('input').before($label);
+		}
+	};
+
+	Common.prototype.delLabel = function (id, div, val) {
+		if (!val) return;
+		div.find('span[value="' + val.val + '"]:first').remove();
+	};
+
+	Common.prototype.calcLeft = function (id, div) {
+		if (data[id].config.height) {
+			var showLastSpan = div.find('span:not(.xm-span-hide):last')[0];
+			div.next().css('left', (showLastSpan ? this.getPosition(showLastSpan).x - this.getPosition(div[0]).x + showLastSpan.offsetWidth + 20 : 10) + 'px');
+		}
+	};
+
+	Common.prototype.checkHideSpan = function (div) {
+		var _this10 = this;
+
+		var parentHeight = div.parents('.' + NAME)[0].offsetHeight + 5;
+		div.find('span.xm-span-hide').removeClass('xm-span-hide');
+		div.find('span').each(function (index, item) {
+			if (item.offsetHeight + item.offsetTop > parentHeight || _this10.getPosition(item).y + item.offsetHeight > _this10.getPosition(div[0]).y + div[0].offsetHeight + 5) {
+				$(item).addClass('xm-span-hide');
+			}
+		});
+	};
+
+	Common.prototype.retop = function (div) {
+		//计算dl显示的位置
+		var dl = div.find('dl'),
+		    top = div.offset().top + div.outerHeight() + 5 - $win.scrollTop(),
+		    dlHeight = dl.outerHeight();
+		var up = div.hasClass('layui-form-selectup') || dl.css('top').indexOf('-') != -1 || top + dlHeight > $win.height() && top >= dlHeight;
+		div = div.find('.' + NAME);
+
+		var fs = data[dl.attr('xid')];
+		var base = dl.parents('.layui-form-pane')[0] && dl.prev()[0].clientHeight > 38 ? 14 : 10;
+		if (fs) {
+			if (fs.config.direction == 'up') {
+				dl.css({
+					top: 'auto',
+					bottom: '42px'
+				});
+				return;
+			}
+			if (fs.direction == 'down') {
+				dl.css({
+					top: div[0].offsetTop + div.height() + base + 'px',
+					bottom: 'auto'
+				});
+				return;
+			}
+		}
+
+		if (up) {
+			dl.css({
+				top: 'auto',
+				bottom: '42px'
+			});
+		} else {
+			dl.css({
+				top: div[0].offsetTop + div.height() + base + 'px',
+				bottom: 'auto'
+			});
+		}
+	};
+
+	Common.prototype.changeShow = function (children, isShow) {
+		//显示于隐藏
+		var top = children.parents('.' + FORM_SELECT);
+		$('.' + PNAME + ' .' + FORM_SELECT).not(top).removeClass(FORM_SELECTED);
+		if (isShow) {
+			this.retop(top);
+			top.addClass(FORM_SELECTED);
+			top.find('.' + INPUT).focus();
+		} else {
+			top.removeClass(FORM_SELECTED);
+			top.find('.' + INPUT).val('');
+			top.find('dl .layui-hide').removeClass('layui-hide');
+			top.find('dl dd.' + TEMP).remove();
+			//计算ajax数据是否为空, 然后重新请求数据
+			var id = top.find('dl').attr('xid');
+			if (id && data[id] && data[id].config.isEmpty) {
+				this.triggerSearch(top);
+			}
+		}
+	};
+
+	Common.prototype.changePlaceHolder = function (div) {
+		//显示于隐藏提示语
+		//调整pane模式下的高度
+		var title = div.parents('.' + FORM_TITLE);
+
+		var id = div.parents('.' + PNAME).find('dl[xid]').attr('xid');
+		if (data[id] && data[id].config.height) {//既然固定高度了, 那就看着办吧
+
+		} else {
+			var height = title.find('.' + NAME)[0].clientHeight;
+			title.css('height', (height > 34 ? height + 4 : height) + 'px');
+			//如果是layui pane模式, 处理label的高度
+			var label = title.parents('.' + PNAME).parent().prev();
+			if (label.is('.layui-form-label') && title.parents('.layui-form-pane')[0]) {
+				height = height > 36 ? height + 4 : height;
+				title.css('height', height + 'px');
+				label.css({
+					height: height + 2 + 'px',
+					lineHeight: height - 18 + 'px'
+				});
+			}
+		}
+
+		var input = title.find('.' + TDIV + ' input'),
+		    isShow = !div.find('span:last')[0] && !title.find('.' + INPUT).val();
+		if (isShow) {
+			var ph = input.attr('back');
+			input.removeAttr('back');
+			input.attr('placeholder', ph);
+		} else {
+			var _ph = input.attr('placeholder');
+			input.removeAttr('placeholder');
+			input.attr('back', _ph);
+		}
+	};
+
+	Common.prototype.indexOf = function (arr, val) {
+		for (var i = 0; i < arr.length; i++) {
+			if (arr[i].val == val || arr[i].val == (val ? val.val : val) || arr[i] == val || JSON.stringify(arr[i]) == JSON.stringify(val)) {
+				return i;
+			}
+		}
+		return -1;
+	};
+
+	Common.prototype.remove = function (arr, val) {
+		var idx = this.indexOf(arr, val ? val.val : val);
+		if (idx > -1) {
+			arr.splice(idx, 1);
+			return true;
+		}
+		return false;
+	};
+
+	Common.prototype.selectAll = function (id, isOn, skipDis) {
+		var _this11 = this;
+
+		var dl = $('[xid="' + id + '"]');
+		if (dl.find('.xm-select-linkage')[0]) {
+			return;
+		}
+		dl.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + '):not(.' + THIS + ')' + (skipDis ? ':not(.' + DISABLED + ')' : '')).each(function (index, item) {
+			item = $(item);
+			var val = {
+				name: item.find('span').text(),
+				val: item.attr('lay-value')
+			};
+			_this11.handlerLabel(id, dl.find('dd[lay-value="' + val.val + '"]'), true, val, !isOn);
+		});
+	};
+
+	Common.prototype.removeAll = function (id, isOn, skipDis) {
+		var _this12 = this;
+
+		var dl = $('[xid="' + id + '"]');
+		if (dl.find('.xm-select-linkage')[0]) {
+			//针对多级联动的处理
+			data[id].values.concat([]).forEach(function (item, idx) {
+				var vs = item.val.split('/');
+				var pid = void 0,
+				    li = void 0,
+				    index = 0;
+				do {
+					pid = vs[index++];
+					li = dl.find('.xm-select-linkage-group' + index + ':not(.xm-select-linkage-hide) li[value="' + pid + '"]');
+					li.click();
+				} while (li.length && pid != undefined);
+			});
+			return;
+		}
+		data[id].values.concat([]).forEach(function (item, index) {
+			if (skipDis && dl.find('dd[lay-value="' + item.val + '"]').hasClass(DISABLED)) {} else {
+				_this12.handlerLabel(id, dl.find('dd[lay-value="' + item.val + '"]'), false, item, !isOn);
+			}
+		});
+	};
+
+	Common.prototype.reverse = function (id, isOn, skipDis) {
+		var _this13 = this;
+
+		var dl = $('[xid="' + id + '"]');
+		if (dl.find('.xm-select-linkage')[0]) {
+			return;
+		}
+		dl.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + ')' + (skipDis ? ':not(.' + DISABLED + ')' : '')).each(function (index, item) {
+			item = $(item);
+			var val = {
+				name: item.find('span').text(),
+				val: item.attr('lay-value')
+			};
+			_this13.handlerLabel(id, dl.find('dd[lay-value="' + val.val + '"]'), !item.hasClass(THIS), val, !isOn);
+		});
+	};
+
+	Common.prototype.skin = function (id) {
+		var skins = ['default', 'primary', 'normal', 'warm', 'danger'];
+		var skin = skins[Math.floor(Math.random() * skins.length)];
+		$('dl[xid="' + id + '"]').parents('.' + PNAME).find('.' + FORM_SELECT).attr('xm-select-skin', skin);
+		this.commonHanler(id, $('dl[xid="' + id + '"]').parents('.' + PNAME).find('.' + LABEL));
+	};
+
+	Common.prototype.getPosition = function (e) {
+		var x = 0,
+		    y = 0;
+		while (e != null) {
+			x += e.offsetLeft;
+			y += e.offsetTop;
+			e = e.offsetParent;
+		}
+		return { x: x, y: y };
+	};
+
+	Common.prototype.onreset = function () {
+		//监听reset按钮, 然后重置多选
+		$(document).on('click', '[type=reset]', function (e) {
+			$(e.target).parents('form').find('.' + PNAME + ' dl[xid]').each(function (index, item) {
+				var id = item.getAttribute('xid'),
+				    dl = $(item),
+				    dd = void 0,
+				    temp = {};
+				common.removeAll(id);
+				data[id].config.init.forEach(function (val, idx) {
+					if (val && (!temp[val] || data[id].config.repeat) && (dd = dl.find('dd[lay-value="' + val.val + '"]'))[0]) {
+						common.handlerLabel(id, dd, true);
+						temp[val] = 1;
+					}
+				});
+			});
+		});
+	};
+
+	Common.prototype.loadingCss = function () {
+		var cssStyle = $('<style type="text/css">' + '.xm-select-parent *{margin:0;padding:0;font-family:"Helvetica Neue",Helvetica,"PingFang SC",\u5FAE\u8F6F\u96C5\u9ED1,Tahoma,Arial,sans-serif}.xm-select-parent{text-align:left}.xm-select-parent select{display:none}.xm-select-parent .xm-select-title{position:relative;min-height:36px}.xm-select-parent .xm-input{cursor:pointer;border-radius:2px;border-width:1px;border-style:solid;border-color:#E6E6E6;display:block;width:100%;box-sizing:border-box;background-color:#FFF;height:36px;line-height:1.3;padding-left:10px;outline:0}.xm-select-parent .xm-select-sj{display:inline-block;width:0;height:0;border-style:dashed;border-color:transparent;overflow:hidden;position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#C2C2C2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.xm-select-parent .xm-form-selected .xm-select-sj{margin-top:-9px;transform:rotate(180deg)}.xm-select-parent .xm-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:999;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box;animation-fill-mode:both;-webkit-animation-name:layui-upbit;animation-name:layui-upbit;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.xm-select-parent .xm-form-selected dl{display:block}.xm-select-parent .xm-form-select dl dd,.xm-select-parent .xm-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.xm-select-parent .xm-form-select dl dd{cursor:pointer;height:36px}.xm-select-parent .xm-form-select dl dd:hover{background-color:#f2f2f2}.xm-select-parent .xm-form-select dl dt{font-size:12px;color:#999}.layui-select-disabled .xm-dis-disabled{border-color:#eee!important}.xm-select-parent .xm-form-select dl .xm-select-tips{padding-left:10px!important;color:#999;font-size:14px}.xm-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.xm-form-checkbox{position:relative;display:inline-block;vertical-align:middle;height:30px;line-height:30px;margin-right:10px;padding-right:30px;background-color:#fff;cursor:pointer;font-size:0;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box}.xm-form-checkbox *{display:inline-block;vertical-align:middle}.xm-form-checkbox span{padding:0 10px;height:100%;font-size:14px;border-radius:2px 0 0 2px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.xm-form-checkbox:hover span{background-color:#c2c2c2}.xm-form-checkbox i{position:absolute;right:0;top:0;width:30px;height:28px;border:1px solid #d2d2d2;border-left:none;border-radius:0 2px 2px 0;color:#fff;font-size:20px;text-align:center}.xm-form-checkbox:hover i{border-color:#c2c2c2;color:#c2c2c2}.xm-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;border:none!important;margin-right:0;padding-right:0;background:0 0}.xm-form-checkbox[lay-skin=primary] span{float:right;padding-right:15px;line-height:18px;background:0 0;color:#666}.xm-form-checkbox[lay-skin=primary] i{position:relative;top:0;width:16px;height:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.xm-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.xm-icon-yes{width:30px;height:30px;border-radius:4px;background-color:#009688;position:relative}.xm-icon-yes:after{content:\'\';display:inline-block;border:2px solid #fff;border-top-width:0;border-right-width:0;width:9px;height:5px;-webkit-transform:rotate(-50deg);transform:rotate(-50deg);position:absolute;top:2px;left:3px}.xm-dis-disabled,.xm-dis-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.xm-form-select dl dd.xm-dis-disabled{background-color:#fff!important}.xm-form-select dl dd.xm-dis-disabled span{color:#C2C2C2}.xm-form-select dl dd.xm-dis-disabled .xm-icon-yes{border-color:#C2C2C2}.xm-select-parent{position:relative;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.xm-select-parent .xm-select{line-height:normal;height:auto;padding:4px 10px 1px 10px;overflow:hidden;min-height:36px;left:0;z-index:99;position:absolute;background:0 0;padding-right:20px}.xm-select-parent .xm-select:hover{border-color:#C0C4CC}.xm-select-parent .xm-select .xm-select-label{display:inline-block;margin:0;vertical-align:middle}.xm-select-parent .xm-select-title div.xm-select-label>span{position:relative;padding:2px 5px;background-color:#009688;border-radius:2px;color:#FFF;display:inline-block;line-height:18px;height:18px;margin:2px 5px 2px 0;cursor:initial;user-select:none;font-size:14px;padding-right:25px}.xm-select-parent .xm-select-title div.xm-select-label>span i{position:absolute;right:5px;top:2px;margin-left:8px;border-radius:20px;font-size:18px;cursor:pointer;display:inline-block;height:14px;line-height:15px;width:12px;vertical-align:top;margin-top:2px}.xm-select-parent .xm-select .xm-select-input{border:none;height:28px;background-color:transparent;padding:0;vertical-align:middle;display:inline-block;width:50px}.xm-select-parent .xm-select--suffix input{border:none}.xm-select-parent dl dd.xm-dis-disabled.xm-select-this i{border-color:#C2C2C2;background-color:#C2C2C2;color:#FFF}.xm-select-parent dl dd.xm-select-this i{background-color:#009688;border-color:#009688}.xm-form-selected .xm-select,.xm-form-selected .xm-select:hover{border-color:#009688!important}.xm-select--suffix+div{position:absolute;top:0;left:0;bottom:0;right:0}.xm-select-dis .xm-select--suffix+div{z-index:100;cursor:no-drop!important;opacity:.2;background-color:#FFF}.xm-select-disabled,.xm-select-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important;background-color:#fff}.xm-select-none{display:none;margin:5px 0;text-align:center}.xm-select-none:hover{background-color:#FFF!important}.xm-select-empty{display:block}.xm-span-hide{display:none!important}.xm-select-radio .xm-icon-yes{border-radius:20px!important}.xm-select-radio .xm-icon-yes:after{border-radius:20px;background-color:#fff;width:6px;height:6px;border:none;top:5px;left:5px}.layui-form-pane .xm-select,.layui-form-pane .xm-select:hover{border:none!important;top:0}.layui-form-pane .xm-select-title{border:1px solid #e6e6e6!important}div[xm-select-skin] .xm-select-title div.xm-select-label>span{border:1px solid #009688}div[xm-select-skin] .xm-select-title div.xm-select-label>span i:hover{opacity:.8;filter:alpha(opacity=80);cursor:pointer}div[xm-select-skin=default] .xm-select-title div.xm-select-label>span{background-color:#F0F2F5;color:#909399;border:1px solid #F0F2F5}div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i{background-color:#C0C4CC;color:#FFF}div[xm-select-skin=default] dl dd.xm-select-this:not(.xm-dis-disabled) i{background-color:#5FB878;border-color:#5FB878;color:#FFF}div[xm-select-skin=default].xm-form-selected .xm-select,div[xm-select-skin=default].xm-form-selected .xm-select:hover{border-color:#C0C4CC!important}div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span{background-color:#009688;color:#FFF;border:1px solid #009688}div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i{background-color:#009688;color:#FFF}div[xm-select-skin=primary] dl dd.xm-select-this:not(.xm-dis-disabled) i{background-color:#009688;border-color:#009688;color:#FFF}div[xm-select-skin=primary].xm-form-selected .xm-select,div[xm-select-skin=primary].xm-form-selected .xm-select:hover{border-color:#009688!important}div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span{background-color:#1E9FFF;color:#FFF;border:1px solid #1E9FFF}div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span i{background-color:#1E9FFF;color:#FFF}div[xm-select-skin=normal] dl dd.xm-select-this:not(.xm-dis-disabled) i{background-color:#1E9FFF;border-color:#1E9FFF;color:#FFF}div[xm-select-skin=normal].xm-form-selected .xm-select,div[xm-select-skin=normal].xm-form-selected .xm-select:hover{border-color:#1E9FFF!important}div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span{background-color:#FFB800;color:#FFF;border:1px solid #FFB800}div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span i{background-color:#FFB800;color:#FFF}div[xm-select-skin=warm] dl dd.xm-select-this:not(.xm-dis-disabled) i{background-color:#FFB800;border-color:#FFB800;color:#FFF}div[xm-select-skin=warm].xm-form-selected .xm-select,div[xm-select-skin=warm].xm-form-selected .xm-select:hover{border-color:#FFB800!important}div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span{background-color:#FF5722;color:#FFF;border:1px solid #FF5722}div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span i{background-color:#FF5722;color:#FFF}div[xm-select-skin=danger] dl dd.xm-select-this:not(.xm-dis-disabled) i{background-color:#FF5722;border-color:#FF5722;color:#FFF}div[xm-select-skin=danger].xm-form-selected .xm-select,div[xm-select-skin=danger].xm-form-selected .xm-select:hover{border-color:#FF5722!important}.xm-select-parent .layui-form-danger+.xm-select-title .xm-select{border-color:#FF5722!important}.xm-select-linkage li{padding:10px 0;cursor:pointer}.xm-select-linkage li span{padding-left:20px;padding-right:30px;display:inline-block;height:20px;overflow:hidden;text-overflow:ellipsis}.xm-select-linkage li.xm-select-this span{border-left:5px solid #009688;color:#009688;padding-left:15px}.xm-select-linkage-group{position:absolute;left:0;top:0;right:0;bottom:0;overflow-x:hidden;overflow-y:auto}.xm-select-linkage-group li:hover{border-left:1px solid #009688}.xm-select-linkage-group li:hover span{padding-left:19px}.xm-select-linkage-group li.xm-select-this:hover span{padding-left:15px;border-left-width:4px}.xm-select-linkage-group:nth-child(4n+1){background-color:#EFEFEF;left:0}.xm-select-linkage-group:nth-child(4n+1) li.xm-select-active{background-color:#F5F5F5}.xm-select-linkage-group:nth-child(4n+2){background-color:#F5F5F5;left:100px}.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color:#FAFAFA}.xm-select-linkage-group:nth-child(4n+3){background-color:#FAFAFA;left:200px}.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color:#FFF}.xm-select-linkage-group:nth-child(4n+4){background-color:#FFF;left:300px}.xm-select-linkage-group:nth-child(4n+4) li.xm-select-active{background-color:#EFEFEF}.xm-select-linkage li{list-style:none}.xm-select-linkage-hide{display:none}.xm-select-linkage-show{display:block}div[xm-select-skin=default] .xm-select-linkage li.xm-select-this span{border-left-color:#5FB878;color:#5FB878}div[xm-select-skin=default] .xm-select-linkage-group li:hover{border-left-color:#5FB878}div[xm-select-skin=primary] .xm-select-linkage li.xm-select-this span{border-left-color:#1E9FFF;color:#1E9FFF}div[xm-select-skin=primary] .xm-select-linkage-group li:hover{border-left-color:#1E9FFF}div[xm-select-skin=normal] .xm-select-linkage li.xm-select-this span{border-left-color:#1E9FFF;color:#1E9FFF}div[xm-select-skin=normal] .xm-select-linkage-group li:hover{border-left-color:#1E9FFF}div[xm-select-skin=warm] .xm-select-linkage li.xm-select-this span{border-left-color:#FFB800;color:#FFB800}div[xm-select-skin=warm] .xm-select-linkage-group li:hover{border-left-color:#FFB800}div[xm-select-skin=danger] .xm-select-linkage li.xm-select-this span{border-left-color:#FF5722;color:#FF5722}div[xm-select-skin=danger] .xm-select-linkage-group li:hover{border-left-color:#FF5722}.xm-form-checkbox[lay-skin=primary] i{top:9px}.xm-form-checkbox[lay-skin=primary] span{line-height:36px}.xm-select-tips[style]:hover{background-color:#FFF!important}.xm-select-parent dd>.xm-cz{position:absolute;top:5px;right:10px}.xm-select-parent dd>.xm-cz-group{margin-right:30px;border-right:2px solid #ddd;height:16px;margin-top:10px;line-height:16px;overflow:hidden}.xm-select-parent dd>.xm-cz-group .xm-cz{display:inline-block;margin-right:30px}.xm-select-parent dd>.xm-cz-group .xm-cz i{margin-right:10px}.xm-select-parent dd>.xm-cz-group[show=name] .xm-cz i{display:none}.xm-select-parent dd>.xm-cz-group[show=icon] .xm-cz span{display:none}.xm-select-parent dd .xm-cz:hover{color:#009688}div[xm-select-skin=default] dd .xm-cz:hover{color:#C0C4CC}div[xm-select-skin=primary] dd .xm-cz:hover{color:#009688}div[xm-select-skin=normal] dd .xm-cz:hover{color:#1E9FFF}div[xm-select-skin=warm] dd .xm-cz:hover{color:#FFB800}div[xm-select-skin=danger] dd .xm-cz:hover{color:#FF5722}' + '</style>' + '<link rel="stylesheet" type="text/css" href="//at.alicdn.com/t/font_711182_8sv6blqzaw2.css"/>');
+		$('head link:last')[0] && $('head link:last').after(cssStyle) || $('head').append(cssStyle);
+	};
+
+	Common.prototype.listening = function () {
+		//TODO 用于监听dom结构变化, 如果出现新的为渲染select, 则自动进行渲染
+		var flag = false;
+		var index = 0;
+		$(document).on('DOMNodeInserted', function (e) {
+			if (flag) {
+				//避免递归渲染
+				return;
+			}
+			flag = true;
+			//渲染select
+			$('select[' + NAME + ']').each(function (index, select) {
+				var sid = select.getAttribute(NAME);
+				common.init(select);
+				common.one($('dl[xid="' + sid + '"]').parents('.' + PNAME));
+				common.initVal(sid);
+			});
+
+			flag = false;
+		});
+	};
+
+	var Select4 = function Select4() {
+		this.v = v;
+	};
+	var common = new Common();
+
+	Select4.prototype.value = function (id, type, isAppend) {
+		if (typeof id != 'string') {
+			return [];
+		}
+		var fs = data[id];
+		if (!fs) {
+			return [];
+		}
+		if (typeof type == 'string' || type == undefined) {
+			var arr = fs.values.concat([]) || [];
+			if (type == 'val') {
+				return arr.map(function (val) {
+					return val.val;
+				});
+			}
+			if (type == 'valStr') {
+				return arr.map(function (val) {
+					return val.val;
+				}).join(',');
+			}
+			if (type == 'name') {
+				return arr.map(function (val) {
+					return val.name;
+				});
+			}
+			if (type == 'nameStr') {
+				return arr.map(function (val) {
+					return val.name;
+				}).join(',');
+			}
+			return arr;
+		}
+		if (common.isArray(type)) {
+			var dl = $('[xid="' + id + '"]'),
+			    temp = {},
+			    dd = void 0,
+			    isAdd = true;
+			if (isAppend == false) {
+				//删除传入的数组
+				isAdd = false;
+			} else if (isAppend == true) {
+				//追加模式
+				isAdd = true;
+			} else {
+				//删除原有的数据
+				common.removeAll(id);
+			}
+			if (isAdd) {
+				fs.values.forEach(function (val, index) {
+					temp[val.val] = 1;
+				});
+			}
+			type.forEach(function (val, index) {
+				if (val && (!temp[val] || fs.config.repeat)) {
+					if ((dd = dl.find('dd[lay-value="' + val + '"]'))[0]) {
+						common.handlerLabel(id, dd, isAdd, null, true);
+						temp[val] = 1;
+					} else {
+						var name = common.valToName(id, val);
+						if (name) {
+							common.handlerLabel(id, dd, isAdd, {
+								name: name,
+								val: val
+							}, true);
+							temp[val] = 1;
+						}
+					}
+				}
+			});
+		}
+	};
+
+	Common.prototype.bindEvent = function (name, id, fun) {
+		if (id && id instanceof Function) {
+			fun = id;
+			id = null;
+		}
+		if (fun && fun instanceof Function) {
+			if (!id) {
+				$.each(data, function (id, val) {
+					data[id] ? data[id].config[name] = fun : events[name][id] = fun;
+				});
+			} else {
+				data[id] ? data[id].config[name] = fun : events[name][id] = fun;
+			}
+		}
+	};
+
+	Select4.prototype.on = function (id, fun) {
+		common.bindEvent('on', id, fun);
+		return this;
+	};
+
+	Select4.prototype.filter = function (id, fun) {
+		common.bindEvent('filter', id, fun);
+		return this;
+	};
+
+	Select4.prototype.maxTips = function (id, fun) {
+		common.bindEvent('maxTips', id, fun);
+		return this;
+	};
+
+	Select4.prototype.config = function (id, config, isJson) {
+		if (id && (typeof id === 'undefined' ? 'undefined' : _typeof(id)) == 'object') {
+			isJson = config == true;
+			config = id;
+			id = null;
+		}
+		if (config && (typeof config === 'undefined' ? 'undefined' : _typeof(config)) == 'object') {
+			if (isJson) {
+				config.header || (config.header = {});
+				config.header['Content-Type'] = 'application/json; charset=UTF-8';
+				config.dataType = 'json';
+			}
+			id ? (ajaxs[id] = $.extend(true, {}, ajax, config), data[id] && (data[id].config.direction = config.direction), config.searchUrl && data[id] && common.triggerSearch($('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT), true)) : $.extend(true, ajax, config);
+		}
+		return this;
+	};
+
+	Select4.prototype.render = function (id) {
+		var _this14 = this;
+
+		var target = {};
+		id ? data[id] && (target[id] = data[id]) : data;
+
+		if (Object.getOwnPropertyNames(target).length) {
+			$.each(target, function (key, val) {
+				//恢复初始值
+				var dl = $('dl[xid="' + key + '"]'),
+				    vals = [];
+				val.select.find('option[selected]').each(function (index, item) {
+					vals.push(item.value);
+				});
+				//移除创建元素
+				dl.find('.' + CREATE_LONG).remove();
+				//清空INPUT
+				dl.prev().find('.' + INPUT).val('');
+				//触发search
+				common.triggerSearch(dl.parents('.' + FORM_SELECT), true);
+				//移除hidn
+				dl.find('.layui-hide').removeClass('layui-hide');
+				//重新赋值
+				_this14.value(key, vals);
+			});
+		}
+		($('select[' + NAME + '="' + id + '"]')[0] ? $('select[' + NAME + '="' + id + '"]') : $('select[' + NAME + ']')).each(function (index, select) {
+			var sid = select.getAttribute(NAME);
+			common.init(select);
+			common.one($('dl[xid="' + sid + '"]').parents('.' + PNAME));
+			common.initVal(sid);
+		});
+		return this;
+	};
+
+	Select4.prototype.disabled = function (id) {
+		var target = {};
+		id ? data[id] && (target[id] = data[id]) : target = data;
+
+		$.each(target, function (key, val) {
+			$('dl[xid="' + key + '"]').prev().addClass(DIS);
+		});
+		return this;
+	};
+
+	Select4.prototype.undisabled = function (id) {
+		var target = {};
+		id ? data[id] && (target[id] = data[id]) : target = data;
+
+		$.each(target, function (key, val) {
+			$('dl[xid="' + key + '"]').prev().removeClass(DIS);
+		});
+		return this;
+	};
+
+	Select4.prototype.data = function (id, type, config) {
+		if (!id || !type || !config) {
+			return this;
+		}
+		//检测该id是否尚未渲染
+		!data[id] && this.render(id).value(id, []);
+		this.config(id, config);
+		if (type == 'local') {
+			common.renderData(id, config.arr, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100');
+		} else if (type == 'server') {
+			common.ajax(id, config.url, config.keyword, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100');
+		}
+		return this;
+	};
+
+	Select4.prototype.btns = function (id, btns, config) {
+		if (!btns || !common.isArray(btns)) {
+			return this;
+		};
+		var target = {};
+		id ? data[id] && (target[id] = data[id]) : target = data;
+
+		btns = btns.map(function (obj) {
+			if (typeof obj == 'string') {
+				if (obj == 'select') {
+					return quickBtns[0];
+				}
+				if (obj == 'remove') {
+					return quickBtns[1];
+				}
+				if (obj == 'reverse') {
+					return quickBtns[2];
+				}
+				if (obj == 'skin') {
+					return quickBtns[3];
+				}
+			}
+			return obj;
+		});
+
+		$.each(target, function (key, val) {
+			val.config.btns = btns;
+			var dd = $('dl[xid="' + key + '"]').find('.' + FORM_SELECT_TIPS + ':first');
+			if (btns.length) {
+				var show = config && config.show && (config.show == 'name' || config.show == 'icon') ? config.show : '';
+				var html = common.renderBtns(key, show, config && config.space ? config.space : '30px');
+				dd.html(html);
+			} else {
+				var pcInput = dd.parents('.' + FORM_SELECT).find('.' + TDIV + ' input');
+				var _html = pcInput.attr('placeholder') || pcInput.attr('back');
+				dd.html(_html);
+				dd.removeAttr('style');
+			}
+		});
+
+		return this;
+	};
+
+	Select4.prototype.search = function (id, val) {
+		if (id && data[id]) {
+			ajaxs[id] = $.extend(true, {}, ajax, {
+				first: true,
+				searchVal: val
+			});
+			common.triggerSearch($('dl[xid="' + id + '"]').parents('.' + FORM_SELECT), true);
+		}
+		return this;
+	};
+
+	return new Select4();
+});
\ No newline at end of file
diff --git a/src/main/resources/static/custom/module/formSelects/formSelects-v4.css b/src/main/resources/static/custom/module/formSelects/formSelects-v4.css
new file mode 100755
index 0000000..626a4d5
--- /dev/null
+++ b/src/main/resources/static/custom/module/formSelects/formSelects-v4.css
@@ -0,0 +1,156 @@
+/* formSelects多选css */
+.xm-select-parent * {margin: 0;padding: 0;font-family: "Helvetica Neue", Helvetica, "PingFang SC", 微软雅黑, Tahoma, Arial, sans-serif;}
+.xm-select-parent {text-align: left;}
+.xm-select-parent select {display: none;}
+.xm-select-parent .xm-select-title {position: relative;min-height: 36px;}
+.xm-select-parent .xm-input {cursor: pointer;border-radius: 2px;border-width: 1px;border-style: solid;border-color: #E6E6E6;display: block;width: 100%;box-sizing: border-box;background-color: #FFF;height: 36px;line-height: 1.3;padding-left: 10px;outline: 0}
+.xm-select-parent .xm-select-sj {display: inline-block;width: 0;height: 0;border-style: dashed;border-color: transparent;overflow: hidden;position: absolute;right: 10px;top: 50%;margin-top: -3px;cursor: pointer;border-width: 6px;border-top-color: #C2C2C2;border-top-style: solid;transition: all .3s;-webkit-transition: all .3s}
+.xm-select-parent .xm-form-selected .xm-select-sj {margin-top: -9px;transform: rotate(180deg)}
+.xm-select-parent .xm-form-select dl {display: none;position: absolute;left: 0;top: 42px;padding: 5px 0;z-index: 999;min-width: 100%;border: 1px solid #d2d2d2;max-height: 300px;overflow-y: auto;background-color: #fff;border-radius: 2px;box-shadow: 0 2px 4px rgba(0, 0, 0, .12);box-sizing: border-box;animation-fill-mode: both;-webkit-animation-name: layui-upbit;animation-name: layui-upbit;-webkit-animation-duration: .3s;animation-duration: .3s;-webkit-animation-fill-mode: both;animation-fill-mode: both}
+@-webkit-keyframes layui-upbit {
+	from {-webkit-transform: translate3d(0, 30px, 0);opacity: .3}
+	to {-webkit-transform: translate3d(0, 0, 0);opacity: 1}
+}
+@keyframes layui-upbit {
+	from {transform: translate3d(0, 30px, 0);opacity: .3}
+	to {transform: translate3d(0, 0, 0);opacity: 1}
+}
+.xm-select-parent .xm-form-selected dl {display: block}
+.xm-select-parent .xm-form-select dl dd,.xm-select-parent .xm-form-select dl dt {padding: 0 10px;line-height: 36px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis}
+.xm-select-parent .xm-form-select dl dd {cursor: pointer;height: 36px;}
+.xm-select-parent .xm-form-select dl dd:hover {background-color: #f2f2f2}
+.xm-select-parent .xm-form-select dl dt {font-size: 12px;color: #999}
+.layui-select-disabled .xm-dis-disabled {border-color: #eee!important}
+.xm-select-parent .xm-form-select dl .xm-select-tips {padding-left: 10px!important;color: #999;font-size: 14px}
+.xm-unselect {-moz-user-select: none;-webkit-user-select: none;-ms-user-select: none}
+.xm-form-checkbox {position: relative;display: inline-block;vertical-align: middle;height: 30px;line-height: 30px;margin-right: 10px;padding-right: 30px;background-color: #fff;cursor: pointer;font-size: 0;-webkit-transition: .1s linear;transition: .1s linear;box-sizing: border-box}
+.xm-form-checkbox * {display: inline-block;vertical-align: middle}
+.xm-form-checkbox span {padding: 0 10px;height: 100%;font-size: 14px;border-radius: 2px 0 0 2px;background-color: #d2d2d2;color: #fff;overflow: hidden;white-space: nowrap;text-overflow: ellipsis}
+.xm-form-checkbox:hover span {background-color: #c2c2c2}
+.xm-form-checkbox i {position: absolute;right: 0;top: 0;width: 30px;height: 28px;border: 1px solid #d2d2d2;border-left: none;border-radius: 0 2px 2px 0;color: #fff;font-size: 20px;text-align: center}
+.xm-form-checkbox:hover i {border-color: #c2c2c2;color: #c2c2c2}
+.xm-form-checkbox[lay-skin=primary] {height: auto!important;line-height: normal!important;border: none!important;margin-right: 0;padding-right: 0;background: 0 0}
+.xm-form-checkbox[lay-skin=primary] span {float: right;padding-right: 15px;line-height: 18px;background: 0 0;color: #666}
+.xm-form-checkbox[lay-skin=primary] i {position: relative;top: 0;width: 16px;height: 16px;line-height: 16px;border: 1px solid #d2d2d2;font-size: 12px;border-radius: 2px;background-color: #fff;-webkit-transition: .1s linear;transition: .1s linear}
+.xm-form-checkbox[lay-skin=primary]:hover i {border-color: #5FB878;color: #fff}
+.xm-icon-yes {width: 30px;height: 30px;border-radius: 4px;background-color: #009688;position: relative}
+.xm-icon-yes:after {content: '';display: inline-block;border: 2px solid #fff;border-top-width: 0;border-right-width: 0;width: 9px;height: 5px;-webkit-transform: rotate(-50deg);transform: rotate(-50deg);position: absolute;top: 2px;left: 3px}
+.xm-dis-disabled,.xm-dis-disabled:hover {color: #d2d2d2!important;cursor: not-allowed!important}
+.xm-form-select dl dd.xm-dis-disabled {background-color: #fff!important}
+.xm-form-select dl dd.xm-dis-disabled span {color: #C2C2C2}
+.xm-form-select dl dd.xm-dis-disabled .xm-icon-yes {border-color: #C2C2C2}
+.xm-select-parent {position: relative;-moz-user-select: none;-ms-user-select: none;-webkit-user-select: none}
+.xm-select-parent .xm-select {line-height: normal;height: auto;padding: 4px 10px 1px 10px;overflow: hidden;min-height: 36px;left: 0;z-index: 99;position: absolute;background: 0 0;padding-right: 20px}
+.xm-select-parent .xm-select:hover {border-color: #C0C4CC}
+.xm-select-parent .xm-select .xm-select-label {display: inline-block;margin: 0;vertical-align: middle}
+.xm-select-parent .xm-select-title div.xm-select-label>span {position: relative;padding: 2px 5px;background-color: #009688;border-radius: 2px;color: #FFF;display: inline-block;line-height: 18px;height: 18px;margin: 2px 5px 2px 0;cursor: initial;user-select: none;font-size: 14px;padding-right: 25px;}
+.xm-select-parent .xm-select-title div.xm-select-label>span i {position: absolute;right: 5px;top: 2px;margin-left: 8px;border-radius: 20px;font-size: 18px;cursor: pointer;display: inline-block;height: 14px;line-height: 15px;width: 12px;vertical-align: top;margin-top: 2px;}
+.xm-select-parent .xm-select .xm-select-input {border: none;height: 28px;background-color: transparent;padding: 0;vertical-align: middle;display: inline-block;width: 50px}
+.xm-select-parent .xm-select--suffix input {border: none}
+.xm-select-parent dl dd.xm-dis-disabled.xm-select-this i {border-color: #C2C2C2;background-color: #C2C2C2;color: #FFF}
+.xm-select-parent dl dd.xm-select-this i {background-color: #009688;border-color: #009688}
+.xm-form-selected .xm-select,.xm-form-selected .xm-select:hover {border-color: #009688!important}
+.xm-select--suffix+div {position: absolute;top: 0;left: 0;bottom: 0;right: 0}
+.xm-select-dis .xm-select--suffix+div {z-index: 100;cursor: no-drop!important;opacity: .2;background-color: #FFF;}
+.xm-select-disabled,.xm-select-disabled:hover {color: #d2d2d2!important;cursor: not-allowed!important;background-color: #fff}
+.xm-select-none {display: none;margin: 5px 0;text-align: center;}
+.xm-select-none:hover {background-color: #FFF!important}
+.xm-select-empty {display: block}
+.xm-span-hide {display: none!important;}
+.xm-select-radio .xm-icon-yes {border-radius: 20px!important;}
+.xm-select-radio .xm-icon-yes:after {border-radius: 20px;background-color: #fff;width: 6px;height: 6px;border: none;top: 5px;left: 5px;}
+.layui-form-pane .xm-select,.layui-form-pane .xm-select:hover {border: none!important;top: 0px}
+.layui-form-pane .xm-select-title {border: 1px solid #e6e6e6!important}
+
+
+/* 颜色相关 */
+div[xm-select-skin] .xm-select-title div.xm-select-label>span {border: 1px solid #009688}
+div[xm-select-skin] .xm-select-title div.xm-select-label>span i:hover {opacity: .8;filter: alpha(opacity=80);cursor: pointer}
+div[xm-select-skin=default] .xm-select-title div.xm-select-label>span {background-color: #F0F2F5;color: #909399;border: 1px solid #F0F2F5}
+div[xm-select-skin=default] .xm-select-title div.xm-select-label>span i {background-color: #C0C4CC;color: #FFF}
+div[xm-select-skin=default] dl dd.xm-select-this:not(.xm-dis-disabled) i {background-color: #5FB878;border-color: #5FB878;color: #FFF}
+div[xm-select-skin=default].xm-form-selected .xm-select,div[xm-select-skin=default].xm-form-selected .xm-select:hover {border-color: #C0C4CC!important}
+div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span {background-color: #009688;color: #FFF;border: 1px solid #009688}
+div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i {background-color: #009688;color: #FFF}
+div[xm-select-skin=primary] dl dd.xm-select-this:not(.xm-dis-disabled) i {background-color: #009688;border-color: #009688;color: #FFF}
+div[xm-select-skin=primary].xm-form-selected .xm-select,div[xm-select-skin=primary].xm-form-selected .xm-select:hover {border-color: #009688!important}
+div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span {background-color: #1E9FFF;color: #FFF;border: 1px solid #1E9FFF}
+div[xm-select-skin=normal] .xm-select-title div.xm-select-label>span i {background-color: #1E9FFF;color: #FFF}
+div[xm-select-skin=normal] dl dd.xm-select-this:not(.xm-dis-disabled) i {background-color: #1E9FFF;border-color: #1E9FFF;color: #FFF}
+div[xm-select-skin=normal].xm-form-selected .xm-select,div[xm-select-skin=normal].xm-form-selected .xm-select:hover {border-color: #1E9FFF!important}
+div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span {background-color: #FFB800;color: #FFF;border: 1px solid #FFB800}
+div[xm-select-skin=warm] .xm-select-title div.xm-select-label>span i {background-color: #FFB800;color: #FFF}
+div[xm-select-skin=warm] dl dd.xm-select-this:not(.xm-dis-disabled) i {background-color: #FFB800;border-color: #FFB800;color: #FFF}
+div[xm-select-skin=warm].xm-form-selected .xm-select,div[xm-select-skin=warm].xm-form-selected .xm-select:hover {border-color: #FFB800!important}
+div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span {background-color: #FF5722;color: #FFF;border: 1px solid #FF5722}
+div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span i {background-color: #FF5722;color: #FFF}
+div[xm-select-skin=danger] dl dd.xm-select-this:not(.xm-dis-disabled) i {background-color: #FF5722;border-color: #FF5722;color: #FFF}
+div[xm-select-skin=danger].xm-form-selected .xm-select,div[xm-select-skin=danger].xm-form-selected .xm-select:hover {border-color: #FF5722!important}
+
+
+/* 多选联动  */
+.xm-select-parent .layui-form-danger+.xm-select-title .xm-select {border-color: #FF5722 !important;}
+.xm-select-linkage li {padding: 10px 0px;cursor: pointer;}
+.xm-select-linkage li span {padding-left: 20px;padding-right: 30px;display: inline-block;height: 20px;overflow: hidden;text-overflow: ellipsis;}
+.xm-select-linkage li.xm-select-this span {border-left: 5px solid #009688;color: #009688;padding-left: 15px;}
+.xm-select-linkage-group {position: absolute;left: 0;top: 0;right: 0;bottom: 0;overflow-x: hidden;overflow-y: auto;}
+.xm-select-linkage-group li:hover {border-left: 1px solid #009688;}
+.xm-select-linkage-group li:hover span {padding-left: 19px;}
+.xm-select-linkage-group li.xm-select-this:hover span {padding-left: 15px;border-left-width: 4px;}
+.xm-select-linkage-group:nth-child(4n+1){background-color: #EFEFEF; left: 0;}
+.xm-select-linkage-group:nth-child(4n+1) li.xm-select-active{background-color: #F5F5F5;}
+.xm-select-linkage-group:nth-child(4n+2){background-color: #F5F5F5; left: 100px;}
+.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color: #FAFAFA;}
+.xm-select-linkage-group:nth-child(4n+3){background-color: #FAFAFA; left: 200px;}
+.xm-select-linkage-group:nth-child(4n+3) li.xm-select-active{background-color: #FFFFFF;}
+.xm-select-linkage-group:nth-child(4n+4){background-color: #FFFFFF; left: 300px;}
+.xm-select-linkage-group:nth-child(4n+4) li.xm-select-active{background-color: #EFEFEF;}
+.xm-select-linkage li{list-style: none;}
+.xm-select-linkage-hide {display: none;}
+.xm-select-linkage-show {display: block;}
+
+div[xm-select-skin='default'] .xm-select-linkage li.xm-select-this span {border-left-color: #5FB878;color: #5FB878;}
+div[xm-select-skin='default'] .xm-select-linkage-group li:hover {border-left-color: #5FB878;}
+div[xm-select-skin='primary'] .xm-select-linkage li.xm-select-this span {border-left-color: #1E9FFF;color: #1E9FFF;}
+div[xm-select-skin='primary'] .xm-select-linkage-group li:hover {border-left-color: #1E9FFF;}
+div[xm-select-skin='normal'] .xm-select-linkage li.xm-select-this span {border-left-color: #1E9FFF;color: #1E9FFF;}
+div[xm-select-skin='normal'] .xm-select-linkage-group li:hover {border-left-color: #1E9FFF;}
+div[xm-select-skin='warm'] .xm-select-linkage li.xm-select-this span {border-left-color: #FFB800;color: #FFB800;}
+div[xm-select-skin='warm'] .xm-select-linkage-group li:hover {border-left-color: #FFB800;}
+div[xm-select-skin='danger'] .xm-select-linkage li.xm-select-this span {border-left-color: #FF5722;color: #FF5722;}
+div[xm-select-skin='danger'] .xm-select-linkage-group li:hover {border-left-color: #FF5722;}
+.xm-form-checkbox[lay-skin=primary] i {top: 9px}
+.xm-form-checkbox[lay-skin=primary] span {line-height: 36px;}
+
+
+/* 快捷操作 */
+.xm-select-tips[style]:hover{background-color: #FFF!important;}
+.xm-select-parent dd > .xm-cz{position: absolute; top: 5px; right: 10px;}
+.xm-select-parent dd > .xm-cz-group{margin-right: 30px; border-right: 2px solid #ddd; height: 16px; margin-top: 10px; line-height: 16px; overflow: hidden;}
+.xm-select-parent dd > .xm-cz-group .xm-cz{display: inline-block; margin-right: 30px;}
+.xm-select-parent dd > .xm-cz-group .xm-cz i{margin-right: 10px;}
+.xm-select-parent dd > .xm-cz-group[show='name'] .xm-cz i{display: none;}
+.xm-select-parent dd > .xm-cz-group[show='icon'] .xm-cz span{display: none;}
+.xm-select-parent dd .xm-cz:hover{color: #009688;}
+div[xm-select-skin='default'] dd .xm-cz:hover{color: #C0C4CC;}
+div[xm-select-skin='primary'] dd .xm-cz:hover{color: #009688;}
+div[xm-select-skin='normal'] dd .xm-cz:hover{color: #1E9FFF;}
+div[xm-select-skin='warm'] dd .xm-cz:hover{color: #FFB800;}
+div[xm-select-skin='danger'] dd .xm-cz:hover{color: #FF5722;}
+
+
+
+/* 阿里巴巴矢量图标库 */
+@font-face {
+	font-family: "iconfont";
+	src: url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAkUAAsAAAAADXQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZXMkouY21hcAAAAYAAAACEAAAB3mzwoL5nbHlmAAACBAAABNwAAAbEQLmyxWhlYWQAAAbgAAAAMQAAADYR3AzwaGhlYQAABxQAAAAgAAAAJAgBA6pobXR4AAAHNAAAABsAAAAcHA3//mxvY2EAAAdQAAAAEAAAABAFDAZgbWF4cAAAB2AAAAAfAAAAIAEXAM9uYW1lAAAHgAAAAUUAAAJtPlT+fXBvc3QAAAjIAAAASwAAAF/pDVOXeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2BkYWKcwMDKwMHUyXSGgYGhH0IzvmYwYuRgYGBiYGVmwAoC0lxTGBwYKl6YMzf8b2CIYW5mOAIUZgTJAQDaoQv3eJzFkcsJwzAQRN9GsgkhBBeiu2+uIoeU4BJ8zCmlLu7C2Y/BJA14xBPMIGnFLtABxWhGBfkguN6WSuSFW+SVp/kHVy70LDpo00nnddw2y//9IbE7x3Jf4oUu6vWcJjmv9K/usb925x1ZduyLOiQ+JW2J9Q+dEj+vc+LTXMeE+gUlrx+seJyNVE2IHEUUrlfVVdV/0z3939u70zs9vTudsMmumdndcaNu1h/wBw+RRJNcAlGDEdSDBwMacUGUCB4EDzEoKKIYUfDgwUuEmN1IvAgevIiEFQVzUC/iQXB7fdW7Sm461Lx6/V71V/V9/eoRTsjWD+wiS0lAdpF95C5ykBAQM9BzaAeKan6WzkBU8CgJHVaVVSHL3iy7DZKeCOPB4nw/EVK44EAOw2KwWM3SChbml+ktMIg7AGPj2SF/esJnr4GZVvlL9X30XYgmywl3eW99754D4aAb6Kdt3x/z/Vd1wblOqeY68GQSG9wwRf0ed7Po4uRuOgn2WJXdf6zVHfdPnJ1/qjOdGACrqxCMd50PDniZh+NMFgf+mGy39DRrlVMhnP7JSgO70/+R4E8g11s1wiaIRRJSkgVyNzmGbAvFoywUIygcCOOkWIb5Pmv8YZMFWfUxPwnxKD4AGOix/xGB7+FPP039WvpJQq1m8m8Ibfubt587amSBecput+0LRjBm/sczPZ5OpTjq7yAtU1CmfhkSFUvYQ+eOmPjKKZsx+wNzLKiff+OowjhlUWpdQJz6zLkjGDAet3ZWEFUDL2jAXiRtEpJpsoi6EEAyLjR0BopNJatRMo0iRd62QCNvFioPNYq8HBJUSQXK6dIB6W0XQ7OC/XolGsWXw3AtHkXrQfDH+vra5vv1RqcsO9DtlABlRz1BP4cw3w2wO4frG3kPYDaHqFMA9HL64ZUwVDBrYbgej8Lf19bWrnY79TW1rJcjTAGbG/hm/Uvehwa3R3dwd3ZR319Dnp+zNXYHibHS7ySHkKUi+S/THEaLDddRWeHRi20qyTBSBHcYc6+chQVvfnFU5DCp6gWLXxZKi2XFOk5YJFP9y2NoWrr+jPR1S2xIuXQQYP/M5tbMfjU/gH8K2/7m+YWsLDP4KkMx6tdn9tNXoJvWM2kXcIZv1fyJrl85qiNggohUo/KansqfD+9ZAljaU8PMEuz4sIX+yfo89DK4mil5siVY2vxtB+zrtChSpQXbqrc+0qbYIfIo+YJcJoTjBegr1v2Rh1e6X/XnaH8OMDALo+VGmGU4QBcT1CJWUik7aDKYw/hwoCLxdnISorhpCwrJkzg7MM2xJBZHC94IMRqsaqHZYQ76FV5Al+K+aqlQgSY8B6XsIc5OQuGrQXOqzpN4oTpGMqTfdOvzbt7SfS5AiHbVNuUgMg1bOpwJymNb558Jzx7r9yLhc8cAzdX9LBRGOuFQTdhB28h6U25gv2OYlsmly4E64jGzE3njJlDXdKv6OXjayHTOinHTDVydPWJQzZBmaL6NG7Vv1i2qcSvYNRE6wWRqZwaVwl5xpal/LLiUlk0BqGY6up4MueHwlh1NMcGEOXVY03nQimJ4gjEhLF3eFOuGLdqWiO1kwpT8U+FyQYFRQ7Ntyk1NapRyy2LYIW0OoNutt0zdMoX0HCHjXJy0U+Qt6md5K8HqGwLlmnEcHo4z09Acg52wUE88u2+9aQrAgwmE0tttrlHgJvdsaggNpH5BndxwDcq4bmAxJ/uE0Khw4qi+R0pJGTS9YxV76gp6FvGavkqC0iuiAoaNRX+h8dEmMpGqkWArWV2BlS18b6W+BOSvSzc+1df3nj37z6AEVjCFZvNSjcsIGvrgDQvI3936DLp4nGNgZGBgAGLtNU3b4/ltvjJwszCAwHXflFkw+v+//zYsKszNQC4HAxNIFABGAgv1AAAAeJxjYGRgYG7438AQw6L8/9///ywqDEARFMAOAKazBrJ4nGNhYGBgfsnAwAKkWRihtPL/fyAaACKnAyYAAAAAAAB2AQIBdgH8AyADYnicY2BkYGBgZzjMwMYAAkxAzAWEDAz/wXwGABycAecAeJxlj01OwzAQhV/6B6QSqqhgh+QFYgEo/RGrblhUavdddN+mTpsqiSPHrdQDcB6OwAk4AtyAO/BIJ5s2lsffvHljTwDc4Acejt8t95E9XDI7cg0XuBeuU38QbpBfhJto41W4Rf1N2MczpsJtdGF5g9e4YvaEd2EPHXwI13CNT+E69S/hBvlbuIk7/Aq30PHqwj7mXle4jUcv9sdWL5xeqeVBxaHJIpM5v4KZXu+Sha3S6pxrW8QmU4OgX0lTnWlb3VPs10PnIhVZk6oJqzpJjMqt2erQBRvn8lGvF4kehCblWGP+tsYCjnEFhSUOjDFCGGSIyujoO1Vm9K+xQ8Jee1Y9zed0WxTU/3OFAQL0z1xTurLSeTpPgT1fG1J1dCtuy56UNJFezUkSskJe1rZUQuoBNmVXjhF6XNGJPyhnSP8ACVpuyAAAAHicbcNRCoAgEAXAfWYqdRYPtWXJEqwJSR6/oN8Ghgx9JvrnYTDAYoSDRyD0UBtrf7uVJbHO9yaLcLkkRnvK3kIVzUfRTPQAg/cP1gA=') format('woff');
+}
+.iconfont {font-family:"iconfont" !important; font-size:16px; font-style:normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;}
+.icon-quanxuan:before { content: "\e62c"; }
+.icon-caidan:before { content: "\e610"; }
+.icon-fanxuan:before { content: "\e837"; }
+.icon-pifu:before { content: "\e668"; }
+.icon-qingkong:before { content: "\e63e"; }
+
+
+
diff --git a/src/main/resources/static/custom/module/formSelects/formSelects-v4.js b/src/main/resources/static/custom/module/formSelects/formSelects-v4.js
new file mode 100755
index 0000000..f613eec
--- /dev/null
+++ b/src/main/resources/static/custom/module/formSelects/formSelects-v4.js
@@ -0,0 +1,1412 @@
+'use strict';
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+
+/**
+ * name: formSelects
+ * 基于Layui Select多选
+ * version: 4.0.0.formSelects
+ * http://sun.faysunshine.com/layui/formSelects-v4/dist/formSelects-v4.js
+ */
+(function (layui, window, factory) {
+	if ((typeof exports === 'undefined' ? 'undefined' : _typeof(exports)) === 'object') {
+		// 支持 CommonJS
+		module.exports = factory();
+	} else if (typeof define === 'function' && define.amd) {
+		// 支持 AMD
+		define(factory);
+	} else if (window.layui && layui.define) {
+		//layui加载
+		layui.define(['jquery'], function (exports) {
+			exports('formSelects', factory());
+		});
+	} else {
+		window.formSelects = factory();
+	}
+})(typeof layui == 'undefined' ? null : layui, window, function () {
+	var v = '4.0.0.formSelects',
+	    NAME = 'xm-select',
+	    PNAME = 'xm-select-parent',
+	    INPUT = 'xm-select-input',
+	    TDIV = 'xm-select--suffix',
+	    THIS = 'xm-select-this',
+	    LABEL = 'xm-select-label',
+	    SEARCH = 'xm-select-search',
+	    CREATE = 'xm-select-create',
+	    CREATE_LONG = 'xm-select-create-long',
+	    MAX = 'xm-select-max',
+	    SKIN = 'xm-select-skin',
+	    DIRECTION = "xm-select-direction",
+	    HEIGHT = 'xm-select-height',
+	    DISABLED = 'xm-dis-disabled',
+	    DIS = 'xm-select-dis',
+	    TEMP = 'xm-select-temp',
+	    RADIO = 'xm-select-radio',
+	    LINKAGE = 'xm-select-linkage',
+	    DL = 'xm-select-dl',
+	    HIDE_INPUT = 'xm-hide-input',
+	    SANJIAO = 'xm-select-sj',
+	    ICON_CLOSE = 'xm-icon-close',
+	    FORM_TITLE = 'xm-select-title',
+	    FORM_SELECT = 'xm-form-select',
+	    FORM_SELECTED = 'xm-form-selected',
+	    FORM_NONE = 'xm-select-none',
+	    FORM_EMPTY = 'xm-select-empty',
+	    FORM_INPUT = 'xm-input',
+	    FORM_SELECT_TIPS = 'xm-select-tips',
+	    CHECKBOX_YES = 'xm-icon-yes',
+	    CZ = 'xm-cz',
+	    CZ_GROUP = 'xm-cz-group',
+	    TIPS = '请选择',
+	    data = {},
+	    events = {
+		on: {},
+		filter: {},
+		maxTips: {}
+	},
+	    ajax = {
+		type: 'get',
+		header: {},
+		first: true,
+		data: {},
+		searchUrl: '',
+		searchName: 'keyword',
+		searchVal: null,
+		keyName: 'name',
+		keyVal: 'value',
+		keySel: 'selected',
+		keyDis: 'disabled',
+		keyChildren: 'children',
+		dataType: '',
+		delay: 500,
+		beforeSuccess: null,
+		success: null,
+		error: null,
+		beforeSearch: null,
+		clearInput: false
+	},
+	    quickBtns = [{ icon: 'iconfont icon-quanxuan', name: '全选', click: function click(id, cm) {
+			cm.selectAll(id, true, true);
+		} }, { icon: 'iconfont icon-qingkong', name: '清空', click: function click(id, cm) {
+			cm.removeAll(id, true, true);
+		} }, { icon: 'iconfont icon-fanxuan', name: '反选', click: function click(id, cm) {
+			cm.reverse(id, true, true);
+		} }, { icon: 'iconfont icon-pifu', name: '换肤', click: function click(id, cm) {
+			cm.skin(id);
+		} }],
+	    $ = window.$ || window.layui && window.layui.jquery,
+	    $win = $(window),
+	    ajaxs = {},
+	    FormSelects = function FormSelects(options) {
+		var _this = this;
+
+		this.config = {
+			name: null, //xm-select="xxx"
+			max: null,
+			maxTips: function maxTips(vals, val, max) {
+				var ipt = $('[xid="' + _this.config.name + '"]').prev().find('.' + NAME);
+				if (ipt.parents('.layui-form-item[pane]').length) {
+					ipt = ipt.parents('.layui-form-item[pane]');
+				}
+				ipt.attr('style', 'border-color: red !important');
+				setTimeout(function () {
+					ipt.removeAttr('style');
+				}, 300);
+			},
+			init: null, //初始化的选择值,
+			on: null, //select值发生变化
+			filter: function filter(id, inputVal, val, isDisabled) {
+				return val.name.indexOf(inputVal) == -1;
+			},
+			clearid: -1,
+			direction: 'auto',
+			height: null,
+			isEmpty: false,
+			btns: [quickBtns[0], quickBtns[1], quickBtns[2]]
+		};
+		this.select = null;
+		this.values = [];
+		$.extend(true, this.config, options);
+	};
+
+	//一些简单的处理方法
+	var Common = function Common() {
+		this.loadingCss();
+		this.appender();
+		this.init();
+		this.on();
+		this.initVal();
+		this.onreset();
+		this.listening();
+	};
+
+	Common.prototype.appender = function () {
+		//针对IE做的一些拓展
+		if (!Array.prototype.map) {
+			Array.prototype.map = function (callback, thisArg) {
+				var T,
+				    A,
+				    k,
+				    O = Object(this),
+				    len = O.length >>> 0;
+				if (thisArg) {
+					T = thisArg;
+				}
+				A = new Array(len);
+				k = 0;
+				while (k < len) {
+					var kValue, mappedValue;
+					if (k in O) {
+						kValue = O[k];
+						mappedValue = callback.call(T, kValue, k, O);
+						A[k] = mappedValue;
+					}
+					k++;
+				}
+				return A;
+			};
+		}
+		if (!Array.prototype.forEach) {
+			Array.prototype.forEach = function forEach(callback, thisArg) {
+				var T, k;
+				if (this == null) {
+					throw new TypeError("this is null or not defined");
+				}
+				var O = Object(this);
+				var len = O.length >>> 0;
+				if (typeof callback !== "function") {
+					throw new TypeError(callback + " is not a function");
+				}
+				if (arguments.length > 1) {
+					T = thisArg;
+				}
+				k = 0;
+				while (k < len) {
+					var kValue;
+					if (k in O) {
+
+						kValue = O[k];
+						callback.call(T, kValue, k, O);
+					}
+					k++;
+				}
+			};
+		}
+	};
+
+	Common.prototype.init = function (target) {
+		var _this2 = this;
+
+		//初始化页面上已有的select
+		$(target ? target : 'select[' + NAME + ']').each(function (index, select) {
+			var othis = $(select),
+			    id = othis.attr(NAME),
+			    hasRender = othis.next('.layui-form-select'),
+			    disabled = select.disabled,
+			    max = othis.attr(MAX) - 0,
+			    isSearch = othis.attr(SEARCH) != undefined,
+			    searchUrl = isSearch ? othis.attr(SEARCH) : null,
+			    isCreate = othis.attr(CREATE) != undefined,
+			    isRadio = othis.attr(RADIO) != undefined,
+			    skin = othis.attr(SKIN),
+			    direction = othis.attr(DIRECTION),
+			    optionsFirst = select.options[0],
+			    height = othis.attr(HEIGHT),
+			    formname = othis.attr('name'),
+			    layverify = othis.attr('lay-verify'),
+			    placeholder = optionsFirst ? optionsFirst.value ? TIPS : optionsFirst.innerHTML || TIPS : TIPS,
+			    value = othis.find('option[selected]').toArray().map(function (option) {
+				//获取已选中的数据
+				return {
+					name: option.innerHTML,
+					val: option.value
+				};
+			}),
+			    fs = new FormSelects();
+			data[id] = fs;
+			//先取消layui对select的渲染
+			hasRender[0] && hasRender.remove();
+
+			//包裹一个div
+			othis.wrap('<div class="' + PNAME + '"></div>');
+
+			//构造渲染div
+			var dinfo = _this2.renderSelect(id, placeholder, select);
+			var heightStyle = height ? 'style="height: ' + height + ';"' : '';
+			var inputHtml = height ? ['<div class="' + LABEL + '" style="margin-right: 50px;"></div>', '<input type="text" fsw class="' + FORM_INPUT + ' ' + INPUT + '" ' + (isSearch ? '' : 'style="display: none;"') + ' autocomplete="off" debounce="0" style="position: absolute;right: 10px;top: 3px;"/>'] : ['<div class="' + LABEL + '">', '<input type="text" fsw class="' + FORM_INPUT + ' ' + INPUT + '" ' + (isSearch ? '' : 'style="display: none;"') + ' autocomplete="off" debounce="0" />', '</div>'];
+			var reElem = $('<div class="' + FORM_SELECT + '" ' + SKIN + '="' + skin + '">\n\t\t\t\t\t<input type="hidden" class="' + HIDE_INPUT + '" value="" name="' + formname + '" lay-verify="' + layverify + '"/>\n\t\t\t\t\t<div class="' + FORM_TITLE + ' ' + (disabled ? DIS : '') + '">\n\t\t\t\t\t\t<div class="' + FORM_INPUT + ' ' + NAME + '" ' + heightStyle + '>\n\t\t\t\t\t\t\t' + inputHtml.join('') + '\n\t\t\t\t\t\t\t<i class="' + SANJIAO + '"></i>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="' + TDIV + '">\n\t\t\t\t\t\t\t<input type="text" autocomplete="off" placeholder="' + placeholder + '" readonly="readonly" unselectable="on" class="' + FORM_INPUT + '">\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div></div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<dl xid="' + id + '" class="' + DL + ' ' + (isRadio ? RADIO : '') + '">' + dinfo + '</dl>\n\t\t\t\t</div>');
+			othis.after(reElem);
+			fs.select = othis.remove(); //去掉layui.form.render
+			fs.values = value;
+			fs.config.name = id;
+			fs.config.init = value.concat([]);
+			fs.config.direction = direction;
+			fs.config.height = height;
+			fs.config.radio = isRadio;
+
+			if (max) {
+				//有最大值
+				fs.config.max = max;
+			}
+
+			//如果可搜索, 加上事件
+			if (isSearch) {
+				reElem.find('.' + INPUT).on('input propertychange', function (e) {
+					var input = e.target,
+					    inputValue = $.trim(input.value),
+					    keyCode = e.keyCode;
+					if (keyCode === 9 || keyCode === 13 || keyCode === 37 || keyCode === 38 || keyCode === 39 || keyCode === 40) {
+						return false;
+					}
+
+					//过滤一下tips
+					_this2.changePlaceHolder($(input));
+
+					var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+					searchUrl = ajaxConfig.searchUrl || searchUrl;
+					//如果开启了远程搜索
+					if (searchUrl) {
+						if (ajaxConfig.searchVal) {
+							inputValue = ajaxConfig.searchVal;
+							ajaxConfig.searchVal = '';
+						}
+						if (!ajaxConfig.beforeSearch || ajaxConfig.beforeSearch && ajaxConfig.beforeSearch instanceof Function && ajaxConfig.beforeSearch(id, searchUrl, inputValue)) {
+							var delay = ajaxConfig.delay;
+							if (ajaxConfig.first) {
+								ajaxConfig.first = false;
+								delay = 10;
+							}
+							clearTimeout(fs.clearid);
+							fs.clearid = setTimeout(function () {
+								reElem.find('dl > *:not(.' + FORM_SELECT_TIPS + ')').remove();
+								reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('请求中');
+								_this2.ajax(id, searchUrl, inputValue, false, null, true);
+							}, delay);
+						}
+					} else {
+						reElem.find('dl .layui-hide').removeClass('layui-hide');
+						//遍历选项, 选择可以显示的值
+						reElem.find('dl dd:not(.' + FORM_SELECT_TIPS + ')').each(function (idx, item) {
+							var _item = $(item);
+							var searchFun = data[id].config.filter || events.filter[id];
+							if (searchFun && searchFun(id, inputValue, {
+								name: _item.find('span').text(),
+								val: _item.attr('lay-value')
+							}, _item.hasClass(DISABLED)) == true) {
+								_item.addClass('layui-hide');
+							}
+						});
+						//控制分组名称
+						reElem.find('dl dt').each(function (index, item) {
+							if (!$(item).nextUntil('dt', ':not(.layui-hide)').length) {
+								$(item).addClass('layui-hide');
+							}
+						});
+						//动态创建
+						_this2.create(id, isCreate, inputValue);
+						var shows = reElem.find('dl dd:not(.' + FORM_SELECT_TIPS + '):not(.layui-hide)');
+						if (!shows.length) {
+							reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('无匹配项');
+						} else {
+							reElem.find('dd.' + FORM_NONE).removeClass(FORM_EMPTY);
+						}
+					}
+				});
+				if (searchUrl) {
+					//触发第一次请求事件
+					_this2.triggerSearch(reElem, true);
+				}
+			}
+		});
+	};
+
+	Common.prototype.isArray = function (obj) {
+		return Object.prototype.toString.call(obj) == "[object Array]";
+	};
+
+	Common.prototype.triggerSearch = function (div, isCall) {
+		(div ? [div] : $('.' + FORM_SELECT).toArray()).forEach(function (reElem, index) {
+			reElem = $(reElem);
+			var id = reElem.find('dl').attr('xid');
+			if (id && data[id] && data[id].config.isEmpty || isCall) {
+				var obj_caller = reElem.find('.' + INPUT)[0];
+				if (document.createEventObject) {
+					obj_caller.fireEvent("onchange");
+				} else {
+					var evt = document.createEvent("HTMLEvents");
+					evt.initEvent("input", false, true);
+					obj_caller.dispatchEvent(evt);
+				}
+			}
+		});
+	};
+
+	Common.prototype.ajax = function (id, searchUrl, inputValue, isLinkage, linkageWidth, isSearch) {
+		var _this3 = this;
+
+		var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+		if (!reElem[0] || !searchUrl) {
+			return;
+		}
+
+		var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+		var ajaxData = $.extend(true, {}, ajaxConfig.data);
+		ajaxData[ajaxConfig.searchName] = inputValue;
+		ajaxData['_'] = Date.now();
+		$.ajax({
+			type: ajaxConfig.type,
+			headers: ajaxConfig.header,
+			url: searchUrl,
+			data: ajaxConfig.dataType == 'json' ? JSON.stringify(ajaxData) : ajaxData,
+			success: function success(res) {
+				if (typeof res == 'string') {
+					res = JSON.parse(res);
+				}
+				ajaxConfig.beforeSuccess && ajaxConfig.beforeSuccess instanceof Function && (res = ajaxConfig.beforeSuccess(id, searchUrl, inputValue, res));
+				if (_this3.isArray(res)) {
+					res = {
+						code: 0,
+						msg: "",
+						data: res
+					};
+				}
+				if (res.code != 0) {
+					reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text(res.msg);
+				} else {
+					reElem.find('dd.' + FORM_NONE).removeClass(FORM_EMPTY);
+					//获得已选择的values
+					_this3.renderData(id, res.data, isLinkage, linkageWidth, isSearch);
+					data[id].config.isEmpty = res.data.length == 0;
+				}
+				ajaxConfig.success && ajaxConfig.success instanceof Function && ajaxConfig.success(id, searchUrl, inputValue, res);
+			},
+			error: function error(err) {
+				reElem.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + ')').remove();
+				reElem.find('dd.' + FORM_NONE).addClass(FORM_EMPTY).text('服务异常');
+				ajaxConfig.error && ajaxConfig.error instanceof Function && ajaxConfig.error(id, searchUrl, inputValue, err);
+			}
+		});
+	};
+
+	Common.prototype.renderData = function (id, dataArr, linkage, linkageWidth, isSearch) {
+		var _this4 = this;
+
+		if (linkage) {
+			var _ret = function () {
+				//渲染多级联动
+				var result = [],
+				    index = 0,
+				    temp = { "0": dataArr },
+				    ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+
+				var _loop = function _loop() {
+					var group = result[index++] = [],
+					    _temp = temp;
+					temp = {};
+					$.each(_temp, function (pid, arr) {
+						$.each(arr, function (idx, item) {
+							var val = {
+								pid: pid,
+								name: item[ajaxConfig.keyName],
+								val: item[ajaxConfig.keyVal]
+							};
+							group.push(val);
+							var children = item[ajaxConfig.keyChildren];
+							if (children && children.length) {
+								temp[val.val] = children;
+							}
+						});
+					});
+				};
+
+				do {
+					_loop();
+				} while (Object.getOwnPropertyNames(temp).length);
+
+				var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+				var html = ['<div class="xm-select-linkage">'];
+
+				$.each(result, function (idx, arr) {
+					var groupDiv = ['<div style="left: ' + (linkageWidth - 0) * idx + 'px;" class="xm-select-linkage-group xm-select-linkage-group' + (idx + 1) + ' ' + (idx != 0 ? 'xm-select-linkage-hide' : '') + '">'];
+					$.each(arr, function (idx2, item) {
+						var span = '<li title="' + item.name + '" pid="' + item.pid + '" value="' + item.val + '"><span>' + item.name + '</span></li>';
+						groupDiv.push(span);
+					});
+					groupDiv.push('</div>');
+					html = html.concat(groupDiv);
+				});
+				//			<li class="xm-select-this xm-select-active"><span>123</span></li>
+				html.push('<div style="clear: both; height: 288px;"></div>');
+				html.push('</div>');
+				reElem.find('dl').html(html.join(''));
+				reElem.find('.' + INPUT).css('display', 'none'); //联动暂时不支持搜索
+				return {
+					v: void 0
+				};
+			}();
+
+			if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === "object") return _ret.v;
+		}
+
+		var reElem = $('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT);
+		var ajaxConfig = ajaxs[id] ? ajaxs[id] : ajax;
+		var pcInput = reElem.find('.' + TDIV + ' input');
+
+		var values = [];
+		reElem.find('dl').html(this.renderSelect(id, pcInput.attr('placeholder') || pcInput.attr('back'), dataArr.map(function (item) {
+			if (item[ajaxConfig.keySel]) {
+				values.push({
+					name: item[ajaxConfig.keyName],
+					val: item[ajaxConfig.keyVal]
+				});
+			}
+			return {
+				innerHTML: item[ajaxConfig.keyName],
+				value: item[ajaxConfig.keyVal],
+				sel: item[ajaxConfig.keySel],
+				disabled: item[ajaxConfig.keyDis],
+				type: item.type,
+				name: item.name
+			};
+		})));
+
+		var label = reElem.find('.' + LABEL);
+		var dl = reElem.find('dl[xid]');
+		if (isSearch) {
+			//如果是远程搜索, 这里需要判重
+			var oldVal = data[id].values;
+			oldVal.forEach(function (item, index) {
+				dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+			});
+			values.forEach(function (item, index) {
+				if (_this4.indexOf(oldVal, item) == -1) {
+					_this4.addLabel(id, label, item);
+					dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+					oldVal.push(item);
+				}
+			});
+		} else {
+			values.forEach(function (item, index) {
+				_this4.addLabel(id, label, item);
+				dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+			});
+			data[id].values = values;
+		}
+		this.commonHanler(id, label);
+	};
+
+	Common.prototype.create = function (id, isCreate, inputValue) {
+		if (isCreate && inputValue) {
+			var fs = data[id],
+			    dl = $('[xid="' + id + '"]'),
+			    tips = dl.find('dd.' + FORM_SELECT_TIPS + ':first'),
+			    tdd = null,
+			    temp = dl.find('dd.' + TEMP);
+			dl.find('dd:not(.' + FORM_SELECT_TIPS + '):not(.' + TEMP + ')').each(function (index, item) {
+				if (inputValue == $(item).find('span').text()) {
+					tdd = item;
+				}
+			});
+			if (!tdd) {
+				//如果不存在, 则创建
+				if (temp[0]) {
+					temp.attr('lay-value', inputValue);
+					temp.find('span').text(inputValue);
+					temp.removeClass('layui-hide');
+				} else {
+					tips.after($(this.createDD({
+						innerHTML: inputValue,
+						value: Date.now()
+					}, TEMP + ' ' + CREATE_LONG)));
+				}
+			}
+		} else {
+			$('[xid=' + id + '] dd.' + TEMP).remove();
+		}
+	};
+
+	Common.prototype.createDD = function (item, clz) {
+		return '<dd lay-value="' + item.value + '" class="' + (item.disabled ? DISABLED : '') + ' ' + (clz ? clz : '') + '">\n\t\t\t\t\t<div class="xm-unselect xm-form-checkbox ' + (item.disabled ? 'layui-checkbox-disbaled ' + DISABLED : '') + '" lay-skin="primary">\n\t\t\t\t\t\t<span>' + $.trim(item.innerHTML) + '</span>\n\t\t\t\t\t\t<i class="' + CHECKBOX_YES + '"></i>\n\t\t\t\t\t</div>\n\t\t\t\t</dd>';
+	};
+
+	Common.prototype.createQuickBtn = function (obj, right) {
+		return '<div class="' + CZ + '" method="' + obj.name + '" title="' + obj.name + '" ' + (right ? 'style="margin-right: ' + right + '"' : '') + '><i class="' + obj.icon + '"></i><span>' + obj.name + '</span></div>';
+	};
+
+	Common.prototype.renderBtns = function (id, show, right) {
+		var _this5 = this;
+
+		var quickBtn = [];
+		var dl = $('dl[xid="' + id + '"]');
+		quickBtn.push('<div class="' + CZ_GROUP + '" show="' + show + '" style="max-width: ' + (dl.prev().width() - 54) + 'px;">');
+		$.each(data[id].config.btns, function (index, item) {
+			quickBtn.push(_this5.createQuickBtn(item, right));
+		});
+		quickBtn.push('</div>');
+		quickBtn.push(this.createQuickBtn({ icon: 'iconfont icon-caidan', name: '' }));
+		return quickBtn.join('');
+	};
+
+	Common.prototype.renderSelect = function (id, tips, select) {
+		var _this6 = this;
+
+		var arr = [];
+		if (data[id].config.btns.length) {
+			setTimeout(function () {
+				var dl = $('dl[xid="' + id + '"]');
+				dl.find('.' + CZ_GROUP).css('max-width', dl.prev().width() - 54 + 'px');
+			}, 10);
+			arr.push(['<dd lay-value="" class="' + FORM_SELECT_TIPS + '" style="background-color: #FFF!important;">', this.renderBtns(id, null, '30px'), '</dd>'].join(''));
+		} else {
+			arr.push('<dd lay-value="" class="' + FORM_SELECT_TIPS + '">' + tips + '</dd>');
+		}
+		if (this.isArray(select)) {
+			$(select).each(function (index, item) {
+				if (item.type === 'optgroup') {
+					arr.push('<dt>' + item.name + '</dt>');
+				} else {
+					arr.push(_this6.createDD(item));
+				}
+			});
+		} else {
+			$(select).find('*').each(function (index, item) {
+				if (item.tagName.toLowerCase() == 'option' && index == 0 && !item.value) {
+					return;
+				}
+				if (item.tagName.toLowerCase() === 'optgroup') {
+					arr.push('<dt>' + item.label + '</dt>');
+				} else {
+					arr.push(_this6.createDD(item));
+				}
+			});
+		}
+		arr.push('<dt style="display:none;"> </dt>');
+		arr.push('<dd class="' + FORM_SELECT_TIPS + ' ' + FORM_NONE + ' ' + (arr.length === 2 ? FORM_EMPTY : '') + '">\u6CA1\u6709\u9009\u9879</dd>');
+		return arr.join('');
+	};
+
+	Common.prototype.on = function () {
+		var _this7 = this;
+
+		//事件绑定
+		this.one();
+
+		$(document).on('click', function (e) {
+			if (!$(e.target).parents('.' + FORM_TITLE)[0]) {
+				//清空input中的值
+				$('.' + INPUT).val('');
+				$('.' + PNAME + ' dl .layui-hide').removeClass('layui-hide');
+				$('.' + PNAME + ' dl dd.' + TEMP).remove();
+				_this7.triggerSearch();
+			}
+			$('.' + PNAME + ' .' + FORM_SELECTED).removeClass(FORM_SELECTED);
+		});
+	};
+
+	Common.prototype.one = function (target) {
+		var _this8 = this;
+
+		//一次性事件绑定
+		$(target ? target : document).find('.' + FORM_TITLE).off('click').on('click', function (e) {
+			var othis = $(e.target),
+			    title = othis.is(FORM_TITLE) ? othis : othis.parents('.' + FORM_TITLE),
+			    dl = title.next(),
+			    id = dl.attr('xid');
+
+			//清空非本select的input val
+			$('dl[xid]').not(dl).prev().find('.' + INPUT).val('');
+			$('dl[xid]').not(dl).find('dd.layui-hide').removeClass('layui-hide');
+
+			//如果是disabled select
+			if (title.hasClass(DIS)) {
+				return false;
+			}
+			//如果点击的是右边的三角或者只读的input
+			if (othis.is('.' + SANJIAO) || othis.is('.' + INPUT + '[readonly]')) {
+				_this8.changeShow(title, !title.parents('.' + FORM_SELECT).hasClass(FORM_SELECTED));
+				return false;
+			}
+			//如果点击的是input的右边, focus一下
+			if (title.find('.' + INPUT + ':not(readonly)')[0]) {
+				var input = title.find('.' + INPUT),
+				    epos = { x: e.pageX, y: e.pageY },
+				    pos = _this8.getPosition(title[0]),
+				    width = title.width();
+				while (epos.x > pos.x) {
+					if ($(document.elementFromPoint(epos.x, epos.y)).is(input)) {
+						input.focus();
+						_this8.changeShow(title, true);
+						return false;
+					}
+					epos.x -= 50;
+				}
+			}
+
+			//如果点击的是可搜索的input
+			if (othis.is('.' + INPUT)) {
+				_this8.changeShow(title, true);
+				return false;
+			}
+			//如果点击的是x按钮
+			if (othis.is('i[fsw="' + NAME + '"]')) {
+				var val = {
+					name: othis.prev().text(),
+					val: othis.parent().attr("value")
+				},
+				    dd = dl.find('dd[lay-value=\'' + val.val + '\']');
+				if (dd.hasClass(DISABLED)) {
+					//如果是disabled状态, 不可选, 不可删
+					return false;
+				}
+				_this8.handlerLabel(id, dd, false, val);
+				return false;
+			}
+
+			_this8.changeShow(title, !title.parents('.' + FORM_SELECT).hasClass(FORM_SELECTED));
+			return false;
+		});
+		$(target ? target : document).find('dl.' + DL).off('click').on('click', function (e) {
+			var othis = $(e.target);
+			if (othis.is('.' + LINKAGE) || othis.parents('.' + LINKAGE)[0]) {
+				//linkage的处理
+				othis = othis.is('li') ? othis : othis.parents('li');
+				var _group = othis.parents('.xm-select-linkage-group'),
+				    _id = othis.parents('dl').attr('xid');
+				//激活li
+				_group.find('.xm-select-active').removeClass('xm-select-active');
+				othis.addClass('xm-select-active');
+				//激活下一个group, 激活前显示对应数据
+				_group.nextAll('.xm-select-linkage-group').addClass('xm-select-linkage-hide');
+				var nextGroup = _group.next('.xm-select-linkage-group');
+				nextGroup.find('li').addClass('xm-select-linkage-hide');
+				nextGroup.find('li[pid="' + othis.attr('value') + '"]').removeClass('xm-select-linkage-hide');
+				//如果没有下一个group, 或没有对应的值
+				if (!nextGroup[0] || nextGroup.find('li:not(.xm-select-linkage-hide)').length == 0) {
+					var vals = [],
+					    index = 0,
+					    _isAdd = !othis.hasClass('xm-select-this');
+					if (data[_id].config.radio) {
+						othis.parents('.xm-select-linkage').find('.xm-select-this').removeClass('xm-select-this');
+					}
+					do {
+						vals[index++] = {
+							name: othis.find('span').text(),
+							val: othis.attr('value')
+							/*isAdd ? (
+       	othis.addClass('xm-select-this')
+       ) : (
+       	!othis.parent('.xm-select-linkage-group').next().find(`li[pid="${othis.attr('value')}"].xm-select-this`).length && othis.removeClass('xm-select-this')
+       );*/
+						};othis = othis.parents('.xm-select-linkage-group').prev().find('li[value="' + othis.attr('pid') + '"]');
+					} while (othis.length);
+					vals.reverse();
+					var val = {
+						name: vals.map(function (item) {
+							return item.name;
+						}).join('/'),
+						val: vals.map(function (item) {
+							return item.val;
+						}).join('/')
+					};
+					_this8.handlerLabel(_id, null, _isAdd, val);
+				} else {
+					nextGroup.removeClass('xm-select-linkage-hide');
+				}
+				return false;
+			} //xm-select-this xm-select-active
+
+			if (othis.is('dt') || othis.is('dl')) {
+				return false;
+			}
+			var dd = othis.is('dd') ? othis : othis.parents('dd');
+			var id = dd.parent('dl').attr('xid');
+			if (dd.hasClass(DISABLED)) {
+				//被禁用选项的处理
+				return false;
+			}
+			if (dd.hasClass(FORM_SELECT_TIPS)) {
+				//tips的处理
+				var btn = othis.is('.' + CZ) ? othis : othis.parents('.' + CZ);
+				if (!btn[0]) {
+					return false;
+				}
+				//TODO 快捷操作
+				var method = btn.attr('method');
+				var obj = data[id].config.btns.filter(function (bean) {
+					return bean.name == method;
+				})[0];
+				obj && obj.click && obj.click instanceof Function && obj.click(id, _this8);
+				return false;
+			}
+			var isAdd = !dd.hasClass(THIS);
+			_this8.handlerLabel(id, dd, isAdd);
+			return false;
+		});
+	};
+
+	Common.prototype.linkageAdd = function (id, val) {
+		var dl = $('dl[xid="' + id + '"]');
+		dl.find('.xm-select-active').removeClass('xm-select-active');
+		var vs = val.val.split('/');
+		var pid = void 0,
+		    li = void 0,
+		    index = 0;
+		var lis = [];
+		do {
+			pid = vs[index];
+			li = dl.find('.xm-select-linkage-group' + (index + 1) + ' li[value="' + pid + '"]');
+			li[0] && lis.push(li);
+			index++;
+		} while (li.length && pid != undefined);
+		if (lis.length == vs.length) {
+			$.each(lis, function (idx, item) {
+				item.addClass('xm-select-this');
+			});
+		}
+	};
+
+	Common.prototype.linkageDel = function (id, val) {
+		var dl = $('dl[xid="' + id + '"]');
+		var vs = val.val.split('/');
+		var pid = void 0,
+		    li = void 0,
+		    index = vs.length - 1;
+		do {
+			pid = vs[index];
+			li = dl.find('.xm-select-linkage-group' + (index + 1) + ' li[value="' + pid + '"]');
+			if (!li.parent().next().find('li[pid=' + pid + '].xm-select-this').length) {
+				li.removeClass('xm-select-this');
+			}
+			index--;
+		} while (li.length && pid != undefined);
+	};
+
+	Common.prototype.valToName = function (id, val) {
+		var dl = $('dl[xid="' + id + '"]');
+		var vs = (val + "").split('/');
+		var names = [];
+		$.each(vs, function (idx, item) {
+			var name = dl.find('.xm-select-linkage-group' + (idx + 1) + ' li[value="' + item + '"] span').text();
+			names.push(name);
+		});
+		return names.length == vs.length ? names.join('/') : null;
+	};
+
+	Common.prototype.commonHanler = function (key, label) {
+		//计算input的提示语
+		this.changePlaceHolder(label);
+		//计算高度
+		this.retop(label.parents('.' + FORM_SELECT));
+		this.checkHideSpan(label);
+		this.calcLeft(key, label);
+		//表单默认值
+		label.parents('.' + PNAME).find('.' + HIDE_INPUT).val(data[key].values.map(function (val) {
+			return val.val;
+		}).join(','));
+		//title值
+		label.parents('.' + FORM_TITLE + ' .' + NAME).attr('title', data[key].values.map(function (val) {
+			return val.name;
+		}).join(','));
+	};
+
+	Common.prototype.initVal = function (id) {
+		var _this9 = this;
+
+		var target = {};
+		if (id) {
+			target[id] = data[id];
+		} else {
+			target = data;
+		}
+		$.each(target, function (key, val) {
+			var values = val.values,
+			    div = $('dl[xid="' + key + '"]').parent(),
+			    label = div.find('.' + LABEL),
+			    dl = div.find('dl');
+			dl.find('dd.' + THIS).removeClass(THIS);
+
+			var _vals = values.concat([]);
+			_vals.concat([]).forEach(function (item, index) {
+				_this9.addLabel(key, label, item);
+				dl.find('dd[lay-value="' + item.val + '"]').addClass(THIS);
+			});
+			if (val.config.radio) {
+				_vals.length && values.push(_vals[_vals.length - 1]);
+			}
+			_this9.commonHanler(key, label);
+		});
+	};
+
+	Common.prototype.handlerLabel = function (id, dd, isAdd, oval, notOn) {
+		var div = $('[xid="' + id + '"]').prev().find('.' + LABEL),
+		    val = dd && {
+			name: dd.find('span').text(),
+			val: dd.attr('lay-value')
+		},
+		    vals = data[id].values,
+		    on = data[id].config.on || events.on[id];
+		if (oval) {
+			val = oval;
+		}
+		var fs = data[id];
+		if (isAdd && fs.config.max && fs.values.length >= fs.config.max) {
+			var maxTipsFun = data[id].config.maxTips || events.maxTips[id];
+			maxTipsFun && maxTipsFun(id, vals.concat([]), val, fs.max);
+			return;
+		}
+		if (!notOn) {
+			if (on && on instanceof Function && on(id, vals.concat([]), val, isAdd, dd && dd.hasClass(DISABLED) == false)) {
+				return;
+			}
+		}
+		var dl = $('dl[xid="' + id + '"]');
+		isAdd ? (dd && dd[0] ? (dd.addClass(THIS), dd.removeClass(TEMP)) : dl.find('.xm-select-linkage')[0] && this.linkageAdd(id, val), this.addLabel(id, div, val), vals.push(val)) : (dd && dd[0] ? dd.removeClass(THIS) : dl.find('.xm-select-linkage')[0] && this.linkageDel(id, val), this.delLabel(id, div, val), this.remove(vals, val));
+		if (!div[0]) return;
+		//单选选完后直接关闭选择域
+		if (fs.config.radio) {
+			this.changeShow(div, false);
+		}
+		//移除表单验证的红色边框
+		div.parents('.' + FORM_TITLE).prev().removeClass('layui-form-danger');
+
+		//清空搜索值
+		fs.config.clearInput && div.parents('.' + PNAME).find('.' + INPUT).val('');
+
+		this.commonHanler(id, div);
+	};
+
+	Common.prototype.addLabel = function (id, div, val) {
+		if (!val) return;
+		var tips = 'fsw="' + NAME + '"';
+		var _ref = [$('<span ' + tips + ' value="' + val.val + '"><font ' + tips + '>' + val.name + '</font></span>'), $('<i ' + tips + ' class="xm-icon-close">\xD7</i>')],
+		    $label = _ref[0],
+		    $close = _ref[1];
+
+		$label.append($close);
+		//如果是radio模式
+		var fs = data[id];
+		if (fs.config.radio) {
+			fs.values.length = 0;
+			$('dl[xid="' + id + '"]').find('dd.' + THIS + ':not([lay-value="' + val.val + '"])').removeClass(THIS);
+			div.find('span').remove();
+		}
+		//如果是固定高度
+		if (fs.config.height) {
+			div.append($label);
+		} else {
+			div.find('input').css('width', '50px');
+			div.find('input').before($label);
+		}
+	};
+
+	Common.prototype.delLabel = function (id, div, val) {
+		if (!val) return;
+		div.find('span[value="' + val.val + '"]:first').remove();
+	};
+
+	Common.prototype.calcLeft = function (id, div) {
+		if (data[id].config.height) {
+			var showLastSpan = div.find('span:not(.xm-span-hide):last')[0];
+			div.next().css('left', (showLastSpan ? this.getPosition(showLastSpan).x - this.getPosition(div[0]).x + showLastSpan.offsetWidth + 20 : 10) + 'px');
+		}
+	};
+
+	Common.prototype.checkHideSpan = function (div) {
+		var _this10 = this;
+
+		var parentHeight = div.parents('.' + NAME)[0].offsetHeight + 5;
+		div.find('span.xm-span-hide').removeClass('xm-span-hide');
+		div.find('span').each(function (index, item) {
+			if (item.offsetHeight + item.offsetTop > parentHeight || _this10.getPosition(item).y + item.offsetHeight > _this10.getPosition(div[0]).y + div[0].offsetHeight + 5) {
+				$(item).addClass('xm-span-hide');
+			}
+		});
+	};
+
+	Common.prototype.retop = function (div) {
+		//计算dl显示的位置
+		var dl = div.find('dl'),
+		    top = div.offset().top + div.outerHeight() + 5 - $win.scrollTop(),
+		    dlHeight = dl.outerHeight();
+		var up = div.hasClass('layui-form-selectup') || dl.css('top').indexOf('-') != -1 || top + dlHeight > $win.height() && top >= dlHeight;
+		div = div.find('.' + NAME);
+
+		var fs = data[dl.attr('xid')];
+		var base = dl.parents('.layui-form-pane')[0] && dl.prev()[0].clientHeight > 38 ? 14 : 10;
+		if (fs) {
+			if (fs.config.direction == 'up') {
+				dl.css({
+					top: 'auto',
+					bottom: '42px'
+				});
+				return;
+			}
+			if (fs.direction == 'down') {
+				dl.css({
+					top: div[0].offsetTop + div.height() + base + 'px',
+					bottom: 'auto'
+				});
+				return;
+			}
+		}
+
+		if (up) {
+			dl.css({
+				top: 'auto',
+				bottom: '42px'
+			});
+		} else {
+			dl.css({
+				top: div[0].offsetTop + div.height() + base + 'px',
+				bottom: 'auto'
+			});
+		}
+	};
+
+	Common.prototype.changeShow = function (children, isShow) {
+		//显示于隐藏
+		var top = children.parents('.' + FORM_SELECT);
+		$('.' + PNAME + ' .' + FORM_SELECT).not(top).removeClass(FORM_SELECTED);
+		if (isShow) {
+			this.retop(top);
+			top.addClass(FORM_SELECTED);
+			top.find('.' + INPUT).focus();
+		} else {
+			top.removeClass(FORM_SELECTED);
+			top.find('.' + INPUT).val('');
+			top.find('dl .layui-hide').removeClass('layui-hide');
+			top.find('dl dd.' + TEMP).remove();
+			//计算ajax数据是否为空, 然后重新请求数据
+			var id = top.find('dl').attr('xid');
+			if (id && data[id] && data[id].config.isEmpty) {
+				this.triggerSearch(top);
+			}
+		}
+	};
+
+	Common.prototype.changePlaceHolder = function (div) {
+		//显示于隐藏提示语
+		//调整pane模式下的高度
+		var title = div.parents('.' + FORM_TITLE);
+
+		var id = div.parents('.' + PNAME).find('dl[xid]').attr('xid');
+		if (data[id] && data[id].config.height) {//既然固定高度了, 那就看着办吧
+
+		} else {
+			var height = title.find('.' + NAME)[0].clientHeight;
+			title.css('height', (height > 34 ? height + 4 : height) + 'px');
+			//如果是layui pane模式, 处理label的高度
+			var label = title.parents('.' + PNAME).parent().prev();
+			if (label.is('.layui-form-label') && title.parents('.layui-form-pane')[0]) {
+				height = height > 36 ? height + 4 : height;
+				title.css('height', height + 'px');
+				label.css({
+					height: height + 2 + 'px',
+					lineHeight: height - 18 + 'px'
+				});
+			}
+		}
+
+		var input = title.find('.' + TDIV + ' input'),
+		    isShow = !div.find('span:last')[0] && !title.find('.' + INPUT).val();
+		if (isShow) {
+			var ph = input.attr('back');
+			input.removeAttr('back');
+			input.attr('placeholder', ph);
+		} else {
+			var _ph = input.attr('placeholder');
+			input.removeAttr('placeholder');
+			input.attr('back', _ph);
+		}
+	};
+
+	Common.prototype.indexOf = function (arr, val) {
+		for (var i = 0; i < arr.length; i++) {
+			if (arr[i].val == val || arr[i].val == (val ? val.val : val) || arr[i] == val || JSON.stringify(arr[i]) == JSON.stringify(val)) {
+				return i;
+			}
+		}
+		return -1;
+	};
+
+	Common.prototype.remove = function (arr, val) {
+		var idx = this.indexOf(arr, val ? val.val : val);
+		if (idx > -1) {
+			arr.splice(idx, 1);
+			return true;
+		}
+		return false;
+	};
+
+	Common.prototype.selectAll = function (id, isOn, skipDis) {
+		var _this11 = this;
+
+		var dl = $('[xid="' + id + '"]');
+		if (dl.find('.xm-select-linkage')[0]) {
+			return;
+		}
+		dl.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + '):not(.' + THIS + ')' + (skipDis ? ':not(.' + DISABLED + ')' : '')).each(function (index, item) {
+			item = $(item);
+			var val = {
+				name: item.find('span').text(),
+				val: item.attr('lay-value')
+			};
+			_this11.handlerLabel(id, dl.find('dd[lay-value="' + val.val + '"]'), true, val, !isOn);
+		});
+	};
+
+	Common.prototype.removeAll = function (id, isOn, skipDis) {
+		var _this12 = this;
+
+		var dl = $('[xid="' + id + '"]');
+		if (dl.find('.xm-select-linkage')[0]) {
+			//针对多级联动的处理
+			data[id].values.concat([]).forEach(function (item, idx) {
+				var vs = item.val.split('/');
+				var pid = void 0,
+				    li = void 0,
+				    index = 0;
+				do {
+					pid = vs[index++];
+					li = dl.find('.xm-select-linkage-group' + index + ':not(.xm-select-linkage-hide) li[value="' + pid + '"]');
+					li.click();
+				} while (li.length && pid != undefined);
+			});
+			return;
+		}
+		data[id].values.concat([]).forEach(function (item, index) {
+			if (skipDis && dl.find('dd[lay-value="' + item.val + '"]').hasClass(DISABLED)) {} else {
+				_this12.handlerLabel(id, dl.find('dd[lay-value="' + item.val + '"]'), false, item, !isOn);
+			}
+		});
+	};
+
+	Common.prototype.reverse = function (id, isOn, skipDis) {
+		var _this13 = this;
+
+		var dl = $('[xid="' + id + '"]');
+		if (dl.find('.xm-select-linkage')[0]) {
+			return;
+		}
+		dl.find('dd[lay-value]:not(.' + FORM_SELECT_TIPS + ')' + (skipDis ? ':not(.' + DISABLED + ')' : '')).each(function (index, item) {
+			item = $(item);
+			var val = {
+				name: item.find('span').text(),
+				val: item.attr('lay-value')
+			};
+			_this13.handlerLabel(id, dl.find('dd[lay-value="' + val.val + '"]'), !item.hasClass(THIS), val, !isOn);
+		});
+	};
+
+	Common.prototype.skin = function (id) {
+		var skins = ['default', 'primary', 'normal', 'warm', 'danger'];
+		var skin = skins[Math.floor(Math.random() * skins.length)];
+		$('dl[xid="' + id + '"]').parents('.' + PNAME).find('.' + FORM_SELECT).attr('xm-select-skin', skin);
+		this.commonHanler(id, $('dl[xid="' + id + '"]').parents('.' + PNAME).find('.' + LABEL));
+	};
+
+	Common.prototype.getPosition = function (e) {
+		var x = 0,
+		    y = 0;
+		while (e != null) {
+			x += e.offsetLeft;
+			y += e.offsetTop;
+			e = e.offsetParent;
+		}
+		return { x: x, y: y };
+	};
+
+	Common.prototype.onreset = function () {
+		//监听reset按钮, 然后重置多选
+		$(document).on('click', '[type=reset]', function (e) {
+			$(e.target).parents('form').find('.' + PNAME + ' dl[xid]').each(function (index, item) {
+				var id = item.getAttribute('xid'),
+				    dl = $(item),
+				    dd = void 0,
+				    temp = {};
+				common.removeAll(id);
+				data[id].config.init.forEach(function (val, idx) {
+					if (val && (!temp[val] || data[id].config.repeat) && (dd = dl.find('dd[lay-value="' + val.val + '"]'))[0]) {
+						common.handlerLabel(id, dd, true);
+						temp[val] = 1;
+					}
+				});
+			});
+		});
+	};
+
+	Common.prototype.loadingCss = function () {};
+
+	Common.prototype.listening = function () {
+		//TODO 用于监听dom结构变化, 如果出现新的为渲染select, 则自动进行渲染
+		var flag = false;
+		var index = 0;
+		$(document).on('DOMNodeInserted', function (e) {
+			if (flag) {
+				//避免递归渲染
+				return;
+			}
+			flag = true;
+			//渲染select
+			$('select[' + NAME + ']').each(function (index, select) {
+				var sid = select.getAttribute(NAME);
+				common.init(select);
+				common.one($('dl[xid="' + sid + '"]').parents('.' + PNAME));
+				common.initVal(sid);
+			});
+
+			flag = false;
+		});
+	};
+
+	var Select4 = function Select4() {
+		this.v = v;
+	};
+	var common = new Common();
+
+	Select4.prototype.value = function (id, type, isAppend) {
+		if (typeof id != 'string') {
+			return [];
+		}
+		var fs = data[id];
+		if (!fs) {
+			return [];
+		}
+		if (typeof type == 'string' || type == undefined) {
+			var arr = fs.values.concat([]) || [];
+			if (type == 'val') {
+				return arr.map(function (val) {
+					return val.val;
+				});
+			}
+			if (type == 'valStr') {
+				return arr.map(function (val) {
+					return val.val;
+				}).join(',');
+			}
+			if (type == 'name') {
+				return arr.map(function (val) {
+					return val.name;
+				});
+			}
+			if (type == 'nameStr') {
+				return arr.map(function (val) {
+					return val.name;
+				}).join(',');
+			}
+			return arr;
+		}
+		if (common.isArray(type)) {
+			var dl = $('[xid="' + id + '"]'),
+			    temp = {},
+			    dd = void 0,
+			    isAdd = true;
+			if (isAppend == false) {
+				//删除传入的数组
+				isAdd = false;
+			} else if (isAppend == true) {
+				//追加模式
+				isAdd = true;
+			} else {
+				//删除原有的数据
+				common.removeAll(id);
+			}
+			if (isAdd) {
+				fs.values.forEach(function (val, index) {
+					temp[val.val] = 1;
+				});
+			}
+			type.forEach(function (val, index) {
+				if (val && (!temp[val] || fs.config.repeat)) {
+					if ((dd = dl.find('dd[lay-value="' + val + '"]'))[0]) {
+						common.handlerLabel(id, dd, isAdd, null, true);
+						temp[val] = 1;
+					} else {
+						var name = common.valToName(id, val);
+						if (name) {
+							common.handlerLabel(id, dd, isAdd, {
+								name: name,
+								val: val
+							}, true);
+							temp[val] = 1;
+						}
+					}
+				}
+			});
+		}
+	};
+
+	Common.prototype.bindEvent = function (name, id, fun) {
+		if (id && id instanceof Function) {
+			fun = id;
+			id = null;
+		}
+		if (fun && fun instanceof Function) {
+			if (!id) {
+				$.each(data, function (id, val) {
+					data[id] ? data[id].config[name] = fun : events[name][id] = fun;
+				});
+			} else {
+				data[id] ? data[id].config[name] = fun : events[name][id] = fun;
+			}
+		}
+	};
+
+	Select4.prototype.on = function (id, fun) {
+		common.bindEvent('on', id, fun);
+		return this;
+	};
+
+	Select4.prototype.filter = function (id, fun) {
+		common.bindEvent('filter', id, fun);
+		return this;
+	};
+
+	Select4.prototype.maxTips = function (id, fun) {
+		common.bindEvent('maxTips', id, fun);
+		return this;
+	};
+
+	Select4.prototype.config = function (id, config, isJson) {
+		if (id && (typeof id === 'undefined' ? 'undefined' : _typeof(id)) == 'object') {
+			isJson = config == true;
+			config = id;
+			id = null;
+		}
+		if (config && (typeof config === 'undefined' ? 'undefined' : _typeof(config)) == 'object') {
+			if (isJson) {
+				config.header || (config.header = {});
+				config.header['Content-Type'] = 'application/json; charset=UTF-8';
+				config.dataType = 'json';
+			}
+			id ? (ajaxs[id] = $.extend(true, {}, ajax, config), data[id] && (data[id].config.direction = config.direction), config.searchUrl && data[id] && common.triggerSearch($('.' + PNAME + ' dl[xid="' + id + '"]').parents('.' + FORM_SELECT), true)) : $.extend(true, ajax, config);
+		}
+		return this;
+	};
+
+	Select4.prototype.render = function (id) {
+		var _this14 = this;
+
+		var target = {};
+		id ? data[id] && (target[id] = data[id]) : data;
+
+		if (Object.getOwnPropertyNames(target).length) {
+			$.each(target, function (key, val) {
+				//恢复初始值
+				var dl = $('dl[xid="' + key + '"]'),
+				    vals = [];
+				val.select.find('option[selected]').each(function (index, item) {
+					vals.push(item.value);
+				});
+				//移除创建元素
+				dl.find('.' + CREATE_LONG).remove();
+				//清空INPUT
+				dl.prev().find('.' + INPUT).val('');
+				//触发search
+				common.triggerSearch(dl.parents('.' + FORM_SELECT), true);
+				//移除hidn
+				dl.find('.layui-hide').removeClass('layui-hide');
+				//重新赋值
+				_this14.value(key, vals);
+			});
+		}
+		($('select[' + NAME + '="' + id + '"]')[0] ? $('select[' + NAME + '="' + id + '"]') : $('select[' + NAME + ']')).each(function (index, select) {
+			var sid = select.getAttribute(NAME);
+			common.init(select);
+			common.one($('dl[xid="' + sid + '"]').parents('.' + PNAME));
+			common.initVal(sid);
+		});
+		return this;
+	};
+
+	Select4.prototype.disabled = function (id) {
+		var target = {};
+		id ? data[id] && (target[id] = data[id]) : target = data;
+
+		$.each(target, function (key, val) {
+			$('dl[xid="' + key + '"]').prev().addClass(DIS);
+		});
+		return this;
+	};
+
+	Select4.prototype.undisabled = function (id) {
+		var target = {};
+		id ? data[id] && (target[id] = data[id]) : target = data;
+
+		$.each(target, function (key, val) {
+			$('dl[xid="' + key + '"]').prev().removeClass(DIS);
+		});
+		return this;
+	};
+
+	Select4.prototype.data = function (id, type, config) {
+		if (!id || !type || !config) {
+			return this;
+		}
+		//检测该id是否尚未渲染
+		!data[id] && this.render(id).value(id, []);
+		this.config(id, config);
+		if (type == 'local') {
+			common.renderData(id, config.arr, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100');
+		} else if (type == 'server') {
+			common.ajax(id, config.url, config.keyword, config.linkage == true, config.linkageWidth ? config.linkageWidth : '100');
+		}
+		return this;
+	};
+
+	Select4.prototype.btns = function (id, btns, config) {
+		if (!btns || !common.isArray(btns)) {
+			return this;
+		};
+		var target = {};
+		id ? data[id] && (target[id] = data[id]) : target = data;
+
+		btns = btns.map(function (obj) {
+			if (typeof obj == 'string') {
+				if (obj == 'select') {
+					return quickBtns[0];
+				}
+				if (obj == 'remove') {
+					return quickBtns[1];
+				}
+				if (obj == 'reverse') {
+					return quickBtns[2];
+				}
+				if (obj == 'skin') {
+					return quickBtns[3];
+				}
+			}
+			return obj;
+		});
+
+		$.each(target, function (key, val) {
+			val.config.btns = btns;
+			var dd = $('dl[xid="' + key + '"]').find('.' + FORM_SELECT_TIPS + ':first');
+			if (btns.length) {
+				var show = config && config.show && (config.show == 'name' || config.show == 'icon') ? config.show : '';
+				var html = common.renderBtns(key, show, config && config.space ? config.space : '30px');
+				dd.html(html);
+			} else {
+				var pcInput = dd.parents('.' + FORM_SELECT).find('.' + TDIV + ' input');
+				var _html = pcInput.attr('placeholder') || pcInput.attr('back');
+				dd.html(_html);
+				dd.removeAttr('style');
+			}
+		});
+
+		return this;
+	};
+
+	Select4.prototype.search = function (id, val) {
+		if (id && data[id]) {
+			ajaxs[id] = $.extend(true, {}, ajax, {
+				first: true,
+				searchVal: val
+			});
+			common.triggerSearch($('dl[xid="' + id + '"]').parents('.' + FORM_SELECT), true);
+		}
+		return this;
+	};
+
+	return new Select4();
+});
\ No newline at end of file
diff --git a/src/main/resources/static/custom/module/index.js b/src/main/resources/static/custom/module/index.js
new file mode 100755
index 0000000..1217d02
--- /dev/null
+++ b/src/main/resources/static/custom/module/index.js
@@ -0,0 +1,158 @@
+layui.define(['admin', 'layer', 'element'], function (exports) {
+    var admin = layui.admin;
+    var layer = layui.layer;
+    var element = layui.element;
+
+    var index = {
+        pageTabs: true,  // 是否开启多标签
+        // 路由注册
+        initRouter: function () {
+            // 自动扫描side菜单注册
+            $('.layui-layout-admin .layui-side .layui-nav a[lay-href]').each(function () {
+                var menuName = $(this).text();
+                var menuPath = $(this).attr('lay-href');
+                if ('javascript:;' != menuPath && '' != menuPath) {
+                    var key = menuPath.replace(/[?:=&/]/g, '_');
+                    $(this).attr('href', '#!' + key);
+                    Q.reg(key, function () {
+                        index.loadView({
+                            menuId: key,
+                            menuPath: menuPath,
+                            menuName: menuName
+                        });
+                    });
+                } else {
+                    $(this).attr('href', 'javascript:;');
+                }
+            });
+            // 主页
+            Q.init({
+                index: 'home_console'
+            });
+            // tab选项卡切换监听
+            element.on('tab(admin-pagetabs)', function (data) {
+                var layId = $(this).attr('lay-id');
+                Q.go(layId);
+            });
+        },
+        // 加载主体部分
+        loadView: function (param) {
+            var menuId = param.menuId;
+            var menuPath = param.menuPath;
+            var menuName = param.menuName;
+            var flag;  // 选项卡是否已添加
+            var contentBody = '.layui-layout-admin .layui-body';
+            // 判断是否开启了选项卡功能
+            if (index.pageTabs) {
+                $('.layui-layout-admin .layui-body .layui-tab .layui-tab-title>li').each(function () {
+                    if ($(this).attr('lay-id') === menuId) {
+                        flag = true;
+                        return false;
+                    }
+                });
+                if (!flag) {
+                    element.tabAdd('admin-pagetabs', {
+                        title: menuName,
+                        id: menuId,
+                        content: '<div id="' + menuId + '"></div>'
+                    });
+                }
+                contentBody = '#' + menuId;
+                element.tabChange('admin-pagetabs', menuId);
+                admin.rollPage('auto');
+                // 切换tab关闭表格内浮窗
+                $('.layui-table-tips-c').trigger('click');
+                admin.removeLoading('.layui-layout-admin .layui-body');
+                // 解决切换tab滚动条时而消失的问题
+                var $iframe = $('.layui-layout-admin .layui-body .layui-tab-content .layui-tab-item.layui-show .admin-iframe')[0];
+                if ($iframe) {
+                    $iframe.style.height = "99%";
+                    $iframe.scrollWidth;
+                    $iframe.style.height = "100%";
+                }
+            } else {
+                $('.layui-body.admin-iframe-body').removeClass('admin-iframe-body');
+            }
+            if (!flag || admin.isRefresh) {
+                admin.showLoading('.layui-layout-admin .layui-body');
+                admin.ajax({
+                    url: menuPath,
+                    type: 'GET',
+                    dataType: 'html',
+                    success: function (result, status, xhr) {
+                        $(contentBody).html(result);
+                        admin.isRefresh = false;
+                        element.render('breadcrumb');
+                        admin.removeLoading('.layui-layout-admin .layui-body');
+                    }
+                });
+            }
+            admin.activeNav(Q.lash);
+            // 移动设备切换页面隐藏侧导航
+            if (document.body.clientWidth <= 750) {
+                admin.flexible(true);
+            }
+        },
+        // 检查多标签功能是否开启
+        checkPageTabs: function () {
+            if (index.pageTabs) {
+                $('.layui-layout-admin').addClass('open-tab');
+                // 如果开启多标签先加载主页
+                element.tabAdd('admin-pagetabs', {
+                    id: 'home_console',
+                    title: '<i class="layui-icon layui-icon-home"></i>',
+                    content: '<div id="home_console"></div>'
+                });
+                $('#home_console').load('home/console');
+            } else {
+                $('.layui-layout-admin').removeClass('open-tab');
+            }
+        },
+        // 打开新页面
+        openNewTab: function (param) {
+            var menuId = param.menuId;
+            var url = param.url;
+            var title = param.title;
+
+            Q.reg(menuId, function () {
+                index.loadView({
+                    menuId: menuId,
+                    menuPath: url,
+                    menuName: title
+                });
+            });
+
+            Q.go(menuId);
+        },
+        // 关闭选项卡
+        closeTab: function (menuId) {
+            element.tabDelete('admin-pagetabs', menuId);
+        },
+        // 绑定事件监听
+        bindEvent: function () {
+            // 退出登录点击事件
+            $('#btnLogout').click(function () {
+                layer.confirm('确定退出登录？', function () {
+                    location.replace('logout');
+                });
+            });
+
+            // 修改密码点击事件
+            $('#setPsw').click(function () {
+                admin.popupRight('home/password');
+            });
+
+            // 个人信息点击事件
+            $('#setInfo').click(function () {
+
+            });
+
+            // 消息点击事件
+            $('#btnMessage').click(function () {
+                admin.popupRight('home/message');
+            });
+        }
+    };
+
+    exports('index', index);
+});
diff --git a/src/main/resources/static/custom/module/treetable-lay/treetable.css b/src/main/resources/static/custom/module/treetable-lay/treetable.css
new file mode 100755
index 0000000..ca2922d
--- /dev/null
+++ b/src/main/resources/static/custom/module/treetable-lay/treetable.css
@@ -0,0 +1,17 @@
+.treeTable-empty {
+    width: 20px;
+    display: inline-block;
+}
+
+.treeTable-icon {
+    cursor: pointer;
+}
+
+.treeTable-icon .layui-icon-triangle-d:before {
+    content: "\e623";
+}
+
+.treeTable-icon.open .layui-icon-triangle-d:before {
+    content: "\e625";
+}
+
diff --git a/src/main/resources/static/custom/module/treetable-lay/treetable.js b/src/main/resources/static/custom/module/treetable-lay/treetable.js
new file mode 100755
index 0000000..35efdcf
--- /dev/null
+++ b/src/main/resources/static/custom/module/treetable-lay/treetable.js
@@ -0,0 +1,198 @@
+layui.define(['layer', 'table'], function (exports) {
+    var $ = layui.jquery;
+    var layer = layui.layer;
+    var table = layui.table;
+
+    var treetable = {
+        // 渲染树形表格
+        render: function (param) {
+            // 检查参数
+            if (!treetable.checkParam(param)) {
+                return;
+            }
+            var doneCallback = param.done;
+            // 获取数据
+            var mData = [];
+            $.getJSON(param.url, param.where, function (res) {
+                var tNodes = res.data;
+                // 补上id和pid字段
+                for (var i = 0; i < tNodes.length; i++) {
+                    var tt = tNodes[i];
+                    if (!tt.id) {
+                        if (!param.treeIdName) {
+                            layer.msg('参数treeIdName不能为空', {icon: 5});
+                            return;
+                        }
+                        tt.id = tt[param.treeIdName];
+                    }
+                    if (!tt.pid) {
+                        if (!param.treePidName) {
+                            layer.msg('参数treePidName不能为空', {icon: 5});
+                            return;
+                        }
+                        tt.pid = tt[param.treePidName];
+                    }
+                }
+
+                // 对数据进行排序
+                var sort = function (s_pid, data) {
+                    for (var i = 0; i < data.length; i++) {
+                        if (data[i].pid == s_pid) {
+                            var len = mData.length;
+                            if (len > 0 && mData[len - 1].id == s_pid) {
+                                mData[len - 1].isParent = true;
+                            }
+                            mData.push(data[i]);
+                            sort(data[i].id, data);
+                        }
+                    }
+                };
+                sort(param.treeSpid, tNodes);
+
+                // 重写参数
+                param.url = undefined;
+                param.data = mData;
+                param.page = {
+                    count: param.data.length,
+                    limit: param.data.length
+                };
+                param.cols[0][param.treeColIndex].templet = function (d) {
+                    var mId = d.id;
+                    var mPid = d.pid;
+                    var isDir = d.isParent;
+                    var emptyNum = treetable.getEmptyNum(mPid, mData);
+                    var iconHtml = '';
+                    for (var i = 0; i < emptyNum; i++) {
+                        iconHtml += '<span class="treeTable-empty"></span>';
+                    }
+                    if (isDir) {
+                        iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>';
+                    } else {
+                        iconHtml += '<i class="layui-icon layui-icon-file"></i>';
+                    }
+                    iconHtml += '&nbsp;&nbsp;';
+                    var ttype = isDir ? 'dir' : 'file';
+                    var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">';
+                    return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
+                };
+
+                param.done = function (res, curr, count) {
+                    $(param.elem).next().addClass('treeTable');
+                    $('.treeTable .layui-table-page').css('display', 'none');
+                    $(param.elem).next().attr('treeLinkage', param.treeLinkage);
+                    // 绑定事件换成对body绑定
+                    /*$('.treeTable .treeTable-icon').click(function () {
+                        treetable.toggleRows($(this), param.treeLinkage);
+                    });*/
+                    if (param.treeDefaultClose) {
+                        treetable.foldAll(param.elem);
+                    }
+                    if (doneCallback) {
+                        doneCallback(res, curr, count);
+                    }
+                };
+
+                // 渲染表格
+                table.render(param);
+            });
+        },
+        // 计算缩进的数量
+        getEmptyNum: function (pid, data) {
+            var num = 0;
+            if (!pid) {
+                return num;
+            }
+            var tPid;
+            for (var i = 0; i < data.length; i++) {
+                if (pid == data[i].id) {
+                    num += 1;
+                    tPid = data[i].pid;
+                    break;
+                }
+            }
+            return num + treetable.getEmptyNum(tPid, data);
+        },
+        // 展开/折叠行
+        toggleRows: function ($dom, linkage) {
+            var type = $dom.attr('lay-ttype');
+            if ('file' == type) {
+                return;
+            }
+            var mId = $dom.attr('lay-tid');
+            var isOpen = $dom.hasClass('open');
+            if (isOpen) {
+                $dom.removeClass('open');
+            } else {
+                $dom.addClass('open');
+            }
+            $dom.closest('tbody').find('tr').each(function () {
+                var $ti = $(this).find('.treeTable-icon');
+                var pid = $ti.attr('lay-tpid');
+                var ttype = $ti.attr('lay-ttype');
+                var tOpen = $ti.hasClass('open');
+                if (mId == pid) {
+                    if (isOpen) {
+                        $(this).hide();
+                        if ('dir' == ttype && tOpen == isOpen) {
+                            $ti.trigger('click');
+                        }
+                    } else {
+                        $(this).show();
+                        if (linkage && 'dir' == ttype && tOpen == isOpen) {
+                            $ti.trigger('click');
+                        }
+                    }
+                }
+            });
+        },
+        // 检查参数
+        checkParam: function (param) {
+            if (!param.treeSpid && param.treeSpid != 0) {
+                layer.msg('参数treeSpid不能为空', {icon: 5});
+                return false;
+            }
+
+            if (!param.treeColIndex && param.treeColIndex != 0) {
+                layer.msg('参数treeColIndex不能为空', {icon: 5});
+                return false;
+            }
+            return true;
+        },
+        // 展开所有
+        expandAll: function (dom) {
+            $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
+                var $ti = $(this).find('.treeTable-icon');
+                var ttype = $ti.attr('lay-ttype');
+                var tOpen = $ti.hasClass('open');
+                if ('dir' == ttype && !tOpen) {
+                    $ti.trigger('click');
+                }
+            });
+        },
+        // 折叠所有
+        foldAll: function (dom) {
+            $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
+                var $ti = $(this).find('.treeTable-icon');
+                var ttype = $ti.attr('lay-ttype');
+                var tOpen = $ti.hasClass('open');
+                if ('dir' == ttype && tOpen) {
+                    $ti.trigger('click');
+                }
+            });
+        }
+    };
+
+    layui.link(layui.cache.base + 'treetable-lay/treetable.css');
+
+    // 给图标列绑定事件
+    $('body').on('click', '.treeTable .treeTable-icon', function () {
+        var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage');
+        if ('true' == treeLinkage) {
+            treetable.toggleRows($(this), true);
+        } else {
+            treetable.toggleRows($(this), false);
+        }
+    });
+
+    exports('treetable', treetable);
+});
diff --git a/src/main/resources/static/libs/q.js b/src/main/resources/static/libs/q.js
new file mode 100755
index 0000000..a809434
--- /dev/null
+++ b/src/main/resources/static/libs/q.js
@@ -0,0 +1,100 @@
+/**
+ * 路由组件
+ * q.js-1.2 <https://github.com/itorr/q.js>
+ */
+var Q = function (W, D, HTML, hash, view, arg, _arg, i, index, Regex, key, Q) {
+    HTML = D.documentElement;
+    Regex = [];
+    key = '!';
+    onhashchange = function () {
+        Q.hash = hash = location.hash.substring(key.length + 1);
+
+        arg = hash.split(/\?/g).shift();
+
+        arg = arg.split('/');
+
+        i = Regex.length;
+        while (i--)
+            if (_arg = hash.match(Regex[i])) {
+                arg = _arg;
+                arg[0] = Regex[i];
+                break;
+            }
+
+
+        if (!Q[arg[0]]) // default
+            arg[0] = index;
+
+        if (Q.pop)
+            Q.pop.apply(W, arg);
+
+        Q.lash = view = arg.shift();
+
+        HTML.setAttribute('view', view);
+
+        Q[view].apply(W, arg);
+    };
+
+    if (!'onhashchange' in W) {
+        Q.path = location.hash;
+        setInterval(function () {
+            if (Q.path != location.hash) {
+                onhashchange();
+                Q.path = location.hash;
+            }
+        }, 100);
+    }
+
+    Q = {
+        init: function (o) {
+
+            if (o.key !== undefined)
+                key = o.key;
+
+            index = o.index || 'V';
+
+            if (o.pop && typeof o.pop == 'function')
+                Q.pop = o.pop;
+
+            onhashchange();
+
+            return this
+        },
+        reg: function (r, u) {
+            if (!r)
+                return;
+
+            if (u == undefined)
+                u = function () {
+                };
+
+            if (r instanceof RegExp) { //正则注册
+                Q[r] = u;
+                Regex.push(r);
+            } else if (r instanceof Array) { //数组注册
+                for (var i in r) {
+                    this.reg.apply(this, [].concat(r[i]).concat(u));
+                }
+            } else if (typeof r == 'string') { //关键字注册
+                if (typeof u == 'function')
+                    Q[r] = u;
+                else if (typeof u == 'string' && Q[u])
+                    Q[r] = Q[u];
+            }
+
+            return this
+        },
+        V: function () {
+            console.log('q.js <https://github.com/itorr/q.js> 2014/12/28');
+            return this
+        },
+        go: function (u) {
+            location.hash = '#' + key + u;
+            return this
+        },
+        refresh: function () {
+            onhashchange();
+        }
+    };
+    return Q;
+}(this, document);
diff --git a/src/main/resources/static/libs/zTree/css/metroStyle/img/line_conn.png b/src/main/resources/static/libs/zTree/css/metroStyle/img/line_conn.png
new file mode 100755
index 0000000..b211da2
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/css/metroStyle/img/line_conn.png
Binary files differ
diff --git a/src/main/resources/static/libs/zTree/css/metroStyle/img/loading.gif b/src/main/resources/static/libs/zTree/css/metroStyle/img/loading.gif
new file mode 100755
index 0000000..e8c2892
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/css/metroStyle/img/loading.gif
Binary files differ
diff --git a/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.gif b/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.gif
new file mode 100755
index 0000000..664b969
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.gif
Binary files differ
diff --git a/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.png b/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.png
new file mode 100755
index 0000000..e9e58a3
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/css/metroStyle/img/metro.png
Binary files differ
diff --git a/src/main/resources/static/libs/zTree/css/metroStyle/metroStyle.css b/src/main/resources/static/libs/zTree/css/metroStyle/metroStyle.css
new file mode 100755
index 0000000..e20c37d
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/css/metroStyle/metroStyle.css
@@ -0,0 +1,96 @@
+/*-------------------------------------
+zTree Style
+
+version:    3.4
+author:     Hunter.z
+email:      hunter.z@263.net
+website:    http://code.google.com/p/jquerytree/
+
+-------------------------------------*/
+
+.ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif}
+.ztree {margin:0; padding:5px; color:#333}
+.ztree li{padding:0; margin:0; list-style:none; line-height:17px; text-align:left; white-space:nowrap; outline:0}
+.ztree li ul{ margin:0; padding:0 0 0 18px}
+.ztree li ul.line{ background:url(./img/line_conn.png) 0 0 repeat-y;}
+
+.ztree li a {padding-right:3px; margin:0; cursor:pointer; height:21px; color:#333; background-color: transparent; text-decoration:none; vertical-align:top; display: inline-block}
+.ztree li a:hover {text-decoration:underline}
+.ztree li a.curSelectedNode {padding-top:0px; background-color:#e5e5e5; color:black; height:21px; opacity:0.8;}
+.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#e5e5e5; color:black; height:21px; border:1px #666 solid; opacity:0.8;}
+.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#aaa; color:white; height:21px; border:1px #666 solid;
+  opacity:0.8; filter:alpha(opacity=80)}
+.ztree li a.tmpTargetNode_prev {}
+.ztree li a.tmpTargetNode_next {}
+.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0;
+  font-size:12px; border:1px #585956 solid; *border:0px}
+.ztree li span {line-height:21px; margin-right:2px}
+.ztree li span.button {line-height:0; margin:0; padding: 0; width:21px; height:21px; display: inline-block; vertical-align:middle;
+  border:0 none; cursor: pointer;outline:none;
+  background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+  background-image:url("./img/metro.png"); *background-image:url("./img/metro.gif")}
+
+.ztree li span.button.chk {width:13px; height:13px; margin:0 2px; cursor: auto}
+.ztree li span.button.chk.checkbox_false_full {background-position: -5px -5px;}
+.ztree li span.button.chk.checkbox_false_full_focus {background-position: -5px -26px;}
+.ztree li span.button.chk.checkbox_false_part {background-position: -5px -48px;}
+.ztree li span.button.chk.checkbox_false_part_focus {background-position: -5px -68px;}
+.ztree li span.button.chk.checkbox_false_disable {background-position: -5px -89px;}
+.ztree li span.button.chk.checkbox_true_full {background-position: -26px -5px;}
+.ztree li span.button.chk.checkbox_true_full_focus {background-position: -26px -26px;}
+.ztree li span.button.chk.checkbox_true_part {background-position: -26px -48px;}
+.ztree li span.button.chk.checkbox_true_part_focus {background-position: -26px -68px;}
+.ztree li span.button.chk.checkbox_true_disable {background-position: -26px -89px;}
+.ztree li span.button.chk.radio_false_full {background-position: -47px -5px;}
+.ztree li span.button.chk.radio_false_full_focus {background-position: -47px -26px;}
+.ztree li span.button.chk.radio_false_part {background-position: -47px -47px;}
+.ztree li span.button.chk.radio_false_part_focus {background-position: -47px -68px;}
+.ztree li span.button.chk.radio_false_disable {background-position: -47px -89px;}
+.ztree li span.button.chk.radio_true_full {background-position: -68px -5px;}
+.ztree li span.button.chk.radio_true_full_focus {background-position: -68px -26px;}
+.ztree li span.button.chk.radio_true_part {background-position: -68px -47px;}
+.ztree li span.button.chk.radio_true_part_focus {background-position: -68px -68px;}
+.ztree li span.button.chk.radio_true_disable {background-position: -68px -89px;}
+
+.ztree li span.button.switch {width:21px; height:21px}
+.ztree li span.button.root_open{background-position:-105px -63px}
+.ztree li span.button.root_close{background-position:-126px -63px}
+.ztree li span.button.roots_open{background-position: -105px 0;}
+.ztree li span.button.roots_close{background-position: -126px 0;}
+.ztree li span.button.center_open{background-position: -105px -21px;}
+.ztree li span.button.center_close{background-position: -126px -21px;}
+.ztree li span.button.bottom_open{background-position: -105px -42px;}
+.ztree li span.button.bottom_close{background-position: -126px -42px;}
+.ztree li span.button.noline_open{background-position: -105px -84px;}
+.ztree li span.button.noline_close{background-position: -126px -84px;}
+.ztree li span.button.root_docu{ background:none;}
+.ztree li span.button.roots_docu{background-position: -84px 0;}
+.ztree li span.button.center_docu{background-position: -84px -21px;}
+.ztree li span.button.bottom_docu{background-position: -84px -42px;}
+.ztree li span.button.noline_docu{ background:none;}
+
+.ztree li span.button.ico_open{margin-right:2px; background-position: -147px -21px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_close{margin-right:2px; margin-right:2px; background-position: -147px 0; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_docu{margin-right:2px; background-position: -147px -42px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.edit {margin-left:2px; margin-right: -1px; background-position: -189px -21px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.edit:hover {
+  background-position: -168px -21px;
+}
+.ztree li span.button.remove {margin-left:2px; margin-right: -1px; background-position: -189px -42px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.remove:hover {
+  background-position: -168px -42px;
+}
+.ztree li span.button.add {margin-left:2px; margin-right: -1px; background-position: -189px 0; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.add:hover {
+  background-position: -168px 0;
+}
+.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
+
+ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)}
+
+span.tmpzTreeMove_arrow {width:16px; height:21px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute;
+    background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+    background-position:-168px -84px; background-image:url("./img/metro.png"); *background-image:url("./img/metro.gif")}
+
+ul.ztreeul.ztreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)}
+.ztreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute}
diff --git a/src/main/resources/static/libs/zTree/css/zTreeStyle/img/line_conn.gif b/src/main/resources/static/libs/zTree/css/zTreeStyle/img/line_conn.gif
new file mode 100755
index 0000000..d561d36
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/css/zTreeStyle/img/line_conn.gif
Binary files differ
diff --git a/src/main/resources/static/libs/zTree/css/zTreeStyle/img/loading.gif b/src/main/resources/static/libs/zTree/css/zTreeStyle/img/loading.gif
new file mode 100755
index 0000000..e8c2892
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/css/zTreeStyle/img/loading.gif
Binary files differ
diff --git a/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.gif b/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.gif
new file mode 100755
index 0000000..50c94fd
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.gif
Binary files differ
diff --git a/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.png b/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.png
new file mode 100755
index 0000000..ffda01e
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/css/zTreeStyle/img/zTreeStandard.png
Binary files differ
diff --git a/src/main/resources/static/libs/zTree/css/zTreeStyle/zTreeStyle.css b/src/main/resources/static/libs/zTree/css/zTreeStyle/zTreeStyle.css
new file mode 100755
index 0000000..a6845a4
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/css/zTreeStyle/zTreeStyle.css
@@ -0,0 +1,97 @@
+/*-------------------------------------
+zTree Style
+
+version:	3.5.17
+author:		Hunter.z
+email:		hunter.z@263.net
+website:	http://code.google.com/p/jquerytree/
+
+-------------------------------------*/
+
+.ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif}
+.ztree {margin:0; padding:5px; color:#333}
+.ztree li{padding:0; margin:0; list-style:none; line-height:14px; text-align:left; white-space:nowrap; outline:0}
+.ztree li ul{ margin:0; padding:0 0 0 18px}
+.ztree li ul.line{ background:url(./img/line_conn.gif) 0 0 repeat-y;}
+
+.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:17px; color:#333; background-color: transparent;
+	text-decoration:none; vertical-align:top; display: inline-block}
+.ztree li a:hover {text-decoration:underline}
+.ztree li a.curSelectedNode {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
+.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;}
+.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:16px; border:1px #316AC5 solid;
+	opacity:0.8; filter:alpha(opacity=80)}
+.ztree li a.tmpTargetNode_prev {}
+.ztree li a.tmpTargetNode_next {}
+.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0;
+	font-size:12px; border:1px #7EC4CC solid; *border:0px}
+.ztree li span {line-height:16px; margin-right:2px}
+.ztree li span.button {line-height:0; margin:0; width:16px; height:16px; display: inline-block; vertical-align:middle;
+	border:0 none; cursor: pointer;outline:none;
+	background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+	background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
+
+.ztree li span.button.chk {width:13px; height:13px; margin:0 3px 0 0; cursor: auto}
+.ztree li span.button.chk.checkbox_false_full {background-position:0 0}
+.ztree li span.button.chk.checkbox_false_full_focus {background-position:0 -14px}
+.ztree li span.button.chk.checkbox_false_part {background-position:0 -28px}
+.ztree li span.button.chk.checkbox_false_part_focus {background-position:0 -42px}
+.ztree li span.button.chk.checkbox_false_disable {background-position:0 -56px}
+.ztree li span.button.chk.checkbox_true_full {background-position:-14px 0}
+.ztree li span.button.chk.checkbox_true_full_focus {background-position:-14px -14px}
+.ztree li span.button.chk.checkbox_true_part {background-position:-14px -28px}
+.ztree li span.button.chk.checkbox_true_part_focus {background-position:-14px -42px}
+.ztree li span.button.chk.checkbox_true_disable {background-position:-14px -56px}
+.ztree li span.button.chk.radio_false_full {background-position:-28px 0}
+.ztree li span.button.chk.radio_false_full_focus {background-position:-28px -14px}
+.ztree li span.button.chk.radio_false_part {background-position:-28px -28px}
+.ztree li span.button.chk.radio_false_part_focus {background-position:-28px -42px}
+.ztree li span.button.chk.radio_false_disable {background-position:-28px -56px}
+.ztree li span.button.chk.radio_true_full {background-position:-42px 0}
+.ztree li span.button.chk.radio_true_full_focus {background-position:-42px -14px}
+.ztree li span.button.chk.radio_true_part {background-position:-42px -28px}
+.ztree li span.button.chk.radio_true_part_focus {background-position:-42px -42px}
+.ztree li span.button.chk.radio_true_disable {background-position:-42px -56px}
+
+.ztree li span.button.switch {width:18px; height:18px}
+.ztree li span.button.root_open{background-position:-92px -54px}
+.ztree li span.button.root_close{background-position:-74px -54px}
+.ztree li span.button.roots_open{background-position:-92px 0}
+.ztree li span.button.roots_close{background-position:-74px 0}
+.ztree li span.button.center_open{background-position:-92px -18px}
+.ztree li span.button.center_close{background-position:-74px -18px}
+.ztree li span.button.bottom_open{background-position:-92px -36px}
+.ztree li span.button.bottom_close{background-position:-74px -36px}
+.ztree li span.button.noline_open{background-position:-92px -72px}
+.ztree li span.button.noline_close{background-position:-74px -72px}
+.ztree li span.button.root_docu{ background:none;}
+.ztree li span.button.roots_docu{background-position:-56px 0}
+.ztree li span.button.center_docu{background-position:-56px -18px}
+.ztree li span.button.bottom_docu{background-position:-56px -36px}
+.ztree li span.button.noline_docu{ background:none;}
+
+.ztree li span.button.ico_open{margin-right:2px; background-position:-110px -16px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_close{margin-right:2px; background-position:-110px 0; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.ico_docu{margin-right:2px; background-position:-110px -32px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.edit {margin-right:2px; background-position:-110px -48px; vertical-align:top; *vertical-align:middle}
+.ztree li span.button.remove {margin-right:2px; background-position:-110px -64px; vertical-align:top; *vertical-align:middle}
+
+.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle}
+
+ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)}
+
+span.tmpzTreeMove_arrow {width:16px; height:16px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute;
+	background-color:transparent; background-repeat:no-repeat; background-attachment: scroll;
+	background-position:-110px -80px; background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")}
+
+ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)}
+.zTreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute}
+
+/* level style*/
+/*.ztree li span.button.level0 {
+	display:none;
+}
+.ztree li ul.level0 {
+	padding:0;
+	background:none;
+}*/
\ No newline at end of file
diff --git a/src/main/resources/static/libs/zTree/js/jquery.ztree.all-3.5.min.js b/src/main/resources/static/libs/zTree/js/jquery.ztree.all-3.5.min.js
new file mode 100755
index 0000000..8ff9481
--- /dev/null
+++ b/src/main/resources/static/libs/zTree/js/jquery.ztree.all-3.5.min.js
@@ -0,0 +1,161 @@
+
+/*
+ * JQuery zTree common v3.5.18
+ * http://zTree.me/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2015-06-18
+ */
+(function(p){var G,H,I,J,K,L,r={},u={},v={},M={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nameIsHTML:!1,selectedMulti:!0,showIcon:!0,showLine:!0,showTitle:!0,txtSelectedEnable:!1},data:{key:{children:"children",name:"name",title:"",url:"url"},simpleData:{enable:!1,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:!1,leaf:!1}},async:{enable:!1,contentType:"application/x-www-form-urlencoded",type:"post",dataType:"text",url:"",autoParam:[],
+otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},w=[function(b){var a=b.treeObj,c=e.event;a.bind(c.NODECREATED,function(a,c,g){j.apply(b.callback.onNodeCreated,
+[a,c,g])});a.bind(c.CLICK,function(a,c,g,l,h){j.apply(b.callback.onClick,[c,g,l,h])});a.bind(c.EXPAND,function(a,c,g){j.apply(b.callback.onExpand,[a,c,g])});a.bind(c.COLLAPSE,function(a,c,g){j.apply(b.callback.onCollapse,[a,c,g])});a.bind(c.ASYNC_SUCCESS,function(a,c,g,l){j.apply(b.callback.onAsyncSuccess,[a,c,g,l])});a.bind(c.ASYNC_ERROR,function(a,c,g,l,h,e){j.apply(b.callback.onAsyncError,[a,c,g,l,h,e])});a.bind(c.REMOVE,function(a,c,g){j.apply(b.callback.onRemove,[a,c,g])});a.bind(c.SELECTED,
+function(a,c,g,l){j.apply(b.callback.onSelected,[c,g,l])});a.bind(c.UNSELECTED,function(a,c,g,l){j.apply(b.callback.onUnSelected,[c,g,l])})}],x=[function(b){var a=e.event;b.treeObj.unbind(a.NODECREATED).unbind(a.CLICK).unbind(a.EXPAND).unbind(a.COLLAPSE).unbind(a.ASYNC_SUCCESS).unbind(a.ASYNC_ERROR).unbind(a.REMOVE).unbind(a.SELECTED).unbind(a.UNSELECTED)}],y=[function(b){var a=h.getCache(b);a||(a={},h.setCache(b,a));a.nodes=[];a.doms=[]}],z=[function(b,a,c,d,f,g){if(c){var l=h.getRoot(b),e=b.data.key.children;
+c.level=a;c.tId=b.treeId+"_"+ ++l.zId;c.parentTId=d?d.tId:null;c.open=typeof c.open=="string"?j.eqs(c.open,"true"):!!c.open;c[e]&&c[e].length>0?(c.isParent=!0,c.zAsync=!0):(c.isParent=typeof c.isParent=="string"?j.eqs(c.isParent,"true"):!!c.isParent,c.open=c.isParent&&!b.async.enable?c.open:!1,c.zAsync=!c.isParent);c.isFirstNode=f;c.isLastNode=g;c.getParentNode=function(){return h.getNodeCache(b,c.parentTId)};c.getPreNode=function(){return h.getPreNode(b,c)};c.getNextNode=function(){return h.getNextNode(b,
+c)};c.isAjaxing=!1;h.fixPIdKeyValue(b,c)}}],s=[function(b){var a=b.target,c=h.getSetting(b.data.treeId),d="",f=null,g="",l="",i=null,o=null,k=null;if(j.eqs(b.type,"mousedown"))l="mousedown";else if(j.eqs(b.type,"mouseup"))l="mouseup";else if(j.eqs(b.type,"contextmenu"))l="contextmenu";else if(j.eqs(b.type,"click"))if(j.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+e.id.SWITCH)!==null)d=j.getNodeMainDom(a).id,g="switchNode";else{if(k=j.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+e.id.A}]))d=j.getNodeMainDom(k).id,
+g="clickNode"}else if(j.eqs(b.type,"dblclick")&&(l="dblclick",k=j.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+e.id.A}])))d=j.getNodeMainDom(k).id,g="switchNode";if(l.length>0&&d.length==0&&(k=j.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+e.id.A}])))d=j.getNodeMainDom(k).id;if(d.length>0)switch(f=h.getNodeCache(c,d),g){case "switchNode":f.isParent?j.eqs(b.type,"click")||j.eqs(b.type,"dblclick")&&j.apply(c.view.dblClickExpand,[c.treeId,f],c.view.dblClickExpand)?i=G:g="":g="";break;case "clickNode":i=
+H}switch(l){case "mousedown":o=I;break;case "mouseup":o=J;break;case "dblclick":o=K;break;case "contextmenu":o=L}return{stop:!1,node:f,nodeEventType:g,nodeEventCallback:i,treeEventType:l,treeEventCallback:o}}],A=[function(b){var a=h.getRoot(b);a||(a={},h.setRoot(b,a));a[b.data.key.children]=[];a.expandTriggerFlag=!1;a.curSelectedList=[];a.noSelection=!0;a.createdNodes=[];a.zId=0;a._ver=(new Date).getTime()}],B=[],C=[],D=[],E=[],F=[],h={addNodeCache:function(b,a){h.getCache(b).nodes[h.getNodeCacheId(a.tId)]=
+a},getNodeCacheId:function(b){return b.substring(b.lastIndexOf("_")+1)},addAfterA:function(b){C.push(b)},addBeforeA:function(b){B.push(b)},addInnerAfterA:function(b){E.push(b)},addInnerBeforeA:function(b){D.push(b)},addInitBind:function(b){w.push(b)},addInitUnBind:function(b){x.push(b)},addInitCache:function(b){y.push(b)},addInitNode:function(b){z.push(b)},addInitProxy:function(b,a){a?s.splice(0,0,b):s.push(b)},addInitRoot:function(b){A.push(b)},addNodesData:function(b,a,c){var d=b.data.key.children;
+a[d]||(a[d]=[]);if(a[d].length>0)a[d][a[d].length-1].isLastNode=!1,i.setNodeLineIcos(b,a[d][a[d].length-1]);a.isParent=!0;a[d]=a[d].concat(c)},addSelectedNode:function(b,a){var c=h.getRoot(b);h.isSelectedNode(b,a)||c.curSelectedList.push(a)},addCreatedNode:function(b,a){(b.callback.onNodeCreated||b.view.addDiyDom)&&h.getRoot(b).createdNodes.push(a)},addZTreeTools:function(b){F.push(b)},exSetting:function(b){p.extend(!0,M,b)},fixPIdKeyValue:function(b,a){b.data.simpleData.enable&&(a[b.data.simpleData.pIdKey]=
+a.parentTId?a.getParentNode()[b.data.simpleData.idKey]:b.data.simpleData.rootPId)},getAfterA:function(b,a,c){for(var d=0,f=C.length;d<f;d++)C[d].apply(this,arguments)},getBeforeA:function(b,a,c){for(var d=0,f=B.length;d<f;d++)B[d].apply(this,arguments)},getInnerAfterA:function(b,a,c){for(var d=0,f=E.length;d<f;d++)E[d].apply(this,arguments)},getInnerBeforeA:function(b,a,c){for(var d=0,f=D.length;d<f;d++)D[d].apply(this,arguments)},getCache:function(b){return v[b.treeId]},getNextNode:function(b,a){if(!a)return null;
+for(var c=b.data.key.children,d=a.parentTId?a.getParentNode():h.getRoot(b),f=0,g=d[c].length-1;f<=g;f++)if(d[c][f]===a)return f==g?null:d[c][f+1];return null},getNodeByParam:function(b,a,c,d){if(!a||!c)return null;for(var f=b.data.key.children,g=0,l=a.length;g<l;g++){if(a[g][c]==d)return a[g];var e=h.getNodeByParam(b,a[g][f],c,d);if(e)return e}return null},getNodeCache:function(b,a){if(!a)return null;var c=v[b.treeId].nodes[h.getNodeCacheId(a)];return c?c:null},getNodeName:function(b,a){return""+
+a[b.data.key.name]},getNodeTitle:function(b,a){return""+a[b.data.key.title===""?b.data.key.name:b.data.key.title]},getNodes:function(b){return h.getRoot(b)[b.data.key.children]},getNodesByParam:function(b,a,c,d){if(!a||!c)return[];for(var f=b.data.key.children,g=[],l=0,e=a.length;l<e;l++)a[l][c]==d&&g.push(a[l]),g=g.concat(h.getNodesByParam(b,a[l][f],c,d));return g},getNodesByParamFuzzy:function(b,a,c,d){if(!a||!c)return[];for(var f=b.data.key.children,g=[],d=d.toLowerCase(),l=0,e=a.length;l<e;l++)typeof a[l][c]==
+"string"&&a[l][c].toLowerCase().indexOf(d)>-1&&g.push(a[l]),g=g.concat(h.getNodesByParamFuzzy(b,a[l][f],c,d));return g},getNodesByFilter:function(b,a,c,d,f){if(!a)return d?null:[];for(var g=b.data.key.children,e=d?null:[],i=0,o=a.length;i<o;i++){if(j.apply(c,[a[i],f],!1)){if(d)return a[i];e.push(a[i])}var k=h.getNodesByFilter(b,a[i][g],c,d,f);if(d&&k)return k;e=d?k:e.concat(k)}return e},getPreNode:function(b,a){if(!a)return null;for(var c=b.data.key.children,d=a.parentTId?a.getParentNode():h.getRoot(b),
+f=0,g=d[c].length;f<g;f++)if(d[c][f]===a)return f==0?null:d[c][f-1];return null},getRoot:function(b){return b?u[b.treeId]:null},getRoots:function(){return u},getSetting:function(b){return r[b]},getSettings:function(){return r},getZTreeTools:function(b){return(b=this.getRoot(this.getSetting(b)))?b.treeTools:null},initCache:function(b){for(var a=0,c=y.length;a<c;a++)y[a].apply(this,arguments)},initNode:function(b,a,c,d,f,g){for(var e=0,h=z.length;e<h;e++)z[e].apply(this,arguments)},initRoot:function(b){for(var a=
+0,c=A.length;a<c;a++)A[a].apply(this,arguments)},isSelectedNode:function(b,a){for(var c=h.getRoot(b),d=0,f=c.curSelectedList.length;d<f;d++)if(a===c.curSelectedList[d])return!0;return!1},removeNodeCache:function(b,a){var c=b.data.key.children;if(a[c])for(var d=0,f=a[c].length;d<f;d++)arguments.callee(b,a[c][d]);h.getCache(b).nodes[h.getNodeCacheId(a.tId)]=null},removeSelectedNode:function(b,a){for(var c=h.getRoot(b),d=0,f=c.curSelectedList.length;d<f;d++)if(a===c.curSelectedList[d]||!h.getNodeCache(b,
+c.curSelectedList[d].tId))c.curSelectedList.splice(d,1),d--,f--},setCache:function(b,a){v[b.treeId]=a},setRoot:function(b,a){u[b.treeId]=a},setZTreeTools:function(b,a){for(var c=0,d=F.length;c<d;c++)F[c].apply(this,arguments)},transformToArrayFormat:function(b,a){if(!a)return[];var c=b.data.key.children,d=[];if(j.isArray(a))for(var f=0,g=a.length;f<g;f++)d.push(a[f]),a[f][c]&&(d=d.concat(h.transformToArrayFormat(b,a[f][c])));else d.push(a),a[c]&&(d=d.concat(h.transformToArrayFormat(b,a[c])));return d},
+transformTozTreeFormat:function(b,a){var c,d,f=b.data.simpleData.idKey,g=b.data.simpleData.pIdKey,e=b.data.key.children;if(!f||f==""||!a)return[];if(j.isArray(a)){var h=[],i=[];for(c=0,d=a.length;c<d;c++)i[a[c][f]]=a[c];for(c=0,d=a.length;c<d;c++)i[a[c][g]]&&a[c][f]!=a[c][g]?(i[a[c][g]][e]||(i[a[c][g]][e]=[]),i[a[c][g]][e].push(a[c])):h.push(a[c]);return h}else return[a]}},m={bindEvent:function(b){for(var a=0,c=w.length;a<c;a++)w[a].apply(this,arguments)},unbindEvent:function(b){for(var a=0,c=x.length;a<
+c;a++)x[a].apply(this,arguments)},bindTree:function(b){var a={treeId:b.treeId},c=b.treeObj;b.view.txtSelectedEnable||c.bind("selectstart",function(a){a=a.originalEvent.srcElement.nodeName.toLowerCase();return a==="input"||a==="textarea"}).css({"-moz-user-select":"-moz-none"});c.bind("click",a,m.proxy);c.bind("dblclick",a,m.proxy);c.bind("mouseover",a,m.proxy);c.bind("mouseout",a,m.proxy);c.bind("mousedown",a,m.proxy);c.bind("mouseup",a,m.proxy);c.bind("contextmenu",a,m.proxy)},unbindTree:function(b){b.treeObj.unbind("click",
+m.proxy).unbind("dblclick",m.proxy).unbind("mouseover",m.proxy).unbind("mouseout",m.proxy).unbind("mousedown",m.proxy).unbind("mouseup",m.proxy).unbind("contextmenu",m.proxy)},doProxy:function(b){for(var a=[],c=0,d=s.length;c<d;c++){var f=s[c].apply(this,arguments);a.push(f);if(f.stop)break}return a},proxy:function(b){var a=h.getSetting(b.data.treeId);if(!j.uCanDo(a,b))return!0;for(var a=m.doProxy(b),c=!0,d=0,f=a.length;d<f;d++){var g=a[d];g.nodeEventCallback&&(c=g.nodeEventCallback.apply(g,[b,g.node])&&
+c);g.treeEventCallback&&(c=g.treeEventCallback.apply(g,[b,g.node])&&c)}return c}};G=function(b,a){var c=h.getSetting(b.data.treeId);if(a.open){if(j.apply(c.callback.beforeCollapse,[c.treeId,a],!0)==!1)return!0}else if(j.apply(c.callback.beforeExpand,[c.treeId,a],!0)==!1)return!0;h.getRoot(c).expandTriggerFlag=!0;i.switchNode(c,a);return!0};H=function(b,a){var c=h.getSetting(b.data.treeId),d=c.view.autoCancelSelected&&(b.ctrlKey||b.metaKey)&&h.isSelectedNode(c,a)?0:c.view.autoCancelSelected&&(b.ctrlKey||
+b.metaKey)&&c.view.selectedMulti?2:1;if(j.apply(c.callback.beforeClick,[c.treeId,a,d],!0)==!1)return!0;d===0?i.cancelPreSelectedNode(c,a):i.selectNode(c,a,d===2);c.treeObj.trigger(e.event.CLICK,[b,c.treeId,a,d]);return!0};I=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeMouseDown,[c.treeId,a],!0)&&j.apply(c.callback.onMouseDown,[b,c.treeId,a]);return!0};J=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeMouseUp,[c.treeId,a],!0)&&j.apply(c.callback.onMouseUp,
+[b,c.treeId,a]);return!0};K=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeDblClick,[c.treeId,a],!0)&&j.apply(c.callback.onDblClick,[b,c.treeId,a]);return!0};L=function(b,a){var c=h.getSetting(b.data.treeId);j.apply(c.callback.beforeRightClick,[c.treeId,a],!0)&&j.apply(c.callback.onRightClick,[b,c.treeId,a]);return typeof c.callback.onRightClick!="function"};var j={apply:function(b,a,c){return typeof b=="function"?b.apply(N,a?a:[]):c},canAsync:function(b,a){var c=b.data.key.children;
+return b.async.enable&&a&&a.isParent&&!(a.zAsync||a[c]&&a[c].length>0)},clone:function(b){if(b===null)return null;var a=j.isArray(b)?[]:{},c;for(c in b)a[c]=b[c]instanceof Date?new Date(b[c].getTime()):typeof b[c]==="object"?arguments.callee(b[c]):b[c];return a},eqs:function(b,a){return b.toLowerCase()===a.toLowerCase()},isArray:function(b){return Object.prototype.toString.apply(b)==="[object Array]"},$:function(b,a,c){a&&typeof a!="string"&&(c=a,a="");return typeof b=="string"?p(b,c?c.treeObj.get(0).ownerDocument:
+null):p("#"+b.tId+a,c?c.treeObj:null)},getMDom:function(b,a,c){if(!a)return null;for(;a&&a.id!==b.treeId;){for(var d=0,f=c.length;a.tagName&&d<f;d++)if(j.eqs(a.tagName,c[d].tagName)&&a.getAttribute(c[d].attrName)!==null)return a;a=a.parentNode}return null},getNodeMainDom:function(b){return p(b).parent("li").get(0)||p(b).parentsUntil("li").parent().get(0)},isChildOrSelf:function(b,a){return p(b).closest("#"+a).length>0},uCanDo:function(){return!0}},i={addNodes:function(b,a,c,d){if(!b.data.keep.leaf||
+!a||a.isParent)if(j.isArray(c)||(c=[c]),b.data.simpleData.enable&&(c=h.transformTozTreeFormat(b,c)),a){var f=k(a,e.id.SWITCH,b),g=k(a,e.id.ICON,b),l=k(a,e.id.UL,b);if(!a.open)i.replaceSwitchClass(a,f,e.folder.CLOSE),i.replaceIcoClass(a,g,e.folder.CLOSE),a.open=!1,l.css({display:"none"});h.addNodesData(b,a,c);i.createNodes(b,a.level+1,c,a);d||i.expandCollapseParentNode(b,a,!0)}else h.addNodesData(b,h.getRoot(b),c),i.createNodes(b,0,c,null)},appendNodes:function(b,a,c,d,f,g){if(!c)return[];for(var e=
+[],j=b.data.key.children,k=0,m=c.length;k<m;k++){var n=c[k];if(f){var t=(d?d:h.getRoot(b))[j].length==c.length&&k==0;h.initNode(b,a,n,d,t,k==c.length-1,g);h.addNodeCache(b,n)}t=[];n[j]&&n[j].length>0&&(t=i.appendNodes(b,a+1,n[j],n,f,g&&n.open));g&&(i.makeDOMNodeMainBefore(e,b,n),i.makeDOMNodeLine(e,b,n),h.getBeforeA(b,n,e),i.makeDOMNodeNameBefore(e,b,n),h.getInnerBeforeA(b,n,e),i.makeDOMNodeIcon(e,b,n),h.getInnerAfterA(b,n,e),i.makeDOMNodeNameAfter(e,b,n),h.getAfterA(b,n,e),n.isParent&&n.open&&i.makeUlHtml(b,
+n,e,t.join("")),i.makeDOMNodeMainAfter(e,b,n),h.addCreatedNode(b,n))}return e},appendParentULDom:function(b,a){var c=[],d=k(a,b);!d.get(0)&&a.parentTId&&(i.appendParentULDom(b,a.getParentNode()),d=k(a,b));var f=k(a,e.id.UL,b);f.get(0)&&f.remove();f=i.appendNodes(b,a.level+1,a[b.data.key.children],a,!1,!0);i.makeUlHtml(b,a,c,f.join(""));d.append(c.join(""))},asyncNode:function(b,a,c,d){var f,g;if(a&&!a.isParent)return j.apply(d),!1;else if(a&&a.isAjaxing)return!1;else if(j.apply(b.callback.beforeAsync,
+[b.treeId,a],!0)==!1)return j.apply(d),!1;if(a)a.isAjaxing=!0,k(a,e.id.ICON,b).attr({style:"","class":e.className.BUTTON+" "+e.className.ICO_LOADING});var l={};for(f=0,g=b.async.autoParam.length;a&&f<g;f++){var q=b.async.autoParam[f].split("="),o=q;q.length>1&&(o=q[1],q=q[0]);l[o]=a[q]}if(j.isArray(b.async.otherParam))for(f=0,g=b.async.otherParam.length;f<g;f+=2)l[b.async.otherParam[f]]=b.async.otherParam[f+1];else for(var m in b.async.otherParam)l[m]=b.async.otherParam[m];var n=h.getRoot(b)._ver;
+p.ajax({contentType:b.async.contentType,cache:!1,type:b.async.type,url:j.apply(b.async.url,[b.treeId,a],b.async.url),data:l,dataType:b.async.dataType,success:function(f){if(n==h.getRoot(b)._ver){var g=[];try{g=!f||f.length==0?[]:typeof f=="string"?eval("("+f+")"):f}catch(l){g=f}if(a)a.isAjaxing=null,a.zAsync=!0;i.setNodeLineIcos(b,a);g&&g!==""?(g=j.apply(b.async.dataFilter,[b.treeId,a,g],g),i.addNodes(b,a,g?j.clone(g):[],!!c)):i.addNodes(b,a,[],!!c);b.treeObj.trigger(e.event.ASYNC_SUCCESS,[b.treeId,
+a,f]);j.apply(d)}},error:function(c,d,f){if(n==h.getRoot(b)._ver){if(a)a.isAjaxing=null;i.setNodeLineIcos(b,a);b.treeObj.trigger(e.event.ASYNC_ERROR,[b.treeId,a,c,d,f])}}});return!0},cancelPreSelectedNode:function(b,a,c){var d=h.getRoot(b).curSelectedList,f,g;for(f=d.length-1;f>=0;f--)if(g=d[f],a===g||!a&&(!c||c!==g))if(k(g,e.id.A,b).removeClass(e.node.CURSELECTED),a){h.removeSelectedNode(b,a);b.treeObj.trigger(e.event.UNSELECTED,[m,b.treeId,g]);break}else d.splice(f,1),b.treeObj.trigger(e.event.UNSELECTED,
+[m,b.treeId,g])},createNodeCallback:function(b){if(b.callback.onNodeCreated||b.view.addDiyDom)for(var a=h.getRoot(b);a.createdNodes.length>0;){var c=a.createdNodes.shift();j.apply(b.view.addDiyDom,[b.treeId,c]);b.callback.onNodeCreated&&b.treeObj.trigger(e.event.NODECREATED,[b.treeId,c])}},createNodes:function(b,a,c,d){if(c&&c.length!=0){var f=h.getRoot(b),g=b.data.key.children,g=!d||d.open||!!k(d[g][0],b).get(0);f.createdNodes=[];a=i.appendNodes(b,a,c,d,!0,g);d?(d=k(d,e.id.UL,b),d.get(0)&&d.append(a.join(""))):
+b.treeObj.append(a.join(""));i.createNodeCallback(b)}},destroy:function(b){b&&(h.initCache(b),h.initRoot(b),m.unbindTree(b),m.unbindEvent(b),b.treeObj.empty(),delete r[b.treeId])},expandCollapseNode:function(b,a,c,d,f){var g=h.getRoot(b),l=b.data.key.children;if(a){if(g.expandTriggerFlag){var q=f,f=function(){q&&q();a.open?b.treeObj.trigger(e.event.EXPAND,[b.treeId,a]):b.treeObj.trigger(e.event.COLLAPSE,[b.treeId,a])};g.expandTriggerFlag=!1}if(!a.open&&a.isParent&&(!k(a,e.id.UL,b).get(0)||a[l]&&a[l].length>
+0&&!k(a[l][0],b).get(0)))i.appendParentULDom(b,a),i.createNodeCallback(b);if(a.open==c)j.apply(f,[]);else{var c=k(a,e.id.UL,b),g=k(a,e.id.SWITCH,b),o=k(a,e.id.ICON,b);a.isParent?(a.open=!a.open,a.iconOpen&&a.iconClose&&o.attr("style",i.makeNodeIcoStyle(b,a)),a.open?(i.replaceSwitchClass(a,g,e.folder.OPEN),i.replaceIcoClass(a,o,e.folder.OPEN),d==!1||b.view.expandSpeed==""?(c.show(),j.apply(f,[])):a[l]&&a[l].length>0?c.slideDown(b.view.expandSpeed,f):(c.show(),j.apply(f,[]))):(i.replaceSwitchClass(a,
+g,e.folder.CLOSE),i.replaceIcoClass(a,o,e.folder.CLOSE),d==!1||b.view.expandSpeed==""||!(a[l]&&a[l].length>0)?(c.hide(),j.apply(f,[])):c.slideUp(b.view.expandSpeed,f))):j.apply(f,[])}}else j.apply(f,[])},expandCollapseParentNode:function(b,a,c,d,f){a&&(a.parentTId?(i.expandCollapseNode(b,a,c,d),a.parentTId&&i.expandCollapseParentNode(b,a.getParentNode(),c,d,f)):i.expandCollapseNode(b,a,c,d,f))},expandCollapseSonNode:function(b,a,c,d,f){var g=h.getRoot(b),e=b.data.key.children,g=a?a[e]:g[e],e=a?!1:
+d,j=h.getRoot(b).expandTriggerFlag;h.getRoot(b).expandTriggerFlag=!1;if(g)for(var k=0,m=g.length;k<m;k++)g[k]&&i.expandCollapseSonNode(b,g[k],c,e);h.getRoot(b).expandTriggerFlag=j;i.expandCollapseNode(b,a,c,d,f)},isSelectedNode:function(b,a){if(!a)return!1;var c=h.getRoot(b).curSelectedList,d;for(d=c.length-1;d>=0;d--)if(a===c[d])return!0;return!1},makeDOMNodeIcon:function(b,a,c){var d=h.getNodeName(a,c),d=a.view.nameIsHTML?d:d.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");b.push("<span id='",
+c.tId,e.id.ICON,"' title='' treeNode",e.id.ICON," class='",i.makeNodeIcoClass(a,c),"' style='",i.makeNodeIcoStyle(a,c),"'></span><span id='",c.tId,e.id.SPAN,"'>",d,"</span>")},makeDOMNodeLine:function(b,a,c){b.push("<span id='",c.tId,e.id.SWITCH,"' title='' class='",i.makeNodeLineClass(a,c),"' treeNode",e.id.SWITCH,"></span>")},makeDOMNodeMainAfter:function(b){b.push("</li>")},makeDOMNodeMainBefore:function(b,a,c){b.push("<li id='",c.tId,"' class='",e.className.LEVEL,c.level,"' tabindex='0' hidefocus='true' treenode>")},
+makeDOMNodeNameAfter:function(b){b.push("</a>")},makeDOMNodeNameBefore:function(b,a,c){var d=h.getNodeTitle(a,c),f=i.makeNodeUrl(a,c),g=i.makeNodeFontCss(a,c),l=[],k;for(k in g)l.push(k,":",g[k],";");b.push("<a id='",c.tId,e.id.A,"' class='",e.className.LEVEL,c.level,"' treeNode",e.id.A,' onclick="',c.click||"",'" ',f!=null&&f.length>0?"href='"+f+"'":""," target='",i.makeNodeTarget(c),"' style='",l.join(""),"'");j.apply(a.view.showTitle,[a.treeId,c],a.view.showTitle)&&d&&b.push("title='",d.replace(/'/g,
+"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),"'");b.push(">")},makeNodeFontCss:function(b,a){var c=j.apply(b.view.fontCss,[b.treeId,a],b.view.fontCss);return c&&typeof c!="function"?c:{}},makeNodeIcoClass:function(b,a){var c=["ico"];a.isAjaxing||(c[0]=(a.iconSkin?a.iconSkin+"_":"")+c[0],a.isParent?c.push(a.open?e.folder.OPEN:e.folder.CLOSE):c.push(e.folder.DOCU));return e.className.BUTTON+" "+c.join("_")},makeNodeIcoStyle:function(b,a){var c=[];if(!a.isAjaxing){var d=a.isParent&&a.iconOpen&&
+a.iconClose?a.open?a.iconOpen:a.iconClose:a.icon;d&&c.push("background:url(",d,") 0 0 no-repeat;");(b.view.showIcon==!1||!j.apply(b.view.showIcon,[b.treeId,a],!0))&&c.push("width:0px;height:0px;")}return c.join("")},makeNodeLineClass:function(b,a){var c=[];b.view.showLine?a.level==0&&a.isFirstNode&&a.isLastNode?c.push(e.line.ROOT):a.level==0&&a.isFirstNode?c.push(e.line.ROOTS):a.isLastNode?c.push(e.line.BOTTOM):c.push(e.line.CENTER):c.push(e.line.NOLINE);a.isParent?c.push(a.open?e.folder.OPEN:e.folder.CLOSE):
+c.push(e.folder.DOCU);return i.makeNodeLineClassEx(a)+c.join("_")},makeNodeLineClassEx:function(b){return e.className.BUTTON+" "+e.className.LEVEL+b.level+" "+e.className.SWITCH+" "},makeNodeTarget:function(b){return b.target||"_blank"},makeNodeUrl:function(b,a){var c=b.data.key.url;return a[c]?a[c]:null},makeUlHtml:function(b,a,c,d){c.push("<ul id='",a.tId,e.id.UL,"' class='",e.className.LEVEL,a.level," ",i.makeUlLineClass(b,a),"' style='display:",a.open?"block":"none","'>");c.push(d);c.push("</ul>")},
+makeUlLineClass:function(b,a){return b.view.showLine&&!a.isLastNode?e.line.LINE:""},removeChildNodes:function(b,a){if(a){var c=b.data.key.children,d=a[c];if(d){for(var f=0,g=d.length;f<g;f++)h.removeNodeCache(b,d[f]);h.removeSelectedNode(b);delete a[c];b.data.keep.parent?k(a,e.id.UL,b).empty():(a.isParent=!1,a.open=!1,c=k(a,e.id.SWITCH,b),d=k(a,e.id.ICON,b),i.replaceSwitchClass(a,c,e.folder.DOCU),i.replaceIcoClass(a,d,e.folder.DOCU),k(a,e.id.UL,b).remove())}}},setFirstNode:function(b,a){var c=b.data.key.children;
+if(a[c].length>0)a[c][0].isFirstNode=!0},setLastNode:function(b,a){var c=b.data.key.children,d=a[c].length;if(d>0)a[c][d-1].isLastNode=!0},removeNode:function(b,a){var c=h.getRoot(b),d=b.data.key.children,f=a.parentTId?a.getParentNode():c;a.isFirstNode=!1;a.isLastNode=!1;a.getPreNode=function(){return null};a.getNextNode=function(){return null};if(h.getNodeCache(b,a.tId)){k(a,b).remove();h.removeNodeCache(b,a);h.removeSelectedNode(b,a);for(var g=0,l=f[d].length;g<l;g++)if(f[d][g].tId==a.tId){f[d].splice(g,
+1);break}i.setFirstNode(b,f);i.setLastNode(b,f);var j,g=f[d].length;if(!b.data.keep.parent&&g==0)f.isParent=!1,f.open=!1,g=k(f,e.id.UL,b),l=k(f,e.id.SWITCH,b),j=k(f,e.id.ICON,b),i.replaceSwitchClass(f,l,e.folder.DOCU),i.replaceIcoClass(f,j,e.folder.DOCU),g.css("display","none");else if(b.view.showLine&&g>0){var o=f[d][g-1],g=k(o,e.id.UL,b),l=k(o,e.id.SWITCH,b);j=k(o,e.id.ICON,b);f==c?f[d].length==1?i.replaceSwitchClass(o,l,e.line.ROOT):(c=k(f[d][0],e.id.SWITCH,b),i.replaceSwitchClass(f[d][0],c,e.line.ROOTS),
+i.replaceSwitchClass(o,l,e.line.BOTTOM)):i.replaceSwitchClass(o,l,e.line.BOTTOM);g.removeClass(e.line.LINE)}}},replaceIcoClass:function(b,a,c){if(a&&!b.isAjaxing&&(b=a.attr("class"),b!=void 0)){b=b.split("_");switch(c){case e.folder.OPEN:case e.folder.CLOSE:case e.folder.DOCU:b[b.length-1]=c}a.attr("class",b.join("_"))}},replaceSwitchClass:function(b,a,c){if(a){var d=a.attr("class");if(d!=void 0){d=d.split("_");switch(c){case e.line.ROOT:case e.line.ROOTS:case e.line.CENTER:case e.line.BOTTOM:case e.line.NOLINE:d[0]=
+i.makeNodeLineClassEx(b)+c;break;case e.folder.OPEN:case e.folder.CLOSE:case e.folder.DOCU:d[1]=c}a.attr("class",d.join("_"));c!==e.folder.DOCU?a.removeAttr("disabled"):a.attr("disabled","disabled")}}},selectNode:function(b,a,c){c||i.cancelPreSelectedNode(b,null,a);k(a,e.id.A,b).addClass(e.node.CURSELECTED);h.addSelectedNode(b,a);b.treeObj.trigger(e.event.SELECTED,[m,b.treeId,a])},setNodeFontCss:function(b,a){var c=k(a,e.id.A,b),d=i.makeNodeFontCss(b,a);d&&c.css(d)},setNodeLineIcos:function(b,a){if(a){var c=
+k(a,e.id.SWITCH,b),d=k(a,e.id.UL,b),f=k(a,e.id.ICON,b),g=i.makeUlLineClass(b,a);g.length==0?d.removeClass(e.line.LINE):d.addClass(g);c.attr("class",i.makeNodeLineClass(b,a));a.isParent?c.removeAttr("disabled"):c.attr("disabled","disabled");f.removeAttr("style");f.attr("style",i.makeNodeIcoStyle(b,a));f.attr("class",i.makeNodeIcoClass(b,a))}},setNodeName:function(b,a){var c=h.getNodeTitle(b,a),d=k(a,e.id.SPAN,b);d.empty();b.view.nameIsHTML?d.html(h.getNodeName(b,a)):d.text(h.getNodeName(b,a));j.apply(b.view.showTitle,
+[b.treeId,a],b.view.showTitle)&&k(a,e.id.A,b).attr("title",!c?"":c)},setNodeTarget:function(b,a){k(a,e.id.A,b).attr("target",i.makeNodeTarget(a))},setNodeUrl:function(b,a){var c=k(a,e.id.A,b),d=i.makeNodeUrl(b,a);d==null||d.length==0?c.removeAttr("href"):c.attr("href",d)},switchNode:function(b,a){a.open||!j.canAsync(b,a)?i.expandCollapseNode(b,a,!a.open):b.async.enable?i.asyncNode(b,a)||i.expandCollapseNode(b,a,!a.open):a&&i.expandCollapseNode(b,a,!a.open)}};p.fn.zTree={consts:{className:{BUTTON:"button",
+LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch"},event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open",CLOSE:"close",
+DOCU:"docu"},node:{CURSELECTED:"curSelectedNode"}},_z:{tools:j,view:i,event:m,data:h},getZTreeObj:function(b){return(b=h.getZTreeTools(b))?b:null},destroy:function(b){if(b&&b.length>0)i.destroy(h.getSetting(b));else for(var a in r)i.destroy(r[a])},init:function(b,a,c){var d=j.clone(M);p.extend(!0,d,a);d.treeId=b.attr("id");d.treeObj=b;d.treeObj.empty();r[d.treeId]=d;if(typeof document.body.style.maxHeight==="undefined")d.view.expandSpeed="";h.initRoot(d);b=h.getRoot(d);a=d.data.key.children;c=c?j.clone(j.isArray(c)?
+c:[c]):[];b[a]=d.data.simpleData.enable?h.transformTozTreeFormat(d,c):c;h.initCache(d);m.unbindTree(d);m.bindTree(d);m.unbindEvent(d);m.bindEvent(d);c={setting:d,addNodes:function(a,b,c){function e(){i.addNodes(d,a,h,c==!0)}if(!b)return null;a||(a=null);if(a&&!a.isParent&&d.data.keep.leaf)return null;var h=j.clone(j.isArray(b)?b:[b]);j.canAsync(d,a)?i.asyncNode(d,a,c,e):e();return h},cancelSelectedNode:function(a){i.cancelPreSelectedNode(d,a)},destroy:function(){i.destroy(d)},expandAll:function(a){a=
+!!a;i.expandCollapseSonNode(d,null,a,!0);return a},expandNode:function(a,b,c,e,m){if(!a||!a.isParent)return null;b!==!0&&b!==!1&&(b=!a.open);if((m=!!m)&&b&&j.apply(d.callback.beforeExpand,[d.treeId,a],!0)==!1)return null;else if(m&&!b&&j.apply(d.callback.beforeCollapse,[d.treeId,a],!0)==!1)return null;b&&a.parentTId&&i.expandCollapseParentNode(d,a.getParentNode(),b,!1);if(b===a.open&&!c)return null;h.getRoot(d).expandTriggerFlag=m;if(!j.canAsync(d,a)&&c)i.expandCollapseSonNode(d,a,b,!0,function(){if(e!==
+!1)try{k(a,d).focus().blur()}catch(b){}});else if(a.open=!b,i.switchNode(this.setting,a),e!==!1)try{k(a,d).focus().blur()}catch(p){}return b},getNodes:function(){return h.getNodes(d)},getNodeByParam:function(a,b,c){return!a?null:h.getNodeByParam(d,c?c[d.data.key.children]:h.getNodes(d),a,b)},getNodeByTId:function(a){return h.getNodeCache(d,a)},getNodesByParam:function(a,b,c){return!a?null:h.getNodesByParam(d,c?c[d.data.key.children]:h.getNodes(d),a,b)},getNodesByParamFuzzy:function(a,b,c){return!a?
+null:h.getNodesByParamFuzzy(d,c?c[d.data.key.children]:h.getNodes(d),a,b)},getNodesByFilter:function(a,b,c,e){b=!!b;return!a||typeof a!="function"?b?null:[]:h.getNodesByFilter(d,c?c[d.data.key.children]:h.getNodes(d),a,b,e)},getNodeIndex:function(a){if(!a)return null;for(var b=d.data.key.children,c=a.parentTId?a.getParentNode():h.getRoot(d),e=0,i=c[b].length;e<i;e++)if(c[b][e]==a)return e;return-1},getSelectedNodes:function(){for(var a=[],b=h.getRoot(d).curSelectedList,c=0,e=b.length;c<e;c++)a.push(b[c]);
+return a},isSelectedNode:function(a){return h.isSelectedNode(d,a)},reAsyncChildNodes:function(a,b,c){if(this.setting.async.enable){var j=!a;j&&(a=h.getRoot(d));if(b=="refresh"){for(var b=this.setting.data.key.children,m=0,p=a[b]?a[b].length:0;m<p;m++)h.removeNodeCache(d,a[b][m]);h.removeSelectedNode(d);a[b]=[];j?this.setting.treeObj.empty():k(a,e.id.UL,d).empty()}i.asyncNode(this.setting,j?null:a,!!c)}},refresh:function(){this.setting.treeObj.empty();var a=h.getRoot(d),b=a[d.data.key.children];h.initRoot(d);
+a[d.data.key.children]=b;h.initCache(d);i.createNodes(d,0,a[d.data.key.children])},removeChildNodes:function(a){if(!a)return null;var b=a[d.data.key.children];i.removeChildNodes(d,a);return b?b:null},removeNode:function(a,b){a&&(b=!!b,b&&j.apply(d.callback.beforeRemove,[d.treeId,a],!0)==!1||(i.removeNode(d,a),b&&this.setting.treeObj.trigger(e.event.REMOVE,[d.treeId,a])))},selectNode:function(a,b){if(a&&j.uCanDo(d)){b=d.view.selectedMulti&&b;if(a.parentTId)i.expandCollapseParentNode(d,a.getParentNode(),
+!0,!1,function(){try{k(a,d).focus().blur()}catch(b){}});else try{k(a,d).focus().blur()}catch(c){}i.selectNode(d,a,b)}},transformTozTreeNodes:function(a){return h.transformTozTreeFormat(d,a)},transformToArray:function(a){return h.transformToArrayFormat(d,a)},updateNode:function(a){a&&k(a,d).get(0)&&j.uCanDo(d)&&(i.setNodeName(d,a),i.setNodeTarget(d,a),i.setNodeUrl(d,a),i.setNodeLineIcos(d,a),i.setNodeFontCss(d,a))}};b.treeTools=c;h.setZTreeTools(d,c);b[a]&&b[a].length>0?i.createNodes(d,0,b[a]):d.async.enable&&
+d.async.url&&d.async.url!==""&&i.asyncNode(d);return c}};var N=p.fn.zTree,k=j.$,e=N.consts})(jQuery);
+
+/*
+ * JQuery zTree excheck v3.5.18
+ * http://zTree.me/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2015-06-18
+ */
+(function(m){var p,q,r,o={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},v={check:{enable:!1,autoCheckTrigger:!1,chkStyle:o.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:o.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};p=function(c,
+a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=b.data.key.checked;if(k.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;a[d]=!a[d];e.checkNodeRelation(b,a);d=n(a,j.id.CHECK,b);e.setChkClass(b,d,a);e.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(j.event.CHECK,[c,b.treeId,a]);return!0};q=function(c,a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,j.id.CHECK,b);a.check_Focus=!0;e.setChkClass(b,d,a);return!0};r=function(c,a){if(a.chkDisabled===
+!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,j.id.CHECK,b);a.check_Focus=!1;e.setChkClass(b,d,a);return!0};m.extend(!0,m.fn.zTree.consts,o);m.extend(!0,m.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,h,i=c.data.key.children,l=c.data.key.checked;b=j.radio;if(c.check.chkStyle==b.STYLE){var g=f.getRadioCheckedList(c);if(a[l])if(c.check.radioType==b.TYPE_ALL){for(d=g.length-1;d>=0;d--)b=g[d],b[l]&&b!=a&&(b[l]=!1,g.splice(d,1),e.setChkClass(c,n(b,j.id.CHECK,c),b),b.parentTId!=
+a.parentTId&&e.repairParentChkClassWithSelf(c,b));g.push(a)}else{g=a.parentTId?a.getParentNode():f.getRoot(c);for(d=0,h=g[i].length;d<h;d++)b=g[i][d],b[l]&&b!=a&&(b[l]=!1,e.setChkClass(c,n(b,j.id.CHECK,c),b))}else if(c.check.radioType==b.TYPE_ALL)for(d=0,h=g.length;d<h;d++)if(a==g[d]){g.splice(d,1);break}}else a[l]&&(!a[i]||a[i].length==0||c.check.chkboxType.Y.indexOf("s")>-1)&&e.setSonNodeCheckBox(c,a,!0),!a[l]&&(!a[i]||a[i].length==0||c.check.chkboxType.N.indexOf("s")>-1)&&e.setSonNodeCheckBox(c,
+a,!1),a[l]&&c.check.chkboxType.Y.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!0),!a[l]&&c.check.chkboxType.N.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=c.data.key.checked,d=j.checkbox,h=j.radio,i="",i=a.chkDisabled===!0?d.DISABLED:a.halfCheck?d.PART:c.check.chkStyle==h.STYLE?a.check_Child_State<1?d.FULL:d.PART:a[b]?a.check_Child_State===2||a.check_Child_State===-1?d.FULL:d.PART:a.check_Child_State<1?d.FULL:d.PART,b=c.check.chkStyle+"_"+(a[b]?d.TRUE:d.FALSE)+
+"_"+i,b=a.check_Focus&&a.chkDisabled!==!0?b+"_"+d.FOCUS:b;return j.className.BUTTON+" "+d.DEFAULT+" "+b},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===j.checkbox.STYLE)for(var b=c.data.key.checked,d=c.data.key.children,h=f.getRoot(c),i=0,l=h[d].length;i<l;i++){var g=h[d][i];g.nocheck!==!0&&g.chkDisabled!==!0&&(g[b]=a);e.setSonNodeCheckBox(c,g,a)}},repairChkClass:function(c,a){if(a&&(f.makeChkFlag(c,a),a.nocheck!==!0)){var b=n(a,j.id.CHECK,c);e.setChkClass(c,b,a)}},repairParentChkClass:function(c,
+a){if(a&&a.parentTId){var b=a.getParentNode();e.repairChkClass(c,b);e.repairParentChkClass(c,b)}},repairParentChkClassWithSelf:function(c,a){if(a){var b=c.data.key.children;a[b]&&a[b].length>0?e.repairParentChkClass(c,a[b][0]):e.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){var h=c.data.key.children;if(a.chkDisabled!=b)a.chkDisabled=b;e.repairChkClass(c,a);if(a[h]&&d)for(var i=0,l=a[h].length;i<l;i++)e.repairSonChkDisabled(c,a[h][i],b,d)}},repairParentChkDisabled:function(c,
+a,b,d){if(a){if(a.chkDisabled!=b&&d)a.chkDisabled=b;e.repairChkClass(c,a);e.repairParentChkDisabled(c,a.getParentNode(),b,d)}},setChkClass:function(c,a,b){a&&(b.nocheck===!0?a.hide():a.show(),a.attr("class",e.makeChkClass(c,b)))},setParentNodeCheckBox:function(c,a,b,d){var h=c.data.key.children,i=c.data.key.checked,l=n(a,j.id.CHECK,c);d||(d=a);f.makeChkFlag(c,a);a.nocheck!==!0&&a.chkDisabled!==!0&&(a[i]=b,e.setChkClass(c,l,a),c.check.autoCheckTrigger&&a!=d&&c.treeObj.trigger(j.event.CHECK,[null,c.treeId,
+a]));if(a.parentTId){l=!0;if(!b)for(var h=a.getParentNode()[h],g=0,k=h.length;g<k;g++)if(h[g].nocheck!==!0&&h[g].chkDisabled!==!0&&h[g][i]||(h[g].nocheck===!0||h[g].chkDisabled===!0)&&h[g].check_Child_State>0){l=!1;break}l&&e.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var h=c.data.key.children,i=c.data.key.checked,l=n(a,j.id.CHECK,c);d||(d=a);var g=!1;if(a[h])for(var k=0,m=a[h].length;k<m&&a.chkDisabled!==!0;k++){var o=a[h][k];e.setSonNodeCheckBox(c,
+o,b,d);o.chkDisabled===!0&&(g=!0)}if(a!=f.getRoot(c)&&a.chkDisabled!==!0){g&&a.nocheck!==!0&&f.makeChkFlag(c,a);if(a.nocheck!==!0&&a.chkDisabled!==!0){if(a[i]=b,!g)a.check_Child_State=a[h]&&a[h].length>0?b?2:0:-1}else a.check_Child_State=-1;e.setChkClass(c,l,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(j.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=f.getRoot(c).radioCheckedList,b=0,d=a.length;b<d;b++)f.getNodeCache(c,
+a[b].tId)||(a.splice(b,1),b--,d--);return a},getCheckStatus:function(c,a){if(!c.check.enable||a.nocheck||a.chkDisabled)return null;var b=c.data.key.checked;return{checked:a[b],half:a.halfCheck?a.halfCheck:c.check.chkStyle==j.radio.STYLE?a.check_Child_State===2:a[b]?a.check_Child_State>-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var h=c.data.key.children,i=c.data.key.checked,e=b&&c.check.chkStyle==j.radio.STYLE&&c.check.radioType==j.radio.TYPE_ALL,
+d=!d?[]:d,g=0,k=a.length;g<k;g++){if(a[g].nocheck!==!0&&a[g].chkDisabled!==!0&&a[g][i]==b&&(d.push(a[g]),e))break;f.getTreeCheckedNodes(c,a[g][h],b,d);if(e&&d.length>0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var d=c.data.key.children,h=c.data.key.checked,b=!b?[]:b,i=0,e=a.length;i<e;i++)a[i].nocheck!==!0&&a[i].chkDisabled!==!0&&a[i][h]!=a[i].checkedOld&&b.push(a[i]),f.getTreeChangeCheckedNodes(c,a[i][d],b);return b},makeChkFlag:function(c,a){if(a){var b=c.data.key.children,
+d=c.data.key.checked,h=-1;if(a[b])for(var i=0,e=a[b].length;i<e;i++){var g=a[b][i],f=-1;if(c.check.chkStyle==j.radio.STYLE)if(f=g.nocheck===!0||g.chkDisabled===!0?g.check_Child_State:g.halfCheck===!0?2:g[d]?2:g.check_Child_State>0?2:0,f==2){h=2;break}else f==0&&(h=0);else if(c.check.chkStyle==j.checkbox.STYLE)if(f=g.nocheck===!0||g.chkDisabled===!0?g.check_Child_State:g.halfCheck===!0?1:g[d]?g.check_Child_State===-1||g.check_Child_State===2?2:1:g.check_Child_State>0?1:0,f===1){h=1;break}else if(f===
+2&&h>-1&&i>0&&f!==h){h=1;break}else if(h===2&&f>-1&&f<2){h=1;break}else f>-1&&(h=f)}a.check_Child_State=h}}}});var m=m.fn.zTree,k=m._z.tools,j=m.consts,e=m._z.view,f=m._z.data,n=k.$;f.exSetting(v);f.addInitBind(function(c){c.treeObj.bind(j.event.CHECK,function(a,b,d,h){a.srcEvent=b;k.apply(c.callback.onCheck,[a,d,h])})});f.addInitUnBind(function(c){c.treeObj.unbind(j.event.CHECK)});f.addInitCache(function(){});f.addInitNode(function(c,a,b,d){if(b){a=c.data.key.checked;typeof b[a]=="string"&&(b[a]=
+k.eqs(b[a],"true"));b[a]=!!b[a];b.checkedOld=b[a];if(typeof b.nocheck=="string")b.nocheck=k.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=k.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=k.eqs(b.halfCheck,"true");b.halfCheck=!!b.halfCheck;b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return f.getCheckStatus(c,
+b)};c.check.chkStyle==j.radio.STYLE&&c.check.radioType==j.radio.TYPE_ALL&&b[a]&&f.getRoot(c).radioCheckedList.push(b)}});f.addInitProxy(function(c){var a=c.target,b=f.getSetting(c.data.treeId),d="",h=null,e="",l=null;if(k.eqs(c.type,"mouseover")){if(b.check.enable&&k.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+j.id.CHECK)!==null)d=k.getNodeMainDom(a).id,e="mouseoverCheck"}else if(k.eqs(c.type,"mouseout")){if(b.check.enable&&k.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+j.id.CHECK)!==null)d=
+k.getNodeMainDom(a).id,e="mouseoutCheck"}else if(k.eqs(c.type,"click")&&b.check.enable&&k.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+j.id.CHECK)!==null)d=k.getNodeMainDom(a).id,e="checkNode";if(d.length>0)switch(h=f.getNodeCache(b,d),e){case "checkNode":l=p;break;case "mouseoverCheck":l=q;break;case "mouseoutCheck":l=r}return{stop:e==="checkNode",node:h,nodeEventType:e,nodeEventCallback:l,treeEventType:"",treeEventCallback:null}},!0);f.addInitRoot(function(c){f.getRoot(c).radioCheckedList=[]});
+f.addBeforeA(function(c,a,b){c.check.enable&&(f.makeChkFlag(c,a),b.push("<span ID='",a.tId,j.id.CHECK,"' class='",e.makeChkClass(c,a),"' treeNode",j.id.CHECK,a.nocheck===!0?" style='display:none;'":"","></span>"))});f.addZTreeTools(function(c,a){a.checkNode=function(a,b,c,f){var g=this.setting.data.key.checked;if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!a[g]),f=!!f,(a[g]!==b||c)&&!(f&&k.apply(this.setting.callback.beforeCheck,[this.setting.treeId,a],!0)==!1)&&k.uCanDo(this.setting)&&this.setting.check.enable&&
+a.nocheck!==!0))a[g]=b,b=n(a,j.id.CHECK,this.setting),(c||this.setting.check.chkStyle===j.radio.STYLE)&&e.checkNodeRelation(this.setting,a),e.setChkClass(this.setting,b,a),e.repairParentChkClassWithSelf(this.setting,a),f&&this.setting.treeObj.trigger(j.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){e.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var b=this.setting.data.key.children;return f.getTreeCheckedNodes(this.setting,f.getRoot(this.setting)[b],a!==!1)};
+a.getChangeCheckedNodes=function(){var a=this.setting.data.key.children;return f.getTreeChangeCheckedNodes(this.setting,f.getRoot(this.setting)[a])};a.setChkDisabled=function(a,b,c,f){b=!!b;c=!!c;e.repairSonChkDisabled(this.setting,a,b,!!f);e.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,f){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&n(c,this.setting).get(0)&&k.uCanDo(this.setting)){var i=n(c,j.id.CHECK,this.setting);(f==!0||this.setting.check.chkStyle===
+j.radio.STYLE)&&e.checkNodeRelation(this.setting,c);e.setChkClass(this.setting,i,c);e.repairParentChkClassWithSelf(this.setting,c)}}});var s=e.createNodes;e.createNodes=function(c,a,b,d){s&&s.apply(e,arguments);b&&e.repairParentChkClassWithSelf(c,d)};var t=e.removeNode;e.removeNode=function(c,a){var b=a.getParentNode();t&&t.apply(e,arguments);a&&b&&(e.repairChkClass(c,b),e.repairParentChkClass(c,b))};var u=e.appendNodes;e.appendNodes=function(c,a,b,d,h,i){var j="";u&&(j=u.apply(e,arguments));d&&f.makeChkFlag(c,
+d);return j}})(jQuery);
+
+/*
+ * JQuery zTree exedit v3.5.18
+ * http://zTree.me/
+ *
+ * Copyright (c) 2010 Hunter.z
+ *
+ * Licensed same as jquery - MIT License
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * email: hunter.z@263.net
+ * Date: 2015-06-18
+ */
+(function(w){var I={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},x={onHoverOverNode:function(b,a){var c=m.getSetting(b.data.treeId),d=m.getRoot(c);if(d.curHoverNode!=a)x.onHoverOutNode(b);d.curHoverNode=a;f.addHoverDom(c,a)},onHoverOutNode:function(b){var b=
+m.getSetting(b.data.treeId),a=m.getRoot(b);if(a.curHoverNode&&!m.isSelectedNode(b,a.curHoverNode))f.removeTreeDom(b,a.curHoverNode),a.curHoverNode=null},onMousedownNode:function(b,a){function c(b){if(C.dragFlag==0&&Math.abs(N-b.clientX)<e.edit.drag.minMoveSize&&Math.abs(O-b.clientY)<e.edit.drag.minMoveSize)return!0;var a,c,n,k,i;i=e.data.key.children;M.css("cursor","pointer");if(C.dragFlag==0){if(g.apply(e.callback.beforeDrag,[e.treeId,l],!0)==!1)return r(b),!0;for(a=0,c=l.length;a<c;a++){if(a==0)C.dragNodeShowBefore=
+[];n=l[a];n.isParent&&n.open?(f.expandCollapseNode(e,n,!n.open),C.dragNodeShowBefore[n.tId]=!0):C.dragNodeShowBefore[n.tId]=!1}C.dragFlag=1;t.showHoverDom=!1;g.showIfameMask(e,!0);n=!0;k=-1;if(l.length>1){var j=l[0].parentTId?l[0].getParentNode()[i]:m.getNodes(e);i=[];for(a=0,c=j.length;a<c;a++)if(C.dragNodeShowBefore[j[a].tId]!==void 0&&(n&&k>-1&&k+1!==a&&(n=!1),i.push(j[a]),k=a),l.length===i.length){l=i;break}}n&&(H=l[0].getPreNode(),R=l[l.length-1].getNextNode());D=o("<ul class='zTreeDragUL'></ul>",
+e);for(a=0,c=l.length;a<c;a++)n=l[a],n.editNameFlag=!1,f.selectNode(e,n,a>0),f.removeTreeDom(e,n),a>e.edit.drag.maxShowNodeNum-1||(k=o("<li id='"+n.tId+"_tmp'></li>",e),k.append(o(n,d.id.A,e).clone()),k.css("padding","0"),k.children("#"+n.tId+d.id.A).removeClass(d.node.CURSELECTED),D.append(k),a==e.edit.drag.maxShowNodeNum-1&&(k=o("<li id='"+n.tId+"_moretmp'><a>  ...  </a></li>",e),D.append(k)));D.attr("id",l[0].tId+d.id.UL+"_tmp");D.addClass(e.treeObj.attr("class"));D.appendTo(M);B=o("<span class='tmpzTreeMove_arrow'></span>",
+e);B.attr("id","zTreeMove_arrow_tmp");B.appendTo(M);e.treeObj.trigger(d.event.DRAG,[b,e.treeId,l])}if(C.dragFlag==1){s&&B.attr("id")==b.target.id&&u&&b.clientX+F.scrollLeft()+2>w("#"+u+d.id.A,s).offset().left?(n=w("#"+u+d.id.A,s),b.target=n.length>0?n.get(0):b.target):s&&(s.removeClass(d.node.TMPTARGET_TREE),u&&w("#"+u+d.id.A,s).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));
+u=s=null;J=!1;h=e;n=m.getSettings();for(var y in n)if(n[y].treeId&&n[y].edit.enable&&n[y].treeId!=e.treeId&&(b.target.id==n[y].treeId||w(b.target).parents("#"+n[y].treeId).length>0))J=!0,h=n[y];y=F.scrollTop();k=F.scrollLeft();i=h.treeObj.offset();a=h.treeObj.get(0).scrollHeight;n=h.treeObj.get(0).scrollWidth;c=b.clientY+y-i.top;var p=h.treeObj.height()+i.top-b.clientY-y,q=b.clientX+k-i.left,x=h.treeObj.width()+i.left-b.clientX-k;i=c<e.edit.drag.borderMax&&c>e.edit.drag.borderMin;var j=p<e.edit.drag.borderMax&&
+p>e.edit.drag.borderMin,K=q<e.edit.drag.borderMax&&q>e.edit.drag.borderMin,G=x<e.edit.drag.borderMax&&x>e.edit.drag.borderMin,p=c>e.edit.drag.borderMin&&p>e.edit.drag.borderMin&&q>e.edit.drag.borderMin&&x>e.edit.drag.borderMin,q=i&&h.treeObj.scrollTop()<=0,x=j&&h.treeObj.scrollTop()+h.treeObj.height()+10>=a,P=K&&h.treeObj.scrollLeft()<=0,Q=G&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=n;if(b.target&&g.isChildOrSelf(b.target,h.treeId)){for(var E=b.target;E&&E.tagName&&!g.eqs(E.tagName,"li")&&E.id!=
+h.treeId;)E=E.parentNode;var S=!0;for(a=0,c=l.length;a<c;a++)if(n=l[a],E.id===n.tId){S=!1;break}else if(o(n,e).find("#"+E.id).length>0){S=!1;break}if(S&&b.target&&g.isChildOrSelf(b.target,E.id+d.id.A))s=w(E),u=E.id}n=l[0];if(p&&g.isChildOrSelf(b.target,h.treeId)){if(!s&&(b.target.id==h.treeId||q||x||P||Q)&&(J||!J&&n.parentTId))s=h.treeObj;i?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):j&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);K?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):G&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+
+10);s&&s!=h.treeObj&&s.offset().left<h.treeObj.offset().left&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+s.offset().left-h.treeObj.offset().left)}D.css({top:b.clientY+y+3+"px",left:b.clientX+k+3+"px"});i=a=0;if(s&&s.attr("id")!=h.treeId){var z=u==null?null:m.getNodeCache(h,u);c=(b.ctrlKey||b.metaKey)&&e.edit.drag.isMove&&e.edit.drag.isCopy||!e.edit.drag.isMove&&e.edit.drag.isCopy;a=!!(H&&u===H.tId);i=!!(R&&u===R.tId);k=n.parentTId&&n.parentTId==u;n=(c||!i)&&g.apply(h.edit.drag.prev,[h.treeId,l,z],
+!!h.edit.drag.prev);a=(c||!a)&&g.apply(h.edit.drag.next,[h.treeId,l,z],!!h.edit.drag.next);G=(c||!k)&&!(h.data.keep.leaf&&!z.isParent)&&g.apply(h.edit.drag.inner,[h.treeId,l,z],!!h.edit.drag.inner);if(!n&&!a&&!G){if(s=null,u="",v=d.move.TYPE_INNER,B.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null}else{c=w("#"+u+d.id.A,s);i=z.isLastNode?null:w("#"+z.getNextNode().tId+d.id.A,s.next());j=c.offset().top;k=c.offset().left;K=n?G?0.25:a?
+0.5:1:-1;G=a?G?0.75:n?0.5:0:-1;y=(b.clientY+y-j)/c.height();(K==1||y<=K&&y>=-0.2)&&n?(a=1-B.width(),i=j-B.height()/2,v=d.move.TYPE_PREV):(G==0||y>=G&&y<=1.2)&&a?(a=1-B.width(),i=i==null||z.isParent&&z.open?j+c.height()-B.height()/2:i.offset().top-B.height()/2,v=d.move.TYPE_NEXT):(a=5-B.width(),i=j,v=d.move.TYPE_INNER);B.css({display:"block",top:i+"px",left:k+a+"px"});c.addClass(d.node.TMPTARGET_NODE+"_"+v);if(T!=u||U!=v)L=(new Date).getTime();if(z&&z.isParent&&v==d.move.TYPE_INNER&&(y=!0,window.zTreeMoveTimer&&
+window.zTreeMoveTargetNodeTId!==z.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===z.tId&&(y=!1),y))window.zTreeMoveTimer=setTimeout(function(){v==d.move.TYPE_INNER&&z&&z.isParent&&!z.open&&(new Date).getTime()-L>h.edit.drag.autoOpenTime&&g.apply(h.callback.beforeDragOpen,[h.treeId,z],!0)&&(f.switchNode(h,z),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND,[h.treeId,z]))},h.edit.drag.autoOpenTime+50),
+window.zTreeMoveTargetNodeTId=z.tId}}else if(v=d.move.TYPE_INNER,s&&g.apply(h.edit.drag.inner,[h.treeId,l,null],!!h.edit.drag.inner)?s.addClass(d.node.TMPTARGET_TREE):s=null,B.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;T=u;U=v;e.treeObj.trigger(d.event.DRAGMOVE,[b,e.treeId,l])}return!1}function r(b){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;U=T=null;F.unbind("mousemove",c);
+F.unbind("mouseup",r);F.unbind("selectstart",k);M.css("cursor","auto");s&&(s.removeClass(d.node.TMPTARGET_TREE),u&&w("#"+u+d.id.A,s).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));g.showIfameMask(e,!1);t.showHoverDom=!0;if(C.dragFlag!=0){C.dragFlag=0;var a,i,j;for(a=0,i=l.length;a<i;a++)j=l[a],j.isParent&&C.dragNodeShowBefore[j.tId]&&!j.open&&(f.expandCollapseNode(e,j,!j.open),
+delete C.dragNodeShowBefore[j.tId]);D&&D.remove();B&&B.remove();var p=(b.ctrlKey||b.metaKey)&&e.edit.drag.isMove&&e.edit.drag.isCopy||!e.edit.drag.isMove&&e.edit.drag.isCopy;!p&&s&&u&&l[0].parentTId&&u==l[0].parentTId&&v==d.move.TYPE_INNER&&(s=null);if(s){var q=u==null?null:m.getNodeCache(h,u);if(g.apply(e.callback.beforeDrop,[h.treeId,l,q,v,p],!0)==!1)f.selectNodes(x,l);else{var A=p?g.clone(l):l;a=function(){if(J){if(!p)for(var a=0,c=l.length;a<c;a++)f.removeNode(e,l[a]);if(v==d.move.TYPE_INNER)f.addNodes(h,
+q,A);else if(f.addNodes(h,q.getParentNode(),A),v==d.move.TYPE_PREV)for(a=0,c=A.length;a<c;a++)f.moveNode(h,q,A[a],v,!1);else for(a=-1,c=A.length-1;a<c;c--)f.moveNode(h,q,A[c],v,!1)}else if(p&&v==d.move.TYPE_INNER)f.addNodes(h,q,A);else if(p&&f.addNodes(h,q.getParentNode(),A),v!=d.move.TYPE_NEXT)for(a=0,c=A.length;a<c;a++)f.moveNode(h,q,A[a],v,!1);else for(a=-1,c=A.length-1;a<c;c--)f.moveNode(h,q,A[c],v,!1);f.selectNodes(h,A);o(A[0],e).focus().blur();e.treeObj.trigger(d.event.DROP,[b,h.treeId,A,q,
+v,p])};v==d.move.TYPE_INNER&&g.canAsync(h,q)?f.asyncNode(h,q,!1,a):a()}}else f.selectNodes(x,l),e.treeObj.trigger(d.event.DROP,[b,e.treeId,l,null,null,null])}}function k(){return!1}var i,j,e=m.getSetting(b.data.treeId),C=m.getRoot(e),t=m.getRoots();if(b.button==2||!e.edit.enable||!e.edit.drag.isCopy&&!e.edit.drag.isMove)return!0;var p=b.target,q=m.getRoot(e).curSelectedList,l=[];if(m.isSelectedNode(e,a))for(i=0,j=q.length;i<j;i++){if(q[i].editNameFlag&&g.eqs(p.tagName,"input")&&p.getAttribute("treeNode"+
+d.id.INPUT)!==null)return!0;l.push(q[i]);if(l[0].parentTId!==q[i].parentTId){l=[a];break}}else l=[a];f.editNodeBlur=!0;f.cancelCurEditNode(e);var F=w(e.treeObj.get(0).ownerDocument),M=w(e.treeObj.get(0).ownerDocument.body),D,B,s,J=!1,h=e,x=e,H,R,T=null,U=null,u=null,v=d.move.TYPE_INNER,N=b.clientX,O=b.clientY,L=(new Date).getTime();g.uCanDo(e)&&F.bind("mousemove",c);F.bind("mouseup",r);F.bind("selectstart",k);b.preventDefault&&b.preventDefault();return!0}};w.extend(!0,w.fn.zTree.consts,I);w.extend(!0,
+w.fn.zTree._z,{tools:{getAbs:function(b){b=b.getBoundingClientRect();return[b.left+(document.body.scrollLeft+document.documentElement.scrollLeft),b.top+(document.body.scrollTop+document.documentElement.scrollTop)]},inputFocus:function(b){b.get(0)&&(b.focus(),g.setCursorPosition(b.get(0),b.val().length))},inputSelect:function(b){b.get(0)&&(b.focus(),b.select())},setCursorPosition:function(b,a){if(b.setSelectionRange)b.focus(),b.setSelectionRange(a,a);else if(b.createTextRange){var c=b.createTextRange();
+c.collapse(!0);c.moveEnd("character",a);c.moveStart("character",a);c.select()}},showIfameMask:function(b,a){for(var c=m.getRoot(b);c.dragMaskList.length>0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(a)for(var d=o("iframe",b),f=0,i=d.length;f<i;f++){var j=d.get(f),e=g.getAbs(j),j=o("<div id='zTreeMask_"+f+"' class='zTreeMask' style='top:"+e[1]+"px; left:"+e[0]+"px; width:"+j.offsetWidth+"px; height:"+j.offsetHeight+"px;'></div>",b);j.appendTo(o("body",b));c.dragMaskList.push(j)}}},view:{addEditBtn:function(b,
+a){if(!(a.editNameFlag||o(a,d.id.EDIT,b).length>0)&&g.apply(b.edit.showRenameBtn,[b.treeId,a],b.edit.showRenameBtn)){var c=o(a,d.id.A,b),r="<span class='"+d.className.BUTTON+" edit' id='"+a.tId+d.id.EDIT+"' title='"+g.apply(b.edit.renameTitle,[b.treeId,a],b.edit.renameTitle)+"' treeNode"+d.id.EDIT+" style='display:none;'></span>";c.append(r);o(a,d.id.EDIT,b).bind("click",function(){if(!g.uCanDo(b)||g.apply(b.callback.beforeEditName,[b.treeId,a],!0)==!1)return!1;f.editNode(b,a);return!1}).show()}},
+addRemoveBtn:function(b,a){if(!(a.editNameFlag||o(a,d.id.REMOVE,b).length>0)&&g.apply(b.edit.showRemoveBtn,[b.treeId,a],b.edit.showRemoveBtn)){var c=o(a,d.id.A,b),r="<span class='"+d.className.BUTTON+" remove' id='"+a.tId+d.id.REMOVE+"' title='"+g.apply(b.edit.removeTitle,[b.treeId,a],b.edit.removeTitle)+"' treeNode"+d.id.REMOVE+" style='display:none;'></span>";c.append(r);o(a,d.id.REMOVE,b).bind("click",function(){if(!g.uCanDo(b)||g.apply(b.callback.beforeRemove,[b.treeId,a],!0)==!1)return!1;f.removeNode(b,
+a);b.treeObj.trigger(d.event.REMOVE,[b.treeId,a]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(b,a){if(m.getRoots().showHoverDom)a.isHover=!0,b.edit.enable&&(f.addEditBtn(b,a),f.addRemoveBtn(b,a)),g.apply(b.view.addHoverDom,[b.treeId,a])},cancelCurEditNode:function(b,a,c){var r=m.getRoot(b),k=b.data.key.name,i=r.curEditNode;if(i){var j=r.curEditInput,a=a?a:c?i[k]:j.val();if(g.apply(b.callback.beforeRename,[b.treeId,i,a,c],!0)===!1)return!1;i[k]=a;o(i,d.id.A,b).removeClass(d.node.CURSELECTED_EDIT);
+j.unbind();f.setNodeName(b,i);i.editNameFlag=!1;r.curEditNode=null;r.curEditInput=null;f.selectNode(b,i,!1);b.treeObj.trigger(d.event.RENAME,[b.treeId,i,c])}return r.noSelection=!0},editNode:function(b,a){var c=m.getRoot(b);f.editNodeBlur=!1;if(m.isSelectedNode(b,a)&&c.curEditNode==a&&a.editNameFlag)setTimeout(function(){g.inputFocus(c.curEditInput)},0);else{var r=b.data.key.name;a.editNameFlag=!0;f.removeTreeDom(b,a);f.cancelCurEditNode(b);f.selectNode(b,a,!1);o(a,d.id.SPAN,b).html("<input type=text class='rename' id='"+
+a.tId+d.id.INPUT+"' treeNode"+d.id.INPUT+" >");var k=o(a,d.id.INPUT,b);k.attr("value",a[r]);b.edit.editNameSelectAll?g.inputSelect(k):g.inputFocus(k);k.bind("blur",function(){f.editNodeBlur||f.cancelCurEditNode(b)}).bind("keydown",function(a){a.keyCode=="13"?(f.editNodeBlur=!0,f.cancelCurEditNode(b)):a.keyCode=="27"&&f.cancelCurEditNode(b,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});o(a,d.id.A,b).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=k;c.noSelection=
+!1;c.curEditNode=a}},moveNode:function(b,a,c,r,k,i){var j=m.getRoot(b),e=b.data.key.children;if(a!=c&&(!b.data.keep.leaf||!a||a.isParent||r!=d.move.TYPE_INNER)){var g=c.parentTId?c.getParentNode():j,t=a===null||a==j;t&&a===null&&(a=j);if(t)r=d.move.TYPE_INNER;j=a.parentTId?a.getParentNode():j;if(r!=d.move.TYPE_PREV&&r!=d.move.TYPE_NEXT)r=d.move.TYPE_INNER;if(r==d.move.TYPE_INNER)if(t)c.parentTId=null;else{if(!a.isParent)a.isParent=!0,a.open=!!a.open,f.setNodeLineIcos(b,a);c.parentTId=a.tId}var p;
+t?p=t=b.treeObj:(!i&&r==d.move.TYPE_INNER?f.expandCollapseNode(b,a,!0,!1):i||f.expandCollapseNode(b,a.getParentNode(),!0,!1),t=o(a,b),p=o(a,d.id.UL,b),t.get(0)&&!p.get(0)&&(p=[],f.makeUlHtml(b,a,p,""),t.append(p.join(""))),p=o(a,d.id.UL,b));var q=o(c,b);q.get(0)?t.get(0)||q.remove():q=f.appendNodes(b,c.level,[c],null,!1,!0).join("");p.get(0)&&r==d.move.TYPE_INNER?p.append(q):t.get(0)&&r==d.move.TYPE_PREV?t.before(q):t.get(0)&&r==d.move.TYPE_NEXT&&t.after(q);var l=-1,w=0,x=null,t=null,D=c.level;if(c.isFirstNode){if(l=
+0,g[e].length>1)x=g[e][1],x.isFirstNode=!0}else if(c.isLastNode)l=g[e].length-1,x=g[e][l-1],x.isLastNode=!0;else for(p=0,q=g[e].length;p<q;p++)if(g[e][p].tId==c.tId){l=p;break}l>=0&&g[e].splice(l,1);if(r!=d.move.TYPE_INNER)for(p=0,q=j[e].length;p<q;p++)j[e][p].tId==a.tId&&(w=p);if(r==d.move.TYPE_INNER){a[e]||(a[e]=[]);if(a[e].length>0)t=a[e][a[e].length-1],t.isLastNode=!1;a[e].splice(a[e].length,0,c);c.isLastNode=!0;c.isFirstNode=a[e].length==1}else a.isFirstNode&&r==d.move.TYPE_PREV?(j[e].splice(w,
+0,c),t=a,t.isFirstNode=!1,c.parentTId=a.parentTId,c.isFirstNode=!0,c.isLastNode=!1):a.isLastNode&&r==d.move.TYPE_NEXT?(j[e].splice(w+1,0,c),t=a,t.isLastNode=!1,c.parentTId=a.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(r==d.move.TYPE_PREV?j[e].splice(w,0,c):j[e].splice(w+1,0,c),c.parentTId=a.parentTId,c.isFirstNode=!1,c.isLastNode=!1);m.fixPIdKeyValue(b,c);m.setSonNodeLevel(b,c.getParentNode(),c);f.setNodeLineIcos(b,c);f.repairNodeLevelClass(b,c,D);!b.data.keep.parent&&g[e].length<1?(g.isParent=!1,
+g.open=!1,a=o(g,d.id.UL,b),r=o(g,d.id.SWITCH,b),e=o(g,d.id.ICON,b),f.replaceSwitchClass(g,r,d.folder.DOCU),f.replaceIcoClass(g,e,d.folder.DOCU),a.css("display","none")):x&&f.setNodeLineIcos(b,x);t&&f.setNodeLineIcos(b,t);b.check&&b.check.enable&&f.repairChkClass&&(f.repairChkClass(b,g),f.repairParentChkClassWithSelf(b,g),g!=c.parent&&f.repairParentChkClassWithSelf(b,c));i||f.expandCollapseParentNode(b,c.getParentNode(),!0,k)}},removeEditBtn:function(b,a){o(a,d.id.EDIT,b).unbind().remove()},removeRemoveBtn:function(b,
+a){o(a,d.id.REMOVE,b).unbind().remove()},removeTreeDom:function(b,a){a.isHover=!1;f.removeEditBtn(b,a);f.removeRemoveBtn(b,a);g.apply(b.view.removeHoverDom,[b.treeId,a])},repairNodeLevelClass:function(b,a,c){if(c!==a.level){var f=o(a,b),g=o(a,d.id.A,b),b=o(a,d.id.UL,b),c=d.className.LEVEL+c,a=d.className.LEVEL+a.level;f.removeClass(c);f.addClass(a);g.removeClass(c);g.addClass(a);b.removeClass(c);b.addClass(a)}},selectNodes:function(b,a){for(var c=0,d=a.length;c<d;c++)f.selectNode(b,a[c],c>0)}},event:{},
+data:{setSonNodeLevel:function(b,a,c){if(c){var d=b.data.key.children;c.level=a?a.level+1:0;if(c[d])for(var a=0,f=c[d].length;a<f;a++)c[d][a]&&m.setSonNodeLevel(b,c,c[d][a])}}}});var H=w.fn.zTree,g=H._z.tools,d=H.consts,f=H._z.view,m=H._z.data,o=g.$;m.exSetting({edit:{enable:!1,editNameSelectAll:!1,showRemoveBtn:!0,showRenameBtn:!0,removeTitle:"remove",renameTitle:"rename",drag:{autoExpandTrigger:!1,isCopy:!0,isMove:!0,prev:!0,next:!0,inner:!0,minMoveSize:5,borderMax:10,borderMin:-5,maxShowNodeNum:5,
+autoOpenTime:500}},view:{addHoverDom:null,removeHoverDom:null},callback:{beforeDrag:null,beforeDragOpen:null,beforeDrop:null,beforeEditName:null,beforeRename:null,onDrag:null,onDragMove:null,onDrop:null,onRename:null}});m.addInitBind(function(b){var a=b.treeObj,c=d.event;a.bind(c.RENAME,function(a,c,d,f){g.apply(b.callback.onRename,[a,c,d,f])});a.bind(c.DRAG,function(a,c,d,f){g.apply(b.callback.onDrag,[c,d,f])});a.bind(c.DRAGMOVE,function(a,c,d,f){g.apply(b.callback.onDragMove,[c,d,f])});a.bind(c.DROP,
+function(a,c,d,f,e,m,o){g.apply(b.callback.onDrop,[c,d,f,e,m,o])})});m.addInitUnBind(function(b){var b=b.treeObj,a=d.event;b.unbind(a.RENAME);b.unbind(a.DRAG);b.unbind(a.DRAGMOVE);b.unbind(a.DROP)});m.addInitCache(function(){});m.addInitNode(function(b,a,c){if(c)c.isHover=!1,c.editNameFlag=!1});m.addInitProxy(function(b){var a=b.target,c=m.getSetting(b.data.treeId),f=b.relatedTarget,k="",i=null,j="",e=null,o=null;if(g.eqs(b.type,"mouseover")){if(o=g.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+d.id.A}]))k=
+g.getNodeMainDom(o).id,j="hoverOverNode"}else if(g.eqs(b.type,"mouseout"))o=g.getMDom(c,f,[{tagName:"a",attrName:"treeNode"+d.id.A}]),o||(k="remove",j="hoverOutNode");else if(g.eqs(b.type,"mousedown")&&(o=g.getMDom(c,a,[{tagName:"a",attrName:"treeNode"+d.id.A}])))k=g.getNodeMainDom(o).id,j="mousedownNode";if(k.length>0)switch(i=m.getNodeCache(c,k),j){case "mousedownNode":e=x.onMousedownNode;break;case "hoverOverNode":e=x.onHoverOverNode;break;case "hoverOutNode":e=x.onHoverOutNode}return{stop:!1,
+node:i,nodeEventType:j,nodeEventCallback:e,treeEventType:"",treeEventCallback:null}});m.addInitRoot(function(b){var b=m.getRoot(b),a=m.getRoots();b.curEditNode=null;b.curEditInput=null;b.curHoverNode=null;b.dragFlag=0;b.dragNodeShowBefore=[];b.dragMaskList=[];a.showHoverDom=!0});m.addZTreeTools(function(b,a){a.cancelEditName=function(a){m.getRoot(this.setting).curEditNode&&f.cancelCurEditNode(this.setting,a?a:null,!0)};a.copyNode=function(a,b,k,i){if(!b)return null;if(a&&!a.isParent&&this.setting.data.keep.leaf&&
+k===d.move.TYPE_INNER)return null;var j=this,e=g.clone(b);if(!a)a=null,k=d.move.TYPE_INNER;k==d.move.TYPE_INNER?(b=function(){f.addNodes(j.setting,a,[e],i)},g.canAsync(this.setting,a)?f.asyncNode(this.setting,a,i,b):b()):(f.addNodes(this.setting,a.parentNode,[e],i),f.moveNode(this.setting,a,e,k,!1,i));return e};a.editName=function(a){a&&a.tId&&a===m.getNodeCache(this.setting,a.tId)&&(a.parentTId&&f.expandCollapseParentNode(this.setting,a.getParentNode(),!0),f.editNode(this.setting,a))};a.moveNode=
+function(a,b,k,i){function j(){f.moveNode(e.setting,a,b,k,!1,i)}if(!b)return b;if(a&&!a.isParent&&this.setting.data.keep.leaf&&k===d.move.TYPE_INNER)return null;else if(a&&(b.parentTId==a.tId&&k==d.move.TYPE_INNER||o(b,this.setting).find("#"+a.tId).length>0))return null;else a||(a=null);var e=this;g.canAsync(this.setting,a)&&k===d.move.TYPE_INNER?f.asyncNode(this.setting,a,i,j):j();return b};a.setEditable=function(a){this.setting.edit.enable=a;return this.refresh()}});var N=f.cancelPreSelectedNode;
+f.cancelPreSelectedNode=function(b,a){for(var c=m.getRoot(b).curSelectedList,d=0,g=c.length;d<g;d++)if(!a||a===c[d])if(f.removeTreeDom(b,c[d]),a)break;N&&N.apply(f,arguments)};var O=f.createNodes;f.createNodes=function(b,a,c,d){O&&O.apply(f,arguments);c&&f.repairParentChkClassWithSelf&&f.repairParentChkClassWithSelf(b,d)};var V=f.makeNodeUrl;f.makeNodeUrl=function(b,a){return b.edit.enable?null:V.apply(f,arguments)};var L=f.removeNode;f.removeNode=function(b,a){var c=m.getRoot(b);if(c.curEditNode===
+a)c.curEditNode=null;L&&L.apply(f,arguments)};var P=f.selectNode;f.selectNode=function(b,a,c){var d=m.getRoot(b);if(m.isSelectedNode(b,a)&&d.curEditNode==a&&a.editNameFlag)return!1;P&&P.apply(f,arguments);f.addHoverDom(b,a);return!0};var Q=g.uCanDo;g.uCanDo=function(b,a){var c=m.getRoot(b);if(a&&(g.eqs(a.type,"mouseover")||g.eqs(a.type,"mouseout")||g.eqs(a.type,"mousedown")||g.eqs(a.type,"mouseup")))return!0;if(c.curEditNode)f.editNodeBlur=!1,c.curEditInput.focus();return!c.curEditNode&&(Q?Q.apply(f,
+arguments):!0)}})(jQuery);
+
diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html
index eedff07..95f2dee 100755
--- a/src/main/resources/templates/index.html
+++ b/src/main/resources/templates/index.html
@@ -1,472 +1,156 @@
 <!DOCTYPE html>
 <html xmlns:th="http://www.thymeleaf.org">
+
 <head>
-  <meta charset="utf-8">
-  <title>支付中心</title>
-  <meta name="renderer" content="webkit">
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
-  <link rel="stylesheet" type="text/css" th:href="@{/static/libs/layui/css/layui.css}" media="all"/>
-  <link rel="stylesheet" type="text/css"  th:href="@{/static/style/admin.css}" media="all"/>
+    <title>首页</title>
 
+    <meta charset="utf-8"/>
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+    <link rel="stylesheet" th:href="@{/static/libs/layui/css/layui.css}"/>
+    <link rel="stylesheet" th:href="@{/static/libs/zTree/css/zTreeStyle/zTreeStyle.css}"/>
+    <link rel="stylesheet" th:href="@{/static/custom/module/formSelects/formSelects-v4.css}"/>
+    <link rel="stylesheet" th:href="@{/static/custom/css/admin.css}"/>
+    <link th:if="${session.theme != null}" rel="stylesheet" th:href="@{/static/custom/css/theme-blue.css}"/>
 </head>
+
 <body class="layui-layout-body">
-  
-  <div id="LAY_app">
-    <div class="layui-layout layui-layout-admin">
-      <div class="layui-header">
-        <!-- 头部区域 -->
+<div class="layui-layout layui-layout-admin">
+    <!-- 头部 -->
+    <div class="layui-header">
+        <div class="layui-logo">
+            <img th:src="@{/static/custom/images/logo.png}"/>
+            <cite>支付中心</cite>
+        </div>
         <ul class="layui-nav layui-layout-left">
-          <li class="layui-nav-item layadmin-flexible" lay-unselect>
-            <a href="javascript:;" layadmin-event="flexible" title="侧边伸缩">
-              <i class="layui-icon layui-icon-shrink-right" id="LAY_app_flexible"></i>
-            </a>
-          </li>
-          <li class="layui-nav-item layui-hide-xs" lay-unselect>
-            <a href="http://www.layui.com/admin/" target="_blank" title="前台">
-              <i class="layui-icon layui-icon-website"></i>
-            </a>
-          </li>
-          <li class="layui-nav-item" lay-unselect>
-            <a href="javascript:;" layadmin-event="refresh" title="刷新">
-              <i class="layui-icon layui-icon-refresh-3"></i>
-            </a>
-          </li>
-          <li class="layui-nav-item layui-hide-xs" lay-unselect>
-            <input type="text" placeholder="搜索..." autocomplete="off" class="layui-input layui-input-search" layadmin-event="serach" lay-action="template/search.html?keywords="> 
-          </li>
-        </ul>
-        <ul class="layui-nav layui-layout-right" lay-filter="layadmin-layout-right">
-          
-          <li class="layui-nav-item" lay-unselect>
-            <a lay-href="app/message/index.html" layadmin-event="message" lay-text="消息中心">
-              <i class="layui-icon layui-icon-notice"></i>  
-              
-              <!-- 如果有新消息，则显示小圆点 -->
-              <span class="layui-badge-dot"></span>
-            </a>
-          </li>
-          <li class="layui-nav-item layui-hide-xs" lay-unselect>
-            <a href="javascript:;" layadmin-event="theme">
-              <i class="layui-icon layui-icon-theme"></i>
-            </a>
-          </li>
-          <li class="layui-nav-item layui-hide-xs" lay-unselect>
-            <a href="javascript:;" layadmin-event="note">
-              <i class="layui-icon layui-icon-note"></i>
-            </a>
-          </li>
-          <li class="layui-nav-item layui-hide-xs" lay-unselect>
-            <a href="javascript:;" layadmin-event="fullscreen">
-              <i class="layui-icon layui-icon-screen-full"></i>
-            </a>
-          </li>
-          <li class="layui-nav-item" lay-unselect>
-            <a href="javascript:;">
-              <cite>贤心</cite>
-            </a>
-            <dl class="layui-nav-child">
-              <dd><a lay-href="set/user/info.html">基本资料</a></dd>
-              <dd><a lay-href="set/user/password.html">修改密码</a></dd>
-              <hr>
-              <dd layadmin-event="logout" style="text-align: center;"><a>退出</a></dd>
-            </dl>
-          </li>
-          
-          <li class="layui-nav-item layui-hide-xs" lay-unselect>
-            <a href="javascript:;" layadmin-event="about"><i class="layui-icon layui-icon-more-vertical"></i></a>
-          </li>
-          <li class="layui-nav-item layui-show-xs-inline-block layui-hide-sm" lay-unselect>
-            <a href="javascript:;" layadmin-event="more"><i class="layui-icon layui-icon-more-vertical"></i></a>
-          </li>
-        </ul>
-      </div>
-      
-      <!-- 侧边菜单 -->
-      <div class="layui-side layui-side-menu">
-        <div class="layui-side-scroll">
-          <div class="layui-logo" lay-href="home/console.html">
-            <span>layuiAdmin</span>
-          </div>
-          
-          <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-menu" lay-filter="layadmin-system-side-menu">
-            <li data-name="home" class="layui-nav-item layui-nav-itemed">
-              <a href="javascript:;" lay-tips="主页" lay-direction="2">
-                <i class="layui-icon layui-icon-home"></i>
-                <cite>主页</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd data-name="console" class="layui-this">
-                  <a lay-href="home/console.html">控制台</a>
-                </dd>
-                <dd data-name="console">
-                  <a lay-href="home/homepage1.html">主页一</a>
-                </dd>
-                <dd data-name="console">
-                  <a lay-href="home/homepage2.html">主页二</a>
-                </dd>
-              </dl>
-            </li>
-            <li data-name="component" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="组件" lay-direction="2">
-                <i class="layui-icon layui-icon-component"></i>
-                <cite>组件</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd data-name="grid">
-                  <a href="javascript:;">栅格</a>
-                  <dl class="layui-nav-child">
-                    <dd data-name="list"><a lay-href="component/grid/list.html">等比例列表排列</a></dd>
-                    <dd data-name="mobile"><a lay-href="component/grid/mobile.html">按移动端排列</a></dd>
-                    <dd data-name="mobile-pc"><a lay-href="component/grid/mobile-pc.html">移动桌面端组合</a></dd>
-                    <dd data-name="all"><a lay-href="component/grid/all.html">全端复杂组合</a></dd>
-                    <dd data-name="stack"><a lay-href="component/grid/stack.html">低于桌面堆叠排列</a></dd>
-                    <dd data-name="speed-dial"><a lay-href="component/grid/speed-dial.html">九宫格</a></dd>
-                  </dl>
-                </dd>
-                <dd data-name="button">
-                  <a lay-href="component/button/index.html">按钮</a>
-                </dd>
-                <dd data-name="form">
-                  <a href="javascript:;">表单</a>
-                  <dl class="layui-nav-child">
-                    <dd><a lay-href="component/form/element.html">表单元素</a></dd>
-                    <dd><a lay-href="component/form/group.html">表单组合</a></dd>
-                  </dl>
-                </dd>
-                <dd data-name="nav">
-                  <a lay-href="component/nav/index.html">导航</a>
-                </dd>
-                <dd data-name="tabs">
-                  <a lay-href="component/tabs/index.html">选项卡</a>
-                </dd>
-                <dd data-name="progress">
-                  <a lay-href="component/progress/index.html">进度条</a>
-                </dd>
-                <dd data-name="panel"> 
-                  <a lay-href="component/panel/index.html">面板</a>  
-                </dd>
-                <dd data-name="badge"> 
-                  <a lay-href="component/badge/index.html">徽章</a>  
-                </dd>
-                <dd data-name="timeline"> 
-                  <a lay-href="component/timeline/index.html">时间线</a>  
-                </dd>
-                <dd data-name="anim"> 
-                  <a lay-href="component/anim/index.html">动画</a>  
-                </dd>
-                <dd data-name="auxiliar"> 
-                  <a lay-href="component/auxiliar/index.html">辅助</a>  
-                </dd>
-                <dd data-name="layer"> 
-                  <a href="javascript:;">通用弹层<span class="layui-nav-more"></span></a>  
-                  <dl class="layui-nav-child">  
-                    <dd data-name="list"> 
-                      <a lay-href="component/layer/list.html" lay-text="layer 功能演示">功能演示</a> 
-                    </dd>  
-                    <dd data-name="special-demo"> 
-                      <a lay-href="component/layer/special-demo.html" lay-text="layer 特殊示例">特殊示例</a> 
-                    </dd>  
-                    <dd data-name="theme"> 
-                      <a lay-href="component/layer/theme.html" lay-text="layer 风格定制">风格定制</a> 
-                    </dd>  
-                  </dl>  
-                </dd>
-                <dd data-name="laydate"> 
-                  <a href="javascript:;">日期时间</a>
-                  <dl class="layui-nav-child">  
-                    <dd data-name="demo1"> 
-                      <a lay-href="component/laydate/demo1.html" lay-text="layDate 功能演示一">功能演示一</a> 
-                    </dd>
-                    <dd data-name="demo2"> 
-                      <a lay-href="component/laydate/demo2.html" lay-text="layDate 功能演示二">功能演示二</a> 
-                    </dd>
-                    <dd data-name="theme"> 
-                      <a lay-href="component/laydate/theme.html" lay-text="layDate 设定主题">设定主题</a> 
-                    </dd>
-                    <dd data-name="special-demo"> 
-                      <a lay-href="component/laydate/special-demo.html" lay-text="layDate 特殊示例">特殊示例</a> 
-                    </dd>  
-                  </dl>  
-                </dd>
-                <dd data-name="table-static"> 
-                  <a lay-href="component/table/static.html">静态表格</a>
-                </dd>
-                <dd data-name="table"> 
-                  <a href="javascript:;">数据表格</a>
-                  <dl class="layui-nav-child">  
-                    <dd data-name="simple"> 
-                      <a lay-href="component/table/simple.html" lay-text="">简单数据表格</a> 
-                    </dd>
-                    <dd data-name="auto"> 
-                      <a lay-href="component/table/auto.html" lay-text="">列宽自动分配</a> 
-                    </dd>
-                    <dd data-name="data"> 
-                      <a lay-href="component/table/data.html" lay-text="">赋值已知数据</a> 
-                    </dd>
-                    <dd data-name="tostatic"> 
-                      <a lay-href="component/table/tostatic.html" lay-text="">转化静态表格</a> 
-                    </dd>
-                    <dd data-name="page"> 
-                      <a lay-href="component/table/page.html" lay-text="">开启分页</a> 
-                    </dd>
-                    <dd data-name="resetPage"> 
-                      <a lay-href="component/table/resetPage.html" lay-text="">自定义分页</a> 
-                    </dd>
-                    <dd data-name="toolbar"> 
-                      <a lay-href="component/table/toolbar.html" lay-text="">开启头部工具栏</a> 
-                    </dd>
-                    <dd data-name="totalRow"> 
-                      <a lay-href="component/table/totalRow.html" lay-text="">开启合计行</a> 
-                    </dd>
-                    <dd data-name="height"> 
-                      <a lay-href="component/table/height.html" lay-text="">高度最大适应</a> 
-                    </dd>
-                    <dd data-name="checkbox"> 
-                      <a lay-href="component/table/checkbox.html" lay-text="">开启复选框</a> 
-                    </dd>
-                    <dd data-name="radio"> 
-                      <a lay-href="component/table/radio.html" lay-text="">开启单选框</a> 
-                    </dd>
-                    <dd data-name="cellEdit"> 
-                      <a lay-href="component/table/cellEdit.html" lay-text="">开启单元格编辑</a> 
-                    </dd>
-                    <dd data-name="form"> 
-                      <a lay-href="component/table/form.html" lay-text="">加入表单元素</a> 
-                    </dd>
-                    <dd data-name="style"> 
-                      <a lay-href="component/table/style.html" lay-text="">设置单元格样式</a> 
-                    </dd>
-                    <dd data-name="fixed"> 
-                      <a lay-href="component/table/fixed.html" lay-text="">固定列</a> 
-                    </dd>
-                    <dd data-name="operate"> 
-                      <a lay-href="component/table/operate.html" lay-text="">数据操作</a> 
-                    </dd>
-                    <dd data-name="parseData"> 
-                      <a lay-href="component/table/parseData.html" lay-text="">解析任意数据格式</a> 
-                    </dd>
-                    <dd data-name="onrow"> 
-                      <a lay-href="component/table/onrow.html" lay-text="">监听行事件</a> 
-                    </dd>
-                    <dd data-name="reload">
-                      <a lay-href="component/table/reload.html" lay-text="">数据表格的重载</a> 
-                    </dd>
-                    <dd data-name="initSort"> 
-                      <a lay-href="component/table/initSort.html" lay-text="">设置初始排序</a> 
-                    </dd>
-                    <dd data-name="cellEvent"> 
-                      <a lay-href="component/table/cellEvent.html" lay-text="">监听单元格事件</a> 
-                    </dd>
-                    <dd data-name="thead"> 
-                      <a lay-href="component/table/thead.html" lay-text="">复杂表头</a> 
-                    </dd>
-                  </dl>
-                </dd>
-                <dd data-name="laypage"> 
-                  <a href="javascript:;">分页</a>  
-                  <dl class="layui-nav-child">  
-                    <dd data-name="demo1"> 
-                      <a lay-href="component/laypage/demo1.html" lay-text="layPage 功能演示一">功能演示一</a> 
-                    </dd>
-                    <dd data-name="demo2"> 
-                      <a lay-href="component/laypage/demo2.html" lay-text="layPage 功能演示二">功能演示二</a> 
-                    </dd> 
-                  </dl>  
-                </dd>
-                <dd data-name="upload"> 
-                  <a href="javascript:;">上传</a>  
-                  <dl class="layui-nav-child">  
-                    <dd data-name="demo1"> 
-                      <a lay-href="component/upload/demo1.html" lay-text="上传功能演示一">功能演示一</a> 
-                    </dd>
-                    <dd data-name="demo2"> 
-                      <a lay-href="component/upload/demo2.html" lay-text="上传功能演示二">功能演示二</a> 
-                    </dd> 
-                  </dl>  
-                </dd>
-                <dd data-name="colorpicker">
-                  <a lay-href="component/colorpicker/index.html">颜色选择器</a>
-                </dd>
-                <dd data-name="slider">
-                  <a lay-href="component/slider/index.html">滑块组件</a>
-                </dd>
-                <dd data-name="rate">
-                  <a lay-href="component/rate/index.html">评分</a>
-                </dd>
-                <dd data-name="carousel"> 
-                  <a lay-href="component/carousel/index.html">轮播</a>  
-                </dd>
-                <dd data-name="flow"> 
-                  <a lay-href="component/flow/index.html">流加载</a>  
-                </dd>
-                <dd data-name="util"> 
-                  <a lay-href="component/util/index.html">工具</a>  
-                </dd>
-                <dd data-name="code"> 
-                  <a lay-href="component/code/index.html">代码修饰</a> 
-                </dd>
-              </dl>
-            </li>
-            <li data-name="template" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="页面" lay-direction="2">
-                <i class="layui-icon layui-icon-template"></i>
-                <cite>页面</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd><a lay-href="template/personalpage.html">个人主页</a></dd>
-                <dd><a lay-href="template/addresslist.html">通讯录</a></dd>
-                <dd><a lay-href="template/caller.html">客户列表</a></dd>
-                <dd><a lay-href="template/goodslist.html">商品列表</a></dd>
-                <dd><a lay-href="template/msgboard.html">留言板</a></dd>
-                <dd><a lay-href="template/search.html">搜索结果</a></dd>
-                <dd><a href="user/reg.html" target="_blank">注册</a></dd>
-                <dd><a href="user/login.html" target="_blank">登入</a></dd>
-                <dd><a href="user/forget.html" target="_blank">忘记密码</a></dd>
-                <dd><a lay-href="template/tips/404.html">404页面不存在</a></dd>
-                <dd><a lay-href="template/tips/error.html">错误提示</a></dd>
-                <dd><a lay-href="//www.baidu.com/">百度一下</a></dd>
-                <dd><a lay-href="//www.layui.com/">layui官网</a></dd>
-                <dd><a lay-href="//www.layui.com/admin/">layuiAdmin官网</a></dd>
-              </dl>
-            </li>
-            <li data-name="app" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="应用" lay-direction="2">
-                <i class="layui-icon layui-icon-app"></i>
-                <cite>应用</cite>
-              </a>
-              <dl class="layui-nav-child">
-                
-                <dd data-name="content">
-                  <a href="javascript:;">内容系统</a>
-                  <dl class="layui-nav-child">
-                    <dd data-name="list"><a lay-href="app/content/list.html">文章列表</a></dd>
-                    <dd data-name="tags"><a lay-href="app/content/tags.html">分类管理</a></dd>
-                    <dd data-name="comment"><a lay-href="app/content/comment.html">评论管理</a></dd>
-                  </dl>
-                </dd>
-                <dd data-name="forum">
-                  <a href="javascript:;">社区系统</a>
-                  <dl class="layui-nav-child">
-                    <dd data-name="list"><a lay-href="app/forum/list.html">帖子列表</a></dd>
-                    <dd data-name="replys"><a lay-href="app/forum/replys.html">回帖列表</a></dd>
-                  </dl>
-                </dd>
-                <dd>
-                  <a lay-href="app/message/index.html">消息中心</a>
-                </dd>
-                <dd data-name="workorder">
-                  <a lay-href="app/workorder/list.html">工单系统</a>
-                </dd>
-              </dl>
-            </li>
-            <li data-name="senior" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="高级" lay-direction="2">
-                <i class="layui-icon layui-icon-senior"></i>
-                <cite>高级</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd>
-                  <a layadmin-event="im">LayIM 通讯系统</a>  
-                </dd>
-                <dd data-name="echarts">
-                  <a href="javascript:;">Echarts集成</a>
-                  <dl class="layui-nav-child">
-                    <dd><a lay-href="senior/echarts/line.html">折线图</a></dd>
-                    <dd><a lay-href="senior/echarts/bar.html">柱状图</a></dd>
-                    <dd><a lay-href="senior/echarts/map.html">地图</a></dd>
-                  </dl>
-                </dd>
-              </dl>
-            </li>
-            <li data-name="user" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="用户" lay-direction="2">
-                <i class="layui-icon layui-icon-user"></i>
-                <cite>用户</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd>
-                  <a lay-href="user/user/list.html">网站用户</a>
-                </dd>
-                <dd>
-                  <a lay-href="user/administrators/list.html">后台管理员</a>
-                </dd>
-                <dd>
-                  <a lay-href="user/administrators/role.html">角色管理</a>
-                </dd>
-              </dl>
-            </li>
-            <li data-name="set" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="设置" lay-direction="2">
-                <i class="layui-icon layui-icon-set"></i>
-                <cite>设置</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd class="layui-nav-itemed">
-                  <a href="javascript:;">系统设置</a>
-                  <dl class="layui-nav-child">
-                    <dd><a lay-href="set/system/website.html">网站设置</a></dd>
-                    <dd><a lay-href="set/system/email.html">邮件服务</a></dd>
-                  </dl>
-                </dd>
-                <dd class="layui-nav-itemed">
-                  <a href="javascript:;">我的设置</a>
-                  <dl class="layui-nav-child">
-                    <dd><a lay-href="set/user/info.html">基本资料</a></dd>
-                    <dd><a lay-href="set/user/password.html">修改密码</a></dd>
-                  </dl>
-                </dd>
-              </dl>
-            </li>
-            <li data-name="get" class="layui-nav-item">
-              <a href="javascript:;" lay-href="//www.layui.com/admin/#get" lay-tips="授权" lay-direction="2">
-                <i class="layui-icon layui-icon-auz"></i>
-                <cite>授权</cite>
-              </a>
-            </li>
-          </ul>
-        </div>
-      </div>
-
-      <!-- 页面标签 -->
-      <div class="layadmin-pagetabs" id="LAY_app_tabs">
-        <div class="layui-icon layadmin-tabs-control layui-icon-prev" layadmin-event="leftPage"></div>
-        <div class="layui-icon layadmin-tabs-control layui-icon-next" layadmin-event="rightPage"></div>
-        <div class="layui-icon layadmin-tabs-control layui-icon-down">
-          <ul class="layui-nav layadmin-tabs-select" lay-filter="layadmin-pagetabs-nav">
             <li class="layui-nav-item" lay-unselect>
-              <a href="javascript:;"></a>
-              <dl class="layui-nav-child layui-anim-fadein">
-                <dd layadmin-event="closeThisTabs"><a href="javascript:;">关闭当前标签页</a></dd>
-                <dd layadmin-event="closeOtherTabs"><a href="javascript:;">关闭其它标签页</a></dd>
-                <dd layadmin-event="closeAllTabs"><a href="javascript:;">关闭全部标签页</a></dd>
-              </dl>
+                <a ew-event="flexible" title="侧边伸缩"><i class="layui-icon layui-icon-shrink-right"></i></a>
             </li>
-          </ul>
-        </div>
-        <div class="layui-tab" lay-unauto lay-allowClose="true" lay-filter="layadmin-layout-tabs">
-          <ul class="layui-tab-title" id="LAY_app_tabsheader">
-            <li lay-id="home/console.html" lay-attr="home/console.html" class="layui-this"><i class="layui-icon layui-icon-home"></i></li>
-          </ul>
-        </div>
-      </div>
-      
-      
-      <!-- 主体内容 -->
-      <div class="layui-body" id="LAY_app_body">
-        <div class="layadmin-tabsbody-item layui-show">
-          <iframe src="home/console.html" frameborder="0" class="layadmin-iframe"></iframe>
-        </div>
-      </div>
-      
-      <!-- 辅助元素，一般用于移动设备下遮罩 -->
-      <div class="layadmin-body-shade" layadmin-event="shade"></div>
+            <li class="layui-nav-item" lay-unselect>
+                <a ew-event="refresh" title="刷新"><i class="layui-icon layui-icon-refresh-3"></i></a>
+            </li>
+        </ul>
+        <ul class="layui-nav layui-layout-right">
+            <li class="layui-nav-item" lay-unselect>
+                <a id="btnMessage" title="消息"><i class="layui-icon layui-icon-notice"></i></a>
+            </li>
+            <li class="layui-nav-item layui-hide-xs" lay-unselect>
+                <a ew-event="fullScreen" title="全屏"><i class="layui-icon layui-icon-screen-full"></i></a>
+            </li>
+            <li class="layui-nav-item" lay-unselect>
+                <a>
+                    <img th:src="@{/static/custom/images/head.png}" class="layui-nav-img">
+                    <cite>[[${loginOper.opername}]]</cite>
+                </a>
+                <dl class="layui-nav-child">
+                    <dd lay-unselect>
+                        <a id="setInfo">个人信息</a>
+                    </dd>
+                    <dd lay-unselect>
+                        <a id="setPsw">修改密码</a>
+                    </dd>
+                    <hr>
+                    <dd lay-unselect>
+                        <a id="btnLogout">退出</a>
+                    </dd>
+                </dl>
+            </li>
+            <li class="layui-nav-item" lay-unselect>
+                <a ew-event="theme" title="主题"><i class="layui-icon layui-icon-more-vertical"></i></a>
+            </li>
+        </ul>
     </div>
-  </div>
 
-  <script type="text/javascript"  th:src="@{/static/libs/layui/layui.js}" ></script>
+    <!-- 侧边栏 -->
+    <div class="layui-side">
+        <div class="layui-side-scroll">
+            <ul class="layui-nav layui-nav-tree" style="margin-top: 15px;">
+                <li class="layui-nav-item" th:each="menu : ${menus}">
+                    <a th:lay-href="${menu.menuUrl}"><i th:class="'layui-icon '+${menu.menuIcon}"></i>&emsp;<cite>[[${menu.menuName}]]</cite></a>
+                    <dl class="layui-nav-child" th:if="${menu.subMenus.size()} > 0">
+                        <dd th:each="subMenu : ${menu.subMenus}">
+                            <a th:lay-href="${subMenu.menuUrl}">[[${subMenu.menuName}]]</a>
+                            <dl class="layui-nav-child" th:if="${subMenu.subMenus.size()} > 0">
+                                <dd th:each="temp : ${subMenu.subMenus}"><a th:lay-href="${temp.menuUrl}">[[${temp.menuName}]]</a>
+                                </dd>
+                            </dl>
+                        </dd>
+                    </dl>
+                </li>
 
+                <!--<li class="layui-nav-item">-->
+                    <!--<a href="javascript:;"><i class="layui-icon layui-icon-unlink"></i>&emsp;<cite>多级菜单</cite></a>-->
+                    <!--<dl class="layui-nav-child">-->
+                        <!--<dd>-->
+                            <!--<a href="javascript:;">二级菜单</a>-->
+                            <!--<dl class="layui-nav-child">-->
+                                <!--<dd><a href="javascript:;">三级菜单</a></dd>-->
+                                <!--<dd><a href="javascript:;">三级菜单</a></dd>-->
+                            <!--</dl>-->
+                        <!--</dd>-->
+                    <!--</dl>-->
+                <!--</li>-->
+            </ul>
+        </div>
+    </div>
+
+
+    <!-- 主体部分 -->
+    <div class="layui-body">
+        <div class="layui-tab" lay-allowClose="true" lay-filter="admin-pagetabs">
+            <ul class="layui-tab-title">
+            </ul>
+            <div class="layui-tab-content">
+            </div>
+        </div>
+        <div class="layui-icon admin-tabs-control layui-icon-prev" ew-event="leftPage"></div>
+        <div class="layui-icon admin-tabs-control layui-icon-next" ew-event="rightPage"></div>
+        <div class="layui-icon admin-tabs-control layui-icon-down">
+            <ul class="layui-nav admin-tabs-select" lay-filter="admin-pagetabs-nav">
+                <li class="layui-nav-item" lay-unselect>
+                    <a href="javascript:;"></a>
+                    <dl class="layui-nav-child layui-anim-fadein">
+                        <dd ew-event="closeThisTabs" lay-unselect><a href="javascript:;">关闭当前标签页</a></dd>
+                        <dd ew-event="closeOtherTabs" lay-unselect><a href="javascript:;">关闭其它标签页</a></dd>
+                        <dd ew-event="closeAllTabs" lay-unselect><a href="javascript:;">关闭全部标签页</a></dd>
+                    </dl>
+                </li>
+            </ul>
+        </div>
+    </div>
+
+    <!-- 底部 -->
+    <div class="layui-footer">Copyright © 2018 supwisdom All rights reserved. <span class="pull-right" th:text="${payapiVersion}">Version 1.0</span>
+    </div>
+
+    <!-- 手机屏幕遮罩层 -->
+    <div class="site-mobile-shade"></div>
+</div>
+
+<script type="text/javascript" th:src="@{/static/libs/jquery/jquery-3.2.1.min.js}"></script>
+<script type="text/javascript" th:src="@{/static/libs/q.js}"></script>
+<script type="text/javascript" th:src="@{/static/libs/layui/layui.js}"></script>
+<script type="text/javascript" th:src="@{/static/libs/zTree/js/jquery.ztree.all-3.5.min.js}"></script>
+<script>
+    layui.config({
+        base: 'static/custom/module/'
+    }).extend({
+        formSelects: 'formSelects/formSelects-v4',
+        treetable: 'treetable-lay/treetable'
+    }).use(['admin'], function () {
+        var admin = layui.admin;
+    });
+</script>
+
+
+<script>
+    layui.use(['index'], function () {
+        var index = layui.index;
+        index.checkPageTabs(true);  // 检查多标签是否开启
+        index.initRouter();  // 导航栏和tab联动
+        index.bindEvent();  // 绑定事件
+    });
+</script>
 </body>
-</html>
 
-
+</html>
\ No newline at end of file
diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html
index 919d862..81e8471 100644
--- a/src/main/resources/templates/login.html
+++ b/src/main/resources/templates/login.html
@@ -8,13 +8,13 @@
     <!-- default header name is X-CSRF-TOKEN -->
     <meta name="_csrf_header" th:content="${_csrf.headerName}" />
     <link rel="stylesheet" type="text/css"  th:href="@{/static/libs/layui/css/layui.css}"   />
-    <link rel="stylesheet" type="text/css"  th:href="@{/static/payapi/css/login.css}"  />
+    <link rel="stylesheet" type="text/css"  th:href="@{/static/custom/css/login.css}"  />
 </head>
 <body>
 <div class="login-wrapper">
 
     <div class="login-header">
-        <img th:src="@{/static/payapi/images/logo.png}"> logo
+        <img th:src="@{/static/custom/images/logo.png}"> logo
     </div>
 
     <div class=" login-body">
@@ -84,7 +84,7 @@
 <script type="text/javascript"  th:src="@{/static/libs/layui/layui.js}" ></script>
 <script>
     layui.config({
-        base: 'payapi/module/'
+        base: 'custom/module/'
     }).use(['form'], function () {
         var $ = layui.jquery;
         var form = layui.form;
