diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/jquery.smartWizard.min.js b/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/jquery.smartWizard.min.js
new file mode 100644
index 00000000..bdbcf7e7
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/jquery.smartWizard.min.js
@@ -0,0 +1,13 @@
+"use strict";function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _defineProperties(t,e){for(var s=0;s<e.length;s++){var i=e[s];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function _createClass(t,e,s){return e&&_defineProperties(t.prototype,e),s&&_defineProperties(t,s),t}function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}
+/*!
+ * jQuery SmartWizard v5.1.1
+ * The awesome jQuery step wizard plugin
+ * http://www.techlaboratory.net/jquery-smartwizard
+ *
+ * Created by Dipu Raj
+ * http://dipu.me
+ *
+ * @license Licensed under the terms of the MIT License
+ * https://github.com/techlab/jquery-smartwizard/blob/master/LICENSE
+ */
+!function(s){"function"==typeof define&&define.amd?define(["jquery"],s):"object"===("undefined"==typeof module?"undefined":_typeof(module))&&module.exports?module.exports=function(t,e){return void 0===e&&(e="undefined"!=typeof window?require("jquery"):require("jquery")(t)),s(e),e}:s(jQuery)}(function(v){var i={selected:0,theme:"default",justified:!0,darkMode:!1,autoAdjustHeight:!0,cycleSteps:!1,backButtonSupport:!0,enableURLhash:!0,transition:{animation:"none",speed:"400",easing:""},toolbarSettings:{toolbarPosition:"bottom",toolbarButtonPosition:"right",showNextButton:!0,showPreviousButton:!0,toolbarExtraButtons:[]},anchorSettings:{anchorClickable:!0,enableAllAnchors:!1,markDoneStep:!0,markAllPreviousStepsAsDone:!0,removeDoneStepOnNavigateBack:!1,enableAnchorOnDoneStep:!0},keyboardSettings:{keyNavigation:!0,keyLeft:[37],keyRight:[39]},lang:{next:"Next",previous:"Previous"},disabledSteps:[],errorSteps:[],hiddenSteps:[]},s=function(){function s(t,e){_classCallCheck(this,s),this.options=v.extend(!0,{},i,e),this.main=v(t),this.nav=this._getFirstDescendant(".nav"),this.steps=this.nav.find(".nav-link"),this.container=this._getFirstDescendant(".tab-content"),this.pages=this.container.children(".tab-pane"),this._initOptions(),this._initLoad()}return _createClass(s,[{key:"_initLoad",value:function(){this.pages.hide(),this.steps.removeClass("done active"),this.current_index=null;var t=this._getStepIndex();this._setPreviousStepsDone(t),this._showStep(t)}},{key:"_initOptions",value:function(){this._setElements(),this._setToolbar(),this._setEvents()}},{key:"_getFirstDescendant",value:function(i){var n=this.main.children(i);return 0<n.length?n:(this.main.children().each(function(t,e){var s=v(e).children(i);if(0<s.length)return n=s,!1}),0<n.length?n:(this._showError("Element not found "+i),!1))}},{key:"_setElements",value:function(){this.main.addClass("sw"),this._setTheme(this.options.theme),this._setJustify(this.options.justified),this._setDarkMode(this.options.darkMode),!0===this.options.anchorSettings.enableAllAnchors&&!0===this.options.anchorSettings.anchorClickable||this.steps.addClass("inactive"),this._setCSSClass(this.options.disabledSteps,"disabled"),this._setCSSClass(this.options.errorSteps,"danger"),this._setCSSClass(this.options.hiddenSteps,"hidden")}},{key:"_setEvents",value:function(){var s=this;if(this.main.data("click-init"))return!0;this.main.data("click-init",!0),v(this.steps).on("click",function(t){if(t.preventDefault(),!1===s.options.anchorSettings.anchorClickable)return!0;var e=s.steps.index(t.currentTarget);return e===s.current_index||(!(!1!==s.options.anchorSettings.enableAnchorOnDoneStep||!s._isDone(e))||void(!1===s.options.anchorSettings.enableAllAnchors&&!s._isDone(e)||s._showStep(e)))}),this.main.find(".sw-btn-next").on("click",function(t){t.preventDefault(),s._showNext()}),this.main.find(".sw-btn-prev").on("click",function(t){t.preventDefault(),s._showPrevious()}),this.options.keyboardSettings.keyNavigation&&v(document).keyup(function(t){s._keyNav(t)}),this.options.backButtonSupport&&v(window).on("hashchange",function(t){var e=s._getURLHashIndex();!1!==e&&(t.preventDefault(),s._showStep(e))})}},{key:"_setToolbar",value:function(){if("none"===this.options.toolbarSettings.toolbarPosition)return!0;switch(this.options.toolbarSettings.toolbarPosition){case"top":this.container.before(this._createToolbar("top"));break;case"bottom":this.container.after(this._createToolbar("bottom"));break;case"both":this.container.before(this._createToolbar("top")),this.container.after(this._createToolbar("bottom"));break;default:this.container.after(this._createToolbar("bottom"))}}},{key:"_createToolbar",value:function(t){if(0<this.main.find(".toolbar-"+t).length)return null;var s=v("<div></div>").addClass("toolbar toolbar-"+t).attr("role","toolbar"),e=!1!==this.options.toolbarSettings.showNextButton?v("<button></button>").text(this.options.lang.next).addClass("btn sw-btn-next").attr("type","button"):null,i=!1!==this.options.toolbarSettings.showPreviousButton?v("<button></button>").text(this.options.lang.previous).addClass("btn sw-btn-prev").attr("type","button"):null;return s.append(i,e),this.options.toolbarSettings.toolbarExtraButtons&&0<this.options.toolbarSettings.toolbarExtraButtons.length&&v.each(this.options.toolbarSettings.toolbarExtraButtons,function(t,e){s.append(e.clone(!0))}),s.css("text-align",this.options.toolbarSettings.toolbarButtonPosition),s}},{key:"_showNext",value:function(){var t=this._getNextShowable(this.current_index);if(!1===t)return!1;this._showStep(t)}},{key:"_showPrevious",value:function(){var t=this._getPreviousShowable(this.current_index);if(!1===t)return!1;this._showStep(t)}},{key:"_showStep",value:function(t){return t!=this.current_index&&(!!this.steps.eq(t)&&(!!this._isShowable(t)&&void this._loadStep(t)))}},{key:"_getNextShowable",value:function(t){for(var e=!1,s=t+1;s<this.steps.length;s++)if(this._isShowable(s)){e=s;break}if(!1!==e&&this.steps.length<=e){if(!this.options.cycleSteps)return!1;e=0}return e}},{key:"_getPreviousShowable",value:function(t){for(var e=!1,s=t-1;0<=s;s--)if(this._isShowable(s)){e=s;break}if(!1!==e&&e<0){if(!this.options.cycleSteps)return!1;e=this.steps.length-1}return e}},{key:"_isShowable",value:function(t){var e=this.steps.eq(t);return!e.hasClass("disabled")&&!e.hasClass("hidden")}},{key:"_isDone",value:function(t){return!!this.steps.eq(t).hasClass("done")}},{key:"_setPreviousStepsDone",value:function(t){if(0<t&&this.options.anchorSettings.markDoneStep&&this.options.anchorSettings.markAllPreviousStepsAsDone)for(var e=t;0<=e;e--)this._setCSSClass(e,"done")}},{key:"_setCSSClass",value:function(t,e){var s=this;if(null===t)return!1;(v.isArray(t)?t:[t]).map(function(t){s.steps.eq(t).addClass(e)})}},{key:"_resetCSSClass",value:function(t,e){var s=this;(v.isArray(t)?t:[t]).map(function(t){s.steps.eq(t).removeClass(e)})}},{key:"_getStepDirection",value:function(t){return null==this.current_index?"":this.current_index<t?"forward":"backward"}},{key:"_getStepPosition",value:function(t){var e="middle";return 0===t?e="first":t===this.steps.length-1&&(e="last"),e}},{key:"_getStepAnchor",value:function(t){return null==t?null:this.steps.eq(t)}},{key:"_getStepPage",value:function(t){if(null==t)return null;var e=this._getStepAnchor(t);return 0<e.length?this.main.find(e.attr("href")):null}},{key:"_setStepContent",value:function(t,e){var s=this._getStepPage(t);s&&s.html(e)}},{key:"_loadStep",value:function(e){var s=this,t=this._getStepAnchor(this.current_index),i=this._getStepDirection(e);if(null!==this.current_index&&!1===this._triggerEvent("leaveStep",[t,this.current_index,e,i]))return!1;var n=this._getStepAnchor(e),o=this._triggerEvent("stepContent",[n,e,i]);o?"object"==_typeof(o)?o.then(function(t){s._setStepContent(e,t),s._transitStep(e)}).catch(function(t){console.error(t),s._setStepContent(e,t),s._transitStep(e)}):("string"==typeof o&&this._setStepContent(e,o),this._transitStep(e)):this._transitStep(e)}},{key:"_transitStep",value:function(t){var e=this,s=this._getStepAnchor(t);this._setURLHash(s.attr("href")),this._setAnchor(t);var i=this._getStepDirection(t),n=this._getStepPosition(t);this._doStepAnimation(t,function(){e._fixHeight(t),e._triggerEvent("showStep",[s,e.current_index,i,n])}),this.current_index=t,this._setButtons(t)}},{key:"_doStepAnimation",value:function(t,e){var s=this,i=this._getStepPage(this.current_index),n=this._getStepPage(t),o=this.options.transition.animation.toLowerCase();switch(this._stopAnimations(),o){case"slide-horizontal":case"slide-h":var a,r,h=this.container.width(),l=h,u=-2*h;t>this.current_index&&(l=-1*h,u=h),null==this.current_index&&this.container.height(n.outerHeight()),i&&(a=i.css("position"),r=i.css("left"),i.css("position","absolute").css("left",0).animate({left:l},this.options.transition.speed,this.options.transition.easing,function(){v(this).hide(),i.css("position",a).css("left",r)})),a=n.css("position"),r=n.css("left"),n.css("position","absolute").css("left",u).outerWidth(h).show().animate({left:0},this.options.transition.speed,this.options.transition.easing,function(){n.css("position",a).css("left",r),e()});break;case"slide-vertical":case"slide-v":var c,d,p=this.container.height(),f=p,_=-2*p;t>this.current_index&&(f=-1*p,_=p),i&&(c=i.css("position"),d=i.css("top"),i.css("position","absolute").css("top",0).animate({top:f},this.options.transition.speed,this.options.transition.easing,function(){v(this).hide(),i.css("position",c).css("top",d)})),c=n.css("position"),d=n.css("top"),n.css("position","absolute").css("top",_).show().animate({top:0},this.options.transition.speed,this.options.transition.easing,function(){n.css("position",c).css("top",d),e()});break;case"slide-swing":case"slide-s":i?i.slideUp("fast",this.options.transition.easing,function(){n.slideDown(s.options.transition.speed,s.options.transition.easing,function(){e()})}):n.slideDown(this.options.transition.speed,this.options.transition.easing,function(){e()});break;case"fade":i?i.fadeOut("fast",this.options.transition.easing,function(){n.fadeIn("fast",s.options.transition.easing,function(){e()})}):n.fadeIn(this.options.transition.speed,this.options.transition.easing,function(){e()});break;default:i&&i.hide(),n.show(),e()}}},{key:"_stopAnimations",value:function(){this.pages.finish(),this.container.finish()}},{key:"_setAnchor",value:function(t){this._resetCSSClass(this.current_index,"active"),!1!==this.options.anchorSettings.markDoneStep&&null!==this.current_index&&(this._setCSSClass(this.current_index,"done"),!1!==this.options.anchorSettings.removeDoneStepOnNavigateBack&&"backward"===this._getStepDirection(t)&&this._resetCSSClass(this.current_index,"done")),this._resetCSSClass(t,"done"),this._setCSSClass(t,"active")}},{key:"_setButtons",value:function(t){if(!this.options.cycleSteps)switch(this.main.find(".sw-btn-prev").removeClass("disabled"),this.main.find(".sw-btn-next").removeClass("disabled"),this._getStepPosition(t)){case"first":this.main.find(".sw-btn-prev").addClass("disabled");break;case"last":this.main.find(".sw-btn-next").addClass("disabled");break;default:!1===this._getNextShowable(t)&&this.main.find(".sw-btn-next").addClass("disabled"),!1===this._getPreviousShowable(t)&&this.main.find(".sw-btn-prev").addClass("disabled")}}},{key:"_getStepIndex",value:function(){var t=this._getURLHashIndex();return!1===t?this.options.selected:t}},{key:"_setTheme",value:function(t){this.main.removeClass(function(t,e){return(e.match(/(^|\s)sw-theme-\S+/g)||[]).join(" ")}).addClass("sw-theme-"+t)}},{key:"_setJustify",value:function(t){!0===t?this.main.addClass("sw-justified"):this.main.removeClass("sw-justified")}},{key:"_setDarkMode",value:function(t){!0===t?this.main.addClass("sw-dark"):this.main.removeClass("sw-dark")}},{key:"_keyNav",value:function(t){if(-1<v.inArray(t.which,this.options.keyboardSettings.keyLeft))this._showPrevious(),t.preventDefault();else{if(!(-1<v.inArray(t.which,this.options.keyboardSettings.keyRight)))return;this._showNext(),t.preventDefault()}}},{key:"_fixHeight",value:function(t){var e;this.options.autoAdjustHeight&&(e=this._getStepPage(t),this.container.finish().animate({height:e.outerHeight()},this.options.transition.speed))}},{key:"_triggerEvent",value:function(t,e){var s=v.Event(t);return this.main.trigger(s,e),!s.isDefaultPrevented()&&s.result}},{key:"_setURLHash",value:function(t){this.options.enableURLhash&&window.location.hash!==t&&history.pushState(null,null,t)}},{key:"_getURLHashIndex",value:function(){if(this.options.enableURLhash){var t=window.location.hash;if(0<t.length){var e=this.nav.find("a[href*='"+t+"']");if(0<e.length)return this.steps.index(e)}}return!1}},{key:"_loader",value:function(t){switch(t){case"show":this.main.addClass("sw-loading");break;case"hide":this.main.removeClass("sw-loading");break;default:this.main.toggleClass("sw-loading")}}},{key:"_showError",value:function(t){console.error(t)}},{key:"goToStep",value:function(t){this._showStep(t)}},{key:"next",value:function(){this._showNext()}},{key:"prev",value:function(){this._showPrevious()}},{key:"reset",value:function(){this._setURLHash("#"),this._initOptions(),this._initLoad()}},{key:"stepState",value:function(t,e){if(!t)return!1;switch(e){case"disable":this._setCSSClass(t,"disabled");break;case"enable":this._resetCSSClass(t,"disabled");break;case"hide":this._setCSSClass(t,"hidden");break;case"show":this._resetCSSClass(t,"hidden");break;case"error-on":this._setCSSClass(t,"danger");break;case"error-off":this._resetCSSClass(t,"danger")}}},{key:"setOptions",value:function(t){this.options=v.extend(!0,{},this.options,t),this._initOptions()}},{key:"getStepIndex",value:function(){return this.current_index}},{key:"loader",value:function(t){"show"===t?this.main.addClass("sw-loading"):this.main.removeClass("sw-loading")}}]),s}();v.fn.smartWizard=function(t){if(void 0===t||"object"===_typeof(t))return this.each(function(){v.data(this,"smartWizard")||v.data(this,"smartWizard",new s(this,t))});if("string"==typeof t&&"_"!==t[0]&&"init"!==t){var e=v.data(this[0],"smartWizard");return"destroy"===t&&v.data(this,"smartWizard",null),e instanceof s&&"function"==typeof e[t]?e[t].apply(e,Array.prototype.slice.call(arguments,1)):this}}});
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/smart_wizard_all.min.css b/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/smart_wizard_all.min.css
new file mode 100644
index 00000000..217d3aa6
--- /dev/null
+++ b/ruoyi-admin/src/main/resources/static/ajax/libs/smartwizard/smart_wizard_all.min.css
@@ -0,0 +1,11 @@
+/*!
+ * jQuery SmartWizard v5
+ * jQuery Wizard Plugin
+ * http://www.techlaboratory.net/smartwizard
+ *
+ * Created by Dipu Raj
+ * http://dipu.me
+ *
+ * Licensed under the terms of MIT License
+ * https://github.com/techlab/jquery-smartwizard/blob/master/LICENSE
+ */.sw{position:relative}.sw *,.sw ::after,.sw ::before{box-sizing:border-box}.sw>.tab-content{position:relative;overflow:hidden}.sw .toolbar{padding:.8rem}.sw .toolbar>.btn{display:inline-block;text-decoration:none;text-align:center;text-transform:none;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-left:.2rem;margin-right:.2rem;cursor:pointer}.sw .toolbar>.btn.disabled,.sw .toolbar>.btn:disabled{opacity:.65}.sw>.nav{display:flex;flex-wrap:wrap;list-style:none;padding-left:0;margin-top:0;margin-bottom:0}@media screen and (max-width:640px){.sw>.nav{flex-direction:column!important;flex:1 auto}}.sw>.nav .nav-link{display:block;padding:.5rem 1rem;text-decoration:none}.sw>.nav .nav-link:active,.sw>.nav .nav-link:focus,.sw>.nav .nav-link:hover{text-decoration:none}.sw>.nav .nav-link::-moz-focus-inner{border:0!important}.sw>.nav .nav-link.disabled{color:#ccc!important;pointer-events:none;cursor:default}.sw>.nav .nav-link.hidden{display:none!important}.sw.sw-justified>.nav .nav-link,.sw.sw-justified>.nav>li{flex-basis:0;flex-grow:1;text-align:center}.sw.sw-dark{color:rgba(255,255,255,.95);background:#000}.sw.sw-loading{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.sw.sw-loading::after{content:"";display:block;position:absolute;opacity:1;top:0;left:0;height:100%;width:100%;background:rgba(255,255,255,.7);z-index:2;transition:all .2s ease}.sw.sw-loading::before{content:'';display:inline-block;position:absolute;top:45%;left:45%;width:2rem;height:2rem;border:10px solid #f3f3f3;border-top:10px solid #3498db;border-radius:50%;z-index:10;-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}@-webkit-keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes spin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.sw-theme-default{border:1px solid #eee}.sw-theme-default>.tab-content>.tab-pane{padding:10px}.sw-theme-default .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-default>.nav{box-shadow:0 .125rem .25rem rgba(0,0,0,.1)!important}.sw-theme-default>.nav .nav-link{position:relative;height:100%;min-height:100%}.sw-theme-default>.nav .nav-link::after{content:"";position:absolute;height:2px;width:0;left:0;bottom:-1px;background:#999;transition:all .35s ease .15s}.sw-theme-default>.nav .nav-link.inactive{color:#999;cursor:not-allowed}.sw-theme-default>.nav .nav-link.active{color:#17a2b8!important;cursor:pointer}.sw-theme-default>.nav .nav-link.active::after{background:#17a2b8!important;width:100%}.sw-theme-default>.nav .nav-link.done{color:#5cb85c!important;cursor:pointer}.sw-theme-default>.nav .nav-link.done::after{background:#5cb85c;width:100%}.sw-theme-default>.nav .nav-link.disabled{color:#ddd!important;cursor:not-allowed}.sw-theme-default>.nav .nav-link.disabled::after{background:#ddd;width:100%}.sw-theme-default>.nav .nav-link.danger{color:#d9534f!important;cursor:pointer}.sw-theme-default>.nav .nav-link.danger::after{background:#d9534f;width:100%}.sw-theme-arrows{border:1px solid #eee}.sw-theme-arrows>.tab-content>.tab-pane{padding:10px}.sw-theme-arrows .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-arrows>.nav{overflow:hidden;border-bottom:1px solid #eee}.sw-theme-arrows>.nav .nav-link{position:relative;height:100%;min-height:100%;margin-right:30px;margin-left:-30px;padding-left:40px}@media screen and (max-width:640px){.sw-theme-arrows>.nav .nav-link{overflow:hidden;margin-bottom:1px;margin-right:unset}}.sw-theme-arrows>.nav .nav-link::after{content:"";position:absolute;display:block;width:0;height:0;top:50%;left:100%;margin-top:-50px;border-top:50px solid transparent;border-bottom:50px solid transparent;border-left:30px solid #f8f8f8;z-index:2}.sw-theme-arrows>.nav .nav-link::before{content:" ";position:absolute;display:block;width:0;height:0;top:50%;left:100%;margin-top:-50px;margin-left:1px;border-top:50px solid transparent;border-bottom:50px solid transparent;border-left:30px solid #eee;z-index:1}.sw-theme-arrows>.nav .nav-link.inactive{color:#999;border-color:#f8f8f8;background:#f8f8f8;cursor:not-allowed}.sw-theme-arrows>.nav .nav-link.active{color:#fff;border-color:#5bc0de;background:#5bc0de;cursor:pointer}.sw-theme-arrows>.nav .nav-link.active::after{border-left-color:#5bc0de}.sw-theme-arrows>.nav .nav-link.done{color:#fff;border-color:#5cb85c;background:#5cb85c;cursor:pointer}.sw-theme-arrows>.nav .nav-link.done::after{border-left-color:#5cb85c}.sw-theme-arrows>.nav .nav-link.disabled{color:#eee;border-color:#f9f9f9;background:#f9f9f9;cursor:not-allowed}.sw-theme-arrows>.nav .nav-link.disabled::after{border-left-color:#f9f9f9}.sw-theme-arrows>.nav .nav-link.danger{color:#fff;border-color:#d9534f;background:#d9534f;cursor:pointer}.sw-theme-arrows>.nav .nav-link.danger::after{border-left-color:#d9534f}.sw-theme-arrows.sw-dark{color:rgba(255,255,255,.95);background:#000}.sw-theme-arrows.sw-dark>.nav{border-bottom:1px solid #555}.sw-theme-arrows.sw-dark>.nav .nav-link::after{border-left:30px solid #5f5f5f}.sw-theme-arrows.sw-dark>.nav .nav-link::before{border-left:30px solid #555}.sw-theme-arrows.sw-dark>.nav .nav-link.inactive{color:#fff;border-color:#5f5f5f;background:#5f5f5f}.sw-theme-arrows.sw-dark>.nav .nav-link.inactive::after{border-left-color:#5f5f5f}.sw-theme-arrows.sw-dark>.nav .nav-link.active{color:#fff;border-color:#010506;background:#0a2730}.sw-theme-arrows.sw-dark>.nav .nav-link.active::after{border-left-color:#0a2730}.sw-theme-arrows.sw-dark>.nav .nav-link.done{color:#fff;border-color:#000;background:#000}.sw-theme-arrows.sw-dark>.nav .nav-link.done::after{border-left-color:#000}.sw-theme-arrows.sw-dark>.nav .nav-link.disabled{color:#555!important;border-color:#f9f9f9;background:#474747}.sw-theme-arrows.sw-dark>.nav .nav-link.disabled::after{border-left-color:#474747}.sw-theme-arrows.sw-dark>.nav .nav-link.danger{color:#fff;border-color:#d9534f;background:#d9534f}.sw-theme-arrows.sw-dark>.nav .nav-link.danger::after{border-left-color:#d9534f}.sw-theme-dots>.tab-content>.tab-pane{padding:10px}.sw-theme-dots .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-dots>.nav{position:relative;margin-bottom:10px}.sw-theme-dots>.nav::before{content:" ";position:absolute;top:18px;left:0;width:100%;height:5px;background-color:#eee;border-radius:3px;z-index:1}.sw-theme-dots>.nav .nav-link{position:relative;margin-top:40px}.sw-theme-dots>.nav .nav-link::before{content:" ";position:absolute;display:block;top:-36px;left:0;right:0;margin-left:auto;margin-right:auto;width:32px;height:32px;border-radius:50%;border:none;background:#f5f5f5;color:#428bca;text-decoration:none;z-index:98}.sw-theme-dots>.nav .nav-link::after{content:" ";position:absolute;display:block;top:-28px;left:0;right:0;margin-left:auto;margin-right:auto;width:16px;height:16px;border-radius:50%;z-index:99}.sw-theme-dots>.nav .nav-link.inactive{color:#999;cursor:not-allowed}.sw-theme-dots>.nav .nav-link.inactive::after{background-color:#999}.sw-theme-dots>.nav .nav-link.active{color:#5bc0de!important;cursor:pointer}.sw-theme-dots>.nav .nav-link.active::after{background-color:#5bc0de!important}.sw-theme-dots>.nav .nav-link.done{color:#5cb85c;cursor:pointer}.sw-theme-dots>.nav .nav-link.done::after{background-color:#5cb85c}.sw-theme-dots>.nav .nav-link.disabled{color:#f9f9f9;cursor:not-allowed}.sw-theme-dots>.nav .nav-link.disabled::after{background-color:#f9f9f9}.sw-theme-dots>.nav .nav-link.danger{color:#d9534f;cursor:pointer}.sw-theme-dots>.nav .nav-link.danger::after{background-color:#d9534f}.sw-theme-dots.sw-dark{color:rgba(255,255,255,.95);background:#000}.sw-theme-dots.sw-dark>.nav::before{background-color:#3c3c3c}.sw-theme-dots.sw-dark>.nav .nav-link::before{background:#434343;color:#000}.sw-theme-progress{border:1px solid #eee}.sw-theme-progress>.tab-content>.tab-pane{padding:10px}.sw-theme-progress .toolbar>.btn{color:#fff;background-color:#17a2b8;border:1px solid #17a2b8;padding:.375rem .75rem;border-radius:.25rem;font-weight:400}.sw-theme-progress>.nav{box-shadow:0 .125rem .25rem rgba(0,0,0,.1)!important}.sw-theme-progress>.nav .nav-link{position:relative;height:100%;min-height:100%;background:0 0;overflow:hidden;z-index:2}.sw-theme-progress>.nav .nav-link::after{content:"";position:absolute;height:150%;width:0;left:0;top:0;background:#fff;z-index:-1;transition:all .35s ease .1s}.sw-theme-progress>.nav .nav-link.inactive{color:#999;cursor:not-allowed}.sw-theme-progress>.nav .nav-link.active{color:#fff!important;cursor:pointer}.sw-theme-progress>.nav .nav-link.active::after{background-color:#5cb85c;width:100%}.sw-theme-progress>.nav .nav-link.done{color:#fff!important;cursor:pointer}.sw-theme-progress>.nav .nav-link.done::after{background:#5cb85c;width:100%}.sw-theme-progress>.nav .nav-link.disabled{color:#ddd!important;cursor:not-allowed}.sw-theme-progress>.nav .nav-link.disabled::after{background:#f9f9f9;width:100%}.sw-theme-progress>.nav .nav-link.danger{color:#fff!important;cursor:pointer}.sw-theme-progress>.nav .nav-link.danger::after{background:#d9534f;width:100%}.sw-theme-progress.sw-dark{color:rgba(255,255,255,.95)}.sw-theme-progress.sw-dark>.nav .nav-link.active{color:#fff}.sw-theme-progress.sw-dark>.nav .nav-link.active::after{background-color:#333}.sw-theme-progress.sw-dark>.nav .nav-link.done{color:#fff!important}.sw-theme-progress.sw-dark>.nav .nav-link.done::after{background:#333}.sw-theme-progress.sw-dark>.nav .nav-link.disabled{color:#2b2b2b!important}.sw-theme-progress.sw-dark>.nav .nav-link.disabled::after{background:#474747}.sw-theme-progress.sw-dark>.nav .nav-link.danger{color:#fff!important}.sw-theme-progress.sw-dark>.nav .nav-link.danger::after{background:#d9534f}
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.css b/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.css
deleted file mode 100644
index 35184c09..00000000
--- a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.css
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
-    Common
-*/
-
-.wizard,
-.tabcontrol
-{
-    display: block;
-    width: 100%;
-    overflow: hidden;
-}
-
-.wizard a,
-.tabcontrol a
-{
-    outline: 0;
-}
-
-.wizard ul,
-.tabcontrol ul
-{
-    list-style: none !important;
-    padding: 0;
-    margin: 0;
-}
-
-.wizard ul > li,
-.tabcontrol ul > li
-{
-    display: block;
-    padding: 0;
-}
-
-/* Accessibility */
-.wizard > .steps .current-info,
-.tabcontrol > .steps .current-info
-{
-    position: absolute;
-    left: -999em;
-}
-
-.wizard > .content > .title,
-.tabcontrol > .content > .title
-{
-    position: absolute;
-    left: -999em;
-}
-
-
-
-/*
-    Wizard
-*/
-
-.wizard > .steps
-{
-    position: relative;
-    display: block;
-    width: 100%;
-}
-
-.wizard.vertical > .steps
-{
-    display: inline;
-    float: left;
-    width: 30%;
-}
-
-.wizard > .steps > ul > li
-{
-    width: 25%;
-}
-
-.wizard > .steps > ul > li,
-.wizard > .actions > ul > li
-{
-    float: left;
-}
-
-.wizard.vertical > .steps > ul > li
-{
-    float: none;
-    width: 100%;
-}
-
-.wizard > .steps a,
-.wizard > .steps a:hover,
-.wizard > .steps a:active
-{
-    display: block;
-    width: auto;
-    margin: 0 0.5em 0.5em;
-    padding: 8px;
-    text-decoration: none;
-
-    -webkit-border-radius: 5px;
-    -moz-border-radius: 5px;
-    border-radius: 5px;
-}
-
-.wizard > .steps .disabled a,
-.wizard > .steps .disabled a:hover,
-.wizard > .steps .disabled a:active
-{
-    background: #eee;
-    color: #aaa;
-    cursor: default;
-}
-
-.wizard > .steps .current a,
-.wizard > .steps .current a:hover,
-.wizard > .steps .current a:active
-{
-    background: #1AB394;
-    color: #fff;
-    cursor: default;
-}
-
-.wizard > .steps .done a,
-.wizard > .steps .done a:hover,
-.wizard > .steps .done a:active
-{
-    background: #6fd1bd;
-    color: #fff;
-}
-
-.wizard > .steps .error a,
-.wizard > .steps .error a:hover,
-.wizard > .steps .error a:active
-{
-    background: #ED5565 ;
-    color: #fff;
-}
-
-.wizard > .content
-{
-    background: #eee;
-    display: block;
-    margin: 5px 5px 10px 5px;
-    min-height: 120px;
-    overflow: hidden;
-    position: relative;
-    width: auto;
-
-    -webkit-border-radius: 5px;
-    -moz-border-radius: 5px;
-    border-radius: 5px;
-}
-
-.wizard-big.wizard > .content {
-    min-height: 320px;
-}
-.wizard.vertical > .content
-{
-    display: inline;
-    float: left;
-    margin: 0 2.5% 0.5em 2.5%;
-    width: 65%;
-}
-
-.wizard > .content > .body
-{
-    float: left;
-    position: absolute;
-    width: 95%;
-    height: 95%;
-    padding: 2.5%;
-}
-
-.wizard > .content > .body ul
-{
-    list-style: disc !important;
-}
-
-.wizard > .content > .body ul > li
-{
-    display: list-item;
-}
-
-.wizard > .content > .body > iframe
-{
-    border: 0 none;
-    width: 100%;
-    height: 100%;
-}
-
-.wizard > .content > .body input
-{
-    display: block;
-    border: 1px solid #ccc;
-}
-
-.wizard > .content > .body input[type="checkbox"]
-{
-    display: inline-block;
-}
-
-.wizard > .content > .body input.error
-{
-    background: rgb(251, 227, 228);
-    border: 1px solid #fbc2c4;
-    color: #8a1f11;
-}
-
-.wizard > .content > .body label
-{
-    display: inline-block;
-    margin-bottom: 0.5em;
-}
-
-.wizard > .content > .body label.error
-{
-    color: #8a1f11;
-    display: inline-block;
-    margin-left: 1.5em;
-}
-
-.wizard > .actions
-{
-    position: relative;
-    display: block;
-    text-align: right;
-    width: 100%;
-}
-
-.wizard.vertical > .actions
-{
-    display: inline;
-    float: right;
-    margin: 0 2.5%;
-    width: 95%;
-}
-
-.wizard > .actions > ul
-{
-    display: inline-block;
-    text-align: right;
-}
-
-.wizard > .actions > ul > li
-{
-    margin: 0 0.5em;
-}
-
-.wizard.vertical > .actions > ul > li
-{
-    margin: 0 0 0 1em;
-}
-
-.wizard > .actions a,
-.wizard > .actions a:hover,
-.wizard > .actions a:active
-{
-    background: #1AB394;
-    color: #fff;
-    display: block;
-    padding: 0.5em 1em;
-    text-decoration: none;
-
-    -webkit-border-radius: 5px;
-    -moz-border-radius: 5px;
-    border-radius: 5px;
-}
-
-.wizard > .actions .disabled a,
-.wizard > .actions .disabled a:hover,
-.wizard > .actions .disabled a:active
-{
-    background: #eee;
-    color: #aaa;
-}
-
-.wizard > .loading
-{
-}
-
-.wizard > .loading .spinner
-{
-}
-
-
-
-/*
-    Tabcontrol
-*/
-
-.tabcontrol > .steps
-{
-    position: relative;
-    display: block;
-    width: 100%;
-}
-
-.tabcontrol > .steps > ul
-{
-    position: relative;
-    margin: 6px 0 0 0;
-    top: 1px;
-    z-index: 1;
-}
-
-.tabcontrol > .steps > ul > li
-{
-    float: left;
-    margin: 5px 2px 0 0;
-    padding: 1px;
-
-    -webkit-border-top-left-radius: 5px;
-    -webkit-border-top-right-radius: 5px;
-    -moz-border-radius-topleft: 5px;
-    -moz-border-radius-topright: 5px;
-    border-top-left-radius: 5px;
-    border-top-right-radius: 5px;
-}
-
-.tabcontrol > .steps > ul > li:hover
-{
-    background: #edecec;
-    border: 1px solid #bbb;
-    padding: 0;
-}
-
-.tabcontrol > .steps > ul > li.current
-{
-    background: #fff;
-    border: 1px solid #bbb;
-    border-bottom: 0 none;
-    padding: 0 0 1px 0;
-    margin-top: 0;
-}
-
-.tabcontrol > .steps > ul > li > a
-{
-    color: #5f5f5f;
-    display: inline-block;
-    border: 0 none;
-    margin: 0;
-    padding: 10px 30px;
-    text-decoration: none;
-}
-
-.tabcontrol > .steps > ul > li > a:hover
-{
-    text-decoration: none;
-}
-
-.tabcontrol > .steps > ul > li.current > a
-{
-    padding: 15px 30px 10px 30px;
-}
-
-.tabcontrol > .content
-{
-    position: relative;
-    display: inline-block;
-    width: 100%;
-    height: 35em;
-    overflow: hidden;
-    border-top: 1px solid #bbb;
-    padding-top: 20px;
-}
-
-.tabcontrol > .content > .body
-{
-    float: left;
-    position: absolute;
-    width: 95%;
-    height: 95%;
-    padding: 2.5%;
-}
-
-.tabcontrol > .content > .body ul
-{
-    list-style: disc !important;
-}
-
-.tabcontrol > .content > .body ul > li
-{
-    display: list-item;
-}
-label.error { position:inherit;  }
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.js b/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.js
deleted file mode 100644
index 3ffcf50f..00000000
--- a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.js
+++ /dev/null
@@ -1,2042 +0,0 @@
-/*! 
- * jQuery Steps v1.1.0 - 09/04/2014
- * Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com)
- * Licensed under MIT http://www.opensource.org/licenses/MIT
- */
-;(function ($, undefined)
-{
-$.fn.extend({
-    _aria: function (name, value)
-    {
-        return this.attr("aria-" + name, value);
-    },
-
-    _removeAria: function (name)
-    {
-        return this.removeAttr("aria-" + name);
-    },
-
-    _enableAria: function (enable)
-    {
-        return (enable == null || enable) ? 
-            this.removeClass("disabled")._aria("disabled", "false") : 
-            this.addClass("disabled")._aria("disabled", "true");
-    },
-
-    _showAria: function (show)
-    {
-        return (show == null || show) ? 
-            this.show()._aria("hidden", "false") : 
-            this.hide()._aria("hidden", "true");
-    },
-
-    _selectAria: function (select)
-    {
-        return (select == null || select) ? 
-            this.addClass("current")._aria("selected", "true") : 
-            this.removeClass("current")._aria("selected", "false");
-    },
-
-    _id: function (id)
-    {
-        return (id) ? this.attr("id", id) : this.attr("id");
-    }
-});
-
-if (!String.prototype.format)
-{
-    String.prototype.format = function()
-    {
-        var args = (arguments.length === 1 && $.isArray(arguments[0])) ? arguments[0] : arguments;
-        var formattedString = this;
-        for (var i = 0; i < args.length; i++)
-        {
-            var pattern = new RegExp("\\{" + i + "\\}", "gm");
-            formattedString = formattedString.replace(pattern, args[i]);
-        }
-        return formattedString;
-    };
-}
-
-/**
- * A global unique id count.
- *
- * @static
- * @private
- * @property _uniqueId
- * @type Integer
- **/
-var _uniqueId = 0;
-
-/**
- * The plugin prefix for cookies.
- *
- * @final
- * @private
- * @property _cookiePrefix
- * @type String
- **/
-var _cookiePrefix = "jQu3ry_5teps_St@te_";
-
-/**
- * Suffix for the unique tab id.
- *
- * @final
- * @private
- * @property _tabSuffix
- * @type String
- * @since 0.9.7
- **/
-var _tabSuffix = "-t-";
-
-/**
- * Suffix for the unique tabpanel id.
- *
- * @final
- * @private
- * @property _tabpanelSuffix
- * @type String
- * @since 0.9.7
- **/
-var _tabpanelSuffix = "-p-";
-
-/**
- * Suffix for the unique title id.
- *
- * @final
- * @private
- * @property _titleSuffix
- * @type String
- * @since 0.9.7
- **/
-var _titleSuffix = "-h-";
-
-/**
- * An error message for an "index out of range" error.
- *
- * @final
- * @private
- * @property _indexOutOfRangeErrorMessage
- * @type String
- **/
-var _indexOutOfRangeErrorMessage = "Index out of range.";
-
-/**
- * An error message for an "missing corresponding element" error.
- *
- * @final
- * @private
- * @property _missingCorrespondingElementErrorMessage
- * @type String
- **/
-var _missingCorrespondingElementErrorMessage = "One or more corresponding step {0} are missing.";
-
-/**
- * Adds a step to the cache.
- *
- * @static
- * @private
- * @method addStepToCache
- * @param wizard {Object} A jQuery wizard object
- * @param step {Object} The step object to add
- **/
-function addStepToCache(wizard, step)
-{
-    getSteps(wizard).push(step);
-}
-
-function analyzeData(wizard, options, state)
-{
-    var stepTitles = wizard.children(options.headerTag),
-        stepContents = wizard.children(options.bodyTag);
-
-    // Validate content
-    if (stepTitles.length > stepContents.length)
-    {
-        throwError(_missingCorrespondingElementErrorMessage, "contents");
-    }
-    else if (stepTitles.length < stepContents.length)
-    {
-        throwError(_missingCorrespondingElementErrorMessage, "titles");
-    }
-        
-    var startIndex = options.startIndex;
-
-    state.stepCount = stepTitles.length;
-
-    // Tries to load the saved state (step position)
-    if (options.saveState && $.cookie)
-    {
-        var savedState = $.cookie(_cookiePrefix + getUniqueId(wizard));
-        // Sets the saved position to the start index if not undefined or out of range 
-        var savedIndex = parseInt(savedState, 0);
-        if (!isNaN(savedIndex) && savedIndex < state.stepCount)
-        {
-            startIndex = savedIndex;
-        }
-    }
-
-    state.currentIndex = startIndex;
-
-    stepTitles.each(function (index)
-    {
-        var item = $(this), // item == header
-            content = stepContents.eq(index),
-            modeData = content.data("mode"),
-            mode = (modeData == null) ? contentMode.html : getValidEnumValue(contentMode,
-                (/^\s*$/.test(modeData) || isNaN(modeData)) ? modeData : parseInt(modeData, 0)),
-            contentUrl = (mode === contentMode.html || content.data("url") === undefined) ?
-                "" : content.data("url"),
-            contentLoaded = (mode !== contentMode.html && content.data("loaded") === "1"),
-            step = $.extend({}, stepModel, {
-                title: item.html(),
-                content: (mode === contentMode.html) ? content.html() : "",
-                contentUrl: contentUrl,
-                contentMode: mode,
-                contentLoaded: contentLoaded
-            });
-
-        addStepToCache(wizard, step);
-    });
-}
-
-/**
- * Triggers the onCanceled event.
- *
- * @static
- * @private
- * @method cancel
- * @param wizard {Object} The jQuery wizard object
- **/
-function cancel(wizard)
-{
-    wizard.triggerHandler("canceled");
-}
-
-function decreaseCurrentIndexBy(state, decreaseBy)
-{
-    return state.currentIndex - decreaseBy;
-}
-
-/**
- * Removes the control functionality completely and transforms the current state to the initial HTML structure.
- *
- * @static
- * @private
- * @method destroy
- * @param wizard {Object} A jQuery wizard object
- **/
-function destroy(wizard, options)
-{
-    var eventNamespace = getEventNamespace(wizard);
-
-    // Remove virtual data objects from the wizard
-    wizard.unbind(eventNamespace).removeData("uid").removeData("options")
-        .removeData("state").removeData("steps").removeData("eventNamespace")
-        .find(".actions a").unbind(eventNamespace);
-
-    // Remove attributes and CSS classes from the wizard
-    wizard.removeClass(options.clearFixCssClass + " vertical");
-
-    var contents = wizard.find(".content > *");
-
-    // Remove virtual data objects from panels and their titles
-    contents.removeData("loaded").removeData("mode").removeData("url");
-
-    // Remove attributes, CSS classes and reset inline styles on all panels and their titles
-    contents.removeAttr("id").removeAttr("role").removeAttr("tabindex")
-        .removeAttr("class").removeAttr("style")._removeAria("labelledby")
-        ._removeAria("hidden");
-
-    // Empty panels if the mode is set to 'async' or 'iframe'
-    wizard.find(".content > [data-mode='async'],.content > [data-mode='iframe']").empty();
-
-    var wizardSubstitute = $("<{0} class=\"{1}\"></{0}>".format(wizard.get(0).tagName, wizard.attr("class")));
-
-    var wizardId = wizard._id();
-    if (wizardId != null && wizardId !== "")
-    {
-        wizardSubstitute._id(wizardId);
-    }
-
-    wizardSubstitute.html(wizard.find(".content").html());
-    wizard.after(wizardSubstitute);
-    wizard.remove();
-
-    return wizardSubstitute;
-}
-
-/**
- * Triggers the onFinishing and onFinished event.
- *
- * @static
- * @private
- * @method finishStep
- * @param wizard {Object} The jQuery wizard object
- * @param state {Object} The state container of the current wizard
- **/
-function finishStep(wizard, state)
-{
-    var currentStep = wizard.find(".steps li").eq(state.currentIndex);
-
-    if (wizard.triggerHandler("finishing", [state.currentIndex]))
-    {
-        currentStep.addClass("done").removeClass("error");
-        wizard.triggerHandler("finished", [state.currentIndex]);
-    }
-    else
-    {
-        currentStep.addClass("error");
-    }
-}
-
-/**
- * Gets or creates if not exist an unique event namespace for the given wizard instance.
- *
- * @static
- * @private
- * @method getEventNamespace
- * @param wizard {Object} A jQuery wizard object
- * @return {String} Returns the unique event namespace for the given wizard
- */
-function getEventNamespace(wizard)
-{
-    var eventNamespace = wizard.data("eventNamespace");
-
-    if (eventNamespace == null)
-    {
-        eventNamespace = "." + getUniqueId(wizard);
-        wizard.data("eventNamespace", eventNamespace);
-    }
-
-    return eventNamespace;
-}
-
-function getStepAnchor(wizard, index)
-{
-    var uniqueId = getUniqueId(wizard);
-
-    return wizard.find("#" + uniqueId + _tabSuffix + index);
-}
-
-function getStepPanel(wizard, index)
-{
-    var uniqueId = getUniqueId(wizard);
-
-    return wizard.find("#" + uniqueId + _tabpanelSuffix + index);
-}
-
-function getStepTitle(wizard, index)
-{
-    var uniqueId = getUniqueId(wizard);
-
-    return wizard.find("#" + uniqueId + _titleSuffix + index);
-}
-
-function getOptions(wizard)
-{
-    return wizard.data("options");
-}
-
-function getState(wizard)
-{
-    return wizard.data("state");
-}
-
-function getSteps(wizard)
-{
-    return wizard.data("steps");
-}
-
-/**
- * Gets a specific step object by index.
- *
- * @static
- * @private
- * @method getStep
- * @param index {Integer} An integer that belongs to the position of a step
- * @return {Object} A specific step object
- **/
-function getStep(wizard, index)
-{
-    var steps = getSteps(wizard);
-
-    if (index < 0 || index >= steps.length)
-    {
-        throwError(_indexOutOfRangeErrorMessage);
-    }
-
-    return steps[index];
-}
-
-/**
- * Gets or creates if not exist an unique id from the given wizard instance.
- *
- * @static
- * @private
- * @method getUniqueId
- * @param wizard {Object} A jQuery wizard object
- * @return {String} Returns the unique id for the given wizard
- */
-function getUniqueId(wizard)
-{
-    var uniqueId = wizard.data("uid");
-
-    if (uniqueId == null)
-    {
-        uniqueId = wizard._id();
-        if (uniqueId == null)
-        {
-            uniqueId = "steps-uid-".concat(_uniqueId);
-            wizard._id(uniqueId);
-        }
-
-        _uniqueId++;
-        wizard.data("uid", uniqueId);
-    }
-
-    return uniqueId;
-}
-
-/**
- * Gets a valid enum value by checking a specific enum key or value.
- * 
- * @static
- * @private
- * @method getValidEnumValue
- * @param enumType {Object} Type of enum
- * @param keyOrValue {Object} Key as `String` or value as `Integer` to check for
- */
-function getValidEnumValue(enumType, keyOrValue)
-{
-    validateArgument("enumType", enumType);
-    validateArgument("keyOrValue", keyOrValue);
-
-    // Is key
-    if (typeof keyOrValue === "string")
-    {
-        var value = enumType[keyOrValue];
-        if (value === undefined)
-        {
-            throwError("The enum key '{0}' does not exist.", keyOrValue);
-        }
-
-        return value;
-    }
-    // Is value
-    else if (typeof keyOrValue === "number")
-    {
-        for (var key in enumType)
-        {
-            if (enumType[key] === keyOrValue)
-            {
-                return keyOrValue;
-            }
-        }
-
-        throwError("Invalid enum value '{0}'.", keyOrValue);
-    }
-    // Type is not supported
-    else
-    {
-        throwError("Invalid key or value type.");
-    }
-}
-
-/**
- * Routes to the next step.
- *
- * @static
- * @private
- * @method goToNextStep
- * @param wizard {Object} The jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @return {Boolean} Indicates whether the action executed
- **/
-function goToNextStep(wizard, options, state)
-{
-    return paginationClick(wizard, options, state, increaseCurrentIndexBy(state, 1));
-}
-
-/**
- * Routes to the previous step.
- *
- * @static
- * @private
- * @method goToPreviousStep
- * @param wizard {Object} The jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @return {Boolean} Indicates whether the action executed
- **/
-function goToPreviousStep(wizard, options, state)
-{
-    return paginationClick(wizard, options, state, decreaseCurrentIndexBy(state, 1));
-}
-
-/**
- * Routes to a specific step by a given index.
- *
- * @static
- * @private
- * @method goToStep
- * @param wizard {Object} The jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param index {Integer} The position (zero-based) to route to
- * @return {Boolean} Indicates whether the action succeeded or failed
- **/
-function goToStep(wizard, options, state, index)
-{
-    if (index < 0 || index >= state.stepCount)
-    {
-        throwError(_indexOutOfRangeErrorMessage);
-    }
-
-    if (options.forceMoveForward && index < state.currentIndex)
-    {
-        return;
-    }
-
-    var oldIndex = state.currentIndex;
-    if (wizard.triggerHandler("stepChanging", [state.currentIndex, index]))
-    {
-        // Save new state
-        state.currentIndex = index;
-        saveCurrentStateToCookie(wizard, options, state);
-
-        // Change visualisation
-        refreshStepNavigation(wizard, options, state, oldIndex);
-        refreshPagination(wizard, options, state);
-        loadAsyncContent(wizard, options, state);
-        startTransitionEffect(wizard, options, state, index, oldIndex, function()
-        {
-            wizard.triggerHandler("stepChanged", [index, oldIndex]);
-        });
-    }
-    else
-    {
-        wizard.find(".steps li").eq(oldIndex).addClass("error");
-    }
-
-    return true;
-}
-
-function increaseCurrentIndexBy(state, increaseBy)
-{
-    return state.currentIndex + increaseBy;
-}
-
-/**
- * Initializes the component.
- *
- * @static
- * @private
- * @method initialize
- * @param options {Object} The component settings
- **/
-function initialize(options)
-{
-    /*jshint -W040 */
-    var opts = $.extend(true, {}, defaults, options);
-
-    return this.each(function ()
-    {
-        var wizard = $(this);
-        var state = {
-            currentIndex: opts.startIndex,
-            currentStep: null,
-            stepCount: 0,
-            transitionElement: null
-        };
-
-        // Create data container
-        wizard.data("options", opts);
-        wizard.data("state", state);
-        wizard.data("steps", []);
-
-        analyzeData(wizard, opts, state);
-        render(wizard, opts, state);
-        registerEvents(wizard, opts);
-
-        // Trigger focus
-        if (opts.autoFocus && _uniqueId === 0)
-        {
-            getStepAnchor(wizard, opts.startIndex).focus();
-        }
-
-        wizard.triggerHandler("init", [opts.startIndex]);
-    });
-}
-
-/**
- * Inserts a new step to a specific position.
- *
- * @static
- * @private
- * @method insertStep
- * @param wizard {Object} The jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param index {Integer} The position (zero-based) to add
- * @param step {Object} The step object to add
- * @example
- *     $("#wizard").steps().insert(0, {
- *         title: "Title",
- *         content: "", // optional
- *         contentMode: "async", // optional
- *         contentUrl: "/Content/Step/1" // optional
- *     });
- * @chainable
- **/
-function insertStep(wizard, options, state, index, step)
-{
-    if (index < 0 || index > state.stepCount)
-    {
-        throwError(_indexOutOfRangeErrorMessage);
-    }
-
-    // TODO: Validate step object
-
-    // Change data
-    step = $.extend({}, stepModel, step);
-    insertStepToCache(wizard, index, step);
-    if (state.currentIndex !== state.stepCount && state.currentIndex >= index)
-    {
-        state.currentIndex++;
-        saveCurrentStateToCookie(wizard, options, state);
-    }
-    state.stepCount++;
-
-    var contentContainer = wizard.find(".content"),
-        header = $("<{0}>{1}</{0}>".format(options.headerTag, step.title)),
-        body = $("<{0}></{0}>".format(options.bodyTag));
-
-    if (step.contentMode == null || step.contentMode === contentMode.html)
-    {
-        body.html(step.content);
-    }
-
-    if (index === 0)
-    {
-        contentContainer.prepend(body).prepend(header);
-    }
-    else
-    {
-        getStepPanel(wizard, (index - 1)).after(body).after(header);
-    }
-
-    renderBody(wizard, state, body, index);
-    renderTitle(wizard, options, state, header, index);
-    refreshSteps(wizard, options, state, index);
-    if (index === state.currentIndex)
-    {
-        refreshStepNavigation(wizard, options, state);
-    }
-    refreshPagination(wizard, options, state);
-
-    return wizard;
-}
-
-/**
- * Inserts a step object to the cache at a specific position.
- *
- * @static
- * @private
- * @method insertStepToCache
- * @param wizard {Object} A jQuery wizard object
- * @param index {Integer} The position (zero-based) to add
- * @param step {Object} The step object to add
- **/
-function insertStepToCache(wizard, index, step)
-{
-    getSteps(wizard).splice(index, 0, step);
-}
-
-/**
- * Handles the keyup DOM event for pagination.
- *
- * @static
- * @private
- * @event keyup
- * @param event {Object} An event object
- */
-function keyUpHandler(event)
-{
-    var wizard = $(this),
-        options = getOptions(wizard),
-        state = getState(wizard);
-
-    if (options.suppressPaginationOnFocus && wizard.find(":focus").is(":input"))
-    {
-        event.preventDefault();
-        return false;
-    }
-
-    var keyCodes = { left: 37, right: 39 };
-    if (event.keyCode === keyCodes.left)
-    {
-        event.preventDefault();
-        goToPreviousStep(wizard, options, state);
-    }
-    else if (event.keyCode === keyCodes.right)
-    {
-        event.preventDefault();
-        goToNextStep(wizard, options, state);
-    }
-}
-
-/**
- * Loads and includes async content.
- *
- * @static
- * @private
- * @method loadAsyncContent
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- */
-function loadAsyncContent(wizard, options, state)
-{
-    if (state.stepCount > 0)
-    {
-        var currentIndex = state.currentIndex,
-            currentStep = getStep(wizard, currentIndex);
-
-        if (!options.enableContentCache || !currentStep.contentLoaded)
-        {
-            switch (getValidEnumValue(contentMode, currentStep.contentMode))
-            {
-                case contentMode.iframe:
-                    wizard.find(".content > .body").eq(state.currentIndex).empty()
-                        .html("<iframe src=\"" + currentStep.contentUrl + "\" frameborder=\"0\" scrolling=\"no\" />")
-                        .data("loaded", "1");
-                    break;
-
-                case contentMode.async:
-                    var currentStepContent = getStepPanel(wizard, currentIndex)._aria("busy", "true")
-                        .empty().append(renderTemplate(options.loadingTemplate, { text: options.labels.loading }));
-
-                    $.ajax({ url: currentStep.contentUrl, cache: false }).done(function (data)
-                    {
-                        currentStepContent.empty().html(data)._aria("busy", "false").data("loaded", "1");
-                        wizard.triggerHandler("contentLoaded", [currentIndex]);
-                    });
-                    break;
-            }
-        }
-    }
-}
-
-/**
- * Fires the action next or previous click event.
- *
- * @static
- * @private
- * @method paginationClick
- * @param wizard {Object} The jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param index {Integer} The position (zero-based) to route to
- * @return {Boolean} Indicates whether the event fired successfully or not
- **/
-function paginationClick(wizard, options, state, index)
-{
-    var oldIndex = state.currentIndex;
-
-    if (index >= 0 && index < state.stepCount && !(options.forceMoveForward && index < state.currentIndex))
-    {
-        var anchor = getStepAnchor(wizard, index),
-            parent = anchor.parent(),
-            isDisabled = parent.hasClass("disabled");
-
-        // Enable the step to make the anchor clickable!
-        parent._enableAria();
-        anchor.click();
-
-        // An error occured
-        if (oldIndex === state.currentIndex && isDisabled)
-        {
-            // Disable the step again if current index has not changed; prevents click action.
-            parent._enableAria(false);
-            return false;
-        }
-
-        return true;
-    }
-
-    return false;
-}
-
-/**
- * Fires when a pagination click happens.
- *
- * @static
- * @private
- * @event click
- * @param event {Object} An event object
- */
-function paginationClickHandler(event)
-{
-    event.preventDefault();
-
-    var anchor = $(this),
-        wizard = anchor.parent().parent().parent().parent(),
-        options = getOptions(wizard),
-        state = getState(wizard),
-        href = anchor.attr("href");
-
-    switch (href.substring(href.lastIndexOf("#") + 1))
-    {
-        case "cancel":
-            cancel(wizard);
-            break;
-
-        case "finish":
-            finishStep(wizard, state);
-            break;
-
-        case "next":
-            goToNextStep(wizard, options, state);
-            break;
-
-        case "previous":
-            goToPreviousStep(wizard, options, state);
-            break;
-    }
-}
-
-/**
- * Refreshs the visualization state for the entire pagination.
- *
- * @static
- * @private
- * @method refreshPagination
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- */
-function refreshPagination(wizard, options, state)
-{
-    if (options.enablePagination)
-    {
-        var finish = wizard.find(".actions a[href$='#finish']").parent(),
-            next = wizard.find(".actions a[href$='#next']").parent();
-
-        if (!options.forceMoveForward)
-        {
-            var previous = wizard.find(".actions a[href$='#previous']").parent();
-            previous._enableAria(state.currentIndex > 0);
-        }
-
-        if (options.enableFinishButton && options.showFinishButtonAlways)
-        {
-            finish._enableAria(state.stepCount > 0);
-            next._enableAria(state.stepCount > 1 && state.stepCount > (state.currentIndex + 1));
-        }
-        else
-        {
-            finish._showAria(options.enableFinishButton && state.stepCount === (state.currentIndex + 1));
-            next._showAria(state.stepCount === 0 || state.stepCount > (state.currentIndex + 1)).
-                _enableAria(state.stepCount > (state.currentIndex + 1) || !options.enableFinishButton);
-        }
-    }
-}
-
-/**
- * Refreshs the visualization state for the step navigation (tabs).
- *
- * @static
- * @private
- * @method refreshStepNavigation
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param [oldIndex] {Integer} The index of the prior step
- */
-function refreshStepNavigation(wizard, options, state, oldIndex)
-{
-    var currentOrNewStepAnchor = getStepAnchor(wizard, state.currentIndex),
-        currentInfo = $("<span class=\"current-info audible\">" + options.labels.current + " </span>"),
-        stepTitles = wizard.find(".content > .title");
-
-    if (oldIndex != null)
-    {
-        var oldStepAnchor = getStepAnchor(wizard, oldIndex);
-        oldStepAnchor.parent().addClass("done").removeClass("error")._selectAria(false);
-        stepTitles.eq(oldIndex).removeClass("current").next(".body").removeClass("current");
-        currentInfo = oldStepAnchor.find(".current-info");
-        currentOrNewStepAnchor.focus();
-    }
-
-    currentOrNewStepAnchor.prepend(currentInfo).parent()._selectAria().removeClass("done")._enableAria();
-    stepTitles.eq(state.currentIndex).addClass("current").next(".body").addClass("current");
-}
-
-/**
- * Refreshes step buttons and their related titles beyond a certain position.
- *
- * @static
- * @private
- * @method refreshSteps
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param index {Integer} The start point for refreshing ids
- */
-function refreshSteps(wizard, options, state, index)
-{
-    var uniqueId = getUniqueId(wizard);
-
-    for (var i = index; i < state.stepCount; i++)
-    {
-        var uniqueStepId = uniqueId + _tabSuffix + i,
-            uniqueBodyId = uniqueId + _tabpanelSuffix + i,
-            uniqueHeaderId = uniqueId + _titleSuffix + i,
-            title = wizard.find(".title").eq(i)._id(uniqueHeaderId);
-
-        wizard.find(".steps a").eq(i)._id(uniqueStepId)
-            ._aria("controls", uniqueBodyId).attr("href", "#" + uniqueHeaderId)
-            .html(renderTemplate(options.titleTemplate, { index: i + 1, title: title.html() }));
-        wizard.find(".body").eq(i)._id(uniqueBodyId)
-            ._aria("labelledby", uniqueHeaderId);
-    }
-}
-
-function registerEvents(wizard, options)
-{
-    var eventNamespace = getEventNamespace(wizard);
-
-    wizard.bind("canceled" + eventNamespace, options.onCanceled);
-    wizard.bind("contentLoaded" + eventNamespace, options.onContentLoaded);
-    wizard.bind("finishing" + eventNamespace, options.onFinishing);
-    wizard.bind("finished" + eventNamespace, options.onFinished);
-    wizard.bind("init" + eventNamespace, options.onInit);
-    wizard.bind("stepChanging" + eventNamespace, options.onStepChanging);
-    wizard.bind("stepChanged" + eventNamespace, options.onStepChanged);
-
-    if (options.enableKeyNavigation)
-    {
-        wizard.bind("keyup" + eventNamespace, keyUpHandler);
-    }
-
-    wizard.find(".actions a").bind("click" + eventNamespace, paginationClickHandler);
-}
-
-/**
- * Removes a specific step by an given index.
- *
- * @static
- * @private
- * @method removeStep
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param index {Integer} The position (zero-based) of the step to remove
- * @return Indecates whether the item is removed.
- **/
-function removeStep(wizard, options, state, index)
-{
-    // Index out of range and try deleting current item will return false.
-    if (index < 0 || index >= state.stepCount || state.currentIndex === index)
-    {
-        return false;
-    }
-
-    // Change data
-    removeStepFromCache(wizard, index);
-    if (state.currentIndex > index)
-    {
-        state.currentIndex--;
-        saveCurrentStateToCookie(wizard, options, state);
-    }
-    state.stepCount--;
-
-    getStepTitle(wizard, index).remove();
-    getStepPanel(wizard, index).remove();
-    getStepAnchor(wizard, index).parent().remove();
-
-    // Set the "first" class to the new first step button 
-    if (index === 0)
-    {
-        wizard.find(".steps li").first().addClass("first");
-    }
-
-    // Set the "last" class to the new last step button 
-    if (index === state.stepCount)
-    {
-        wizard.find(".steps li").eq(index).addClass("last");
-    }
-
-    refreshSteps(wizard, options, state, index);
-    refreshPagination(wizard, options, state);
-
-    return true;
-}
-
-function removeStepFromCache(wizard, index)
-{
-    getSteps(wizard).splice(index, 1);
-}
-
-/**
- * Transforms the base html structure to a more sensible html structure.
- *
- * @static
- * @private
- * @method render
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- **/
-function render(wizard, options, state)
-{
-    // Create a content wrapper and copy HTML from the intial wizard structure
-    var wrapperTemplate = "<{0} class=\"{1}\">{2}</{0}>",
-        orientation = getValidEnumValue(stepsOrientation, options.stepsOrientation),
-        verticalCssClass = (orientation === stepsOrientation.vertical) ? " vertical" : "",
-        contentWrapper = $(wrapperTemplate.format(options.contentContainerTag, "content " + options.clearFixCssClass, wizard.html())),
-        stepsWrapper = $(wrapperTemplate.format(options.stepsContainerTag, "steps " + options.clearFixCssClass, "<ul role=\"tablist\"></ul>")),
-        stepTitles = contentWrapper.children(options.headerTag),
-        stepContents = contentWrapper.children(options.bodyTag);
-
-    // Transform the wizard wrapper and remove the inner HTML
-    wizard.attr("role", "application").empty().append(stepsWrapper).append(contentWrapper)
-        .addClass(options.cssClass + " " + options.clearFixCssClass + verticalCssClass);
-
-    // Add WIA-ARIA support
-    stepContents.each(function (index)
-    {
-        renderBody(wizard, state, $(this), index);
-    });
-
-    stepTitles.each(function (index)
-    {
-        renderTitle(wizard, options, state, $(this), index);
-    });
-
-    refreshStepNavigation(wizard, options, state);
-    renderPagination(wizard, options, state);
-}
-
-/**
- * Transforms the body to a proper tabpanel.
- *
- * @static
- * @private
- * @method renderBody
- * @param wizard {Object} A jQuery wizard object
- * @param body {Object} A jQuery body object
- * @param index {Integer} The position of the body
- */
-function renderBody(wizard, state, body, index)
-{
-    var uniqueId = getUniqueId(wizard),
-        uniqueBodyId = uniqueId + _tabpanelSuffix + index,
-        uniqueHeaderId = uniqueId + _titleSuffix + index;
-
-    body._id(uniqueBodyId).attr("role", "tabpanel")._aria("labelledby", uniqueHeaderId)
-        .addClass("body")._showAria(state.currentIndex === index);
-}
-
-/**
- * Renders a pagination if enabled.
- *
- * @static
- * @private
- * @method renderPagination
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- */
-function renderPagination(wizard, options, state)
-{
-    if (options.enablePagination)
-    {
-        var pagination = "<{0} class=\"actions {1}\"><ul role=\"menu\" aria-label=\"{2}\">{3}</ul></{0}>",
-            buttonTemplate = "<li><a href=\"#{0}\" role=\"menuitem\">{1}</a></li>",
-            buttons = "";
-
-        if (!options.forceMoveForward)
-        {
-            buttons += buttonTemplate.format("previous", options.labels.previous);
-        }
-
-        buttons += buttonTemplate.format("next", options.labels.next);
-
-        if (options.enableFinishButton)
-        {
-            buttons += buttonTemplate.format("finish", options.labels.finish);
-        }
-
-        if (options.enableCancelButton)
-        {
-            buttons += buttonTemplate.format("cancel", options.labels.cancel);
-        }
-
-        wizard.append(pagination.format(options.actionContainerTag, options.clearFixCssClass,
-            options.labels.pagination, buttons));
-
-        refreshPagination(wizard, options, state);
-        loadAsyncContent(wizard, options, state);
-    }
-}
-
-/**
- * Renders a template and replaces all placeholder.
- *
- * @static
- * @private
- * @method renderTemplate
- * @param template {String} A template
- * @param substitutes {Object} A list of substitute
- * @return {String} The rendered template
- */
-function renderTemplate(template, substitutes)
-{
-    var matches = template.match(/#([a-z]*)#/gi);
-
-    for (var i = 0; i < matches.length; i++)
-    {
-        var match = matches[i], 
-            key = match.substring(1, match.length - 1);
-
-        if (substitutes[key] === undefined)
-        {
-            throwError("The key '{0}' does not exist in the substitute collection!", key);
-        }
-
-        template = template.replace(match, substitutes[key]);
-    }
-
-    return template;
-}
-
-/**
- * Transforms the title to a step item button.
- *
- * @static
- * @private
- * @method renderTitle
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- * @param header {Object} A jQuery header object
- * @param index {Integer} The position of the header
- */
-function renderTitle(wizard, options, state, header, index)
-{
-    var uniqueId = getUniqueId(wizard),
-        uniqueStepId = uniqueId + _tabSuffix + index,
-        uniqueBodyId = uniqueId + _tabpanelSuffix + index,
-        uniqueHeaderId = uniqueId + _titleSuffix + index,
-        stepCollection = wizard.find(".steps > ul"),
-        title = renderTemplate(options.titleTemplate, {
-            index: index + 1,
-            title: header.html()
-        }),
-        stepItem = $("<li role=\"tab\"><a id=\"" + uniqueStepId + "\" href=\"#" + uniqueHeaderId + 
-            "\" aria-controls=\"" + uniqueBodyId + "\">" + title + "</a></li>");
-        
-    stepItem._enableAria(options.enableAllSteps || state.currentIndex > index);
-
-    if (state.currentIndex > index)
-    {
-        stepItem.addClass("done");
-    }
-
-    header._id(uniqueHeaderId).attr("tabindex", "-1").addClass("title");
-
-    if (index === 0)
-    {
-        stepCollection.prepend(stepItem);
-    }
-    else
-    {
-        stepCollection.find("li").eq(index - 1).after(stepItem);
-    }
-
-    // Set the "first" class to the new first step button
-    if (index === 0)
-    {
-        stepCollection.find("li").removeClass("first").eq(index).addClass("first");
-    }
-
-    // Set the "last" class to the new last step button
-    if (index === (state.stepCount - 1))
-    {
-        stepCollection.find("li").removeClass("last").eq(index).addClass("last");
-    }
-
-    // Register click event
-    stepItem.children("a").bind("click" + getEventNamespace(wizard), stepClickHandler);
-}
-
-/**
- * Saves the current state to a cookie.
- *
- * @static
- * @private
- * @method saveCurrentStateToCookie
- * @param wizard {Object} A jQuery wizard object
- * @param options {Object} Settings of the current wizard
- * @param state {Object} The state container of the current wizard
- */
-function saveCurrentStateToCookie(wizard, options, state)
-{
-    if (options.saveState && $.cookie)
-    {
-        $.cookie(_cookiePrefix + getUniqueId(wizard), state.currentIndex);
-    }
-}
-
-function startTransitionEffect(wizard, options, state, index, oldIndex, doneCallback)
-{
-    var stepContents = wizard.find(".content > .body"),
-        effect = getValidEnumValue(transitionEffect, options.transitionEffect),
-        effectSpeed = options.transitionEffectSpeed,
-        newStep = stepContents.eq(index),
-        currentStep = stepContents.eq(oldIndex);
-
-    switch (effect)
-    {
-        case transitionEffect.fade:
-        case transitionEffect.slide:
-            var hide = (effect === transitionEffect.fade) ? "fadeOut" : "slideUp",
-                show = (effect === transitionEffect.fade) ? "fadeIn" : "slideDown";
-
-            state.transitionElement = newStep;
-            currentStep[hide](effectSpeed, function ()
-            {
-                var wizard = $(this)._showAria(false).parent().parent(),
-                    state = getState(wizard);
-
-                if (state.transitionElement)
-                {
-                    state.transitionElement[show](effectSpeed, function ()
-                    {
-                        $(this)._showAria();
-                    }).promise().done(doneCallback);
-                    state.transitionElement = null;
-                }
-            });
-            break;
-
-        case transitionEffect.slideLeft:
-            var outerWidth = currentStep.outerWidth(true),
-                posFadeOut = (index > oldIndex) ? -(outerWidth) : outerWidth,
-                posFadeIn = (index > oldIndex) ? outerWidth : -(outerWidth);
-
-            $.when(currentStep.animate({ left: posFadeOut }, effectSpeed, 
-                    function () { $(this)._showAria(false); }),
-                newStep.css("left", posFadeIn + "px")._showAria()
-                    .animate({ left: 0 }, effectSpeed)).done(doneCallback);
-            break;
-
-        default:
-            $.when(currentStep._showAria(false), newStep._showAria())
-                .done(doneCallback);
-            break;
-    }
-}
-
-/**
- * Fires when a step click happens.
- *
- * @static
- * @private
- * @event click
- * @param event {Object} An event object
- */
-function stepClickHandler(event)
-{
-    event.preventDefault();
-
-    var anchor = $(this),
-        wizard = anchor.parent().parent().parent().parent(),
-        options = getOptions(wizard),
-        state = getState(wizard),
-        oldIndex = state.currentIndex;
-
-    if (anchor.parent().is(":not(.disabled):not(.current)"))
-    {
-        var href = anchor.attr("href"),
-            position = parseInt(href.substring(href.lastIndexOf("-") + 1), 0);
-
-        goToStep(wizard, options, state, position);
-    }
-
-    // If nothing has changed
-    if (oldIndex === state.currentIndex)
-    {
-        getStepAnchor(wizard, oldIndex).focus();
-        return false;
-    }
-}
-
-function throwError(message)
-{
-    if (arguments.length > 1)
-    {
-        message = message.format(Array.prototype.slice.call(arguments, 1));
-    }
-
-    throw new Error(message);
-}
-
-/**
- * Checks an argument for null or undefined and throws an error if one check applies.
- *
- * @static
- * @private
- * @method validateArgument
- * @param argumentName {String} The name of the given argument
- * @param argumentValue {Object} The argument itself
- */
-function validateArgument(argumentName, argumentValue)
-{
-    if (argumentValue == null)
-    {
-        throwError("The argument '{0}' is null or undefined.", argumentName);
-    }
-}
-
-/**
- * Represents a jQuery wizard plugin.
- *
- * @class steps
- * @constructor
- * @param [method={}] The name of the method as `String` or an JSON object for initialization
- * @param [params=]* {Array} Additional arguments for a method call
- * @chainable
- **/
-$.fn.steps = function (method)
-{
-    if ($.fn.steps[method])
-    {
-        return $.fn.steps[method].apply(this, Array.prototype.slice.call(arguments, 1));
-    }
-    else if (typeof method === "object" || !method)
-    {
-        return initialize.apply(this, arguments);
-    }
-    else
-    {
-        $.error("Method " + method + " does not exist on jQuery.steps");
-    }
-};
-
-/**
- * Adds a new step.
- *
- * @method add
- * @param step {Object} The step object to add
- * @chainable
- **/
-$.fn.steps.add = function (step)
-{
-    var state = getState(this);
-    return insertStep(this, getOptions(this), state, state.stepCount, step);
-};
-
-/**
- * Removes the control functionality completely and transforms the current state to the initial HTML structure.
- *
- * @method destroy
- * @chainable
- **/
-$.fn.steps.destroy = function ()
-{
-    return destroy(this, getOptions(this));
-};
-
-/**
- * Triggers the onFinishing and onFinished event.
- *
- * @method finish
- **/
-$.fn.steps.finish = function ()
-{
-    finishStep(this, getState(this));
-};
-
-/**
- * Gets the current step index.
- *
- * @method getCurrentIndex
- * @return {Integer} The actual step index (zero-based)
- * @for steps
- **/
-$.fn.steps.getCurrentIndex = function ()
-{
-    return getState(this).currentIndex;
-};
-
-/**
- * Gets the current step object.
- *
- * @method getCurrentStep
- * @return {Object} The actual step object
- **/
-$.fn.steps.getCurrentStep = function ()
-{
-    return getStep(this, getState(this).currentIndex);
-};
-
-/**
- * Gets a specific step object by index.
- *
- * @method getStep
- * @param index {Integer} An integer that belongs to the position of a step
- * @return {Object} A specific step object
- **/
-$.fn.steps.getStep = function (index)
-{
-    return getStep(this, index);
-};
-
-/**
- * Inserts a new step to a specific position.
- *
- * @method insert
- * @param index {Integer} The position (zero-based) to add
- * @param step {Object} The step object to add
- * @example
- *     $("#wizard").steps().insert(0, {
- *         title: "Title",
- *         content: "", // optional
- *         contentMode: "async", // optional
- *         contentUrl: "/Content/Step/1" // optional
- *     });
- * @chainable
- **/
-$.fn.steps.insert = function (index, step)
-{
-    return insertStep(this, getOptions(this), getState(this), index, step);
-};
-
-/**
- * Routes to the next step.
- *
- * @method next
- * @return {Boolean} Indicates whether the action executed
- **/
-$.fn.steps.next = function ()
-{
-    return goToNextStep(this, getOptions(this), getState(this));
-};
-
-/**
- * Routes to the previous step.
- *
- * @method previous
- * @return {Boolean} Indicates whether the action executed
- **/
-$.fn.steps.previous = function ()
-{
-    return goToPreviousStep(this, getOptions(this), getState(this));
-};
-
-/**
- * Removes a specific step by an given index.
- *
- * @method remove
- * @param index {Integer} The position (zero-based) of the step to remove
- * @return Indecates whether the item is removed.
- **/
-$.fn.steps.remove = function (index)
-{
-    return removeStep(this, getOptions(this), getState(this), index);
-};
-
-/**
- * Sets a specific step object by index.
- *
- * @method setStep
- * @param index {Integer} An integer that belongs to the position of a step
- * @param step {Object} The step object to change
- **/
-$.fn.steps.setStep = function (index, step)
-{
-    throw new Error("Not yet implemented!");
-};
-
-/**
- * Skips an certain amount of steps.
- *
- * @method skip
- * @param count {Integer} The amount of steps that should be skipped
- * @return {Boolean} Indicates whether the action executed
- **/
-$.fn.steps.skip = function (count)
-{
-    throw new Error("Not yet implemented!");
-};
-
-/**
- * An enum represents the different content types of a step and their loading mechanisms.
- *
- * @class contentMode
- * @for steps
- **/
-var contentMode = $.fn.steps.contentMode = {
-    /**
-     * HTML embedded content
-     *
-     * @readOnly
-     * @property html
-     * @type Integer
-     * @for contentMode
-     **/
-    html: 0,
-
-    /**
-     * IFrame embedded content
-     *
-     * @readOnly
-     * @property iframe
-     * @type Integer
-     * @for contentMode
-     **/
-    iframe: 1,
-
-    /**
-     * Async embedded content
-     *
-     * @readOnly
-     * @property async
-     * @type Integer
-     * @for contentMode
-     **/
-    async: 2
-};
-
-/**
- * An enum represents the orientation of the steps navigation.
- *
- * @class stepsOrientation
- * @for steps
- **/
-var stepsOrientation = $.fn.steps.stepsOrientation = {
-    /**
-     * Horizontal orientation
-     *
-     * @readOnly
-     * @property horizontal
-     * @type Integer
-     * @for stepsOrientation
-     **/
-    horizontal: 0,
-
-    /**
-     * Vertical orientation
-     *
-     * @readOnly
-     * @property vertical
-     * @type Integer
-     * @for stepsOrientation
-     **/
-    vertical: 1
-};
-
-/**
- * An enum that represents the various transition animations.
- *
- * @class transitionEffect
- * @for steps
- **/
-var transitionEffect = $.fn.steps.transitionEffect = {
-    /**
-     * No transition animation
-     *
-     * @readOnly
-     * @property none
-     * @type Integer
-     * @for transitionEffect
-     **/
-    none: 0,
-
-    /**
-     * Fade in transition
-     *
-     * @readOnly
-     * @property fade
-     * @type Integer
-     * @for transitionEffect
-     **/
-    fade: 1,
-
-    /**
-     * Slide up transition
-     *
-     * @readOnly
-     * @property slide
-     * @type Integer
-     * @for transitionEffect
-     **/
-    slide: 2,
-
-    /**
-     * Slide left transition
-     *
-     * @readOnly
-     * @property slideLeft
-     * @type Integer
-     * @for transitionEffect
-     **/
-    slideLeft: 3
-};
-
-var stepModel = $.fn.steps.stepModel = {
-    title: "",
-    content: "",
-    contentUrl: "",
-    contentMode: contentMode.html,
-    contentLoaded: false
-};
-
-/**
- * An object that represents the default settings.
- * There are two possibities to override the sub-properties.
- * Either by doing it generally (global) or on initialization.
- *
- * @static
- * @class defaults
- * @for steps
- * @example
- *   // Global approach
- *   $.steps.defaults.headerTag = "h3";
- * @example
- *   // Initialization approach
- *   $("#wizard").steps({ headerTag: "h3" });
- **/
-var defaults = $.fn.steps.defaults = {
-    /**
-     * The header tag is used to find the step button text within the declared wizard area.
-     *
-     * @property headerTag
-     * @type String
-     * @default "h1"
-     * @for defaults
-     **/
-    headerTag: "h1",
-
-    /**
-     * The body tag is used to find the step content within the declared wizard area.
-     *
-     * @property bodyTag
-     * @type String
-     * @default "div"
-     * @for defaults
-     **/
-    bodyTag: "div",
-
-    /**
-     * The content container tag which will be used to wrap all step contents.
-     *
-     * @property contentContainerTag
-     * @type String
-     * @default "div"
-     * @for defaults
-     **/
-    contentContainerTag: "div",
-
-    /**
-     * The action container tag which will be used to wrap the pagination navigation.
-     *
-     * @property actionContainerTag
-     * @type String
-     * @default "div"
-     * @for defaults
-     **/
-    actionContainerTag: "div",
-
-    /**
-     * The steps container tag which will be used to wrap the steps navigation.
-     *
-     * @property stepsContainerTag
-     * @type String
-     * @default "div"
-     * @for defaults
-     **/
-    stepsContainerTag: "div",
-
-    /**
-     * The css class which will be added to the outer component wrapper.
-     *
-     * @property cssClass
-     * @type String
-     * @default "wizard"
-     * @for defaults
-     * @example
-     *     <div class="wizard">
-     *         ...
-     *     </div>
-     **/
-    cssClass: "wizard",
-
-    /**
-     * The css class which will be used for floating scenarios.
-     *
-     * @property clearFixCssClass
-     * @type String
-     * @default "clearfix"
-     * @for defaults
-     **/
-    clearFixCssClass: "clearfix",
-
-    /**
-     * Determines whether the steps are vertically or horizontally oriented.
-     *
-     * @property stepsOrientation
-     * @type stepsOrientation
-     * @default horizontal
-     * @for defaults
-     * @since 1.0.0
-     **/
-    stepsOrientation: stepsOrientation.horizontal,
-
-    /*
-     * Tempplates
-     */
-
-    /**
-     * The title template which will be used to create a step button.
-     *
-     * @property titleTemplate
-     * @type String
-     * @default "<span class=\"number\">#index#.</span> #title#"
-     * @for defaults
-     **/
-    titleTemplate: "<span class=\"number\">#index#.</span> #title#",
-
-    /**
-     * The loading template which will be used to create the loading animation.
-     *
-     * @property loadingTemplate
-     * @type String
-     * @default "<span class=\"spinner\"></span> #text#"
-     * @for defaults
-     **/
-    loadingTemplate: "<span class=\"spinner\"></span> #text#",
-
-    /*
-     * Behaviour
-     */
-
-    /**
-     * Sets the focus to the first wizard instance in order to enable the key navigation from the begining if `true`. 
-     *
-     * @property autoFocus
-     * @type Boolean
-     * @default false
-     * @for defaults
-     * @since 0.9.4
-     **/
-    autoFocus: false,
-
-    /**
-     * Enables all steps from the begining if `true` (all steps are clickable).
-     *
-     * @property enableAllSteps
-     * @type Boolean
-     * @default false
-     * @for defaults
-     **/
-    enableAllSteps: false,
-
-    /**
-     * Enables keyboard navigation if `true` (arrow left and arrow right).
-     *
-     * @property enableKeyNavigation
-     * @type Boolean
-     * @default true
-     * @for defaults
-     **/
-    enableKeyNavigation: true,
-
-    /**
-     * Enables pagination if `true`.
-     *
-     * @property enablePagination
-     * @type Boolean
-     * @default true
-     * @for defaults
-     **/
-    enablePagination: true,
-
-    /**
-     * Suppresses pagination if a form field is focused.
-     *
-     * @property suppressPaginationOnFocus
-     * @type Boolean
-     * @default true
-     * @for defaults
-     **/
-    suppressPaginationOnFocus: true,
-
-    /**
-     * Enables cache for async loaded or iframe embedded content.
-     *
-     * @property enableContentCache
-     * @type Boolean
-     * @default true
-     * @for defaults
-     **/
-    enableContentCache: true,
-
-    /**
-     * Shows the cancel button if enabled.
-     *
-     * @property enableCancelButton
-     * @type Boolean
-     * @default false
-     * @for defaults
-     **/
-    enableCancelButton: false,
-
-    /**
-     * Shows the finish button if enabled.
-     *
-     * @property enableFinishButton
-     * @type Boolean
-     * @default true
-     * @for defaults
-     **/
-    enableFinishButton: true,
-
-    /**
-     * Not yet implemented.
-     *
-     * @property preloadContent
-     * @type Boolean
-     * @default false
-     * @for defaults
-     **/
-    preloadContent: false,
-
-    /**
-     * Shows the finish button always (on each step; right beside the next button) if `true`. 
-     * Otherwise the next button will be replaced by the finish button if the last step becomes active.
-     *
-     * @property showFinishButtonAlways
-     * @type Boolean
-     * @default false
-     * @for defaults
-     **/
-    showFinishButtonAlways: false,
-
-    /**
-     * Prevents jumping to a previous step.
-     *
-     * @property forceMoveForward
-     * @type Boolean
-     * @default false
-     * @for defaults
-     **/
-    forceMoveForward: false,
-
-    /**
-     * Saves the current state (step position) to a cookie.
-     * By coming next time the last active step becomes activated.
-     *
-     * @property saveState
-     * @type Boolean
-     * @default false
-     * @for defaults
-     **/
-    saveState: false,
-
-    /**
-     * The position to start on (zero-based).
-     *
-     * @property startIndex
-     * @type Integer
-     * @default 0
-     * @for defaults
-     **/
-    startIndex: 0,
-
-    /*
-     * Animation Effect Configuration
-     */
-
-    /**
-     * The animation effect which will be used for step transitions.
-     *
-     * @property transitionEffect
-     * @type transitionEffect
-     * @default none
-     * @for defaults
-     **/
-    transitionEffect: transitionEffect.none,
-
-    /**
-     * Animation speed for step transitions (in milliseconds).
-     *
-     * @property transitionEffectSpeed
-     * @type Integer
-     * @default 200
-     * @for defaults
-     **/
-    transitionEffectSpeed: 200,
-
-    /*
-     * Events
-     */
-
-    /**
-     * Fires before the step changes and can be used to prevent step changing by returning `false`. 
-     * Very useful for form validation. 
-     *
-     * @property onStepChanging
-     * @type Event
-     * @default function (event, currentIndex, newIndex) { return true; }
-     * @for defaults
-     **/
-    onStepChanging: function (event, currentIndex, newIndex) { return true; },
-
-    /**
-     * Fires after the step has change. 
-     *
-     * @property onStepChanged
-     * @type Event
-     * @default function (event, currentIndex, priorIndex) { }
-     * @for defaults
-     **/
-    onStepChanged: function (event, currentIndex, priorIndex) { },
-
-    /**
-     * Fires after cancelation. 
-     *
-     * @property onCanceled
-     * @type Event
-     * @default function (event) { }
-     * @for defaults
-     **/
-    onCanceled: function (event) { },
-
-    /**
-     * Fires before finishing and can be used to prevent completion by returning `false`. 
-     * Very useful for form validation. 
-     *
-     * @property onFinishing
-     * @type Event
-     * @default function (event, currentIndex) { return true; }
-     * @for defaults
-     **/
-    onFinishing: function (event, currentIndex) { return true; },
-
-    /**
-     * Fires after completion. 
-     *
-     * @property onFinished
-     * @type Event
-     * @default function (event, currentIndex) { }
-     * @for defaults
-     **/
-    onFinished: function (event, currentIndex) { },
-
-    /**
-     * Fires after async content is loaded. 
-     *
-     * @property onContentLoaded
-     * @type Event
-     * @default function (event, index) { }
-     * @for defaults
-     **/
-    onContentLoaded: function (event, currentIndex) { },
-
-    /**
-     * Fires when the wizard is initialized. 
-     *
-     * @property onInit
-     * @type Event
-     * @default function (event) { }
-     * @for defaults
-     **/
-    onInit: function (event, currentIndex) { },
-
-    /**
-     * Contains all labels. 
-     *
-     * @property labels
-     * @type Object
-     * @for defaults
-     **/
-    labels: {
-        /**
-         * Label for the cancel button.
-         *
-         * @property cancel
-         * @type String
-         * @default "Cancel"
-         * @for defaults
-         **/
-        cancel: "取消",
-
-        /**
-         * This label is important for accessability reasons.
-         * Indicates which step is activated.
-         *
-         * @property current
-         * @type String
-         * @default "current step:"
-         * @for defaults
-         **/
-        current: "当前步骤::",
-
-        /**
-         * This label is important for accessability reasons and describes the kind of navigation.
-         *
-         * @property pagination
-         * @type String
-         * @default "Pagination"
-         * @for defaults
-         * @since 0.9.7
-         **/
-        pagination: "分页",
-
-        /**
-         * Label for the finish button.
-         *
-         * @property finish
-         * @type String
-         * @default "Finish"
-         * @for defaults
-         **/
-        finish: "完成",
-
-        /**
-         * Label for the next button.
-         *
-         * @property next
-         * @type String
-         * @default "Next"
-         * @for defaults
-         **/
-        next: "下一步",
-
-        /**
-         * Label for the previous button.
-         *
-         * @property previous
-         * @type String
-         * @default "Previous"
-         * @for defaults
-         **/
-        previous: "上一步",
-
-        /**
-         * Label for the loading animation.
-         *
-         * @property loading
-         * @type String
-         * @default "Loading ..."
-         * @for defaults
-         **/
-        loading: "加载中 ..."
-    }
-};
-})(jQuery);
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.min.js b/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.min.js
deleted file mode 100644
index 8e617bf9..00000000
--- a/ruoyi-admin/src/main/resources/static/ajax/libs/staps/jquery.steps.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! 
- * jQuery Steps v1.1.0 - 09/04/2014
- * Copyright (c) 2014 Rafael Staib (http://www.jquery-steps.com)
- * Licensed under MIT http://www.opensource.org/licenses/MIT
- */
-(function($,undefined){$.fn.extend({_aria:function(name,value){return this.attr("aria-"+name,value)},_removeAria:function(name){return this.removeAttr("aria-"+name)},_enableAria:function(enable){return(enable==null||enable)?this.removeClass("disabled")._aria("disabled","false"):this.addClass("disabled")._aria("disabled","true")},_showAria:function(show){return(show==null||show)?this.show()._aria("hidden","false"):this.hide()._aria("hidden","true")},_selectAria:function(select){return(select==null||select)?this.addClass("current")._aria("selected","true"):this.removeClass("current")._aria("selected","false")},_id:function(id){return(id)?this.attr("id",id):this.attr("id")}});if(!String.prototype.format){String.prototype.format=function(){var args=(arguments.length===1&&$.isArray(arguments[0]))?arguments[0]:arguments;var formattedString=this;for(var i=0;i<args.length;i++){var pattern=new RegExp("\\{"+i+"\\}","gm");formattedString=formattedString.replace(pattern,args[i])}return formattedString}}var _uniqueId=0;var _cookiePrefix="jQu3ry_5teps_St@te_";var _tabSuffix="-t-";var _tabpanelSuffix="-p-";var _titleSuffix="-h-";var _indexOutOfRangeErrorMessage="Index out of range.";var _missingCorrespondingElementErrorMessage="One or more corresponding step {0} are missing.";function addStepToCache(wizard,step){getSteps(wizard).push(step)}function analyzeData(wizard,options,state){var stepTitles=wizard.children(options.headerTag),stepContents=wizard.children(options.bodyTag);if(stepTitles.length>stepContents.length){throwError(_missingCorrespondingElementErrorMessage,"contents")}else{if(stepTitles.length<stepContents.length){throwError(_missingCorrespondingElementErrorMessage,"titles")}}var startIndex=options.startIndex;state.stepCount=stepTitles.length;if(options.saveState&&$.cookie){var savedState=$.cookie(_cookiePrefix+getUniqueId(wizard));var savedIndex=parseInt(savedState,0);if(!isNaN(savedIndex)&&savedIndex<state.stepCount){startIndex=savedIndex}}state.currentIndex=startIndex;stepTitles.each(function(index){var item=$(this),content=stepContents.eq(index),modeData=content.data("mode"),mode=(modeData==null)?contentMode.html:getValidEnumValue(contentMode,(/^\s*$/.test(modeData)||isNaN(modeData))?modeData:parseInt(modeData,0)),contentUrl=(mode===contentMode.html||content.data("url")===undefined)?"":content.data("url"),contentLoaded=(mode!==contentMode.html&&content.data("loaded")==="1"),step=$.extend({},stepModel,{title:item.html(),content:(mode===contentMode.html)?content.html():"",contentUrl:contentUrl,contentMode:mode,contentLoaded:contentLoaded});addStepToCache(wizard,step)})}function cancel(wizard){wizard.triggerHandler("canceled")}function decreaseCurrentIndexBy(state,decreaseBy){return state.currentIndex-decreaseBy}function destroy(wizard,options){var eventNamespace=getEventNamespace(wizard);wizard.unbind(eventNamespace).removeData("uid").removeData("options").removeData("state").removeData("steps").removeData("eventNamespace").find(".actions a").unbind(eventNamespace);wizard.removeClass(options.clearFixCssClass+" vertical");var contents=wizard.find(".content > *");contents.removeData("loaded").removeData("mode").removeData("url");contents.removeAttr("id").removeAttr("role").removeAttr("tabindex").removeAttr("class").removeAttr("style")._removeAria("labelledby")._removeAria("hidden");wizard.find(".content > [data-mode='async'],.content > [data-mode='iframe']").empty();var wizardSubstitute=$('<{0} class="{1}"></{0}>'.format(wizard.get(0).tagName,wizard.attr("class")));var wizardId=wizard._id();if(wizardId!=null&&wizardId!==""){wizardSubstitute._id(wizardId)}wizardSubstitute.html(wizard.find(".content").html());wizard.after(wizardSubstitute);wizard.remove();return wizardSubstitute}function finishStep(wizard,state){var currentStep=wizard.find(".steps li").eq(state.currentIndex);if(wizard.triggerHandler("finishing",[state.currentIndex])){currentStep.addClass("done").removeClass("error");wizard.triggerHandler("finished",[state.currentIndex])}else{currentStep.addClass("error")}}function getEventNamespace(wizard){var eventNamespace=wizard.data("eventNamespace");if(eventNamespace==null){eventNamespace="."+getUniqueId(wizard);wizard.data("eventNamespace",eventNamespace)}return eventNamespace}function getStepAnchor(wizard,index){var uniqueId=getUniqueId(wizard);return wizard.find("#"+uniqueId+_tabSuffix+index)}function getStepPanel(wizard,index){var uniqueId=getUniqueId(wizard);return wizard.find("#"+uniqueId+_tabpanelSuffix+index)}function getStepTitle(wizard,index){var uniqueId=getUniqueId(wizard);return wizard.find("#"+uniqueId+_titleSuffix+index)}function getOptions(wizard){return wizard.data("options")}function getState(wizard){return wizard.data("state")}function getSteps(wizard){return wizard.data("steps")}function getStep(wizard,index){var steps=getSteps(wizard);if(index<0||index>=steps.length){throwError(_indexOutOfRangeErrorMessage)}return steps[index]}function getUniqueId(wizard){var uniqueId=wizard.data("uid");if(uniqueId==null){uniqueId=wizard._id();if(uniqueId==null){uniqueId="steps-uid-".concat(_uniqueId);wizard._id(uniqueId)}_uniqueId++;wizard.data("uid",uniqueId)}return uniqueId}function getValidEnumValue(enumType,keyOrValue){validateArgument("enumType",enumType);validateArgument("keyOrValue",keyOrValue);if(typeof keyOrValue==="string"){var value=enumType[keyOrValue];if(value===undefined){throwError("The enum key '{0}' does not exist.",keyOrValue)}return value}else{if(typeof keyOrValue==="number"){for(var key in enumType){if(enumType[key]===keyOrValue){return keyOrValue}}throwError("Invalid enum value '{0}'.",keyOrValue)}else{throwError("Invalid key or value type.")}}}function goToNextStep(wizard,options,state){return paginationClick(wizard,options,state,increaseCurrentIndexBy(state,1))}function goToPreviousStep(wizard,options,state){return paginationClick(wizard,options,state,decreaseCurrentIndexBy(state,1))}function goToStep(wizard,options,state,index){if(index<0||index>=state.stepCount){throwError(_indexOutOfRangeErrorMessage)}if(options.forceMoveForward&&index<state.currentIndex){return}var oldIndex=state.currentIndex;if(wizard.triggerHandler("stepChanging",[state.currentIndex,index])){state.currentIndex=index;saveCurrentStateToCookie(wizard,options,state);refreshStepNavigation(wizard,options,state,oldIndex);refreshPagination(wizard,options,state);loadAsyncContent(wizard,options,state);startTransitionEffect(wizard,options,state,index,oldIndex,function(){wizard.triggerHandler("stepChanged",[index,oldIndex])})}else{wizard.find(".steps li").eq(oldIndex).addClass("error")}return true}function increaseCurrentIndexBy(state,increaseBy){return state.currentIndex+increaseBy}function initialize(options){var opts=$.extend(true,{},defaults,options);return this.each(function(){var wizard=$(this);var state={currentIndex:opts.startIndex,currentStep:null,stepCount:0,transitionElement:null};wizard.data("options",opts);wizard.data("state",state);wizard.data("steps",[]);analyzeData(wizard,opts,state);render(wizard,opts,state);registerEvents(wizard,opts);if(opts.autoFocus&&_uniqueId===0){getStepAnchor(wizard,opts.startIndex).focus()}wizard.triggerHandler("init",[opts.startIndex])})}function insertStep(wizard,options,state,index,step){if(index<0||index>state.stepCount){throwError(_indexOutOfRangeErrorMessage)}step=$.extend({},stepModel,step);insertStepToCache(wizard,index,step);if(state.currentIndex!==state.stepCount&&state.currentIndex>=index){state.currentIndex++;saveCurrentStateToCookie(wizard,options,state)}state.stepCount++;var contentContainer=wizard.find(".content"),header=$("<{0}>{1}</{0}>".format(options.headerTag,step.title)),body=$("<{0}></{0}>".format(options.bodyTag));if(step.contentMode==null||step.contentMode===contentMode.html){body.html(step.content)}if(index===0){contentContainer.prepend(body).prepend(header)}else{getStepPanel(wizard,(index-1)).after(body).after(header)}renderBody(wizard,state,body,index);renderTitle(wizard,options,state,header,index);refreshSteps(wizard,options,state,index);if(index===state.currentIndex){refreshStepNavigation(wizard,options,state)}refreshPagination(wizard,options,state);return wizard}function insertStepToCache(wizard,index,step){getSteps(wizard).splice(index,0,step)}function keyUpHandler(event){var wizard=$(this),options=getOptions(wizard),state=getState(wizard);if(options.suppressPaginationOnFocus&&wizard.find(":focus").is(":input")){event.preventDefault();return false}var keyCodes={left:37,right:39};if(event.keyCode===keyCodes.left){event.preventDefault();goToPreviousStep(wizard,options,state)}else{if(event.keyCode===keyCodes.right){event.preventDefault();goToNextStep(wizard,options,state)}}}function loadAsyncContent(wizard,options,state){if(state.stepCount>0){var currentIndex=state.currentIndex,currentStep=getStep(wizard,currentIndex);if(!options.enableContentCache||!currentStep.contentLoaded){switch(getValidEnumValue(contentMode,currentStep.contentMode)){case contentMode.iframe:wizard.find(".content > .body").eq(state.currentIndex).empty().html('<iframe src="'+currentStep.contentUrl+'" frameborder="0" scrolling="no" />').data("loaded","1");break;case contentMode.async:var currentStepContent=getStepPanel(wizard,currentIndex)._aria("busy","true").empty().append(renderTemplate(options.loadingTemplate,{text:options.labels.loading}));$.ajax({url:currentStep.contentUrl,cache:false}).done(function(data){currentStepContent.empty().html(data)._aria("busy","false").data("loaded","1");wizard.triggerHandler("contentLoaded",[currentIndex])});break}}}}function paginationClick(wizard,options,state,index){var oldIndex=state.currentIndex;if(index>=0&&index<state.stepCount&&!(options.forceMoveForward&&index<state.currentIndex)){var anchor=getStepAnchor(wizard,index),parent=anchor.parent(),isDisabled=parent.hasClass("disabled");parent._enableAria();anchor.click();if(oldIndex===state.currentIndex&&isDisabled){parent._enableAria(false);return false}return true}return false}function paginationClickHandler(event){event.preventDefault();var anchor=$(this),wizard=anchor.parent().parent().parent().parent(),options=getOptions(wizard),state=getState(wizard),href=anchor.attr("href");switch(href.substring(href.lastIndexOf("#")+1)){case"cancel":cancel(wizard);break;case"finish":finishStep(wizard,state);break;case"next":goToNextStep(wizard,options,state);break;case"previous":goToPreviousStep(wizard,options,state);break}}function refreshPagination(wizard,options,state){if(options.enablePagination){var finish=wizard.find(".actions a[href$='#finish']").parent(),next=wizard.find(".actions a[href$='#next']").parent();if(!options.forceMoveForward){var previous=wizard.find(".actions a[href$='#previous']").parent();previous._enableAria(state.currentIndex>0)}if(options.enableFinishButton&&options.showFinishButtonAlways){finish._enableAria(state.stepCount>0);next._enableAria(state.stepCount>1&&state.stepCount>(state.currentIndex+1))}else{finish._showAria(options.enableFinishButton&&state.stepCount===(state.currentIndex+1));next._showAria(state.stepCount===0||state.stepCount>(state.currentIndex+1))._enableAria(state.stepCount>(state.currentIndex+1)||!options.enableFinishButton)}}}function refreshStepNavigation(wizard,options,state,oldIndex){var currentOrNewStepAnchor=getStepAnchor(wizard,state.currentIndex),currentInfo=$('<span class="current-info audible">'+options.labels.current+" </span>"),stepTitles=wizard.find(".content > .title");if(oldIndex!=null){var oldStepAnchor=getStepAnchor(wizard,oldIndex);oldStepAnchor.parent().addClass("done").removeClass("error")._selectAria(false);stepTitles.eq(oldIndex).removeClass("current").next(".body").removeClass("current");currentInfo=oldStepAnchor.find(".current-info");currentOrNewStepAnchor.focus()}currentOrNewStepAnchor.prepend(currentInfo).parent()._selectAria().removeClass("done")._enableAria();stepTitles.eq(state.currentIndex).addClass("current").next(".body").addClass("current")}function refreshSteps(wizard,options,state,index){var uniqueId=getUniqueId(wizard);for(var i=index;i<state.stepCount;i++){var uniqueStepId=uniqueId+_tabSuffix+i,uniqueBodyId=uniqueId+_tabpanelSuffix+i,uniqueHeaderId=uniqueId+_titleSuffix+i,title=wizard.find(".title").eq(i)._id(uniqueHeaderId);wizard.find(".steps a").eq(i)._id(uniqueStepId)._aria("controls",uniqueBodyId).attr("href","#"+uniqueHeaderId).html(renderTemplate(options.titleTemplate,{index:i+1,title:title.html()}));wizard.find(".body").eq(i)._id(uniqueBodyId)._aria("labelledby",uniqueHeaderId)}}function registerEvents(wizard,options){var eventNamespace=getEventNamespace(wizard);wizard.bind("canceled"+eventNamespace,options.onCanceled);wizard.bind("contentLoaded"+eventNamespace,options.onContentLoaded);wizard.bind("finishing"+eventNamespace,options.onFinishing);wizard.bind("finished"+eventNamespace,options.onFinished);wizard.bind("init"+eventNamespace,options.onInit);wizard.bind("stepChanging"+eventNamespace,options.onStepChanging);wizard.bind("stepChanged"+eventNamespace,options.onStepChanged);if(options.enableKeyNavigation){wizard.bind("keyup"+eventNamespace,keyUpHandler)}wizard.find(".actions a").bind("click"+eventNamespace,paginationClickHandler)}function removeStep(wizard,options,state,index){if(index<0||index>=state.stepCount||state.currentIndex===index){return false}removeStepFromCache(wizard,index);if(state.currentIndex>index){state.currentIndex--;saveCurrentStateToCookie(wizard,options,state)}state.stepCount--;getStepTitle(wizard,index).remove();getStepPanel(wizard,index).remove();getStepAnchor(wizard,index).parent().remove();if(index===0){wizard.find(".steps li").first().addClass("first")}if(index===state.stepCount){wizard.find(".steps li").eq(index).addClass("last")}refreshSteps(wizard,options,state,index);refreshPagination(wizard,options,state);return true}function removeStepFromCache(wizard,index){getSteps(wizard).splice(index,1)}function render(wizard,options,state){var wrapperTemplate='<{0} class="{1}">{2}</{0}>',orientation=getValidEnumValue(stepsOrientation,options.stepsOrientation),verticalCssClass=(orientation===stepsOrientation.vertical)?" vertical":"",contentWrapper=$(wrapperTemplate.format(options.contentContainerTag,"content "+options.clearFixCssClass,wizard.html())),stepsWrapper=$(wrapperTemplate.format(options.stepsContainerTag,"steps "+options.clearFixCssClass,'<ul role="tablist"></ul>')),stepTitles=contentWrapper.children(options.headerTag),stepContents=contentWrapper.children(options.bodyTag);wizard.attr("role","application").empty().append(stepsWrapper).append(contentWrapper).addClass(options.cssClass+" "+options.clearFixCssClass+verticalCssClass);stepContents.each(function(index){renderBody(wizard,state,$(this),index)});stepTitles.each(function(index){renderTitle(wizard,options,state,$(this),index)});refreshStepNavigation(wizard,options,state);renderPagination(wizard,options,state)}function renderBody(wizard,state,body,index){var uniqueId=getUniqueId(wizard),uniqueBodyId=uniqueId+_tabpanelSuffix+index,uniqueHeaderId=uniqueId+_titleSuffix+index;body._id(uniqueBodyId).attr("role","tabpanel")._aria("labelledby",uniqueHeaderId).addClass("body")._showAria(state.currentIndex===index)}function renderPagination(wizard,options,state){if(options.enablePagination){var pagination='<{0} class="actions {1}"><ul role="menu" aria-label="{2}">{3}</ul></{0}>',buttonTemplate='<li><a href="#{0}" role="menuitem">{1}</a></li>',buttons="";if(!options.forceMoveForward){buttons+=buttonTemplate.format("previous",options.labels.previous)}buttons+=buttonTemplate.format("next",options.labels.next);if(options.enableFinishButton){buttons+=buttonTemplate.format("finish",options.labels.finish)}if(options.enableCancelButton){buttons+=buttonTemplate.format("cancel",options.labels.cancel)}wizard.append(pagination.format(options.actionContainerTag,options.clearFixCssClass,options.labels.pagination,buttons));refreshPagination(wizard,options,state);loadAsyncContent(wizard,options,state)}}function renderTemplate(template,substitutes){var matches=template.match(/#([a-z]*)#/gi);for(var i=0;i<matches.length;i++){var match=matches[i],key=match.substring(1,match.length-1);if(substitutes[key]===undefined){throwError("The key '{0}' does not exist in the substitute collection!",key)}template=template.replace(match,substitutes[key])}return template}function renderTitle(wizard,options,state,header,index){var uniqueId=getUniqueId(wizard),uniqueStepId=uniqueId+_tabSuffix+index,uniqueBodyId=uniqueId+_tabpanelSuffix+index,uniqueHeaderId=uniqueId+_titleSuffix+index,stepCollection=wizard.find(".steps > ul"),title=renderTemplate(options.titleTemplate,{index:index+1,title:header.html()}),stepItem=$('<li role="tab"><a id="'+uniqueStepId+'" href="#'+uniqueHeaderId+'" aria-controls="'+uniqueBodyId+'">'+title+"</a></li>");stepItem._enableAria(options.enableAllSteps||state.currentIndex>index);if(state.currentIndex>index){stepItem.addClass("done")}header._id(uniqueHeaderId).attr("tabindex","-1").addClass("title");if(index===0){stepCollection.prepend(stepItem)}else{stepCollection.find("li").eq(index-1).after(stepItem)}if(index===0){stepCollection.find("li").removeClass("first").eq(index).addClass("first")}if(index===(state.stepCount-1)){stepCollection.find("li").removeClass("last").eq(index).addClass("last")}stepItem.children("a").bind("click"+getEventNamespace(wizard),stepClickHandler)}function saveCurrentStateToCookie(wizard,options,state){if(options.saveState&&$.cookie){$.cookie(_cookiePrefix+getUniqueId(wizard),state.currentIndex)}}function startTransitionEffect(wizard,options,state,index,oldIndex,doneCallback){var stepContents=wizard.find(".content > .body"),effect=getValidEnumValue(transitionEffect,options.transitionEffect),effectSpeed=options.transitionEffectSpeed,newStep=stepContents.eq(index),currentStep=stepContents.eq(oldIndex);switch(effect){case transitionEffect.fade:case transitionEffect.slide:var hide=(effect===transitionEffect.fade)?"fadeOut":"slideUp",show=(effect===transitionEffect.fade)?"fadeIn":"slideDown";state.transitionElement=newStep;currentStep[hide](effectSpeed,function(){var wizard=$(this)._showAria(false).parent().parent(),state=getState(wizard);if(state.transitionElement){state.transitionElement[show](effectSpeed,function(){$(this)._showAria()}).promise().done(doneCallback);state.transitionElement=null}});break;case transitionEffect.slideLeft:var outerWidth=currentStep.outerWidth(true),posFadeOut=(index>oldIndex)?-(outerWidth):outerWidth,posFadeIn=(index>oldIndex)?outerWidth:-(outerWidth);$.when(currentStep.animate({left:posFadeOut},effectSpeed,function(){$(this)._showAria(false)}),newStep.css("left",posFadeIn+"px")._showAria().animate({left:0},effectSpeed)).done(doneCallback);break;default:$.when(currentStep._showAria(false),newStep._showAria()).done(doneCallback);break}}function stepClickHandler(event){event.preventDefault();var anchor=$(this),wizard=anchor.parent().parent().parent().parent(),options=getOptions(wizard),state=getState(wizard),oldIndex=state.currentIndex;if(anchor.parent().is(":not(.disabled):not(.current)")){var href=anchor.attr("href"),position=parseInt(href.substring(href.lastIndexOf("-")+1),0);goToStep(wizard,options,state,position)}if(oldIndex===state.currentIndex){getStepAnchor(wizard,oldIndex).focus();return false}}function throwError(message){if(arguments.length>1){message=message.format(Array.prototype.slice.call(arguments,1))}throw new Error(message)}function validateArgument(argumentName,argumentValue){if(argumentValue==null){throwError("The argument '{0}' is null or undefined.",argumentName)}}$.fn.steps=function(method){if($.fn.steps[method]){return $.fn.steps[method].apply(this,Array.prototype.slice.call(arguments,1))}else{if(typeof method==="object"||!method){return initialize.apply(this,arguments)}else{$.error("Method "+method+" does not exist on jQuery.steps")}}};$.fn.steps.add=function(step){var state=getState(this);return insertStep(this,getOptions(this),state,state.stepCount,step)};$.fn.steps.destroy=function(){return destroy(this,getOptions(this))};$.fn.steps.finish=function(){finishStep(this,getState(this))};$.fn.steps.getCurrentIndex=function(){return getState(this).currentIndex};$.fn.steps.getCurrentStep=function(){return getStep(this,getState(this).currentIndex)};$.fn.steps.getStep=function(index){return getStep(this,index)};$.fn.steps.insert=function(index,step){return insertStep(this,getOptions(this),getState(this),index,step)};$.fn.steps.next=function(){return goToNextStep(this,getOptions(this),getState(this))};$.fn.steps.previous=function(){return goToPreviousStep(this,getOptions(this),getState(this))};$.fn.steps.remove=function(index){return removeStep(this,getOptions(this),getState(this),index)};$.fn.steps.setStep=function(index,step){throw new Error("Not yet implemented!")};$.fn.steps.skip=function(count){throw new Error("Not yet implemented!")};var contentMode=$.fn.steps.contentMode={html:0,iframe:1,async:2};var stepsOrientation=$.fn.steps.stepsOrientation={horizontal:0,vertical:1};var transitionEffect=$.fn.steps.transitionEffect={none:0,fade:1,slide:2,slideLeft:3};var stepModel=$.fn.steps.stepModel={title:"",content:"",contentUrl:"",contentMode:contentMode.html,contentLoaded:false};var defaults=$.fn.steps.defaults={headerTag:"h1",bodyTag:"div",contentContainerTag:"div",actionContainerTag:"div",stepsContainerTag:"div",cssClass:"wizard",clearFixCssClass:"clearfix",stepsOrientation:stepsOrientation.horizontal,titleTemplate:'<span class="number">#index#.</span> #title#',loadingTemplate:'<span class="spinner"></span> #text#',autoFocus:false,enableAllSteps:false,enableKeyNavigation:true,enablePagination:true,suppressPaginationOnFocus:true,enableContentCache:true,enableCancelButton:false,enableFinishButton:true,preloadContent:false,showFinishButtonAlways:false,forceMoveForward:false,saveState:false,startIndex:0,transitionEffect:transitionEffect.none,transitionEffectSpeed:200,onStepChanging:function(event,currentIndex,newIndex){return true},onStepChanged:function(event,currentIndex,priorIndex){},onCanceled:function(event){},onFinishing:function(event,currentIndex){return true},onFinished:function(event,currentIndex){},onContentLoaded:function(event,currentIndex){},onInit:function(event,currentIndex){},labels:{cancel:"取消",current:"当前步骤::",pagination:"分页",finish:"完成",next:"下一步",previous:"上一步",loading:"加载中 ..."}}})(jQuery);
\ No newline at end of file
diff --git a/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html b/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html
index 428f330e..beb1a360 100644
--- a/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html
+++ b/ruoyi-admin/src/main/resources/templates/demo/form/wizard.html
@@ -1,192 +1,332 @@
 <!DOCTYPE html>
 <html lang="zh">
 <head>
-	<th:block th:include="include :: header('基本表单')" />
-	<th:block th:include="include :: jquery-steps-css" />
+<th:block th:include="include :: header('基本表单')" />
+<th:block th:include="include :: jquery-smartwizard-css" />
+<style type="text/css">
+/* 如果要让工具栏固定在页面底部,使用下面的样式,不需要的可以注释 */
+.sw>.toolbar-bottom{
+	z-index: 100;
+    bottom: 0px;
+    left: 0;
+    width: 100%;
+    position: fixed;
+    text-align: right;
+    background: #fff;
+    box-shadow: 0 -2px 6px 1px hsla(223,8%,83%,.5);
+    border-top: 1px solid #e3e4e8;
+}
+/* 如果设置了是否自动调节高度为false,需要加滚动条 */
+.sw>.tab-content{
+	overflow-x: hidden;
+    overflow-y: auto;
+}
+</style>
 </head>
 <body class="gray-bg">
-    <div class="wrapper wrapper-content animated fadeInRight">
-        <div class="row">
-            <div class="col-sm-5">
-                <div class="jumbotron">
-                    <h1>表单向导</h1>
-                    <p>Smart UI 部件允许您快速创建表单向导接口。</p>
-                    <p><a href="https://github.com/rstaib/jquery-steps" target="_blank" class="btn btn-primary btn-lg" role="button">了解 jQuery Steps</a>
-                    </p>
-                </div>
-            </div>
-            <div class="col-sm-7">
-                <div class="ibox float-e-margins">
-                    <div class="ibox-title">
-                        <h5>基础表单向导</h5>
-                    </div>
-                    <div class="ibox-content">
-                        <p>
-                                                                      这是一个简单的表单向导示例
-                        </p>
-                        <div id="wizard">
-                            <h1>第一步</h1>
-                            <div class="step-content">
-                                <div class="text-center m-t-md">
-                                    <h2>第一步</h2>
-                                    <p>
-                                                                                                       这是第一步的内容
-                                    </p>
-                                </div>
-                            </div>
+	<div class="wrapper wrapper-content animated fadeInRight" style="height: 100%;">
+		<div class="row">
+			<div class="col-sm-12">
+				<div class="ibox">
+					<div class="ibox-title">
+						<h5>
+							表单向导
+							<small>https://github.com/techlab/jquery-smartwizard</small>
+						</h5>
+					</div>
+					<div class="ibox-content">
+						<div class="row select-list" style="padding-left: 15px; margin-bottom: 10px;">
+							<ul>
+								<li>
+									选择样式:
+									<select id="theme-selector">
+										<option value="default">Default</option>
+										<option value="arrows" selected>Arrows</option>
+										<option value="dots">Dots</option>
+										<option value="progress">Progress</option>
+									</select>
+								</li>
+								<!-- 快速操作栏按钮 -->
+								<li>
+									<div class="btn-group-sm" role="group">
+										<a class="btn btn-info" id="prev-btn"> 上一步 </a>
+										<a class="btn btn-success" id="next-btn"> 下一步 </a>
+										<a class="btn btn-danger" id="reset-btn"> 重置 </a>
+									</div>
+								</li>
+							</ul>
 
-                            <h1>第二步</h1>
-                            <div class="step-content">
-                                <div class="text-center m-t-md">
-                                    <h2>第二步</h2>
-                                    <p>
-                                                                                                       这是第二步的内容
-                                    </p>
-                                </div>
-                            </div>
+						</div>
+						<div id="smartwizard">
+							<ul class="nav">
+								<li class="nav-item">
+									<a class="nav-link" href="#step-1"> 第一步 </a>
+								</li>
+								<li class="nav-item">
+									<a class="nav-link" href="#step-2"> 第二步 </a>
+								</li>
+								<li class="nav-item">
+									<a class="nav-link" href="#step-3"> 第三步 </a>
+								</li>
+								<li class="nav-item">
+									<a class="nav-link" href="#step-4"> 第四步 </a>
+								</li>
+							</ul>
+							<div class="tab-content">
+								<div id="step-1" class="tab-pane" role="tabpanel" aria-labelledby="step-1">
+									<div>
+										<form class="form form-horizontal m-t">
+											<div class="form-group">
+												<label class="col-sm-3 control-label">姓氏:</label>
+												<div class="col-sm-8">
+													<input id="firstname" name="firstname" class="form-control" type="text">
+													<span class="help-block m-b-none">
+														<i class="fa fa-info-circle"></i>
+														这里写点提示的内容
+													</span>
+												</div>
+											</div>
+											<div class="form-group">
+												<label class="col-sm-3 control-label is-required">名字:</label>
+												<div class="col-sm-8">
+													<input id="lastname" name="lastname" class="form-control" type="text" required>
+												</div>
+											</div>
+											<div class="form-group">
+												<label class="col-sm-3 control-label is-required">用户名:</label>
+												<div class="col-sm-8">
+													<input id="username" name="username" class="form-control" type="text" required>
+												</div>
+											</div>
+											<div class="form-group">
+												<label class="col-sm-3 control-label">密码:</label>
+												<div class="col-sm-8">
+													<input id="password" name="password" class="form-control" type="password">
+												</div>
+											</div>
+											<div class="form-group">
+												<label class="col-sm-3 control-label">确认密码:</label>
+												<div class="col-sm-8">
+													<input id="confirm_password" name="confirm_password" class="form-control" type="password">
+													<span class="help-block m-b-none">
+														<i class="fa fa-info-circle"></i>
+														请再次输入您的密码
+													</span>
+												</div>
+											</div>
+											<div class="form-group">
+												<label class="col-sm-3 control-label">E-mail:</label>
+												<div class="col-sm-8">
+													<input id="email" name="email" class="form-control" type="email">
+												</div>
+											</div>
+										</form>
+									</div>
+								</div>
+								<div id="step-2" class="tab-pane" role="tabpanel" aria-labelledby="step-2">
+									<div>
+										<form class="form form-horizontal m-t">
+											<div class="form-group">
+												<label class="col-sm-3 control-label">性别:</label>
+												<div class="col-sm-8">
+													<select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}">
+				                						<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+				            						</select>
+												</div>
+											</div>
+											<div class="form-group">
+												<label class="col-sm-3 control-label">时间:</label>
+												<div class="col-sm-8">
+													<input id="time" name="time" class="form-control time-input" type="text">
+												</div>
+											</div>
+											<div class="form-group">
+												<label class="col-sm-3 control-label">状态:</label>
+												<div class="col-sm-8">
+													<div class="radio-box" th:each="dict : ${@dict.getType('sys_normal_disable')}">
+														<input type="radio" th:id="${dict.dictCode}" name="status" th:value="${dict.dictValue}" th:checked="${dict.default}">
+														<label th:for="${dict.dictCode}" th:text="${dict.dictLabel}"></label>
+													</div>
+												</div>
+											</div>
+										</form>
+									</div>
+								</div>
+								<div id="step-3" class="tab-pane" role="tabpanel" aria-labelledby="step-3">
+									<div class="m-t-md">
+										<p>1、如果需要工具栏在页面底部显示, 将style中下面的部分取消注释<blockquote>.sw>.toolbar-bottom </blockquote></p>
+										<p>2、如果设置了自动调节高度为false, 将style中下面的部分取消注释<blockquote>.sw>.tab-content </blockquote></p>
+										<p>3、工具栏的按钮样式会被表单插件中.btn样式覆盖导致bootstrap中的按钮样式无效, 如果需要改变按钮样式可以自己定义并提高优先级</blockquote></p>
+									</div>
+								</div>
+								<div id="step-4" class="tab-pane" role="tabpanel" aria-labelledby="step-4">
+									<div class="m-t-md">
+										<h3>测试多行显示</h3>
+										<pre style="overflow-x: hidden;">
+$('#smartwizard').smartWizard({
+  selected: 0, // Initial selected step, 0 = first step
+  theme: 'default', // theme for the wizard, related css need to include for other than default theme
+  justified: true, // Nav menu justification. true/false
+  darkMode:false, // Enable/disable Dark Mode if the theme supports. true/false
+  autoAdjustHeight: true, // Automatically adjust content height
+  cycleSteps: false, // Allows to cycle the navigation of steps
+  backButtonSupport: true, // Enable the back button support
+  enableURLhash: true, // Enable selection of the step based on url hash
+  transition: {
+      animation: 'none', // Effect on navigation, none/fade/slide-horizontal/slide-vertical/slide-swing
+      speed: '400', // Transion animation speed
+      easing:'' // Transition animation easing. Not supported without a jQuery easing plugin
+  },
+  toolbarSettings: {
+      toolbarPosition: 'bottom', // none, top, bottom, both
+      toolbarButtonPosition: 'right', // left, right, center
+      showNextButton: true, // show/hide a Next button
+      showPreviousButton: true, // show/hide a Previous button
+      toolbarExtraButtons: [] // Extra buttons to show on toolbar, array of jQuery input/buttons elements
+  },
+  anchorSettings: {
+      anchorClickable: true, // Enable/Disable anchor navigation
+      enableAllAnchors: false, // Activates all anchors clickable all times
+      markDoneStep: true, // Add done state on navigation
+      markAllPreviousStepsAsDone: true, // When a step selected by url hash, all previous steps are marked done
+      removeDoneStepOnNavigateBack: false, // While navigate back done step after active step will be cleared
+      enableAnchorOnDoneStep: true // Enable/Disable the done steps navigation
+  },
+  keyboardSettings: {
+      keyNavigation: true, // Enable/Disable keyboard navigation(left and right keys are used if enabled)
+      keyLeft: [37], // Left key code
+      keyRight: [39] // Right key code
+  },
+  lang: { // Language variables for button
+      next: 'Next',
+      previous: 'Previous'
+  },
+  disabledSteps: [], // Array Steps disabled
+  errorSteps: [], // Highlight step with errors
+  hiddenSteps: [] // Hidden steps
+});
+										</pre>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
 
-                            <h1>第三步</h1>
-                            <div class="step-content">
-                                <div class="text-center m-t-md">
-                                    <h2>第三步</h2>
-                                    <p>
-                                                                                                      这是第三步的内容
-                                    </p>
-                                </div>
-                            </div>
-                        </div>
+		</div>
+	</div>
+	<th:block th:include="include :: footer" />
+	<th:block th:include="include :: jquery-smartwizard-js" />
+	<script>
+		$(document).ready(function() {
+			// 工具栏按钮
+            var btnFinish = $('<a id="btn-finish"></a>').text('完成')
+                                             .addClass('btn btn-info')
+                                             .on('click', function(){ submit(); });
+            var btnCancel = $('<a id="btn-cancel"></a>').text('取消')
+                                             .addClass('btn btn-danger')
+                                             .on('click', function(){ $('#smartwizard').smartWizard("reset"); });
+           	// 下面两个按钮是为了因为插件默认的是botton,这里换成<a>,也可以选择用样式替换,或者不替换
+            var btnNext = $('<a id="btn-next"></a>').text('下一步')
+											 .addClass('btn btn-info')
+											 .on('click', function(){ $('#smartwizard').smartWizard("next");});
+			var btnPrev = $('<a id="btn-prev"></a>').text('上一步')
+											 .addClass('btn btn-success disabled')
+											 .on('click', function(){ $('#smartwizard').smartWizard("prev"); });
+            // 初始化表单向导组件
+            $('#smartwizard').smartWizard({
+                theme: 'arrows', // default, arrows, dots, progress
+                autoAdjustHeight : false, // 自动调整高度, 默认true
+                enableURLhash:false, //开启URL hash,开启后点击浏览器前进后退按钮会执行下一步和上一步操作
+                transition: {
+                    animation: 'slide-horizontal', // Effect on navigation, none/fade/slide-horizontal/slide-vertical/slide-swing
+                },
+                toolbarSettings: {
+                	showNextButton: false,// 因为上面自定义了下一步按钮, 所以隐藏掉插件自带的按钮, 如果不使用自定义按钮, 需要改为true或者去掉该属性
+    				showPreviousButton: false,// 因为上面自定义了上一步按钮, 所以隐藏掉插件自带的按钮, 如果不使用自定义按钮, 需要改为true或者去掉该属性
+                    toolbarExtraButtons: [btnCancel,btnPrev,btnNext,btnFinish]// 扩展的按钮集合
+                }
+            });
+		});
+		
+		function submit(){
+			var data = {};
+			$('.form').each(function (index, form){
+				// 这里可以使用$.common.formToJSON(formId);  需要在form上加id
+                $.each($(form).serializeArray(), function(i, field) {
+                 	 if(data[field.name]) {
+                 		data[field.name] += ("," + field.value);
+					 } else {
+						data[field.name] = field.value;
+                     }
+                });
+			});
+			alert(JSON.stringify(data))
+		}
+		// 显示步骤时将触发事件
+        $("#smartwizard").on("showStep", function(e, anchorObject, stepNumber, stepDirection, stepPosition) {
+        	// 下面按钮是快速操作栏的
+        	$("#prev-btn").removeClass('disabled');
+            $("#next-btn").removeClass('disabled');
+        	// 下面按钮是工具栏的
+        	$("#btn-prev").removeClass('disabled');
+            $("#btn-next").removeClass('disabled');
+            $("#btn-finish").removeClass('disabled');
+            if(stepPosition === 'first') {
+            	$("#prev-btn").addClass('disabled');// 快速操作栏(演示用)
+            	$("#btn-prev").addClass('disabled');
+				$("#btn-finish").addClass('disabled');
+            } else if(stepPosition === 'last') {
+            	$("#next-btn").addClass('disabled');// 快速操作栏(演示用)
+                $("#btn-next").addClass('disabled');
+            } else {
+            	$("#prev-btn").removeClass('disabled');// 快速操作栏(演示用)
+                $("#next-btn").removeClass('disabled');// 快速操作栏(演示用)
+                $("#btn-prev").removeClass('disabled');
+                $("#btn-next").removeClass('disabled');
+                $("#btn-finish").addClass('disabled');
+            }
+        });
+		
+		// 该事件在离开某个步骤之前触发
+		$("#smartwizard").on("leaveStep", function(e, anchorObject, currentStepNumber, nextStepNumber, stepDirection) {
+			if(stepDirection == 'forward'){
+				var form = $("#step-" + (currentStepNumber + 1)).find('.form');
+				if(form.length > 0){
+					return form.validate().form();
+				}
+				return true;
+			}
+			return true;
+		});
+		
+		$("#theme-selector").on("change", function() {
+			// Change theme
+			var options = {
+				theme : $(this).val()
+			};
+			$('#smartwizard').smartWizard("setOptions", options);
+			return true;
+		});
 
-                    </div>
-                </div>
-            </div>
-        </div>
-        <div class="row">
-            <div class="col-sm-12">
-                <div class="ibox">
-                    <div class="ibox-title">
-                        <h5>带验证的表单向导</h5>
-                    </div>
-                    <div class="ibox-content">
-                        <h2>
-                                                                               带验证的表单向导
-                            </h2>
-                        <p>
-                                                                              下面这个示例展示了如何在表单向导中使用 jQuery Validation 插件
-                        </p>
+		$("#reset-btn").on("click", function() {
+            // Reset wizard
+            $('#smartwizard').smartWizard("reset");
+            return true;
+        });
 
-                        <form id="form" action="" class="wizard-big">
-                            <h1>账户</h1>
-                            <fieldset>
-                                <h2>账户信息</h2>
-                                <div class="row">
-                                    <div class="col-sm-8">
-                                        <div class="form-group">
-                                            <label>用户名 *</label>
-                                            <input id="userName" name="userName" type="text" class="form-control required">
-                                        </div>
-                                        <div class="form-group">
-                                            <label>密码 *</label>
-                                            <input id="password" name="password" type="text" class="form-control required">
-                                        </div>
-                                        <div class="form-group">
-                                            <label>确认密码 *</label>
-                                            <input id="confirm" name="confirm" type="text" class="form-control required">
-                                        </div>
-                                    </div>
-                                    <div class="col-sm-4">
-                                        <div class="text-center">
-                                            <div style="margin-top: 20px">
-                                                <i class="fa fa-sign-in" style="font-size: 180px;color: #e5e5e5 "></i>
-                                            </div>
-                                        </div>
-                                    </div>
-                                </div>
+        $("#prev-btn").on("click", function() {
+            // Navigate previous
+            $('#smartwizard').smartWizard("prev");
+            return true;
+        });
 
-                            </fieldset>
-                            <h1>个人资料</h1>
-                            <fieldset>
-                                <h2>个人资料信息</h2>
-                                <div class="row">
-                                    <div class="col-sm-6">
-                                        <div class="form-group">
-                                            <label>姓名 *</label>
-                                            <input id="name" name="name" type="text" class="form-control required">
-                                        </div>
-                                    </div>
-                                    <div class="col-sm-6">
-                                        <div class="form-group">
-                                            <label>Email *</label>
-                                            <input id="email" name="email" type="text" class="form-control required email">
-                                        </div>
-                                        <div class="form-group">
-                                            <label>地址 *</label>
-                                            <input id="address" name="address" type="text" class="form-control">
-                                        </div>
-                                    </div>
-                                </div>
-                            </fieldset>
-
-                            <h1>警告</h1>
-                            <fieldset>
-                                <div class="text-center" style="margin-top: 120px">
-                                    <h2>你是火星人 :-)</h2>
-                                </div>
-                            </fieldset>
-
-                            <h1>完成</h1>
-                            <fieldset>
-                                <h2>条款</h2>
-                                <input id="acceptTerms" name="acceptTerms" type="checkbox" class="required">
-                                <label for="acceptTerms">我同意注册条款</label>
-                            </fieldset>
-                        </form>
-                    </div>
-                </div>
-            </div>
-
-        </div>
-    </div>
-    <th:block th:include="include :: footer" />
-    <th:block th:include="include :: jquery-steps-js" />
-    <script>
-	    $(document).ready(function () {
-	        $("#wizard").steps();
-	        $("#form").steps({
-	            bodyTag: "fieldset", onStepChanging: function (event, currentIndex, newIndex) {
-	                if (currentIndex > newIndex) {
-	                    return true
-	                }
-	                if (newIndex === 3 && Number($("#age").val()) < 18) {
-	                    return false
-	                }
-	                var form = $(this);
-	                if (currentIndex < newIndex) {
-	                    $(".body:eq(" + newIndex + ") label.error", form).remove();
-	                    $(".body:eq(" + newIndex + ") .error", form).removeClass("error")
-	                }
-	                form.validate().settings.ignore = ":disabled,:hidden";
-	                return form.valid()
-	            }, onStepChanged: function (event, currentIndex, priorIndex) {
-	                if (currentIndex === 2 && Number($("#age").val()) >= 18) {
-	                    $(this).steps("next")
-	                }
-	                if (currentIndex === 2 && priorIndex === 3) {
-	                    $(this).steps("previous")
-	                }
-	            }, onFinishing: function (event, currentIndex) {
-	                var form = $(this);
-	                form.validate().settings.ignore = ":disabled";
-	                return form.valid()
-	            }, onFinished: function (event, currentIndex) {
-	                var form = $(this);
-	                form.submit()
-	            }
-	        }).validate({
-	            errorPlacement: function (error, element) {
-	                element.before(error)
-	            }, rules: {confirm: {equalTo: "#password"}}
-	        })
-	    });
+        $("#next-btn").on("click", function() {
+            // Navigate next
+            $('#smartwizard').smartWizard("next");
+            return true;
+        });
 	</script>
 </body>
 </html>
diff --git a/ruoyi-admin/src/main/resources/templates/include.html b/ruoyi-admin/src/main/resources/templates/include.html
index 57fbe288..d39f7c79 100644
--- a/ruoyi-admin/src/main/resources/templates/include.html
+++ b/ruoyi-admin/src/main/resources/templates/include.html
@@ -147,12 +147,12 @@
     <script th:src="@{/ajax/libs/jsonview/jquery.jsonview.js}"></script>
 </div>
 
-<!-- jquery.steps表单向导插件 -->
-<div th:fragment="jquery-steps-css">
-    <link th:href="@{/ajax/libs/staps/jquery.steps.css}" rel="stylesheet"/>
+<!-- jquery.smartwizard表单向导插件 -->
+<div th:fragment="jquery-smartwizard-css">
+    <link th:href="@{/ajax/libs/smartwizard/smart_wizard_all.min.css}" rel="stylesheet"/>
 </div>
-<div th:fragment="jquery-steps-js">
-    <script th:src="@{/ajax/libs/staps/jquery.steps.min.js}"></script>
+<div th:fragment="jquery-smartwizard-js">
+    <script th:src="@{/ajax/libs/smartwizard/jquery.smartWizard.min.js}"></script>
 </div>
 
 <!-- ECharts百度统计图表插件 -->