diff --git a/common/src/main/resources/static/jquery-plugins/jquery.layout-latest.css b/common/src/main/resources/static/jquery-plugins/jquery.layout-latest.css
new file mode 100644
index 00000000..9de8a27a
--- /dev/null
+++ b/common/src/main/resources/static/jquery-plugins/jquery.layout-latest.css
@@ -0,0 +1,249 @@
+/*
+ * Default Layout Theme
+ * Created for jquery.layout
+ * Copyright (c) 2010
+ * Fabrizio Balliano (http://www.fabrizioballiano.net)
+ * Kevin Dalman (http://allpro.net)
+ * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
+ * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
+ * Last Updated: 2010-02-10、2022-09-27 jeesite
+ * NOTE: For best code readability, view this with a fixed-space font and tabs equal to 4-chars
+ */
+.ui-draggable-handle{-ms-touch-action:none;touch-action:none}
+
+/*
+ * DEFAULT FONT
+ * Just to make demo-pages look better - not actually relevant to Layout!
+ */
+/* body { */
+/* font-family: Geneva, Arial, Helvetica, sans-serif; */
+/* font-size: 100%; */
+/* *font-size: 80%; */
+/* } */
+
+/*
+ * PANES & CONTENT-DIVs
+ */
+.ui-layout-pane { /* all 'panes' */
+/* background: #fff; */
+/* border: 1px solid #eee; */
+/* padding: 10px; */
+ overflow: auto;
+ /* DO NOT add scrolling (or padding) to 'panes' that have a content-div,
+ otherwise you may get double-scrollbars - on the pane AND on the content-div
+ - use ui-layout-wrapper class if pane has a content-div
+ - use ui-layout-container if pane has an inner-layout
+ */
+ }
+ /* (scrolling) content-div inside pane allows for fixed header(s) and/or footer(s) */
+ .ui-layout-content {
+ padding: 10px;
+ position: relative; /* contain floated or positioned elements */
+ overflow: auto; /* add scrolling to content-div */
+ width: 100%;
+ border: 0;
+ }
+
+/*
+ * UTILITY CLASSES
+ * Must come AFTER pane-class above so will override
+ * These classes are NOT auto-generated and are NOT used by Layout
+ */
+.layout-child-container,
+.layout-content-container {
+ padding: 0;
+ overflow: hidden;
+}
+.layout-child-container {
+ border: 0; /* remove border because inner-layout-panes probably have borders */
+}
+.layout-scroll {
+ overflow: auto;
+}
+.layout-hide {
+ display: none;
+}
+
+/*
+ * RESIZER-BARS
+ */
+.ui-layout-resizer { /* all 'resizer-bars' */
+ background: #fafafa;
+ border: 1px solid #eee;
+ border-width: 0;
+ }
+ .ui-layout-resizer-drag { /* REAL resizer while resize in progress */
+ }
+ .ui-layout-resizer-hover { /* affects both open and closed states */
+ }
+ /* NOTE: It looks best when 'hover' and 'dragging' are set to the same color,
+ otherwise color shifts while dragging when bar can't keep up with mouse */
+ .ui-layout-resizer-open-hover , /* hover-color to 'resize' */
+ .ui-layout-resizer-dragging { /* resizer beging 'dragging' */
+ background: #fafafa;
+ }
+ .ui-layout-resizer-dragging { /* CLONED resizer being dragged */
+ border: 1px solid #eee;
+ }
+ .ui-layout-resizer-north-dragging,
+ .ui-layout-resizer-south-dragging {
+ border-width: 1px 0;
+ }
+ .ui-layout-resizer-west-dragging,
+ .ui-layout-resizer-east-dragging {
+ border-width: 0 1px;
+ }
+ /* NOTE: Add a 'dragging-limit' color to provide visual feedback when resizer hits min/max size limits */
+ .ui-layout-resizer-dragging-limit { /* CLONED resizer at min or max size-limit */
+ background: #E1A4A4; /* red */
+ }
+
+ .ui-layout-resizer-closed-hover { /* hover-color to 'slide open' */
+ background: #EBD5AA;
+ }
+ .ui-layout-resizer-sliding { /* resizer when pane is 'slid open' */
+/* opacity: .10; show only a slight shadow */
+/* filter: alpha(opacity=10); */
+ }
+ .ui-layout-resizer-sliding-hover { /* sliding resizer - hover */
+/* opacity: 1.00; on-hover, show the resizer-bar normally */
+/* filter: alpha(opacity=100); */
+ }
+ /* sliding resizer - add 'outside-border' to resizer on-hover
+ * this sample illustrates how to target specific panes and states */
+ .ui-layout-resizer-north-sliding-hover { border-bottom-width: 1px; }
+ .ui-layout-resizer-south-sliding-hover { border-top-width: 1px; }
+ .ui-layout-resizer-west-sliding-hover { border-right-width: 1px; }
+ .ui-layout-resizer-east-sliding-hover { border-left-width: 1px; }
+
+/*
+ * TOGGLER-BUTTONS
+ */
+.ui-layout-toggler {
+ /* border: 1px solid #eee;
+ background-color: #eee; */
+ border-radius: 8px;
+ }
+ .ui-layout-resizer-hover .ui-layout-toggler {
+ opacity: 1.00;
+ filter: alpha(opacity=100);
+ }
+ .ui-layout-toggler-hover , /* need when NOT resizable */
+ .ui-layout-resizer-hover .ui-layout-toggler-hover { /* need specificity when IS resizable */
+ background-color: #dfdfdf;
+ opacity: 1.00;
+ filter: alpha(opacity=100);
+ }
+ .skin-dark .ui-layout-toggler-hover ,
+ .skin-dark .ui-layout-resizer-hover .ui-layout-toggler-hover {
+ background-color: #2e2e2e;
+ }
+ .ui-layout-toggler-north ,
+ .ui-layout-toggler-south {
+ border-width: 0 1px; /* left/right borders */
+ }
+ .ui-layout-toggler-west ,
+ .ui-layout-toggler-east {
+ border-width: 1px 0; /* top/bottom borders */
+ }
+ /* hide the toggler-button when the pane is 'slid open' */
+ .ui-layout-resizer-sliding .ui-layout-toggler {
+ display: none;
+ }
+ /*
+ * style the text we put INSIDE the togglers
+ */
+ .ui-layout-toggler .ui-content {
+ color: #666;
+ font-size: 12px;
+ font-weight: bold;
+ line-height: 8px;
+ width: 100%;
+ padding-bottom: 0.35ex; /* to 'vertically center' text inside text-span */
+ }
+ .ui-layout-toggler .ui-content .fa{
+ line-height: 8px;
+ }
+
+ .ui-layout-toggler-north-closed .fa:before,
+ .ui-layout-toggler-south-open .fa:before {
+ content: "\f0d7";/* 下 */
+ }
+ .ui-layout-toggler-south-closed .fa:before,
+ .ui-layout-toggler-north-open .fa:before {
+ content: "\f0d8";/* 上 */
+ }
+ .ui-layout-toggler-west-closed .fa:before,
+ .ui-layout-toggler-east-open .fa:before {
+ content: "\f0da";/* 右 */
+ }
+ .ui-layout-toggler-east-closed .fa:before,
+ .ui-layout-toggler-west-open .fa:before {
+ content: "\f0d9";/* 左 */
+ }
+
+/*
+ * PANE-MASKS
+ * these styles are hard-coded on mask elems, but are also
+ * included here as !important to ensure will overrides any generic styles
+ */
+.ui-layout-mask {
+ border: none !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ overflow: hidden !important;
+ position: absolute !important;
+ opacity: 0 !important;
+ filter: Alpha(Opacity="0") !important;
+}
+.ui-layout-mask-inside-pane { /* masks always inside pane EXCEPT when pane is an iframe */
+ top: 0 !important;
+ left: 0 !important;
+ width: 100% !important;
+ height: 100% !important;
+}
+div.ui-layout-mask {} /* standard mask for iframes */
+iframe.ui-layout-mask {} /* extra mask for objects/applets */
+
+/*
+ * Default printing styles
+ */
+@media print {
+ /*
+ * Unless you want to print the layout as it appears onscreen,
+ * these html/body styles are needed to allow the content to 'flow'
+ */
+ html {
+ height: auto !important;
+ overflow: visible !important;
+ }
+ body.ui-layout-container {
+ position: static !important;
+ top: auto !important;
+ bottom: auto !important;
+ left: auto !important;
+ right: auto !important;
+ /* only IE6 has container width & height set by Layout */
+ _width: auto !important;
+ _height: auto !important;
+ }
+ .ui-layout-resizer, .ui-layout-toggler {
+ display: none !important;
+ }
+ /*
+ * Default pane print styles disables positioning, borders and backgrounds.
+ * You can modify these styles however it suit your needs.
+ */
+ .ui-layout-pane {
+ border: none !important;
+ background: transparent !important;
+ position: relative !important;
+ top: auto !important;
+ bottom: auto !important;
+ left: auto !important;
+ right: auto !important;
+ width: auto !important;
+ height: auto !important;
+ overflow: visible !important;
+ }
+}
\ No newline at end of file
diff --git a/common/src/main/resources/static/jquery-plugins/jquery.layout-latest.js b/common/src/main/resources/static/jquery-plugins/jquery.layout-latest.js
new file mode 100644
index 00000000..4e031bcb
--- /dev/null
+++ b/common/src/main/resources/static/jquery-plugins/jquery.layout-latest.js
@@ -0,0 +1,6096 @@
+/**
+ * jquery.layout 1.4.4 $Date: 2014-11-29 08:00:00 (Sat, 29 November 2014) $ $Rev: 1.0404 $
+ * Copyright (c) 2014 Kevin Dalman (http://jquery-dev.com)
+ * Based on work by Fabrizio Balliano (http://www.fabrizioballiano.net)
+ * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
+ * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
+ * SEE: http://layout.jquery-dev.com/LICENSE.txt
+ * Optimize the modification: ThinkGem by JeeSite.com
+ */
+//
东
南
+//西
北
+//中
+//
+
+// NOTE: For best readability, view with a fixed-width font and tabs equal to 4-chars
+
+;(function ($) {
+
+// alias Math methods - used a lot!
+var min = Math.min
+, max = Math.max
+, round = Math.floor
+
+, isStr = function (v) { return $.type(v) === "string"; }
+
+ /**
+ * @param {!Object} Instance
+ * @param {Array.} a_fn
+ */
+, runPluginCallbacks = function (Instance, a_fn) {
+ if ($.isArray(a_fn))
+ for (var i=0, c=a_fn.length; i').appendTo("body")
+ , d = { width: $c.outerWidth - $c[0].clientWidth, height: 100 - $c[0].clientHeight };
+ $c.remove();
+ window.scrollbarWidth = d.width;
+ window.scrollbarHeight = d.height;
+ return dim.match(/^(width|height)$/) ? d[dim] : d;
+ }
+
+
+, disableTextSelection: function () {
+ var $d = $(document)
+ , s = 'textSelectionDisabled'
+ , x = 'textSelectionInitialized'
+ ;
+ if ($.fn.disableSelection) {
+ if (!$d.data(x)) // document hasn't been initialized yet
+ $d.on('mouseup', $.layout.enableTextSelection ).data(x, true);
+ if (!$d.data(s))
+ $d.disableSelection().data(s, true);
+ }
+ }
+, enableTextSelection: function () {
+ var $d = $(document)
+ , s = 'textSelectionDisabled';
+ if ($.fn.enableSelection && $d.data(s))
+ $d.enableSelection().data(s, false);
+ }
+
+
+ /**
+ * Returns hash container 'display' and 'visibility'
+ *
+ * @see $.swap() - swaps CSS, runs callback, resets CSS
+ * @param {!Object} $E jQuery element
+ * @param {boolean=} [force=false] Run even if display != none
+ * @return {!Object} Returns current style props, if applicable
+ */
+, showInvisibly: function ($E, force) {
+ if ($E && $E.length && (force || $E.css("display") === "none")) { // only if not *already hidden*
+ var s = $E[0].style
+ // save ONLY the 'style' props because that is what we must restore
+ , CSS = { display: s.display || '', visibility: s.visibility || '' };
+ // show element 'invisibly' so can be measured
+ $E.css({ display: "block", visibility: "hidden" });
+ return CSS;
+ }
+ return {};
+ }
+
+ /**
+ * Returns data for setting size of an element (container or a pane).
+ *
+ * @see _create(), onWindowResize() for container, plus others for pane
+ * @return JSON Returns a hash of all dimensions: top, bottom, left, right, outerWidth, innerHeight, etc
+ */
+, getElementDimensions: function ($E, inset) {
+ var
+ // dimensions hash - start with current data IF passed
+ d = { css: {}, inset: {} }
+ , x = d.css // CSS hash
+ , i = { bottom: 0 } // TEMP insets (bottom = complier hack)
+ , N = $.layout.cssNum
+ , R = Math.round
+ , off = $E.offset()
+ , b, p, ei // TEMP border, padding
+ ;
+ d.offsetLeft = off.left;
+ d.offsetTop = off.top;
+
+ if (!inset) inset = {}; // simplify logic below
+
+ $.each("Left,Right,Top,Bottom".split(","), function (idx, e) { // e = edge
+ b = x["border" + e] = $.layout.borderWidth($E, e);
+ p = x["padding"+ e] = $.layout.cssNum($E, "padding"+e);
+ ei = e.toLowerCase();
+ d.inset[ei] = inset[ei] >= 0 ? inset[ei] : p; // any missing insetX value = paddingX
+ i[ei] = d.inset[ei] + b; // total offset of content from outer side
+ });
+
+ x.width = R($E.width());
+ x.height = R($E.height());
+ x.top = N($E,"top",true);
+ x.bottom = N($E,"bottom",true);
+ x.left = N($E,"left",true);
+ x.right = N($E,"right",true);
+
+ d.outerWidth = R($E.outerWidth());
+ d.outerHeight = R($E.outerHeight());
+ // calc the TRUE inner-dimensions, even in quirks-mode!
+ d.innerWidth = max(0, d.outerWidth - i.left - i.right);
+ d.innerHeight = max(0, d.outerHeight - i.top - i.bottom);
+ // layoutWidth/Height is used in calcs for manual resizing
+ // layoutW/H only differs from innerW/H when in quirks-mode - then is like outerW/H
+ d.layoutWidth = R($E.innerWidth());
+ d.layoutHeight = R($E.innerHeight());
+
+ //if ($E.prop('tagName') === 'BODY') { debugData( d, $E.prop('tagName') ); } // DEBUG
+
+ //d.visible = $E.is(":visible");// && x.width > 0 && x.height > 0;
+
+ return d;
+ }
+
+, getElementStyles: function ($E, list) {
+ var
+ CSS = {}
+ , style = $E[0].style
+ , props = list.split(",")
+ , sides = "Top,Bottom,Left,Right".split(",")
+ , attrs = "Color,Style,Width".split(",")
+ , p, s, a, i, j, k
+ ;
+ for (i=0; i < props.length; i++) {
+ p = props[i];
+ if (p.match(/(border|padding|margin)$/))
+ for (j=0; j < 4; j++) {
+ s = sides[j];
+ if (p === "border")
+ for (k=0; k < 3; k++) {
+ a = attrs[k];
+ CSS[p+s+a] = style[p+s+a];
+ }
+ else
+ CSS[p+s] = style[p+s];
+ }
+ else
+ CSS[p] = style[p];
+ };
+ return CSS
+ }
+
+ /**
+ * Return the innerWidth for the current browser/doctype
+ *
+ * @see initPanes(), sizeMidPanes(), initHandles(), sizeHandles()
+ * @param {Array.