diff --git a/IoTGateway.DataAccess/IoTGateway.DataAccess.csproj b/IoTGateway.DataAccess/IoTGateway.DataAccess.csproj index 512bd1c..c590dd0 100644 --- a/IoTGateway.DataAccess/IoTGateway.DataAccess.csproj +++ b/IoTGateway.DataAccess/IoTGateway.DataAccess.csproj @@ -6,7 +6,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/IoTGateway/Views/Shared/_Layout.cshtml b/IoTGateway/Views/Shared/_Layout.cshtml index 900f2fe..476804b 100644 --- a/IoTGateway/Views/Shared/_Layout.cshtml +++ b/IoTGateway/Views/Shared/_Layout.cshtml @@ -22,6 +22,7 @@ + diff --git a/IoTGateway/wwwroot/layui/xm-select.js b/IoTGateway/wwwroot/layui/xm-select.js new file mode 100644 index 0000000..bf44849 --- /dev/null +++ b/IoTGateway/wwwroot/layui/xm-select.js @@ -0,0 +1,8 @@ +/*! + * @Title: xm-select + * @Version: 1.2.4 + * @Description:基于layui的多选解决方案 + * @Site: https://gitee.com/maplemei/xm-select + * @Author: maplemei + * @License:Apache License 2.0 + */!function(e){var t={};function n(o){if(t[o])return t[o].exports;var r=t[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,n),r.l=!0,r.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(o,r,function(t){return e[t]}.bind(null,r));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="./",n(n.s=214)}({1:function(e,t,n){"use strict";function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e){return function(e){if(Array.isArray(e))return a(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return a(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return a(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function a(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,o=new Array(t);n1&&void 0!==arguments[1]?arguments[1]:100,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],o=this,r=!1;return function(){for(var i=arguments.length,a=new Array(i),l=0;l>>0;for(t&&(n=t),o=new Array(a),r=0;r>>0;if("function"!=typeof e)throw new TypeError(e+" is not a function");for(arguments.length>1&&(n=t),o=0;o>>0;if("function"!=typeof e)throw new TypeError;for(var o=[],r=arguments[1],i=0;i>>0,r=arguments[1],i=0;i .xm-tips {\n color: #999999;\n padding: 0 10px;\n position: absolute;\n display: flex;\n height: 100%;\n align-items: center;\n}\nxm-select > .xm-icon {\n display: inline-block;\n overflow: hidden;\n position: absolute;\n width: 0;\n height: 0;\n right: 10px;\n top: 50%;\n margin-top: -3px;\n cursor: pointer;\n border: 6px dashed transparent;\n border-top-color: #C2C2C2;\n border-top-style: solid;\n transition: all 0.3s;\n -webkit-transition: all 0.3s;\n}\nxm-select > .xm-icon-expand {\n margin-top: -9px;\n transform: rotate(180deg);\n}\nxm-select > .xm-label.single-row {\n position: absolute;\n top: 0;\n bottom: 0px;\n left: 0px;\n right: 30px;\n overflow: auto hidden;\n}\nxm-select > .xm-label.single-row .scroll {\n overflow-y: hidden;\n}\nxm-select > .xm-label.single-row .label-content {\n flex-wrap: nowrap;\n white-space: nowrap;\n}\nxm-select > .xm-label.auto-row .label-content {\n flex-wrap: wrap;\n padding-right: 30px !important;\n}\nxm-select > .xm-label.auto-row .xm-label-block > span {\n white-space: unset;\n height: 100%;\n}\nxm-select > .xm-label .scroll .label-content {\n display: flex;\n padding: 3px 10px;\n}\nxm-select > .xm-label .xm-label-block {\n display: flex;\n position: relative;\n padding: 0px 5px;\n margin: 2px 5px 2px 0;\n border-radius: 3px;\n align-items: baseline;\n color: #FFF;\n}\nxm-select > .xm-label .xm-label-block > span {\n display: flex;\n color: #FFF;\n white-space: nowrap;\n}\nxm-select > .xm-label .xm-label-block > i {\n color: #FFF;\n margin-left: 8px;\n font-size: 12px;\n cursor: pointer;\n display: flex;\n}\nxm-select > .xm-label .xm-label-block.disabled {\n background-color: #C2C2C2 !important;\n cursor: no-drop !important;\n}\nxm-select > .xm-label .xm-label-block.disabled > i {\n cursor: no-drop !important;\n}\nxm-select > .xm-body {\n position: absolute;\n left: 0;\n top: 42px;\n padding: 5px 0;\n z-index: 999;\n width: 100%;\n min-width: fit-content;\n border: 1px solid #E6E6E6;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n animation-name: xm-upbit;\n animation-duration: 0.3s;\n animation-fill-mode: both;\n}\nxm-select > .xm-body .scroll-body {\n overflow-x: hidden;\n overflow-y: auto;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar {\n width: 8px;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-track {\n -webkit-border-radius: 2em;\n -moz-border-radius: 2em;\n -ms-border-radius: 2em;\n border-radius: 2em;\n background-color: #FFF;\n}\nxm-select > .xm-body .scroll-body::-webkit-scrollbar-thumb {\n -webkit-border-radius: 2em;\n -moz-border-radius: 2em;\n -ms-border-radius: 2em;\n border-radius: 2em;\n background-color: #C2C2C2;\n}\nxm-select > .xm-body.up {\n top: auto;\n bottom: 42px;\n}\nxm-select > .xm-body.relative {\n position: relative;\n display: block !important;\n top: 0;\n box-shadow: none;\n border: none;\n animation-name: none;\n animation-duration: 0;\n min-width: 100%;\n}\nxm-select > .xm-body .xm-group {\n cursor: default;\n}\nxm-select > .xm-body .xm-group-item {\n display: inline-block;\n cursor: pointer;\n padding: 0 10px;\n color: #999;\n font-size: 12px;\n}\nxm-select > .xm-body .xm-option {\n display: flex;\n align-items: center;\n position: relative;\n padding: 0 10px;\n cursor: pointer;\n}\nxm-select > .xm-body .xm-option-icon {\n color: transparent;\n display: flex;\n border: 1px solid #E6E6E6;\n border-radius: 3px;\n justify-content: center;\n align-items: center;\n}\nxm-select > .xm-body .xm-option-icon.xm-custom-icon {\n color: unset;\n border: unset;\n}\nxm-select > .xm-body .xm-option-icon-hidden {\n margin-right: -10px;\n}\nxm-select > .xm-body .xm-option-icon.xm-icon-danx {\n border-radius: 100%;\n}\nxm-select > .xm-body .xm-option-content {\n display: flex;\n position: relative;\n padding-left: 15px;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n color: #666;\n width: calc(100% - 20px);\n}\nxm-select > .xm-body .xm-option.hide-icon .xm-option-content {\n padding-left: 0;\n}\nxm-select > .xm-body .xm-option.selected.hide-icon .xm-option-content {\n color: #FFF !important;\n}\nxm-select > .xm-body .xm-option .loader {\n width: 0.8em;\n height: 0.8em;\n margin-right: 6px;\n color: #C2C2C2;\n}\nxm-select > .xm-body .xm-select-empty {\n text-align: center;\n color: #999;\n}\nxm-select > .xm-body .disabled {\n cursor: no-drop;\n}\nxm-select > .xm-body .disabled:hover {\n background-color: #FFF;\n}\nxm-select > .xm-body .disabled .xm-option-icon {\n border-color: #C2C2C2 !important;\n}\nxm-select > .xm-body .disabled .xm-option-content {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body .disabled.selected > .xm-option-icon {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body .xm-search {\n background-color: #FFF !important;\n position: relative;\n padding: 0 10px;\n margin-bottom: 5px;\n cursor: pointer;\n}\nxm-select > .xm-body .xm-search > i {\n position: absolute;\n color: #666;\n}\nxm-select > .xm-body .xm-search-input {\n border: none;\n border-bottom: 1px solid #E6E6E6;\n padding-left: 27px;\n cursor: text;\n}\nxm-select > .xm-body .xm-paging {\n padding: 0 10px;\n display: flex;\n margin-top: 5px;\n}\nxm-select > .xm-body .xm-paging > span:first-child {\n border-radius: 2px 0 0 2px;\n}\nxm-select > .xm-body .xm-paging > span:last-child {\n border-radius: 0 2px 2px 0;\n}\nxm-select > .xm-body .xm-paging > span {\n display: flex;\n flex: auto;\n justify-content: center;\n vertical-align: middle;\n margin: 0 -1px 0 0;\n background-color: #fff;\n color: #333;\n font-size: 12px;\n border: 1px solid #e2e2e2;\n flex-wrap: nowrap;\n width: 100%;\n overflow: hidden;\n min-width: 50px;\n}\nxm-select > .xm-body .xm-toolbar {\n padding: 0 10px;\n display: flex;\n margin: -3px 0;\n cursor: default;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag {\n cursor: pointer;\n display: flex;\n margin-right: 20px;\n color: #666;\n align-items: baseline;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:hover {\n opacity: 0.8;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:active {\n opacity: 1;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag > i {\n margin-right: 2px;\n font-size: 14px;\n}\nxm-select > .xm-body .xm-toolbar .toolbar-tag:last-child {\n margin-right: 0;\n}\nxm-select > .xm-body .xm-body-custom {\n line-height: initial;\n cursor: default;\n}\nxm-select > .xm-body .xm-body-custom * {\n box-sizing: initial;\n}\nxm-select > .xm-body .xm-tree {\n position: relative;\n}\nxm-select > .xm-body .xm-tree-icon {\n display: inline-block;\n margin-right: 3px;\n cursor: pointer;\n border: 6px dashed transparent;\n border-left-color: #C2C2C2;\n border-left-style: solid;\n transition: all 0.3s;\n -webkit-transition: all 0.3s;\n z-index: 2;\n visibility: hidden;\n}\nxm-select > .xm-body .xm-tree-icon.expand {\n margin-top: 3px;\n margin-right: 5px;\n margin-left: -2px;\n transform: rotate(90deg);\n}\nxm-select > .xm-body .xm-tree-icon.xm-visible {\n visibility: visible;\n}\nxm-select > .xm-body .xm-tree .left-line {\n position: absolute;\n left: 13px;\n width: 0;\n z-index: 1;\n border-left: 1px dotted #c0c4cc !important;\n}\nxm-select > .xm-body .xm-tree .top-line {\n position: absolute;\n left: 13px;\n height: 0;\n z-index: 1;\n border-top: 1px dotted #c0c4cc !important;\n}\nxm-select > .xm-body .xm-tree .xm-tree-icon + .top-line {\n margin-left: 1px;\n}\nxm-select > .xm-body .scroll-body > .xm-tree > .xm-option > .top-line,\nxm-select > .xm-body .scroll-body > .xm-option > .top-line {\n width: 0 !important;\n}\nxm-select > .xm-body .xm-cascader-box {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n padding: 5px 0;\n border: 1px solid #E6E6E6;\n background-color: #fff;\n border-radius: 2px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12);\n margin: -1px;\n}\nxm-select > .xm-body .xm-cascader-box::before {\n content: ' ';\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n border-right-color: #E6E6E6;\n top: 10px;\n left: -12px;\n}\nxm-select > .xm-body .xm-cascader-box::after {\n content: ' ';\n position: absolute;\n width: 0;\n height: 0;\n border: 6px solid transparent;\n border-right-color: #fff;\n top: 10px;\n left: -11px;\n}\nxm-select > .xm-body .xm-cascader-scroll {\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n}\nxm-select > .xm-body.cascader {\n width: unset;\n min-width: unset;\n}\nxm-select > .xm-body.cascader .xm-option-content {\n padding-left: 8px;\n}\nxm-select > .xm-body.cascader .disabled .xm-right-arrow {\n color: #C2C2C2 !important;\n}\nxm-select > .xm-body.cascader .hide-icon.disabled .xm-right-arrow {\n color: #999 !important;\n}\nxm-select .xm-input {\n cursor: pointer;\n border-radius: 2px;\n border-width: 1px;\n border-style: solid;\n border-color: #E6E6E6;\n display: block;\n width: 100%;\n box-sizing: border-box;\n background-color: #FFF;\n line-height: 1.3;\n padding-left: 10px;\n outline: 0;\n user-select: text;\n -ms-user-select: text;\n -moz-user-select: text;\n -webkit-user-select: text;\n}\nxm-select .dis {\n display: none;\n}\nxm-select .loading {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(255, 255, 255, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n}\nxm-select .loader {\n border: 0.2em dotted currentcolor;\n border-radius: 50%;\n -webkit-animation: 1s loader linear infinite;\n animation: 1s loader linear infinite;\n display: inline-block;\n width: 1em;\n height: 1em;\n color: inherit;\n vertical-align: middle;\n pointer-events: none;\n}\nxm-select .xm-select-default {\n position: absolute;\n width: 100%;\n height: 100%;\n border: none;\n visibility: hidden;\n}\nxm-select .xm-select-disabled {\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n cursor: no-drop;\n z-index: 2;\n opacity: 0.3;\n background-color: #FFF;\n}\nxm-select .item--divided {\n border-top: 1px solid #ebeef5;\n width: calc(100% - 20px);\n cursor: initial;\n}\nxm-select .xm-right-arrow {\n position: absolute;\n color: #666;\n right: 5px;\n top: -1px;\n font-weight: 700;\n transform: scale(0.6, 1);\n}\nxm-select .xm-right-arrow::after {\n content: '>';\n}\nxm-select[size='large'] {\n min-height: 40px;\n line-height: 40px;\n}\nxm-select[size='large'] .xm-input {\n height: 40px;\n}\nxm-select[size='large'] .xm-label .scroll .label-content {\n line-height: 34px;\n}\nxm-select[size='large'] .xm-label .xm-label-block {\n height: 30px;\n line-height: 30px;\n}\nxm-select[size='large'] .xm-body .xm-option .xm-option-icon {\n height: 20px;\n width: 20px;\n font-size: 20px;\n}\nxm-select[size='large'] .xm-paging > span {\n height: 34px;\n line-height: 34px;\n}\nxm-select[size='large'] .xm-tree .left-line {\n height: 100%;\n bottom: 20px;\n}\nxm-select[size='large'] .xm-tree .left-line-group {\n height: calc(100% - 40px);\n}\nxm-select[size='large'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 19px;\n}\nxm-select[size='large'] .item--divided {\n margin: 10px;\n}\nxm-select {\n min-height: 36px;\n line-height: 36px;\n}\nxm-select .xm-input {\n height: 36px;\n}\nxm-select .xm-label .scroll .label-content {\n line-height: 30px;\n}\nxm-select .xm-label .xm-label-block {\n height: 26px;\n line-height: 26px;\n}\nxm-select .xm-body .xm-option .xm-option-icon {\n height: 18px;\n width: 18px;\n font-size: 18px;\n}\nxm-select .xm-paging > span {\n height: 30px;\n line-height: 30px;\n}\nxm-select .xm-tree .left-line {\n height: 100%;\n bottom: 18px;\n}\nxm-select .xm-tree .left-line-group {\n height: calc(100% - 36px);\n}\nxm-select .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 17px;\n}\nxm-select .item--divided {\n margin: 9px;\n}\nxm-select[size='small'] {\n min-height: 32px;\n line-height: 32px;\n}\nxm-select[size='small'] .xm-input {\n height: 32px;\n}\nxm-select[size='small'] .xm-label .scroll .label-content {\n line-height: 26px;\n}\nxm-select[size='small'] .xm-label .xm-label-block {\n height: 22px;\n line-height: 22px;\n}\nxm-select[size='small'] .xm-body .xm-option .xm-option-icon {\n height: 16px;\n width: 16px;\n font-size: 16px;\n}\nxm-select[size='small'] .xm-paging > span {\n height: 26px;\n line-height: 26px;\n}\nxm-select[size='small'] .xm-tree .left-line {\n height: 100%;\n bottom: 16px;\n}\nxm-select[size='small'] .xm-tree .left-line-group {\n height: calc(100% - 32px);\n}\nxm-select[size='small'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 15px;\n}\nxm-select[size='small'] .item--divided {\n margin: 8px;\n}\nxm-select[size='mini'] {\n min-height: 28px;\n line-height: 28px;\n}\nxm-select[size='mini'] .xm-input {\n height: 28px;\n}\nxm-select[size='mini'] .xm-label .scroll .label-content {\n line-height: 22px;\n}\nxm-select[size='mini'] .xm-label .xm-label-block {\n height: 18px;\n line-height: 18px;\n}\nxm-select[size='mini'] .xm-body .xm-option .xm-option-icon {\n height: 14px;\n width: 14px;\n font-size: 14px;\n}\nxm-select[size='mini'] .xm-paging > span {\n height: 22px;\n line-height: 22px;\n}\nxm-select[size='mini'] .xm-tree .left-line {\n height: 100%;\n bottom: 14px;\n}\nxm-select[size='mini'] .xm-tree .left-line-group {\n height: calc(100% - 28px);\n}\nxm-select[size='mini'] .xm-tree .xm-tree-icon.xm-hidden + .top-line {\n top: 13px;\n}\nxm-select[size='mini'] .item--divided {\n margin: 7px;\n}\n.layui-form-pane xm-select {\n margin: -1px -1px -1px 0;\n}\n",""]),e.exports=t},221:function(e,t){(function(t){e.exports=t}).call(this,{})},27:function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||"",o=e[3];if(!o)return n;if(t&&"function"==typeof btoa){var r=function(e){var t=btoa(unescape(encodeURIComponent(JSON.stringify(e)))),n="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(t);return"/*# ".concat(n," */")}(o),i=o.sources.map((function(e){return"/*# sourceURL=".concat(o.sourceRoot||"").concat(e," */")}));return[n].concat(i).concat([r]).join("\n")}return[n].join("\n")}(t,e);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,o){"string"==typeof e&&(e=[[null,e,""]]);var r={};if(o)for(var i=0;i=0&&p.splice(t,1)}function y(e){var t=document.createElement("style");if(void 0===e.attrs.type&&(e.attrs.type="text/css"),void 0===e.attrs.nonce){var o=function(){0;return n.nc}();o&&(e.attrs.nonce=o)}return x(t,e.attrs),m(e,t),t}function x(e,t){Object.keys(t).forEach((function(n){e.setAttribute(n,t[n])}))}function v(e,t){var n,o,r,i;if(t.transform&&e.css){if(!(i="function"==typeof t.transform?t.transform(e.css):t.transform.default(e.css)))return function(){};e.css=i}if(t.singleton){var a=u++;n=c||(c=y(t)),o=w.bind(null,n,a,!1),r=w.bind(null,n,a,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return void 0===e.attrs.type&&(e.attrs.type="text/css"),e.attrs.rel="stylesheet",x(t,e.attrs),m(e,t),t}(t),o=O.bind(null,n,t),r=function(){b(n),n.href&&URL.revokeObjectURL(n.href)}):(n=y(t),o=k.bind(null,n),r=function(){b(n)});return o(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;o(e=t)}else r()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||"boolean"==typeof t.singleton||(t.singleton=a()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=h(e,t);return d(n,t),function(e){for(var o=[],r=0;r3)for(n=[n],o=3;o1&&E(r,t,n),t=O(n,r,r,e.__k,null,r.__e,t),"function"==typeof e.type&&(e.__d=t)))}function A(e,t,n,r,i,a,l,s,c){var u,p,f,h,m,b,v,g,_,w,O,C=t.type;if(void 0!==t.constructor)return null;(u=o.__b)&&u(t);try{e:if("function"==typeof C){if(g=t.props,_=(u=C.contextType)&&r[u.__c],w=u?_?_.props.value:u.__:r,n.__c?v=(p=t.__c=n.__c).__=p.__E:("prototype"in C&&C.prototype.render?t.__c=p=new C(g,w):(t.__c=p=new x(g,w),p.constructor=C,p.render=M),_&&_.sub(p),p.props=g,p.state||(p.state={}),p.context=w,p.__n=r,f=p.__d=!0,p.__h=[]),null==p.__s&&(p.__s=p.state),null!=C.getDerivedStateFromProps&&(p.__s==p.state&&(p.__s=d({},p.__s)),d(p.__s,C.getDerivedStateFromProps(g,p.__s))),h=p.props,m=p.state,f)null==C.getDerivedStateFromProps&&null!=p.componentWillMount&&p.componentWillMount(),null!=p.componentDidMount&&p.__h.push(p.componentDidMount);else{if(null==C.getDerivedStateFromProps&&g!==h&&null!=p.componentWillReceiveProps&&p.componentWillReceiveProps(g,w),!p.__e&&null!=p.shouldComponentUpdate&&!1===p.shouldComponentUpdate(g,p.__s,w)||t.__v===n.__v){p.props=g,p.state=p.__s,t.__v!==n.__v&&(p.__d=!1),p.__v=t,t.__e=n.__e,t.__k=n.__k,p.__h.length&&l.push(p),E(t,s,e);break e}null!=p.componentWillUpdate&&p.componentWillUpdate(g,p.__s,w),null!=p.componentDidUpdate&&p.__h.push((function(){p.componentDidUpdate(h,m,b)}))}p.context=w,p.props=g,p.state=p.__s,(u=o.__r)&&u(t),p.__d=!1,p.__v=t,p.__P=e,u=p.render(p.props,p.state,p.context),p.state=p.__s,null!=p.getChildContext&&(r=d(d({},r),p.getChildContext())),f||null==p.getSnapshotBeforeUpdate||(b=p.getSnapshotBeforeUpdate(h,m)),O=null!=u&&u.type==y&&null==u.key?u.props.children:u,k(e,Array.isArray(O)?O:[O],t,n,r,i,a,l,s,c),p.base=t.__e,p.__h.length&&l.push(p),v&&(p.__E=p.__=null),p.__e=!1}else null==a&&t.__v===n.__v?(t.__k=n.__k,t.__e=n.__e):t.__e=P(n.__e,t,n,r,i,a,l,c);(u=o.diffed)&&u(t)}catch(e){t.__v=null,o.__e(e,t,n)}return t.__e}function R(e,t){o.__c&&o.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){o.__e(e,t.__v)}}))}function P(e,t,n,o,r,i,a,l){var s,c,f,d,h,m=n.props,b=t.props;if(r="svg"===t.type||r,null!=i)for(s=0;se.length)&&(t=e.length);for(var n=0,o=new Array(t);nr?n-r:r,a=this.labelRef.scrollLeft+e.deltaY;a<0&&(a=0),a>i&&(a=i),this.labelRef.scrollLeft=a}}},{key:"blur",value:function(){var e=this.base.querySelector(".label-search-input");e&&e.blur()}},{key:"labelDrag",value:function(e,t){for(var n=t.type,o=t.target;;){if(!o||"I"===o.tagName)return;if("DIV"===o.tagName&&"fixed"!==o.style.position)break;o=o.parentNode}if(console.log(t),"mousedown"===n){var r=o.cloneNode(!0),i=t.pageX,a=t.pageY,l=t.offsetX,s=t.offsetY;console.log(i,a,l,s),r.style.position="fixed",r.style.left=i-l+"px",r.style.top=a-s+"px",o.appendChild(r),console.log(r),r.onmousemove=function(e){r.style.left=e.pageX-l+"px",r.style.top=e.pageY-s+"px"},r.mouseup=function(){r.parentNode.removeChild(r),r.onmousemove=null,r.mouseup=null,r.mouseleave=null},r.mouseleave=function(){console.log("mouseleave")}}else if("mouseup"===n)for(var c=o.childNodes,u=0;ue.length)&&(t=e.length);for(var n=0,o=new Array(t);n0&&void 0!==arguments[0]||this.size;var e=this.state.pageIndex;e<=1||(this.changePageIndex(e-1),this.props.pageRemote&&this.postData(e-1,!0))}},{key:"pageNextClick",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.size,t=this.state.pageIndex;t>=e||(this.changePageIndex(t+1),this.props.pageRemote&&this.postData(t+1,!0))}},{key:"changePageIndex",value:function(e){this.setState({pageIndex:e})}},{key:"labelSearch",value:function(e){"input"==e.type?this.searchInput(e):this.handleComposition(e)}},{key:"searchInput",value:function(e){var t=this,n=e.target.value;n!==this.__value&&(this.searchCid&&clearTimeout(this.searchCid),this.inputOver&&(this.__value=n,this.searchCid=setTimeout((function(){t.callback=!0,t.setState({filterValue:t.__value,remote:!0,pageIndex:1})}),this.props.delay)))}},{key:"focus",value:function(){this.searchInputRef&&this.searchInputRef.focus()}},{key:"blur",value:function(){this.searchInputRef&&this.searchInputRef.blur()}},{key:"handleComposition",value:function(e){var t=e.type;"compositionstart"===t?(this.inputOver=!1,this.searchCid&&clearTimeout(this.searchCid)):"compositionend"===t&&(this.inputOver=!0,this.searchInput(e))}},{key:"postData",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.state.pageIndex,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];(this.state.remote||n)&&(this.callback=!1,this.setState({loading:!0,remote:!1}),this.blur(),this.props.remoteMethod(this.state.filterValue,(function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;setTimeout((function(){e.focus(),e.callback=!0,e.setState({loading:!1,totalSize:n}),e.props.onReset(t,"data")}),10)}),this.props.show,t))}},{key:"keydown",value:function(e,t){var n=this,o=t.keyCode;if("div"===e&&(27===o||9===o?this.props.onReset(!1,"close"):37===o?this.pagePrevClick():39===o&&this.pageNextClick()),this.props.enableKeyboard){var r=this.props.prop,i=r.value,a=r.optgroup,l=r.disabled,s=this.tempData.filter((function(e){return!e[a]&&!e[l]})),c=s.length-1;if(-1===c)return;var u=s.findIndex((function(e){return e[i]===n.state.val}));if(38===o){u<=0?u=c:u>0&&(u-=1);var p=s[u][i];this.setState({val:p}),this.viewTo(p)}else if(40===o){-1===u||u===c?u=0:uM&&(T=M),M>0&&T<=0&&(T=1),!x){var z=(T-1)*e.pageSize,L=z+e.pageSize;S=S.slice(z,L)}var V={cursor:"no-drop",color:"#d2d2d2"},F={},U={};T<=1&&(F=V),T==M&&(U=V),this.state.pageIndex!==T&&this.changePageIndex(T),this.size=M,D=m("div",{class:"xm-paging"},m("span",{style:F,onClick:this.pagePrevClick.bind(this,M)},e.languageProp.paging.prev),m("span",null,this.state.pageIndex," / ",M),m("span",{style:U,onClick:this.pageNextClick.bind(this,M)},e.languageProp.paging.next))}else e.showCount>0&&(S=S.slice(0,e.showCount));var N,B,K=[],H={__tmp:!0};H[j]=!0,S.forEach((function(e){var t=I[e.__group__index];delete e.__group__index,N&&!t&&(t=H),t!=N&&(N=t,t&&K.push(N)),K.push(e)})),S=K,t&&null!=(t=y(this.state.filterValue,Object(c.b)([],S)))&&(B=S).splice.apply(B,[0,0].concat(J((Object(c.d)(t)?t:[t]).map((function(e){return Z(Z({},e),{},{__node:{}})})))));var q=Object(c.b)([],S);this.tempData=q;var Y=m("div",{class:"xm-toolbar"},e.toolbar.list.map((function(t){var o,r=e.languageProp.toolbar[t];o="ALL"===t?{icon:"xm-iconfont xm-icon-quanxuan",name:r,method:function(e){var t=i.optgroup,o=i.disabled,r=e.filter((function(e){return!e[t]})).filter((function(e){return!e[o]})),a=u.filter((function(e){return e[i.disabled]})),l=[];l=s?a.length?a:r.slice(0,1):v>0?a.length>=v?a:Object(c.f)(r.slice(0,v-a.length),a,i):Object(c.f)(r,u,i),n.props.onReset(l,"sels")}}:"CLEAR"===t?{icon:"xm-iconfont xm-icon-qingkong",name:r,method:function(e){n.props.onReset(u.filter((function(e){return e[i.disabled]})),"sels")}}:"REVERSE"===t?{icon:"xm-iconfont xm-icon-fanxuan",name:r,method:function(e){var t=i.optgroup,o=i.disabled,r=e.filter((function(e){return!e[t]})).filter((function(e){return!e[o]})),a=[];u.forEach((function(e){var t=r.findIndex((function(t){return t[k]===e[k]}));-1==t?a.push(e):r.splice(t,1)}));var l=a.filter((function(e){return e[i.disabled]})),p=[];p=s?l.length?l:r.slice(0,1):v>0?l.length>=v?l:Object(c.f)(r.slice(0,v-l.length),l,i):Object(c.f)(r,a,i),n.props.onReset(p,"sels")}}:t;var a=function(e){"mouseenter"===e.type&&(e.target.style.color=l.color),"mouseleave"===e.type&&(e.target.style.color="")};return m("div",{class:"toolbar-tag",style:{},onClick:function(){Object(c.e)(o.method)&&o.method(q),n.focus()},onMouseEnter:a,onMouseLeave:a},e.toolbar.showIcon&&m("i",{class:o.icon}),m("span",null,o.name))})).filter((function(e){return e}))),Q="hidden"!=e.model.icon;return(S=S.map((function(t){return t[j]?t.__tmp?m("div",{class:"item--divided"}):m("div",{class:"xm-group"},m("div",{class:"xm-group-item",onClick:n.groupClick.bind(n,t)},t[w])):function(t){var r=!!u.find((function(e){return e[k]==t[k]})),i=r?{color:l.color,border:"none"}:{borderColor:l.color},c={};g&&t[k]===n.state.val&&(c.backgroundColor=l.hover),!Q&&r&&(c.backgroundColor=l.color,t[O]&&(c.backgroundColor="#C2C2C2"));var p,f,d=["xm-option",t[O]?" disabled":"",r?" selected":"",Q?"show-icon":"hide-icon"].join(" "),h=["xm-option-icon",(p=e.iconfont.select,f=e.iconfont.unselect,(p?!r&&f?f+" xm-custom-icon":p:0)||"xm-iconfont "+(s?"xm-icon-danx":"xm-icon-duox"))].join(" "),b=function(e){"mouseenter"===e.type?t[O]||(g?n.setState({val:t[k]}):e.target.style.backgroundColor=l.hover):"mouseleave"===e.type&&(t[O]||g||(e.target.style.backgroundColor=""))};return m("div",{class:d,style:c,value:t[k],onClick:n.optionClick.bind(n,t,r,t[O]),onMouseEnter:b,onMouseLeave:b},Q&&m("i",{class:h,style:i}),m("div",{class:"xm-option-content",dangerouslySetInnerHTML:{__html:a({data:o,item:t,arr:u,name:t[w],value:t[k]})}}))}(t)}))).length?_&&this.state.val==ne&&this.keydown("div",{keyCode:40}):(!e.pageEmptyShow&&(D=""),S.push(m("div",{class:"xm-select-empty"},p))),m("div",{onClick:this.blockClick,tabindex:"1",style:"outline: none;"},m("div",null,e.toolbar.show&&Y,P,m("div",{class:"scroll-body",style:{maxHeight:e.height}},S),e.paging&&D),this.state.loading&&m("div",{class:"loading"},m("span",{class:"loader"})))}},{key:"componentDidMount",value:function(){var e=this.base.querySelector(".xm-search-input");e&&(e.addEventListener("compositionstart",this.handleComposition.bind(this)),e.addEventListener("compositionupdate",this.handleComposition.bind(this)),e.addEventListener("compositionend",this.handleComposition.bind(this)),e.addEventListener("input",this.searchInput.bind(this)),this.searchInputRef=e),this.base.addEventListener("keydown",this.keydown.bind(this,"div"))}},{key:"componentDidUpdate",value:function(){if(this.callback){this.callback=!1;var e=this.props.filterDone;Object(c.e)(e)&&e(this.state.filterValue,this.tempData||[])}}}])&&G(t.prototype,n),o&&G(t,o),i}(x);function re(e){return(re="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ie(e,t){for(var n=0;n0||p.lazy&&!1!==e.__node.loading)?"xm-visible":"xm-hidden"].join(" "),j=[];p.showFolderIcon&&(j.push(m("i",{class:C,type:"expand"})),p.showLine&&(o&&j.push(m("i",{class:"left-line",style:{left:t-p.indent+3+"px"}})),j.push(m("i",{class:"top-line",style:{left:t-p.indent+3+"px",width:p.indent+(0===o?10:-2)+"px"}}))));var S=function(t){"mouseenter"===t.type?e[g]||(y?n.setState({val:e[v]}):t.target.style.backgroundColor=a.hover):"mouseleave"===t.type&&(e[g]||y||(t.target.style.backgroundColor=""))};return m("div",{class:w,style:h,value:e[v],onClick:n.optionClick.bind(n,e,r,e[g],"line"),onMouseEnter:S,onMouseLeave:S},j,e.__node.loading&&m("span",{class:"loader"}),k&&m("i",{class:O,style:d,onClick:n.optionClick.bind(n,e,r,e[g],"checkbox")}),m("div",{class:"xm-option-content",dangerouslySetInnerHTML:{__html:s({data:u,item:e,arr:i,name:e[x],value:e[v]})}}))};f&&(d?this.postData():this.filterData(u,this.state.filterValue));var C=Object(c.b)([],u),j=Object(c.b)([],i);this.tempData=C;var S=u.map((function(e){return function e(t,o){if(!t.__node.hidn){var r=t[_];if(o+=p.indent,r){var i=-1!==n.state.expandedKeys.findIndex((function(e){return t[v]===e}));return 0===r.length&&(i=!1),m("div",{class:"xm-tree"},p.showFolderIcon&&p.showLine&&i&&r.length>0&&m("i",{class:"left-line left-line-group",style:{left:o+3+"px"}}),O(t,o,0===r.length&&(!p.lazy||p.lazy&&!1===t.__node.loading)?0:i),i&&m("div",{class:"xm-tree-box"},r.map((function(t){return e(t,o)}))))}return O(t,o,0)}}(e,10-p.indent)})).filter((function(e){return e}));function E(e,t){t.forEach((function(t){t[w]?(p.strict||"hidden"===b.parent||e.push(t),E(e,t[_])):e.push(t)}))}var A=m("div",{class:"xm-toolbar"},e.toolbar.list.map((function(t){var r,s=e.languageProp.toolbar[t];r="ALL"===t?{icon:"xm-iconfont xm-icon-quanxuan",name:s,method:function(e){var t=[];E(t,e),t=t.filter((function(e){return!e[g]&&!e.__node.hidn})),n.props.onReset(l?t.slice(0,1):Object(c.f)(t,i,o),"treeData")}}:"CLEAR"===t?{icon:"xm-iconfont xm-icon-qingkong",name:s,method:function(e){n.props.onReset(i.filter((function(e){return e[o.disabled]})),"treeData")}}:"REVERSE"===t?{icon:"xm-iconfont xm-icon-fanxuan",name:s,method:function(e){var t=[];E(t,e),t=t.filter((function(e){return!e[g]&&!e.__node.hidn}));var r=[];i.forEach((function(e){var n=t.findIndex((function(t){return t[v]===e[v]}));-1==n?r.push(e):t.splice(n,1)})),n.props.onReset(l?r.slice(0,1):Object(c.f)(t,r,o),"treeData")}}:t;var u=function(e){"mouseenter"===e.type&&(e.target.style.color=a.color),"mouseleave"===e.type&&(e.target.style.color="")};return m("div",{class:"toolbar-tag",onClick:function(){Object(c.e)(r.method)&&r.method(C,j)},onMouseEnter:u,onMouseLeave:u},e.toolbar.showIcon&&m("i",{class:r.icon}),m("span",null,r.name))})).filter((function(e){return e}))),R=m("div",{class:f?"xm-search":"xm-search dis"},m("i",{class:"xm-iconfont xm-icon-sousuo"}),m("input",{class:"xm-input xm-search-input",placeholder:h}));return S.length||S.push(m("div",{class:"xm-select-empty"},r)),m("div",{onClick:this.blockClick,class:"xm-body-tree"},e.toolbar.show&&A,R,m("div",{class:"scroll-body",style:{maxHeight:e.height}},S),this.state.loading&&m("div",{class:"loading"},m("span",{class:"loader"})))}},{key:"componentDidMount",value:function(){var e=this.base.querySelector(".xm-search-input");e&&(e.addEventListener("compositionstart",this.handleComposition.bind(this)),e.addEventListener("compositionupdate",this.handleComposition.bind(this)),e.addEventListener("compositionend",this.handleComposition.bind(this)),e.addEventListener("input",this.searchInput.bind(this)),this.searchInputRef=e)}},{key:"componentDidUpdate",value:function(){if(this.callback){this.callback=!1;var e=this.props.filterDone;Object(c.e)(e)&&e(this.state.filterValue,this.tempData||[])}}}])&&fe(t.prototype,n),o&&fe(t,o),i}(x);function ve(e){return(ve="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ge(e,t){for(var n=0;n0,O={backgroundColor:"transparent"},C=["xm-option",g?" disabled":"",v?" selected":"",y?"show-icon":"hide-icon"].join(" "),j=k&&"hidden"===e.iconfont.parent?"xm-option-icon-hidden":["xm-option-icon",(_?e.iconfont.half?e.iconfont.half+" xm-custom-icon":0:k&&e.iconfont.parent?e.iconfont.parent+" xm-custom-icon":v?e.iconfont.select?e.iconfont.select:0:e.iconfont.unselect?e.iconfont.unselect+" xm-custom-icon":0)||"xm-iconfont "+(l?"xm-icon-danx":u.strict&&_?"xm-icon-banxuan":"xm-icon-duox")].join(" ");t[f]===n.state.val&&(O.backgroundColor=a.hover),!y&&v&&(O.backgroundColor=a.color,g&&(O.backgroundColor="#C2C2C2"));var S={},E={};x&&(S.color=a.color,S.fontWeight=700,E.color=a.color);var A=function(e){"mouseenter"===e.type?t[d]||n.setState({val:t[f]}):"mouseleave"===e.type&&n.setState({val:""})};return m("div",{class:C,style:O,value:t[f],onClick:n.optionClick.bind(n,t,v,g,"line",r),onMouseEnter:A,onMouseLeave:A},y&&m("i",{class:j,style:w,onClick:n.optionClick.bind(n,t,v,g,"checkbox",r)}),m("div",{class:"xm-option-content",style:S,dangerouslySetInnerHTML:{__html:s({data:c,item:t,arr:i,name:t[p],value:t[f]})}}),t[b]&&m("div",{class:"xm-right-arrow",style:E}))}(o,0,v,_)},g=c.map((function(e){return v(e,2,0)})).concat(x).filter((function(e){return e}));return g.length||g.push(m("div",{class:"xm-select-empty"},r)),m("div",{onClick:this.blockClick,class:"xm-body-cascader scroll-body",style:{width:u.indent+"px",maxHeight:e.height}},g)}},{key:"componentDidMount",value:function(){this.props.onReset("cascader","class")}}])&&ge(t.prototype,n),o&&ge(t,o),i}(x);function je(){return(je=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,o=new Array(t);n1&&(n=n.slice(0,1),(l.show&&l.strict||s.show&&s.strict)&&this.clearAndReset(o,n,!1)),this.setState({sels:n,dataObj:c,flatData:u})}return this.setState({data:o}),n}},{key:"upDate",value:function(e,t){var n=this.state.dataObj,o=this.props,r=o.prop,i=o.tree,a=o.cascader,l=r.value,s=r.disabled,u=r.children;e.map((function(e){return n["object"===Ie(e)?e[l]:e]})).filter((function(e){return e})).forEach((function(e){if(e[s]=!t,i.show&&i.strict||a.show&&a.strict){if(t)for(var n=e;n;)n[s]=!1,n=n.__node.parent;!function e(n){n[s]=!t;var o=n[u];o&&Object(c.d)(o)&&o.forEach((function(t){return e(t)}))}(e)}})),this.setState({dataObj:n})}},{key:"exchangeValue",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.state.dataObj,o=this.props,r=o.prop,i=o.tree,a=o.cascader,l=(o.data,r.children),s=r.value,u=e.map((function(e){return"object"===Ie(e)?Re(Re({},e),{},{__node:{}}):n[e]})).filter((function(e){return e})),p=Se(u);if(i.show&&i.strict||a.show&&a.strict){var f=function e(t,n){var o=n[l];o&&Object(c.d)(o)&&o.forEach((function(n){-1===u.findIndex((function(e){return e[s]===n[s]}))&&t.push(n),e(t,n)}))},d={};d[l]=u,f(p,d),p=p.filter((function(e){return!0!==e[t.props.prop.optgroup]}))}return p}},{key:"value",value:function(e,t,n,o){var r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];!1!==t&&!0!==t&&(t=this.state.show);var i=this.props,a=i.prop,l=i.tree,s=i.cascader,c=this.exchangeValue(e);if(!this.checkMax(c,c,!0)){if(l.show&&l.strict||s.show&&s.strict){var u=this.state.data;this.clearAndReset(u,c,!1),c=this.init({data:u,prop:a},!0)}this.resetSelectValue(c,o||c,r,n),this.setState({show:t})}}},{key:"clearAndReset",value:function(e,t,n){var o=this,r=this.props.prop,i=r.selected,a=r.disabled,l=r.children,s=r.value;e.forEach((function(e){e[i]=-1!=t.findIndex((function(t){return t[s]===e[s]}))||n;var r=e[l];if(r&&Object(c.d)(r)&&r.length>0){o.clearAndReset(r,t,e[i]);var u=r.length,p=r.filter((function(e){return!0===e[i]||!0===e.__node.selected})).length;e.__node.selected=p===u,e.__node.half=p>0&&p0,e.__node.disabled=r.filter((function(e){return!0===e[a]||!0===e.__node.disabled})).length===u}}))}},{key:"load",value:function(e,t,n,o){var r=this,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,a=arguments.length>5?arguments[5]:void 0,l=this.props,s=l.prop,u=l.tree,p=l.cascader,f=s.children,d=s.optgroup,h=s.value,m=s.selected,b=s.disabled;e.forEach((function(e){e.__node={parent:o,level:i,loading:e.__node&&e.__node.loading},a&&(delete e[m],a.find((function(t){return t===e[h]}))&&(e[m]=!0)),t[e[h]]=e,n.push(e);var l=e[f];if(l&&Object(c.d)(l)){var s=l.length;if(s>0){r.load(l,t,n,e,i+1,a),e[d]=!0,(u.show&&u.strict||p.show&&p.strict)&&(!0===e[m]&&(delete e[m],l.forEach((function(e){return e[m]=!0}))),!0===e[b]&&(delete e[b],l.forEach((function(e){return e[b]=!0}))));var y=l.filter((function(e){return!0===e[m]||!0===e.__node.selected})).length;e.__node.selected=y===s,e.__node.half=y>0&&y0,e.__node.disabled=l.filter((function(e){return!0===e[b]||!0===e.__node.disabled})).length===s}}}))}},{key:"resetSelectValue",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2?arguments[2]:void 0,o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=this.props.on;if(Object(c.e)(r)&&this.prepare&&o){var i=r({arr:e,change:t,isAdd:n});if(Object(c.d)(i))return this.value(i,null,!1)}this.setState({sels:e})}},{key:"updateBorderColor",value:function(e){this.setState({tmpColor:e})}},{key:"treeHandler",value:function(e,t,n,o,r){var i=this,a=this.props.prop,l=a.value,s=(a.selected,a.disabled),c=a.children,u=a.optgroup,p=t[c];if(p.filter((function(e){return!(e[s]||e.__node.disabled)})).forEach((function(t){if(t[u])i.treeHandler(e,t,n,o,r);else{var a=e.findIndex((function(e){return e[l]==t[l]}));"del"===o?-1!=a&&(e.splice(a,1),n.push(t)):"half"!==o&&"add"!==o||-1==a&&(e.push(t),n.push(t))}})),r){var f=p.length,d=p.filter((function(t){return-1!==e.findIndex((function(e){return e[l]===t[l]}))||!0===t.__node.selected})).length;t.__node.selected=d===f,t.__node.half=d>0&&dl;if(l>0&&s)return this.updateBorderColor(a.maxColor),i&&Object(c.e)(i)&&i(t,e),!0}},{key:"itemClick",value:function(e,t,n,o){var r=this.props,i=(r.theme,r.prop),a=r.radio,l=r.repeat,s=r.clickClose,c=(r.max,r.maxMethod,r.tree),u=r.cascader,p=r.data,f=Se(this.state.sels),d=i.value,h=(i.selected,i.disabled,i.children),m=i.optgroup;if(!n){if(e[m]&&(c.show&&c.strict||u.show&&u.strict)){e[h];var b,y=[],x=!0;if(e.__node.selected?(b="del",x=!1):e.__node.half?(b="half",this.treeHandler(f,e,y,b),0===y.length&&(b="del",x=!1)):b="add","half"!=b&&this.treeHandler(f,e,y,b),this.checkMax(y,f))return;f=Se(this.state.sels),y=[],this.treeHandler(f,e,y,b,!0),this.resetSelectValue(f,y,x),this.setState({data:this.state.data})}else if(!t||l&&!o){if(this.checkMax(e,f))return;f=a?[e]:[].concat(Se(f),[e]),this.clearAndReset(p,f,t),this.resetSelectValue(f,[e],!t)}else{var v=f.findIndex((function(t){return t[d]==e[d]}));-1!=v&&(f.splice(v,1),this.resetSelectValue(f,[e],!t))}var g=e.__node.parent;if(g){for(;g;){var _=g[h],w=_.length,k=_.filter((function(e){return-1!==f.findIndex((function(t){return t[d]===e[d]}))||!0===e.__node.selected})).length;g.__node.selected=k===w,g.__node.half=k>0&&k0,g=g.__node.parent}this.setState({data:this.state.data})}s&&!o&&this.onClick()}}},{key:"onClick",value:function(e){var t=this;if("relative"!==this.props.model.type)if(this.props.disabled)!1!==this.state.show&&this.setState({show:!1});else{var n=!this.state.show;if(n){if(this.props.show&&0==this.props.show())return;Object.keys(Xe).filter((function(e){return e!=t.props.el})).forEach((function(e){return Xe[e].closed()}))}else{if(this.props.hide&&0==this.props.hide())return;this.bodyView.scroll&&this.bodyView.scroll(0,0)}this.setState({show:n}),e&&e.stopPropagation()}}},{key:"onReset",value:function(e,t){var n=this;if("data"===t){var o=e.filter((function(e){return!0===e[n.props.prop.selected]}));this.resetSelectValue(Object(c.f)(o,this.state.sels,this.props.prop),o,!0);var r=[];this.load(e,{},r),this.setState({data:e,flatData:r})}else"sels"===t?this.resetSelectValue(e,e,!0):"append"===t?this.append(e):"delete"===t?this.del(e):"auto"===t?this.auto(e):"treeData"===t?this.value(e,null,!0,!1,!1):"close"===t?this.onClick():"class"===t?this.setState({bodyClass:e}):"labelSearchBlur"===t?this.labelRef.blur(e):"labelSearch"===t&&this.generalRef.labelSearch(e)}},{key:"append",value:function(e){var t=this.exchangeValue(e);this.value(Object(c.f)(t,this.state.sels,this.props.prop),this.props.show,!0,t)}},{key:"del",value:function(e){var t=this.props.prop.value,n=this.state.sels,o=this.exchangeValue(e);o.forEach((function(e){var o=n.findIndex((function(n){return n[t]===e[t]}));-1!=o&&n.splice(o,1)})),this.value(n,this.props.show,!0,o,!1)}},{key:"auto",value:function(e){var t=this,n=this.props.prop.value;e.filter((function(e){return-1!=t.state.sels.findIndex((function(t){return t[n]===e[n]}))})).length==e.length?this.del(e):this.append(e)}},{key:"changeExpandedKeys",value:function(e){var t=this.props,n=t.tree,o=t.prop,r=this.state,i=r.dataObj,a=r.flatData;n.show&&this.treeRef.init({dataObj:i,flatData:a,prop:o,tree:{expandedKeys:e}})}},{key:"calcPosition",value:function(){if(this.state.show&&"fixed"===this.props.model.type){var e=this.base.getBoundingClientRect();return Date.now()-this.state.time>10&&this.setState({time:Date.now()}),{position:"fixed",left:e.x,top:e.y+e.height+4,width:e.width}}return{}}},{key:"componentWillReceiveProps",value:function(e){this.init(e,e.updateData)}},{key:"componentWillMount",value:function(){this.init(this.props,!0)}},{key:"render",value:function(e,t){var n=this,o=e.theme,r=e.prop,i=(e.radio,e.repeat,e.clickClose,e.on,e.max,e.maxMethod,e.content),a=e.disabled,l=e.tree,s=e.submitConversion,u={borderColor:o.color},p=t.data,f=t.dataObj,d=t.flatData,h=t.sels,b=t.show,y=t.tmpColor,x=t.bodyClass;a&&(b=!1);var v={style:Re(Re({},e.style),b?u:{}),onClick:this.onClick.bind(this),ua:Object(c.a)(),size:e.size,tabindex:1};y&&(v.style.borderColor=y,setTimeout((function(){v.style.borderColor="",n.updateBorderColor("")}),300)),r.value;var g=Re(Re({},e),{},{data:p,sels:h,ck:this.itemClick.bind(this),title:h.map((function(e){return e[r.name]})).join(","),onReset:this.onReset.bind(this)}),_=Re(Re({},e),{},{data:p,dataObj:f,flatData:d,sels:h,ck:this.itemClick.bind(this),show:b,onReset:this.onReset.bind(this)}),w=i?m(ue,_):l.show?m(xe,je({},_,{ref:function(e){return n.treeRef=e}})):e.cascader.show?m(Ce,_):m(oe,je({},_,{ref:function(e){return n.generalRef=e}})),k=this.calcPosition();return m("xm-select",v,m("input",{class:"xm-select-default","lay-verify":e.layVerify,"lay-verType":e.layVerType,"lay-reqText":e.layReqText,name:e.name,value:s(h,r)}),m("i",{class:b?"xm-icon xm-icon-expand":"xm-icon"}),0===h.length&&m("div",{class:"xm-tips"},e.tips),m(H,je({},g,{ref:function(e){return n.labelRef=e}})),m("div",{class:["xm-body",x,e.model.type,b?"":"dis"].join(" "),style:k,ref:function(e){return n.bodyView=e}},w),a&&m("div",{class:"xm-select-disabled"}))}},{key:"componentDidMount",value:function(){var e=this;this.prepare=!0,this.base.addEventListener("keydown",(function(t){13===t.keyCode&&e.onClick(t)})),this.input=this.base.querySelector(".xm-select-default");var t=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;t&&new t((function(t){t.forEach((function(t){"attributes"==t.type&&"class"===t.attributeName&&-1!==e.input.className.indexOf("layui-form-danger")&&(e.input.className="xm-select-default",e.base.style.borderColor=e.props.theme.maxColor,e.base.scrollIntoView&&e.base.scrollIntoView({behavior:"smooth"}))}))})).observe(this.input,{attributes:!0});for(var n=this.base;n;){if("FORM"===n.tagName){var o=n.querySelector('button[type="reset"]');o&&o.addEventListener("click",(function(t){e.init(e.props,!0)}));break}n=n.parentElement}var r=this.props.done;r&&r()}},{key:"componentDidUpdate",value:function(){var e=this.props,t=e.direction,n=e.model;if("relative"!==n.type&&"fixed"!==n.type){var o=this.base.getBoundingClientRect();if("auto"===t){this.bodyView.style.display="block",this.bodyView.style.visibility="hidden";var r=this.bodyView.getBoundingClientRect().height;this.bodyView.style.display="",this.bodyView.style.visibility="";var i=o.y||o.top||0,a=document.documentElement.clientHeight-i-o.height-20;t=a>r||i0&&void 0!==arguments[0]?arguments[0]:"zn",t=Ne[e]||Ue;return{language:e,languageProp:t,data:[],content:"",name:"select",layVerify:"",layVerType:"",layReqText:"",size:"medium",disabled:!1,initValue:null,create:null,tips:t.tips,empty:t.empty,delay:500,searchTips:t.searchTips,filterable:!1,filterMethod:function(e,t,n,o){return!e||-1!=t[o.name].indexOf(e)},remoteSearch:!1,remoteMethod:function(e,t){t([])},direction:"auto",style:{},height:"200px",autoRow:!1,paging:!1,pageSize:10,pageEmptyShow:!0,pageRemote:!1,radio:!1,repeat:!1,clickClose:!1,max:0,maxMethod:function(e,t){},showCount:0,enableKeyboard:!0,enableHoverFirst:!0,selectedKeyCode:13,toolbar:{show:!1,showIcon:!0,list:["ALL","CLEAR"]},tree:{show:!1,showFolderIcon:!0,showLine:!0,indent:20,expandedKeys:[],strict:!0,lazy:!1,load:null,simple:!1,nodeType:"__node_type",clickExpand:!0,clickCheck:!0},cascader:{show:!1,indent:100,strict:!0},prop:{name:"name",value:"value",selected:"selected",disabled:"disabled",children:"children",optgroup:"optgroup",click:"click"},theme:{color:"#009688",maxColor:"#e54d42",hover:"#f2f2f2"},model:{label:{type:"block",text:{left:"",right:"",separator:", "},block:{showCount:0,showIcon:!0,template:null},count:{template:function(e,t){return"已选中 ".concat(t.length," 项, 共 ").concat(e.length," 项")}}},icon:"show",type:"absolute"},iconfont:{select:"",unselect:"",half:"",parent:""},show:function(){},hide:function(){},template:function(e){e.item,e.sels;var t=e.name;return e.value,t},on:function(e){e.arr,e.item,e.selected},submitConversion:function(e,t){return e.map((function(e){return e[t.value]})).join(",")},done:function(){}}}(e.language),this.update(e)}},{key:"update",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=!!e.data;this.options=Object(c.b)(this.options,e),this.options.__render_success=!1;var n=this.options.dom;if(n){var o=this.options.data||[];if("function"==typeof o&&(o=o(),this.options.data=o),Object(c.d)(o))return T(m(Fe,qe({},this.options,{__update:Date.now(),updateData:t})),n),this.options.__render_success=!0,this;Object(c.k)("data数据必须为数组类型, 不能是".concat("undefined"==typeof data?"undefined":Ye(data),"类型"))}else Object(c.k)("没有找到渲染对象: ".concat(e.el,", 请检查"))}},{key:"reset",value:function(){var e=this.options.el;return this.init($e[e]),et[e].init(this.options,!0),this}},{key:"opened",value:function(){var e=et[this.options.el];return!e.state.show&&e.onClick(),this}},{key:"closed",value:function(){var e=et[this.options.el];return e.state.show&&e.onClick(),this}},{key:"getValue",value:function(e){var t=this,n=this.options,o=n.tree,r=n.prop,i=n.data,a=et[this.options.el].state.sels,l=a;o.show&&o.strict&&o.simple&&(l=[],Object(c.j)(i,a,l,r));var s=Object(c.c)(l,r.children,["__node"]);return"name"===e?s.map((function(e){return e[t.options.prop.name]})):"nameStr"===e?s.map((function(e){return e[t.options.prop.name]})).join(","):"value"===e?s.map((function(e){return e[t.options.prop.value]})):"valueStr"===e?s.map((function(e){return e[t.options.prop.value]})).join(","):s}},{key:"setValue",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(Object(c.d)(e))return et[this.options.el].value(this.options.radio?e.slice(0,1):e,t,n),this;Object(c.k)("请传入数组结构...")}},{key:"append",value:function(e){if(Object(c.d)(e))return et[this.options.el].append(e),this;Object(c.k)("请传入数组结构...")}},{key:"delete",value:function(e){if(Object(c.d)(e))return et[this.options.el].del(e),this;Object(c.k)("请传入数组结构...")}},{key:"warning",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=e||this.options.theme.maxColor;return!0===t?et[this.options.el].base.style.borderColor=n:et[this.options.el].updateBorderColor(n),this}},{key:"getTreeValue",value:function(e,t){var n=this.options,o=n.tree,r=n.cascader,i=n.prop,a=i.value;if(!o.show&&!r.show)return this.getValue(e);for(var l=et[this.options.el].state.sels,s=[],u=o.nodeType,p=function(e,t){s.find((function(t){return t[a]===e[a]}))||((e=Ke({},e))[u]=t,s.push(e))},f=0;fe.length)&&(t=e.length);for(var n=0,o=new Array(t);n0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"pid",n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"id",o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"children",r=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,i={};return safety(e).filter((function(e){var a=e[n],l=e[t],s=i[a],c=i[l];return s&&(e[o]=s[o]),i[a]=e,c||(c=Je({},o,[]),i[l]=c),c.push(e),n==r}))}}}}); \ No newline at end of file diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/ConfigOptions/Configs.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/ConfigOptions/Configs.cs index 81d2349..b27b9c7 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/ConfigOptions/Configs.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/ConfigOptions/Configs.cs @@ -56,7 +56,11 @@ namespace WalkingTec.Mvvm.Core } set { - _domains = value; + _domains = new Dictionary(); + foreach (var domain in value) + { + _domains.Add(domain.Key.ToLower(), domain.Value); + } foreach (var item in _domains) { if(item.Value != null) diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/DataContext.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/DataContext.cs index 3d97f2e..cc7cc9c 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/DataContext.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/DataContext.cs @@ -177,8 +177,9 @@ namespace WalkingTec.Mvvm.Core var AllModules = allModules as List; var roles = new FrameworkRole[] { - new FrameworkRole{ ID = Guid.NewGuid(), RoleCode = "001", RoleName = CoreProgram._localizer?["Sys.Admin"]} - }; + new FrameworkRole{ ID = Guid.NewGuid(), RoleCode = "001", CreateBy="Admin" , RoleName = CoreProgram._localizer?["Sys.Admin"]}, + new FrameworkRole{ ID = Guid.NewGuid(), RoleCode = "002", RoleName = CoreProgram._localizer?["_Admin.User"]}, + }; var adminRole = roles[0]; if (Set().Any() == false) @@ -1069,7 +1070,8 @@ namespace WalkingTec.Mvvm.Core var AllModules = allModules as List; var roles = new FrameworkRole[] { - new FrameworkRole{ ID = Guid.NewGuid(), RoleCode = "001", RoleName = CoreProgram._localizer?["Sys.Admin"]} + new FrameworkRole{ ID = Guid.NewGuid(), RoleCode = "001", RoleName = CoreProgram._localizer?["Sys.Admin"]}, + new FrameworkRole{ ID = Guid.NewGuid(), RoleCode = "002", RoleName = CoreProgram._localizer?["_Admin.User"]}, }; var adminRole = roles[0]; diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Enums.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Enums.cs index 2058b09..d3ba0a4 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Enums.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Enums.cs @@ -48,7 +48,8 @@ namespace WalkingTec.Mvvm.Core public enum ButtonTypesEnum { Button, - Link + Link, + Img }; /// diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/DCExtension.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/DCExtension.cs index d3eaf3f..8184ab9 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/DCExtension.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/DCExtension.cs @@ -277,6 +277,8 @@ namespace WalkingTec.Mvvm.Core.Extensions private static IQueryable AppendSelfDPWhere(IQueryable query, WTMContext wtmcontext, List dps) where T : TopBasePoco { var dpsSetting = wtmcontext?.DataPrivilegeSettings; + Type modelTye = typeof(T); + bool isBasePoco = typeof(IBasePoco).IsAssignableFrom(modelTye); ParameterExpression pe = Expression.Parameter(typeof(T)); Expression peid = Expression.Property(pe, typeof(T).GetSingleProperty("ID")); //循环数据权限,加入到where条件中,达到自动过滤的效果 @@ -293,7 +295,15 @@ namespace WalkingTec.Mvvm.Core.Extensions var ids = dps.Where(x => x.TableName == query.ElementType.Name).Select(x => x.RelateId).ToList(); if (ids == null || ids.Count() == 0) { - query = query.Where(Expression.Lambda>(Expression.NotEqual(Expression.Constant(1), Expression.Constant(1)), pe)); + //if (isBasePoco == true) + //{ + // var selfexp = Expression.Equal(Expression.Property(pe, "CreateBy"), Expression.Constant(wtmcontext.LoginUserInfo?.ITCode)); + // query = query.Where(Expression.Lambda>(selfexp, pe)); + //} + //else + //{ + query = query.Where(Expression.Lambda>(Expression.NotEqual(Expression.Constant(1), Expression.Constant(1)), pe)); + //} } else { @@ -315,35 +325,43 @@ namespace WalkingTec.Mvvm.Core.Extensions /// /// 关联表外键 /// 修改后的查询语句 - public static IQueryable DPWhere(this IQueryable baseQuery, WTMContext wtmcontext, params Expression>[] IdFields) where T : TopBasePoco - { - var dps = wtmcontext?.LoginUserInfo?.DataPrivileges; - //循环所有关联外键 - List tableNameList = new List(); - foreach (var IdField in IdFields) - { + //public static IQueryable DPWhere(this IQueryable baseQuery, WTMContext wtmcontext, params Expression>[] IdFields) where T : TopBasePoco + //{ + // var dps = wtmcontext?.LoginUserInfo?.DataPrivileges; + // //循环所有关联外键 + // List tableNameList = new List(); + // foreach (var IdField in IdFields) + // { - //将外键 Id 用.分割,循环生成指向最终id的表达式,比如x=> x.a.b.Id - var fieldName = IdField.GetPropertyName(false); - //获取关联的类 - string typename = ""; - //如果外键名称不是‘id’,则根据model层的命名规则,它应该是xxxId,所以抹掉最后的 Id 应该是关联的类名 - if (fieldName.ToLower() != "id") - { - fieldName = fieldName.Remove(fieldName.Length - 2); - typename = IdField.GetPropertyInfo().DeclaringType.GetSingleProperty(fieldName).PropertyType.Name; - } - //如果是 Id,则本身就是关联的类 - else - { - typename = typeof(T).Name; - } - tableNameList.Add(typename); + // //将外键 Id 用.分割,循环生成指向最终id的表达式,比如x=> x.a.b.Id + // var fieldName = IdField.GetPropertyName(false); + // //获取关联的类 + // string typename = ""; + // //如果外键名称不是‘id’,则根据model层的命名规则,它应该是xxxId,所以抹掉最后的 Id 应该是关联的类名 + // if (fieldName.ToLower() != "id") + // { + // fieldName = fieldName.Remove(fieldName.Length - 2); + // var dtype = IdField.GetPropertyInfo().DeclaringType; + // if (dtype == typeof(TreePoco) && fieldName == "Parent") + // { + // typename = typeof(T).Name; + // } + // else + // { + // typename = dtype.GetSingleProperty(fieldName).PropertyType.Name; + // } + // } + // //如果是 Id,则本身就是关联的类 + // else + // { + // typename = typeof(T).Name; + // } + // tableNameList.Add(typename); - } - //var test = DPWhere(baseQuery, dps, tableNameList, IdFields); - return DPWhere(baseQuery, wtmcontext, tableNameList, IdFields); - } + // } + // //var test = DPWhere(baseQuery, dps, tableNameList, IdFields); + // return DPWhere(baseQuery, wtmcontext, tableNameList, IdFields); + //} #region AddBy YOUKAI 20160310 /// @@ -352,10 +370,9 @@ namespace WalkingTec.Mvvm.Core.Extensions /// 源数据类 /// 源Query /// wtm context - /// 关联数据权限的表名,如果关联外键为自身,则参数第一个为自身 /// 关联表外键 /// 修改后的查询语句 - public static IQueryable DPWhere(this IQueryable baseQuery, WTMContext wtmcontext, List tableName, params Expression>[] IdFields) where T : TopBasePoco + public static IQueryable DPWhere(this IQueryable baseQuery, WTMContext wtmcontext, params Expression>[] IdFields) where T : TopBasePoco { var dps = wtmcontext?.LoginUserInfo?.DataPrivileges; @@ -370,79 +387,99 @@ namespace WalkingTec.Mvvm.Core.Extensions //循环所有关联外键 foreach (var IdField in IdFields) { - bool mtm = false; Expression exp = trueExp; //将外键Id用.分割,循环生成指向最终id的表达式,比如x=> x.a.b.Id var fullname = IdField.GetPropertyName(); string[] splits = fullname.Split('.'); - int leftindex = splits[0].IndexOf('['); - if (leftindex > 0) - { - mtm = true; - splits[0] = splits[0].Substring(0, leftindex); - } - Expression peid = Expression.MakeMemberAccess(pe, pe.Type.GetSingleProperty(splits[0])); - Type middletype = null; - if (mtm) - { - middletype = peid.Type.GetGenericArguments()[0]; - } - else + List<(Expression exp, ParameterExpression pe, bool islist)> data = new System.Collections.Generic.List<(Expression, ParameterExpression, bool)>(); + Expression iexp = pe; + ParameterExpression ipe = pe; + + //格式化idfeild,保存在data中 + for (int i=0;i 0) { - peid = Expression.MakeMemberAccess(peid, peid.Type.GetSingleProperty(splits[i])); + islist = true; + proname = proname.Substring(0, lindex); + } + iexp = Expression.MakeMemberAccess(iexp, iexp.Type.GetSingleProperty(proname)); + + Type petype = null; + if (islist == true) + { + petype = iexp.Type.GetGenericArguments()[0]; + } + else + { + petype = iexp.Type; + } + if (petype == typeof(TreePoco)) + { + petype = typeof(T); + } + if(islist == true || i == splits.Length-1) + { + data.Add((iexp, ipe, islist)); + ipe = Expression.Parameter(petype); + iexp = ipe; } - middletype = (peid as MemberExpression).Member.DeclaringType; } + + //确定最终关联的表名 + string tableName = ""; + if(data.Count > 0) + { + var last = data.Last().exp as MemberExpression; + string fieldname = last?.Member?.Name; + if (string.IsNullOrEmpty(fieldname) == false) + { + if (fieldname.ToLower() == "id") + { + tableName = last.Member.ReflectedType.Name; + } + else + { + var pro2 = wtmcontext.DC.GetPropertyNameByFk(last.Member.ReflectedType, fieldname); + if (string.IsNullOrEmpty(pro2) == false) + { + tableName = last.Member.ReflectedType.GetSingleProperty(pro2).PropertyType.Name; + } + } + } + } + //如果dps为空,则拼接一个返回假的表达式,这样就查询不出任何数据 - if (dps == null) + if (dps == null || tableName == "") { exp = falseExp; } else { - var fieldName = IdField.GetPropertyName(false); - //如果外键名称不是‘id’,则根据model层的命名规则,它应该是xxxId,所以抹掉最后的 Id 应该是关联的类名 - if (fieldName.ToLower() != "id") - { - fieldName = fieldName.Remove(fieldName.Length - 2); - var typeinfo = middletype.GetSingleProperty(fieldName); - //var IsTableName = tableName?.Where(x => x == fieldName).FirstOrDefault(); - var IsTableName = tableName?.Where(x => x.ToLower() == typeinfo.PropertyType.Name.ToLower()).FirstOrDefault(); - if (string.IsNullOrEmpty(IsTableName)) - { - continue; - } - fieldName = IsTableName; - //typename = PropertyHelper.GetPropertyInfo(IdField).DeclaringType.GetProperty(fieldName).PropertyType.Name; - } - //如果是Id,则本身就是关联的类 - else - { - fieldName = tableName[tindex]; - } var dpsSetting = wtmcontext.DataPrivilegeSettings; - //循环系统设定的数据权限,如果没有和关联类一样的表,则跳过 - if (dpsSetting.Where(x => x.ModelName == fieldName).SingleOrDefault() == null) + if (dpsSetting.Where(x => x.ModelName == tableName).FirstOrDefault() == null) { continue; } //获取dps中关联到关联类的id列表 - var ids = dps.Where(x => x.TableName == fieldName).Select(x => x.RelateId).ToList(); + var ids = dps.Where(x => x.TableName == tableName).Select(x => x.RelateId).ToList(); //如果没有关联的id,则拼接一个返回假的where,是语句查询不到任何数据 - if (ids == null || ids.Count() == 0) + if (ids == null || ids.Count == 0) { - exp = falseExp; - //if (peid.Type == typeof(Guid)) + //bool isBasePoco = typeof(IBasePoco).IsAssignableFrom(data.Last().pe.Type); + //if (isBasePoco) //{ - // exp = Expression.Equal(peid, Expression.Constant(Guid.NewGuid())); + // exp = Expression.Equal(Expression.Property(data.Last().pe, "CreateBy"), Expression.Constant(wtmcontext.LoginUserInfo?.ITCode)); //} //else //{ - // exp = Expression.Equal(peid, Expression.Constant(null)); + exp = falseExp; //} } //如果有关联 Id @@ -452,30 +489,30 @@ namespace WalkingTec.Mvvm.Core.Extensions //如果关联 Id 包括null,则代表可以访问所有数据,就不需要再拼接where条件了 if (!ids.Contains(null)) { - if (mtm == true) + for(int i=data.Count-1; i>=0; i--) { - ParameterExpression midpe = Expression.Parameter(middletype); - Expression middleid = Expression.PropertyOrField(midpe, IdField.GetPropertyName(false)); + var d = data[i]; + if(d.islist == true) + { + var lastd = data[i + 1]; + var queryable = Expression.Call( + typeof(Queryable), + "AsQueryable", + new Type[] { lastd.pe.Type }, + d.exp); - var queryable = Expression.Call( - typeof(Queryable), - "AsQueryable", - new Type[] { middletype }, - peid); + exp = Expression.Call( + typeof(Queryable), + "Any", + new Type[] { lastd.pe.Type }, + queryable, + Expression.Lambda(typeof(Func<,>).MakeGenericType(lastd.pe.Type, typeof(bool)), exp, new ParameterExpression[] { lastd.pe })); - List ddd = new List(); - - exp = Expression.Call( - typeof(Queryable), - "Any", - new Type[] { middletype }, - queryable, - Expression.Lambda(typeof(Func<,>).MakeGenericType(middletype, typeof(bool)), ids.GetContainIdExpression(middletype, midpe, middleid).Body, new ParameterExpression[] { midpe })); - - } - else - { - exp = ids.GetContainIdExpression(typeof(T), pe, peid).Body; + } + else + { + exp = ids.GetContainIdExpression(d.pe.Type, d.pe, d.exp).Body; + } } } } diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/ListVMExtension.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/ListVMExtension.cs index 694d533..7210e45 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/ListVMExtension.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/ListVMExtension.cs @@ -355,10 +355,28 @@ namespace WalkingTec.Mvvm.Core.Extensions /// a listvm /// true to return plain text, false to return formated html, such as checkbox,buttons ... /// use enum display name + /// 无参有返回委托,返回一个字典 /// json string - public static string GetJson(this IBasePagedListVM self, bool PlainText = true, bool enumToString = true) where T : TopBasePoco, new() + public static string GetJson(this IBasePagedListVM self, bool PlainText = true, bool enumToString = true, Func> func = null) where T : TopBasePoco, new() { - return $@"{{""Data"":{self.GetDataJson(PlainText,enumToString)},""Count"":{self.Searcher.Count},""Page"":{self.Searcher.Page},""PageCount"":{self.Searcher.PageCount},""Msg"":""success"",""Code"":200}}"; + if (!self.IsSearched) self.DoSearch(); + + StringBuilder builder = new("{", capacity: 1024); + var dic = func?.Invoke(); + + // 如果用户的附加字典不为空,则添加用户自定义的信息 + if (dic != null) foreach (var item in dic) builder.Append($"\"{item.Key}\":\"{item.Value}\","); + + // 设置wtm必要的数据 + builder + .Append($"\"Code\":200,") + .Append($"\"Count\":{self.Searcher.Count},") + .Append($"\"Data\":{self.GetDataJson(PlainText, enumToString)},") + .Append($"\"Msg\":\"success\",") + .Append($"\"Page\":{self.Searcher.Page},") + .Append($"\"PageCount\":{self.Searcher.PageCount}") + .Append('}'); + return builder.ToString(); } public static object GetJsonForApi(this IBasePagedListVM self, bool PlainText = true) where T : TopBasePoco, new() diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/RequestExtension.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/RequestExtension.cs new file mode 100644 index 0000000..2498e0e --- /dev/null +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/RequestExtension.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace WalkingTec.Mvvm.Core.Extensions +{ + public static class RequestExtension + { + public static async Task> RedirectCall(this HttpRequest request, WTMContext wtm, string domainname) + { + HttpMethodEnum method = Enum.Parse(request.Method.ToString()); + ApiResult rv = null; + if (method == HttpMethodEnum.GET) + { + rv = await wtm.CallAPI("mainhost", request.Path.ToString()); + } + else + { + if(request.HasFormContentType == true) + { + Dictionary data = new Dictionary(); + foreach (var item in request.Form) + { + data.Add(item.Key, item.Value); + } + rv = await wtm.CallAPI("mainhost", request.Path.ToString(), method, data); + } + else + { + HttpContent data = new StreamContent(request.Body); + rv = await wtm.CallAPI("mainhost", request.Path.ToString(), method, data); + } + } + return rv; + } + } +} diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/SystemExtensions/StringExtension.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/SystemExtensions/StringExtension.cs index 9faf192..70d5805 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/SystemExtensions/StringExtension.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Extensions/SystemExtensions/StringExtension.cs @@ -106,7 +106,7 @@ namespace WalkingTec.Mvvm.Core.Extensions var s = ""; if (Format == null) { - s = item.ToString(); + s = item?.ToString()??""; } else { diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Helper/IServiceExtension.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Helper/IServiceExtension.cs index b029a6a..4c9ee0f 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Helper/IServiceExtension.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Helper/IServiceExtension.cs @@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; using WalkingTec.Mvvm.Core.Extensions; using WalkingTec.Mvvm.Core.Support.FileHandlers; +using WalkingTec.Mvvm.Core.Support.Quartz; namespace WalkingTec.Mvvm.Core { @@ -53,6 +54,7 @@ namespace WalkingTec.Mvvm.Core dc.Database.EnsureCreated(); } WtmFileProvider.Init(WtmConfigs, gd); + services.TryAddSingleton(); return services; } diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Helper/PropertyHelper.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Helper/PropertyHelper.cs index 095b583..1e4a0c4 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Helper/PropertyHelper.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Helper/PropertyHelper.cs @@ -127,10 +127,15 @@ namespace WalkingTec.Mvvm.Core { me = le.Body as MemberExpression; } - if (le.Body is UnaryExpression) + else if (le.Body is UnaryExpression) { me = (le.Body as UnaryExpression).Operand as MemberExpression; } + else if(le.Body is MethodCallExpression mexp && mexp.Method.Name == "get_Item") + { + object index = 0; + me = mexp.Object as MemberExpression; + } } string rv = ""; if (me != null) diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Models/ActionLog.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Models/ActionLog.cs index bf4433a..6992cc1 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Models/ActionLog.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Models/ActionLog.cs @@ -12,7 +12,9 @@ namespace WalkingTec.Mvvm.Core [Display(Name = "_Admin.Exception")] Exception, [Display(Name = "_Admin.Debug")] - Debug + Debug, + [Display(Name = "_Admin.Job")] + Job }; /// diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Models/FrameworkUser.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Models/FrameworkUser.cs index 5885650..88041c2 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Models/FrameworkUser.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Models/FrameworkUser.cs @@ -15,7 +15,7 @@ namespace WalkingTec.Mvvm.Core /// FrameworkUser /// [Table("FrameworkUsers")] - public class FrameworkUserBase : BasePoco + public abstract class FrameworkUserBase : BasePoco { [Display(Name = "_Admin.Account")] [Required(ErrorMessage = "Validate.{0}required")] diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/QuartzAttributes.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/QuartzAttributes.cs new file mode 100644 index 0000000..98ecb52 --- /dev/null +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/QuartzAttributes.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace WalkingTec.Mvvm.Core.Support.Quartz +{ + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] + public class QuartzJobAttribute : Attribute + { + public string Name { get; set; } + public QuartzJobAttribute(string name) + { + this.Name = name; + } + } + + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] + public class QuartzGroupAttribute : Attribute + { + public string Group { get; set; } + public QuartzGroupAttribute(string group) + { + this.Group = group; + } + } + + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] + public class QuartzRepeatAttribute : Attribute + { + public int Repeat { get; set; } + public bool IsForever { get; set; } + public int IntervalInSeconds { get; set; } + /// + /// + /// + /// 间隔时间,单位秒 + /// 重复的次数 + /// 是否一直重复 + public QuartzRepeatAttribute(int interval,int repeat, bool isForever) + { + this.Repeat = repeat; + this.IsForever = isForever; + this.IntervalInSeconds = interval; + } + } + + [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] + public class QuartzStartAtAttribute : Attribute + { + public string Cron { get; set; } + /// + /// + /// + /// 表示复杂格式的日期,详见https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/crontrigger.html#introduction + public QuartzStartAtAttribute(string cron) + { + this.Cron = cron; + } + } +} diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/QuartzHostService.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/QuartzHostService.cs new file mode 100644 index 0000000..4791da6 --- /dev/null +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/QuartzHostService.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Quartz; +using Quartz.Impl; + +namespace WalkingTec.Mvvm.Core.Support.Quartz +{ + public class QuartzHostService : IHostedService + { + private readonly IServiceProvider _sp; + private readonly GlobalData _gd; + private IScheduler _scheduler; + public QuartzHostService(IServiceProvider sp,GlobalData gd) + { + _sp = sp; + _gd = gd; + } + + public async Task StartAsync(CancellationToken cancellationToken) + { + ISchedulerFactory factory = new StdSchedulerFactory(); + _scheduler = await factory.GetScheduler(); + foreach (var ass in _gd.AllAssembly) + { + try + { + var t = ass.GetExportedTypes().Where(x => typeof(WtmJob).IsAssignableFrom(x) && x.Name != "WtmJob").ToList(); + int count = 1; + foreach (var st in t) + { + var ci = st.GetConstructor(Type.EmptyTypes); + var job = ci?.Invoke(null) as WtmJob; + if (job != null) + { + // job.Sp = _sp; + var attrs = st.GetCustomAttributes(true); + string jobName = st.Name; + string groupName = "group"+count; + var nameAttr = attrs.Where(x => x is QuartzJobAttribute).FirstOrDefault() as QuartzJobAttribute; + var groupAttr = attrs.Where(x => x is QuartzGroupAttribute).FirstOrDefault() as QuartzGroupAttribute; + var repeatAttr = attrs.Where(x => x is QuartzRepeatAttribute).FirstOrDefault() as QuartzRepeatAttribute; + var startAttr = attrs.Where(x => x is QuartzStartAtAttribute).FirstOrDefault() as QuartzStartAtAttribute; + if (nameAttr != null) + { + jobName = nameAttr.Name; + } + if(groupAttr != null) + { + groupName = groupAttr.Group; + } + JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.Add("Sp", _sp); + // 创建作业 + IJobDetail j = JobBuilder.Create(st) + .WithIdentity(jobName, groupName) + .UsingJobData(jobDataMap) + .Build(); + // 创建触发器,每60s执行一次 + var builder = TriggerBuilder.Create() + .WithIdentity("trigger" + count, "group1"); + if (startAttr != null) + { + builder = builder.WithCronSchedule(startAttr.Cron); + } + else { + builder = builder.StartNow(); + if(repeatAttr != null) + { + if(repeatAttr.IsForever == true) + { + builder = builder.WithSimpleSchedule(x => x.WithIntervalInSeconds(repeatAttr.IntervalInSeconds).RepeatForever()); + } + else + { + builder = builder.WithSimpleSchedule(x => x.WithRepeatCount(repeatAttr.Repeat).WithIntervalInSeconds(repeatAttr.IntervalInSeconds)); + } + } + } + var trigger = builder.Build(); + await _scheduler.ScheduleJob(j, trigger); + count++; + } + } + } + catch { } + } + // 开始运行 + await Task.Delay(5000); + await _scheduler.Start(cancellationToken); + } + + public async Task StopAsync(CancellationToken cancellationToken) + { + await _scheduler.Shutdown(cancellationToken); + } + } +} diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/WtmJob.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/WtmJob.cs new file mode 100644 index 0000000..e451ad0 --- /dev/null +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/WtmJob.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Quartz; + +namespace WalkingTec.Mvvm.Core.Support.Quartz +{ + public class WtmJob : IJob,IDisposable + { + private IServiceScope _ss; + private WTMContext _wtm; + protected WTMContext Wtm + { + get + { + if(_wtm == null) + { + _ss = Sp.CreateScope(); + _wtm = _ss.ServiceProvider.GetRequiredService(); + } + return _wtm; + } + } + + public IServiceProvider Sp { get; set; } + + public virtual async Task Execute(IJobExecutionContext context) + { + await Task.Run(() => { }); + } + + public void Dispose() + { + _ss.Dispose(); + } + } +} diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/WtmJobFactory.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/WtmJobFactory.cs new file mode 100644 index 0000000..d15a9af --- /dev/null +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/Quartz/WtmJobFactory.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Quartz; +using Quartz.Spi; + +namespace WalkingTec.Mvvm.Core.Support.Quartz +{ + public class WtmJobFactory : IJobFactory + { + public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) + { + var rv = Activator.CreateInstance(bundle.JobDetail.GetType()) as IJob; + return rv; + } + + public void ReturnJob(IJob job) + { + throw new NotImplementedException(); + } + } +} diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/WTMLogger.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/WTMLogger.cs index 83e2916..68e519b 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/WTMLogger.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/Support/WTMLogger.cs @@ -55,7 +55,7 @@ namespace WalkingTec.Mvvm.Core public bool IsEnabled(LogLevel logLevel) { - if(logConfig == null) + if(logConfig == null || categoryName == "VueCliMiddleware") { return false; } diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/WTMContext.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/WTMContext.cs index 3dea8de..8ee508b 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/WTMContext.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/WTMContext.cs @@ -231,21 +231,21 @@ namespace WalkingTec.Mvvm.Core return null; } - - var code = await BaseUserQuery.Where(x => x.ITCode.ToLower() == itcode.ToLower()).Select(x =>new { itcode = x.ITCode, id= x.GetID(), photoid=x.PhotoId, name=x.Name }).SingleOrDefaultAsync(); - if (code == null) + var password = await BaseUserQuery.Where(x => x.ITCode.ToLower() == itcode.ToLower()).Select(x =>x.Password).SingleOrDefaultAsync(); + if (this.HttpContext.Request.Headers.ContainsKey("Authorization")) { - return null; + var user = await CallAPI("", GetServerUrl() + "/api/_account/loginjwt", HttpMethodEnum.POST, new { Account = itcode, Password = password, IsReload=true }); + return user?.Data; } - LoginUserInfo rv = new LoginUserInfo + else { - ITCode = code.itcode, - UserId = code.id?.ToString(), - Name = code.name, - PhotoId = code.photoid - }; - await rv.LoadBasicInfoAsync(this); - return rv; + Dictionary data = new Dictionary(); + data.Add("account", itcode); + data.Add("password", password); + data.Add("withmenu", "false"); + var user = await CallAPI("", this.HttpContext.Request.Scheme + "://" + this.HttpContext.Request.Host.ToString() + "/api/_account/login", HttpMethodEnum.POST, data); + return user?.Data; + } } #endregion @@ -459,7 +459,7 @@ namespace WalkingTec.Mvvm.Core return isPublic; } - public void DoLog(string msg, ActionLogTypesEnum logtype = ActionLogTypesEnum.Normal) + public void DoLog(string msg, ActionLogTypesEnum logtype = ActionLogTypesEnum.Normal,string moduleName="", string actionName="", string ip="",string url = "", double duration = 0) { var log = this.Log?.GetActionLog(); if (log == null) @@ -469,6 +469,15 @@ namespace WalkingTec.Mvvm.Core log.LogType = logtype; log.ActionTime = DateTime.Now; log.Remark = msg; + log.ActionUrl = url; + log.Duration = duration; + log.ModuleName = moduleName; + log.ActionName = actionName; + log.IP = ip; + if(string.IsNullOrEmpty(url) && this.HttpContext?.Request != null) + { + log.ActionUrl = this.HttpContext.Request.Path.ToString(); + } LogLevel ll = LogLevel.Information; switch (logtype) { @@ -960,6 +969,24 @@ namespace WalkingTec.Mvvm.Core return await CallAPI(domainName, url, method, postdata, timeout, proxy); } + + private string GetServerUrl() + { + var server = ConfigInfo.Domains.Where(x => x.Key.ToLower() == "serverpub").Select(x => x.Value).FirstOrDefault(); + if (server == null) + { + server = ConfigInfo.Domains.Where(x => x.Key.ToLower() == "server").Select(x => x.Value).FirstOrDefault(); + } + if (server != null && string.IsNullOrEmpty(server.Address) == false) + { + return server.Address.TrimEnd('/'); + } + else + { + return this.HttpContext.Request.Scheme + "://" + this.HttpContext.Request.Host.ToString(); + } + } + #endregion } diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/WalkingTec.Mvvm.Core.csproj b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/WalkingTec.Mvvm.Core.csproj index dac8f92..77c62b3 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/WalkingTec.Mvvm.Core.csproj +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Core/WalkingTec.Mvvm.Core.csproj @@ -7,21 +7,20 @@ true - - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + + + + + all runtime; build; native; contentfiles; analyzers @@ -29,16 +28,17 @@ - + - - - + + + + - + diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Auth/JwtAuth/TokenService.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Auth/JwtAuth/TokenService.cs index 1dc61f4..3cde4f2 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Auth/JwtAuth/TokenService.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Auth/JwtAuth/TokenService.cs @@ -121,11 +121,6 @@ namespace WalkingTec.Mvvm.Mvc.Auth TenantCode = pair[1], }; - // 清理过期 refreshtoken - var sql = $"DELETE FROM {DC.GetTableName()} WHERE Expiration<'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}'"; - _dc.RunSQL(sql); - _logger.LogDebug("清理过期的refreshToken:【sql:{0}】", sql); - // 颁发 token return await IssueTokenAsync(loginUserInfo); } diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/CodeGenVM.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/CodeGenVM.cs index 810ac9a..3e947a3 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/CodeGenVM.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/CodeGenVM.cs @@ -2160,7 +2160,14 @@ namespace WalkingTec.Mvvm.Mvc string newname = item.FieldName; if (mpro.PropertyType.IsBoolOrNullableBool()) { - render = "ComponentType=\"@typeof(Switch)\""; + if (mpro.PropertyType.IsNullable()) + { + render = "ComponentType=\"@typeof(NullSwitch)\""; + } + else + { + render = "ComponentType=\"@typeof(Switch)\""; + } } if (mpro.PropertyType == typeof(DateTime) || mpro.PropertyType == typeof(DateTime?)) { @@ -2417,7 +2424,14 @@ namespace WalkingTec.Mvvm.Mvc } if (checktype == typeof(bool)) { - controltype = "Switch"; + if (proType.IsNullable()) + { + controltype = "NullSwitch"; + } + else + { + controltype = "Switch"; + } } else if (checktype.IsEnum()) { @@ -2543,7 +2557,14 @@ namespace WalkingTec.Mvvm.Mvc } if (checktype == typeof(bool)) { - controltype = "Switch"; + if (proType.IsNullable()) + { + controltype = "NullSwitch"; + } + else + { + controltype = "Switch"; + } disabled = "IsDisabled=\"true\""; } } diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Filters/FrameworkFilter.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Filters/FrameworkFilter.cs index 7e9f50c..04f412c 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Filters/FrameworkFilter.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Filters/FrameworkFilter.cs @@ -43,7 +43,6 @@ namespace WalkingTec.Mvvm.Mvc.Filters var postDes = ctrlActDesc.MethodInfo.GetCustomAttributes(typeof(HttpPostAttribute), false).Cast().FirstOrDefault(); var validpostonly = ctrlActDesc.MethodInfo.GetCustomAttributes(typeof(ValidateFormItemOnlyAttribute), false).Cast().FirstOrDefault(); - log.ITCode = ctrl.Wtm.LoginUserInfo?.ITCode ?? string.Empty; //给日志的多语言属性赋值 log.ModuleName = ctrlDes?.GetDescription(ctrl) ?? ctrlActDesc.ControllerName; log.ActionName = actDes?.GetDescription(ctrl) ?? ctrlActDesc.ActionName + (postDes == null ? string.Empty : "[P]"); diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/GeneratorFiles/Spa/Blazor/Index.txt b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/GeneratorFiles/Spa/Blazor/Index.txt index fdc62c6..adeb44a 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/GeneratorFiles/Spa/Blazor/Index.txt +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/GeneratorFiles/Spa/Blazor/Index.txt @@ -44,11 +44,11 @@ $columns$
@if (IsAccessable("/api/$modelname$/Edit")) { - + } @if (IsAccessable("/api/$modelname$/{id}")) { - + } @if (IsAccessable("/api/$modelname$/BatchDelete")) { diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/FrameworkServiceExtension.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/FrameworkServiceExtension.cs index 6fdf490..0e064ba 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/FrameworkServiceExtension.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/FrameworkServiceExtension.cs @@ -45,6 +45,7 @@ using WalkingTec.Mvvm.Mvc.Helper; using WalkingTec.Mvvm.TagHelpers.LayUI; using Microsoft.AspNetCore.SpaServices.Extensions; using Microsoft.Extensions.FileProviders; +using WalkingTec.Mvvm.Core.Support.Quartz; namespace WalkingTec.Mvvm.Mvc { @@ -71,7 +72,7 @@ namespace WalkingTec.Mvvm.Mvc private static GlobalData GetGlobalData() { var gd = new GlobalData(); - + gd.AllAssembly = Utils.GetAllAssembly(); return gd; } @@ -502,6 +503,7 @@ namespace WalkingTec.Mvvm.Mvc y.ValueLengthLimit = int.MaxValue - 20480; y.MultipartBodyLengthLimit = conf.FileUploadOptions.UploadLimit; }); + services.AddHostedService(); return services; } public static IServiceCollection AddWtmCrossDomain(this IServiceCollection services, IConfiguration config) @@ -553,7 +555,7 @@ namespace WalkingTec.Mvvm.Mvc public static IServiceCollection AddWtmAuthentication(this IServiceCollection services, IConfiguration config) { var conf = config.Get(); - services.AddSingleton(); + services.AddScoped(); var jwtOptions = conf.JwtOptions; @@ -698,7 +700,6 @@ namespace WalkingTec.Mvvm.Mvc var localfactory = app.ApplicationServices.GetRequiredService(); var lop = app.ApplicationServices.GetService(); //获取所有程序集 - gd.AllAssembly = Utils.GetAllAssembly(); //var mvc = GetRuntimeAssembly("WalkingTec.Mvvm.Mvc"); //if (mvc != null && gd.AllAssembly.Contains(mvc) == false) //{ diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/IconFontsHelper.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/IconFontsHelper.cs index fbbe45e..ce93fcf 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/IconFontsHelper.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/IconFontsHelper.cs @@ -43,7 +43,8 @@ namespace WalkingTec.Mvvm.Mvc _iconFontItems = iconFontHashSet.Select(x => new ComboSelectListItem { Text = x, - Value = x + Value = x, + Icon = x }).ToList(); _iconFontDicItems = new Dictionary>(); diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/JwtRefreshJob.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/JwtRefreshJob.cs new file mode 100644 index 0000000..ae9975b --- /dev/null +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/JwtRefreshJob.cs @@ -0,0 +1,25 @@ +using System; +using System.Threading.Tasks; +using Quartz; +using WalkingTec.Mvvm.Core; +using WalkingTec.Mvvm.Core.Extensions; +using WalkingTec.Mvvm.Core.Support.Quartz; + +namespace WalkingTec.Mvvm.Mvc.Helper +{ + [QuartzRepeat(3600,0,true)] + public class JwtRefreshJob : WtmJob + { + public override Task Execute(IJobExecutionContext context) + { + try + { + var sql = $"DELETE FROM {this.Wtm.DC.GetTableName()} WHERE Expiration<'{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}'"; + this.Wtm.DC.RunSQL(sql); + Wtm.DoLog("清理过期的refreshToken", ActionLogTypesEnum.Job); + } + catch { } + return Task.CompletedTask; + } + } +} diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/WtmMiddleware.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/WtmMiddleware.cs index 97df6af..b1f3d44 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/WtmMiddleware.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Helper/WtmMiddleware.cs @@ -8,6 +8,7 @@ using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Options; using WalkingTec.Mvvm.Core; +using WalkingTec.Mvvm.Core.Extensions; namespace WalkingTec.Mvvm.Mvc { @@ -20,17 +21,17 @@ namespace WalkingTec.Mvvm.Mvc _next = next; } - public async Task InvokeAsync(HttpContext context, IOptionsMonitor configs) + public async Task InvokeAsync(HttpContext context, WTMContext wtm) { var max = context.Features.Get(); if (max.IsReadOnly == false) { - max.MaxRequestBodySize = configs.CurrentValue.FileUploadOptions.UploadLimit; + max.MaxRequestBodySize = wtm.ConfigInfo.FileUploadOptions.UploadLimit; } if (context.Request.Path == "/") { - context.Response.Cookies.Append("pagemode", configs.CurrentValue.PageMode.ToString()); - context.Response.Cookies.Append("tabmode", configs.CurrentValue.TabMode.ToString()); + context.Response.Cookies.Append("pagemode", wtm.ConfigInfo.PageMode.ToString()); + context.Response.Cookies.Append("tabmode", wtm.ConfigInfo.TabMode.ToString()); } if (context.Request.ContentLength > 0 && context.Request.ContentLength < 512000) { @@ -48,6 +49,17 @@ namespace WalkingTec.Mvvm.Mvc context.Items["DONOTUSE_REQUESTBODY"] = body; } } + //if(wtm.ConfigInfo.Domains != null) + //{ + // var mainHost = wtm.ConfigInfo.Domains.Where(x=>x.Key== "mainhost").Select(x=>x.Value.Address).FirstOrDefault(); + // if(string.IsNullOrEmpty(mainHost) == false) + // { + // if(context.Request.RouteValues["controller"]?.ToString()?.ToLower() == "login") + // { + // var test = await context.Request.RedirectCall(wtm, "mainhost"); + // } + // } + //} await _next(context); if (context.Response.StatusCode == 404) { diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Views/_CodeGen/Gen.cshtml b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Views/_CodeGen/Gen.cshtml index 3d0aa7f..6d3f416 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Views/_CodeGen/Gen.cshtml +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/Views/_CodeGen/Gen.cshtml @@ -14,6 +14,7 @@ Layout = null; + + + ","text/html"); + return Content($"", "text/html"); } diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/framework_layui.js b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/framework_layui.js index ab74f11..6c4ffa7 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/framework_layui.js +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.Mvc/framework_layui.js @@ -251,68 +251,10 @@ window.ff = { }, RenderForm: function (formId) { - var comboxs = $(".layui-form[lay-filter=" + formId + "] select[wtm-combo='MULTI_COMBO']"); - if (comboxs.length === 0) { + var comboxs = $(".layui-form[lay-filter=" + formId + "] div[wtm-ctype='combo']"); layui.use(['form'], function () { var form = layui.form.render(null, formId); }); - } - else { - layui.use(['form', 'formSelects'], function () { - var formSelects = layui.formSelects; - layui.form.render(null, formId); - /* 启用 ComboBox 多选 */ - for (var i = 0; i < comboxs.length; i++) { - var filter = comboxs[i].attributes['lay-filter'].value; - var vs = comboxs[i].attributes['wtm-combovalue'].value; - var vn = comboxs[i].attributes['wtm-comboname'].value; - var arr = []; - if (vs !== null && vs != "") { - var values = vs.split("`"); - var names = vn.split("`"); - for (var a = 0; a < values.length; a++) { - arr.push({ name: names[a], val: values[a] }); - } - } - var changefunc = "1==1"; - var chainchange = ""; - var linkto = false; - var url = ""; - var targetname = ""; - var changefuncattr = comboxs[i].attributes['wtm-cf']; - var linktoattr = comboxs[i].attributes['wtm-linkto']; - var urlattr = comboxs[i].attributes['wtm-turl']; - if (changefuncattr != undefined) { - changefunc = changefuncattr.value + "(a)"; - } - if (urlattr != undefined) { - url = urlattr.value; - } - if (linktoattr != undefined) { - linkto = true; - } - formSelects.on({ - layFilter: filter, left: '', right: '', separator: ',', arr: arr, - url: url, self: comboxs[i], linkto: linkto, cf: changefunc, - selectFunc: function (a) { - try { - if (eval(this.cf) && this.linkto == true) { - var u = this.url; - if (u.indexOf("?") == -1) { - u += "?t=" + new Date().getTime(); - } - for (var i = 0; i < a.length; i++) { - u += "&id=" + a[i].val; - } - ff.ChainChange(u, this.self) - } - } - catch (e) { } - } - }); - } - }); - } }, PostForm: function (url, formId, divid, searchervm) { @@ -467,6 +409,11 @@ window.ff = { , btn: [] , id: windowid //设定一个id,防止重复弹出 , content: str + //, success: function (layero, index) { + // if (height == undefined || height == null || height == '' || max == false){ + // document.getElementById('layui-layer' + index).getElementsByClassName('layui-layer-content')[0].style.overflow = 'unset'; + // } + //} , resizing: function (layero) { ff.triggerResize(); $(layero).find("div[ischart = '1']").each( @@ -668,6 +615,8 @@ window.ff = { var targetname = target.attr("wtm-name"); var ismulticombo = target.attr("wtm-combo") != undefined; var targetid = target.attr("id"); + var comboid = targetid; + if (controltype == undefined) { controltype = ""; } @@ -678,8 +627,7 @@ window.ff = { //clear switch (controltype) { case "combo": - target.html(''); - form.render('select', targetfilter); + window[comboid].update({ data: [] }); break; case "checkbox": target.html(''); @@ -690,9 +638,7 @@ window.ff = { form.render('radio', targetfilter); break; case "tree": - layui.tree.reload(targetid, { - data: [] - }); + window[comboid].update({ data: [] }); break; case "transfer": layui.transfer.reload(targetid, { @@ -707,9 +653,7 @@ window.ff = { var item = null; if (controltype === "tree") { - layui.tree.reload(targetid, { - data: ff.getTreeItems(data.Data) - }); + window[comboid].update({ data: ff.getTreeItems(data.Data) }); } if (controltype === "transfer") { layui.transfer.reload(targetid, { @@ -718,26 +662,7 @@ window.ff = { } if (controltype === "combo") { - target.html(''); - var arr = []; - if (data.Data !== undefined && data.Data !== null) { - for (i = 0; i < data.Data.length; i++) { - item = data.Data[i]; - var icon = item.Icon !== undefined && item.Icon != null && item.Icon.length > 0 ? ' icon="' + item.Icon + '"' : ''; - if (item.Selected === true) { - target.append(''); - } - else { - target.append(''); - } - arr.push({ name: item.Text, val: item.Value }); - } - } - form.render('select', targetfilter); - if (ismulticombo) { - var mm = layui.formSelects.selects[target.attr("lay-filter")]; - ff.refreshcombobox(mm, []); - } + window[comboid].update({ data: ff.getComboItems(data.Data) }); } if (controltype === "checkbox") { for (i = 0; i < data.Data.length; i++) { @@ -787,9 +712,7 @@ window.ff = { var item = null; if (controltype === "tree") { var da = ff.getTreeItems(data.Data, svals); - layui.tree.reload(controlid, { - data: da - }); + window[controlid].update({ data: da }); if (cb !== undefined && cb != null) { cb(); } @@ -800,29 +723,8 @@ window.ff = { }); } if (controltype === "combo") { - - target.html(''); - var arr = []; - if (data.Data !== undefined && data.Data !== null) { - for (i = 0; i < data.Data.length; i++) { - item = data.Data[i]; - var icon = item.Icon !== undefined && item.Icon != null && item.Icon.length > 0 ? ' icon="' + item.Icon + '"' : ''; - if (item.Selected === true || svals.indexOf(item.Value) > -1) { - target.append(''); - arr.push({ name: item.Text, val: item.Value }); - } - else { - target.append(''); - } - } - } - layui.form.render('select', targetfilter+"div"); - if (ismulticombo) { - layui.use(['form', 'formSelects'], function () { - var mm = layui.formSelects.selects[targetfilter]; - ff.refreshcombobox(mm, arr); - }); - } + var da = ff.getComboItems(data.Data, svals); + window[controlid].update({ data: da }); } if (controltype === "checkbox") { for (i = 0; i < data.Data.length; i++) { @@ -892,6 +794,19 @@ window.ff = { } } + var xselect = searchForm.find("div[wtm-ctype='tree'],div[wtm-ctype='combo']"); + layui.each(xselect, function (_, item) { + var val = window[item.id].getValue('value'); + if (val.length > 1) { + fieldElem = fieldElem.filter(function (index) { + return this.name != item.attributes["wtm-name"].value; + }) + $.each(val, function (i, v) { + fieldElem.push({ name: item.attributes["wtm-name"].value, value: v }); + }); + } + }); + var check = {}; layui.each(fieldElem, function (_, item) { if (!item.name) return; @@ -905,9 +820,6 @@ window.ff = { return; } var itemname = item.name; - if (/_WTMMultiCombo_(.*?)_(.*?)$/.test(itemname)) { - itemname = RegExp.$2; - } if (/_DONOTUSE_(.*?)\[(\d?)\]\.(.*?)$/.test(itemname)) { var name1 = RegExp.$1; var number = RegExp.$2; @@ -919,7 +831,7 @@ window.ff = { } if (/_DONOTUSE_(.*?)$/.test(itemname)) { var name1 = RegExp.$1; - if (filterback.hasOwnProperty(name1) == false && filter.hasOwnProperty(name1) == false) { + if (filterback.hasOwnProperty(name1) == false && filter.hasOwnProperty(name1) == false) { filterback[name1] = 1; } return; @@ -957,7 +869,7 @@ window.ff = { } else { filter[itemname] = item.value; - if (filterback.hasOwnProperty(itemname) == true) { + if (filterback.hasOwnProperty(itemname) == true && item.value != "") { filterback[itemname] = undefined; } } @@ -966,6 +878,7 @@ window.ff = { for (item in filterback) { if (filterback[item] !== undefined) { + filter[item] = undefined; filter[item + ".length"] = "0"; } } @@ -1248,21 +1161,34 @@ window.ff = { for (var i = 0; i < data.length; i++) { var item = {}; - item.id = data[i].Value; - item.title = data[i].Text; - item.href = data[i].Url; - item.spread = data[i].Expended; - item.checked = data[i].Selected || svals.indexOf(data[i].Value) > -1; + item.value = data[i].Value; + item.name = data[i].Text; + item.disabled = data[i].Disabled; + item.selected = data[i].Selected || svals.indexOf(data[i].Value) > -1; + item.icon = data[i].Icon; if (data[i].Children != null && data[i].Children.length > 0) { item.children = this.getTreeItems(data[i].Children, svals); + } + rv.push(item); + } + return rv; + }, - for (var j = 0; j < item.children.length; j++) { - if (item.children[j].checked == true || item.children[j].spread == true) { - item.spread = true; - break; - } - } + getComboItems: function (data, svals) { + var rv = []; + if (svals == undefined || svals == null) { + svals = []; + } + for (var i = 0; i < data.length; i++) { + var item = {}; + item.value = data[i].Value; + item.name = data[i].Text; + item.disabled = data[i].Disabled; + item.selected = data[i].Selected || svals.indexOf(data[i].Value) > -1; + item.icon = data[i].Icon; + if (data[i].Children != null && data[i].Children.length > 0) { + item.children = this.getTreeItems(data[i].Children, svals); } rv.push(item); } @@ -1280,7 +1206,7 @@ window.ff = { item.value = data[i].Value; item.title = data[i].Text; item.disabled = data[i].Disabled; - item.checked = data[i].Selected || svals.indexOf(data[i].Value) > -1; + //item.checked = data[i].Selected || svals.indexOf(data[i].Value) > -1; rv.push(item); } return rv; diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseButton.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseButton.cs index e315d9b..84e8355 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseButton.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseButton.cs @@ -44,6 +44,7 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI public string ConfirmTxt { get; set; } + public override void Process(TagHelperContext context, TagHelperOutput output) { if (string.IsNullOrEmpty(Id)) @@ -93,7 +94,15 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI } else { - output.Content.SetHtmlContent(Text ?? string.Empty); + if (string.IsNullOrEmpty(Icon) == false) + { + output.Attributes.SetAttribute("class", "shortcut"); + output.Content.SetHtmlContent($"
{Text ?? ""}"); + } + else + { + output.Content.SetHtmlContent(Text ?? string.Empty); + } } string submitButtonUrl = ""; if (this is SubmitButtonTagHelper sbt) diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseElementTag.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseElementTag.cs index 4259949..d134a42 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseElementTag.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseElementTag.cs @@ -95,38 +95,38 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI { break; } - if (item.LinkField != null || item.LinkId != null) - { - if (!string.IsNullOrEmpty(item.TriggerUrl)) - { - output.PostElement.AppendHtml($@" - -"); - } - } - else - { - output.PostElement.AppendHtml($@" - -"); - } +// if (item.LinkField != null || item.LinkId != null) +// { +// if (!string.IsNullOrEmpty(item.TriggerUrl)) +// { +// output.PostElement.AppendHtml($@" +// +//"); +// } +// } +// else +// { +// output.PostElement.AppendHtml($@" +// +//"); +// } break; case CheckBoxTagHelper item: if (string.IsNullOrEmpty(item.ChangeFunc) == false) diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseFieldTag.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseFieldTag.cs index eeffdc0..0d6cc56 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseFieldTag.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Abstraction/BaseFieldTag.cs @@ -96,20 +96,29 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI if (!(this is DisplayTagHelper) && ((Field.Metadata.IsRequired && Field.Name.Contains("[-1]")==false) || Required == true)) { requiredDot = "*"; - if (!(this is UploadTagHelper || this is RadioTagHelper || this is CheckBoxTagHelper || this is MultiUploadTagHelper || this is ColorPickerTagHelper || this is TreeTagHelper || this is SliderTagHelper)) // 上传组件自定义验证 + if (!(this is UploadTagHelper || this is RadioTagHelper || this is CheckBoxTagHelper || this is MultiUploadTagHelper || this is ColorPickerTagHelper || this is SliderTagHelper || this is TransferTagHelper)) // 上传组件自定义验证 { //richtextbox不需要进行必填验证 if (output.Attributes["isrich"] == null) { - if (this is ComboBoxTagHelper combo && combo.MultiSelect.Value == true) + //combobox和tree用xmselect控件的验证 + if (this is ComboBoxTagHelper combo || this is TreeTagHelper) { - output.Attributes.Add("lay-verify", "selectRequired"); + var script = $@" + +"; + output.PostElement.AppendHtml(script); } else { output.Attributes.Add("lay-verify", "required"); + output.Attributes.Add("lay-reqText", $"{THProgram._localizer["Validate.{0}required", Field?.Metadata?.DisplayName ?? Field?.Metadata?.Name]}"); } - output.Attributes.Add("lay-reqText", $"{THProgram._localizer["Validate.{0}required", Field?.Metadata?.DisplayName ?? Field?.Metadata?.Name]}"); } } } @@ -146,7 +155,7 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI preHtml += $@"
- +
"; } diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Common/LayuiUIService.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Common/LayuiUIService.cs index 2688a80..d415d77 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Common/LayuiUIService.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Common/LayuiUIService.cs @@ -165,7 +165,38 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI.Common public string MakeViewButton(ButtonTypesEnum buttonType, Guid fileID, string buttonText = null, int? width = null, int? height = null, string title = null, bool resizable = true, string _DONOT_USE_CS = "default", bool maxed = false, string buttonClass = null, string style = null) { - return MakeDialogButton(buttonType, $"/_Framework/ViewFile/{fileID}?_DONOT_USE_CS={_DONOT_USE_CS}&width={width}", buttonText, width, height, title, null, true, resizable, maxed,buttonClass, style); + var buttonID = Guid.NewGuid().ToString(); + var innerClick = ""; + string windowid = Guid.NewGuid().ToString(); + var url = $"/_Framework/GetFile/{fileID}?_DONOT_USE_CS={_DONOT_USE_CS}"; + innerClick = $"layui.layer.photos({{photos: {{data: [{{src: '{url}'}}]}},anim: 5}});"; + string funcname = $"x{buttonID.Replace("-", "")}click"; + var click = $""; + string rv = ""; + if (buttonType == ButtonTypesEnum.Link) + { + rv = $"{buttonText}"; + } + if (buttonType == ButtonTypesEnum.Button) + { + rv = $"{buttonText}"; + } + switch (buttonType) + { + case ButtonTypesEnum.Button: + rv = $"{buttonText}"; + break; + case ButtonTypesEnum.Link: + rv = $"{buttonText}"; + break; + case ButtonTypesEnum.Img: + rv = $""; + break; + default: + break; + } + rv += click; + return rv; } public string MakeScriptButton(ButtonTypesEnum buttonType, string buttonText, string script = "", string buttonID = null, string url = null, string buttonClass = null, string style=null) diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/DataTableTagHelper.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/DataTableTagHelper.cs index 5a399d3..4ebcc1a 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/DataTableTagHelper.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/DataTableTagHelper.cs @@ -610,6 +610,7 @@ layui.use(['table'], function(){{ if(res.Code != undefined && res.Code != 200){{ layui.layer.alert(res.Msg,{{title:'{THProgram._localizer["Sys.Error"]}'}});}} var tab = $('#{Id} + .layui-table-view');tab.find('table').css('border-collapse','separate'); {(Height == null ? $"tab.css('overflow','hidden').addClass('donotuse_fill donotuse_pdiv');tab.children('.layui-table-box').addClass('donotuse_fill donotuse_pdiv').css('height','100px');tab.find('.layui-table-main').addClass('donotuse_fill');tab.find('.layui-table-header').css('min-height','{maxDepth*38}px');ff.triggerResize();" : string.Empty)} + {(LineHeight.HasValue == true ? $"tab.find('td .layui-table-cell').css('height','{LineHeight}px')" : string.Empty)} {(MultiLine == true ? $"tab.find('.layui-table-cell').css('height','auto').css('white-space','normal');" : string.Empty)} tab.find('div [lay-event=\'LAYTABLE_COLS\']').attr('title','{THProgram._localizer["Sys.ColumnFilter"]}'); tab.find('div [lay-event=\'LAYTABLE_PRINT\']').attr('title','{THProgram._localizer["Sys.Print"]}'); diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Form/ComboBoxTagHelper.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Form/ComboBoxTagHelper.cs index 5494936..43ee947 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Form/ComboBoxTagHelper.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Form/ComboBoxTagHelper.cs @@ -28,7 +28,7 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI /// 启用搜索 /// 注意:多选与搜索不能同时启用 ///
- public bool EnableSearch { get; set; } + public bool? EnableSearch { get; set; } public ModelExpression Items { get; set; } @@ -40,9 +40,9 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI /// /// 是否多选 /// 默认根据Field 绑定的值类型进行判断。Array or List 即多选,否则单选 - /// 注意:多选与搜索不能同时启用 /// public bool? MultiSelect { get; set; } + public bool AutoRow { get; set; } /// /// 改变选择时触发的js函数,func(data)格式; @@ -65,16 +65,19 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI { EmptyText = THProgram._localizer["Sys.PleaseSelect"]; } - EnableSearch = configs.CurrentValue.UIOptions.ComboBox.DefaultEnableSearch; + if (EnableSearch == null) + { + EnableSearch = configs.CurrentValue.UIOptions.ComboBox.DefaultEnableSearch; + } _wtm = wtm; } public override void Process(TagHelperContext context, TagHelperOutput output) { - output.TagName = "select"; + output.TagName = "div"; + output.Attributes.Add("id", Id); output.TagMode = TagMode.StartTagAndEndTag; output.Attributes.Add("name", Field.Name); - output.Attributes.Add("lay-filter", $"_WTMMultiCombo_{Guid.NewGuid()}_" + Field.Name); output.Attributes.Add("wtm-name", Field.Name); output.Attributes.Add("wtm-ctype", "combo"); if (Disabled == true) @@ -92,14 +95,6 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI MultiSelect = true; } } - if (MultiSelect.Value) - { - output.Attributes.Add("wtm-combo", "MULTI_COMBO"); - } - if (!MultiSelect.Value && EnableSearch) - { - output.Attributes.Add("lay-search", string.Empty); - } if (string.IsNullOrEmpty(ChangeFunc) == false) { output.Attributes.Add("wtm-cf", FormatFuncName(ChangeFunc, false)); @@ -122,12 +117,8 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI output.Attributes.Add("wtm-turl", TriggerUrl); } var contentBuilder = new StringBuilder(); - if (string.IsNullOrEmpty(EmptyText) == false) - { - contentBuilder.Append($""); - } - output.PostElement.AppendHtml($@""); + output.PreElement.AppendHtml($@""); #region 添加下拉数据 并 设置默认选中 @@ -239,44 +230,109 @@ namespace WalkingTec.Mvvm.TagHelpers.LayUI } } } - if (MultiSelect == true) - { - foreach (var item in listItems) - { - contentBuilder.Append($""); - } - // 添加默认选中项 - var selected = listItems.Where(x => x.Selected).ToList(); - var mulvalues = selected.ToSepratedString(x => x.Value, seperator: "`"); - var mulnamess = selected.ToSepratedString(x => x.Text, seperator: "`"); - output.Attributes.Add("wtm-combovalue", $"{mulvalues}"); - output.Attributes.Add("wtm-comboname", $"{mulnamess}"); - } - else // 添加用户设置的设置源 - { - foreach (var item in listItems) - { - if (item.Selected == true) - { - if (Disabled == true) - { - output.PostElement.AppendHtml($""); - } - contentBuilder.Append($""); - } - else - { - contentBuilder.Append($""); - } - } - - } - output.Content.SetHtmlContent(contentBuilder.ToString()); + var script = $@" + +"; + output.PostElement.AppendHtml(script); #endregion base.Process(context, output); } + + private List GetLayuiTree(IEnumerable tree, List values) + { + List rv = new List(); + foreach (var s in tree) + { + var news = new LayuiTreeItem + { + Id = s.Value.ToString(), + Title = s.Text, + Disabled = s.Disabled, + Checked = s.Selected, + Icon = s.Icon + }; + if (values.Contains(s.Value.ToString().ToLower())) + { + news.Checked = true; + } + rv.Add(news); + } + return rv; + } + } } diff --git a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Form/FormTagHelper.cs b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Form/FormTagHelper.cs index 50704ed..1c67fb4 100644 --- a/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Form/FormTagHelper.cs +++ b/WalkingTec.Mvvm/WalkingTec.Mvvm.TagHelpers.LayUI/Form/FormTagHelper.cs @@ -1,3 +1,4 @@ +using System.Text.RegularExpressions; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Microsoft.AspNetCore.Razor.TagHelpers; using WalkingTec.Mvvm.Core; @@ -200,8 +201,8 @@ $('#{search.SearchBtnId}').on('click', function () {{ { firstkey = key; } - output.PostElement.AppendHtml($@" -$(""#{Id}"").find(""button[type=submit]:first"").parent().prepend(""
""); + output.PostElement.AppendHtml($@" +$(""#{Id}"").find(""button[type=submit]:first"").parent().prepend(""