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;
