From 4564d1c1309ba3c0b7f39169527da125833e4542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BE=E5=B0=8F=E5=83=A7?= Date: Tue, 16 Feb 2021 15:39:25 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20update=20documents.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/1.47e3e482.js | 1 - docs/119.06221260.js | 1 - docs/1ca878db.c92cbf13.js | 1 + docs/1ca878db.d7b4851f.js | 1 - docs/404.html | 4 +- docs/blog/fileupload-download/index.html | 4 +- docs/blog/httpcontext/index.html | 4 +- docs/blog/index.html | 4 +- docs/blog/tags/download/index.html | 4 +- docs/blog/tags/furion/index.html | 4 +- docs/blog/tags/furos/index.html | 4 +- docs/blog/tags/httpcontext/index.html | 4 +- docs/blog/tags/index.html | 4 +- docs/blog/tags/net-5/index.html | 4 +- docs/blog/tags/net/index.html | 4 +- docs/blog/tags/netcore/index.html | 4 +- docs/blog/tags/upload/index.html | 4 +- docs/blog/welcome/index.html | 4 +- docs/docs/appstartup/index.html | 4 +- docs/docs/auth-control/index.html | 4 +- docs/docs/author/index.html | 4 +- docs/docs/benchmark/index.html | 4 +- docs/docs/cache/index.html | 4 +- docs/docs/configuration/index.html | 4 +- docs/docs/contribute/index.html | 4 +- docs/docs/cooperate/index.html | 4 +- docs/docs/cors/index.html | 4 +- docs/docs/dapper/index.html | 4 +- docs/docs/data-validation/index.html | 4 +- docs/docs/dbcontext-Interceptor/index.html | 4 +- docs/docs/dbcontext-add-or-update/index.html | 4 +- docs/docs/dbcontext-add/index.html | 4 +- docs/docs/dbcontext-audit/index.html | 4 +- docs/docs/dbcontext-batch/index.html | 4 +- docs/docs/dbcontext-code-first/index.html | 4 +- docs/docs/dbcontext-db-first/index.html | 4 +- docs/docs/dbcontext-delete/index.html | 4 +- docs/docs/dbcontext-entitytrigger/index.html | 4 +- docs/docs/dbcontext-filter/index.html | 4 +- docs/docs/dbcontext-function/index.html | 4 +- docs/docs/dbcontext-hight-query/index.html | 4 +- docs/docs/dbcontext-locator/index.html | 4 +- docs/docs/dbcontext-multi-database/index.html | 4 +- docs/docs/dbcontext-proc/index.html | 4 +- docs/docs/dbcontext-query/index.html | 4 +- docs/docs/dbcontext-read-write/index.html | 4 +- docs/docs/dbcontext-repository/index.html | 4 +- docs/docs/dbcontext-seed-data/index.html | 4 +- docs/docs/dbcontext-sql-proxy/index.html | 4 +- docs/docs/dbcontext-sql-template/index.html | 4 +- docs/docs/dbcontext-sql/index.html | 4 +- docs/docs/dbcontext-start/index.html | 4 +- docs/docs/dbcontext-update/index.html | 4 +- docs/docs/dbcontext-view/index.html | 4 +- docs/docs/dbcontext/index.html | 4 +- docs/docs/dependency-injection/index.html | 4 +- docs/docs/deploy-docker/index.html | 4 +- docs/docs/deploy-iis/index.html | 4 +- docs/docs/deploy-nginx/index.html | 4 +- docs/docs/devops/index.html | 4 +- docs/docs/donate/index.html | 4 +- docs/docs/dynamic-api-controller/index.html | 4 +- docs/docs/encryption/index.html | 4 +- docs/docs/entity/index.html | 4 +- docs/docs/event-bus/index.html | 4 +- docs/docs/friendly-exception/index.html | 4 +- docs/docs/get-start/index.html | 4 +- docs/docs/global/app/index.html | 4 +- docs/docs/global/datavalidator/index.html | 4 +- docs/docs/global/db/index.html | 4 +- docs/docs/global/jsonserializer/index.html | 4 +- docs/docs/global/l/index.html | 4 +- docs/docs/global/linqexpression/index.html | 4 +- docs/docs/global/messagecenter/index.html | 4 +- docs/docs/global/oops/index.html | 4 +- docs/docs/global/shttp/index.html | 4 +- docs/docs/grpc/index.html | 4 +- docs/docs/http/index.html | 4 +- docs/docs/index.html | 4 +- docs/docs/job/index.html | 4 +- docs/docs/local-language/index.html | 4 +- docs/docs/logging/index.html | 4 +- docs/docs/object-mapper/index.html | 4 +- docs/docs/options/index.html | 4 +- docs/docs/performance/index.html | 4 +- docs/docs/process-service/index.html | 4 +- docs/docs/reference/index.html | 4 +- docs/docs/saas/index.html | 4 +- docs/docs/settings/appsettings/index.html | 4 +- .../settings/corsaccessorsettings/index.html | 4 +- .../dependencyinjectionsettings/index.html | 4 +- .../dynamicapicontrollersettings/index.html | 4 +- .../friendlyexceptionsettings/index.html | 4 +- .../settings/localizationsettings/index.html | 4 +- .../specificationdocumentsettings/index.html | 4 +- .../validationTypemessagesettings/index.html | 4 +- docs/docs/signalr/index.html | 4 +- docs/docs/source/index.html | 4 +- docs/docs/specification-document/index.html | 4 +- docs/docs/split-db/index.html | 4 +- docs/docs/sqlsugar/index.html | 4 +- docs/docs/template/index.html | 4 +- docs/docs/tran/index.html | 4 +- docs/docs/unittest/index.html | 4 +- docs/docs/upgrade/index.html | 10 ++-- docs/docs/view-engine/index.html | 4 +- docs/docs/virtual-deploy/index.html | 4 +- docs/index.html | 4 +- docs/main.90011ef5.js | 1 - ...n.44f3c01b.js => runtime~main.b4a789c9.js} | 2 +- docs/search/index.html | 4 +- handbook/build/1ca878db.a30c2d36.js | 1 - handbook/build/1ca878db.c1b61e38.js | 1 + handbook/build/404.html | 4 +- .../build/blog/fileupload-download/index.html | 4 +- handbook/build/blog/httpcontext/index.html | 4 +- handbook/build/blog/index.html | 4 +- handbook/build/blog/tags/download/index.html | 4 +- handbook/build/blog/tags/furion/index.html | 4 +- handbook/build/blog/tags/furos/index.html | 4 +- .../build/blog/tags/httpcontext/index.html | 4 +- handbook/build/blog/tags/index.html | 4 +- handbook/build/blog/tags/net-5/index.html | 4 +- handbook/build/blog/tags/net/index.html | 4 +- handbook/build/blog/tags/netcore/index.html | 4 +- handbook/build/blog/tags/upload/index.html | 4 +- handbook/build/blog/welcome/index.html | 4 +- handbook/build/docs/appstartup/index.html | 4 +- handbook/build/docs/auth-control/index.html | 4 +- handbook/build/docs/author/index.html | 4 +- handbook/build/docs/benchmark/index.html | 4 +- handbook/build/docs/cache/index.html | 4 +- handbook/build/docs/configuration/index.html | 4 +- handbook/build/docs/contribute/index.html | 4 +- handbook/build/docs/cooperate/index.html | 4 +- handbook/build/docs/cors/index.html | 4 +- handbook/build/docs/dapper/index.html | 4 +- .../build/docs/data-validation/index.html | 4 +- .../docs/dbcontext-Interceptor/index.html | 4 +- .../docs/dbcontext-add-or-update/index.html | 4 +- handbook/build/docs/dbcontext-add/index.html | 4 +- .../build/docs/dbcontext-audit/index.html | 4 +- .../build/docs/dbcontext-batch/index.html | 4 +- .../docs/dbcontext-code-first/index.html | 4 +- .../build/docs/dbcontext-db-first/index.html | 4 +- .../build/docs/dbcontext-delete/index.html | 4 +- .../docs/dbcontext-entitytrigger/index.html | 4 +- .../build/docs/dbcontext-filter/index.html | 4 +- .../build/docs/dbcontext-function/index.html | 4 +- .../docs/dbcontext-hight-query/index.html | 4 +- .../build/docs/dbcontext-locator/index.html | 4 +- .../docs/dbcontext-multi-database/index.html | 4 +- handbook/build/docs/dbcontext-proc/index.html | 4 +- .../build/docs/dbcontext-query/index.html | 4 +- .../docs/dbcontext-read-write/index.html | 4 +- .../docs/dbcontext-repository/index.html | 4 +- .../build/docs/dbcontext-seed-data/index.html | 4 +- .../build/docs/dbcontext-sql-proxy/index.html | 4 +- .../docs/dbcontext-sql-template/index.html | 4 +- handbook/build/docs/dbcontext-sql/index.html | 4 +- .../build/docs/dbcontext-start/index.html | 4 +- .../build/docs/dbcontext-update/index.html | 4 +- handbook/build/docs/dbcontext-view/index.html | 4 +- handbook/build/docs/dbcontext/index.html | 4 +- .../docs/dependency-injection/index.html | 4 +- handbook/build/docs/deploy-docker/index.html | 4 +- handbook/build/docs/deploy-iis/index.html | 4 +- handbook/build/docs/deploy-nginx/index.html | 4 +- handbook/build/docs/devops/index.html | 4 +- handbook/build/docs/donate/index.html | 4 +- .../docs/dynamic-api-controller/index.html | 4 +- handbook/build/docs/encryption/index.html | 4 +- handbook/build/docs/entity/index.html | 4 +- handbook/build/docs/event-bus/index.html | 4 +- .../build/docs/friendly-exception/index.html | 4 +- handbook/build/docs/get-start/index.html | 4 +- handbook/build/docs/global/app/index.html | 4 +- .../docs/global/datavalidator/index.html | 4 +- handbook/build/docs/global/db/index.html | 4 +- .../docs/global/jsonserializer/index.html | 4 +- handbook/build/docs/global/l/index.html | 4 +- .../docs/global/linqexpression/index.html | 4 +- .../docs/global/messagecenter/index.html | 4 +- handbook/build/docs/global/oops/index.html | 4 +- handbook/build/docs/global/shttp/index.html | 4 +- handbook/build/docs/grpc/index.html | 4 +- handbook/build/docs/http/index.html | 4 +- handbook/build/docs/index.html | 4 +- handbook/build/docs/job/index.html | 4 +- handbook/build/docs/local-language/index.html | 4 +- handbook/build/docs/logging/index.html | 4 +- handbook/build/docs/object-mapper/index.html | 4 +- handbook/build/docs/options/index.html | 4 +- handbook/build/docs/performance/index.html | 4 +- .../build/docs/process-service/index.html | 4 +- handbook/build/docs/reference/index.html | 4 +- handbook/build/docs/saas/index.html | 4 +- .../docs/settings/appsettings/index.html | 4 +- .../settings/corsaccessorsettings/index.html | 4 +- .../dependencyinjectionsettings/index.html | 4 +- .../dynamicapicontrollersettings/index.html | 4 +- .../friendlyexceptionsettings/index.html | 4 +- .../settings/localizationsettings/index.html | 4 +- .../specificationdocumentsettings/index.html | 4 +- .../validationTypemessagesettings/index.html | 4 +- handbook/build/docs/signalr/index.html | 4 +- handbook/build/docs/source/index.html | 4 +- .../docs/specification-document/index.html | 4 +- handbook/build/docs/split-db/index.html | 4 +- handbook/build/docs/sqlsugar/index.html | 4 +- handbook/build/docs/template/index.html | 4 +- handbook/build/docs/tran/index.html | 4 +- handbook/build/docs/unittest/index.html | 4 +- handbook/build/docs/upgrade/index.html | 10 ++-- handbook/build/docs/view-engine/index.html | 4 +- handbook/build/docs/virtual-deploy/index.html | 4 +- handbook/build/index.html | 4 +- handbook/build/main.307ac0ad.js | 1 - ...n.ed0a7a8a.js => runtime~main.c73b512f.js} | 2 +- handbook/build/search/index.html | 4 +- handbook/docs/upgrade.mdx | 49 ++++++++++++++++++- 221 files changed, 478 insertions(+), 435 deletions(-) create mode 100644 docs/1ca878db.c92cbf13.js delete mode 100644 docs/1ca878db.d7b4851f.js rename docs/{runtime~main.44f3c01b.js => runtime~main.b4a789c9.js} (99%) delete mode 100644 handbook/build/1ca878db.a30c2d36.js create mode 100644 handbook/build/1ca878db.c1b61e38.js rename handbook/build/{runtime~main.ed0a7a8a.js => runtime~main.c73b512f.js} (98%) diff --git a/docs/1.47e3e482.js b/docs/1.47e3e482.js index 48e00569be6..ed495834238 100644 --- a/docs/1.47e3e482.js +++ b/docs/1.47e3e482.js @@ -1,2 +1 @@ -/*! For license information please see 1.47e3e482.js.LICENSE.txt */ (window.webpackJsonp=window.webpackJsonp||[]).push([[1],{200:function(e,t,n){"use strict";function a(e){var t,n,r="";if("string"==typeof e||"number"==typeof e)r+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t{}});var l=n(17),u=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);re.startsWith("/"))(C)?p(C):C):void 0;var C;const w=Object(a.useRef)(!1),_=n?o.e:o.c,D=s.a.canUseIntersectionObserver;let P;Object(a.useEffect)(()=>(!D&&y&&window.docusaurus.prefetch(k),()=>{D&&P&&P.disconnect()}),[k,D,y]);const S=null!==(t=null==k?void 0:k.startsWith("#"))&&void 0!==t&&t,N=!k||!y||S;return k&&y&&!S&&!v&&O.collectLink(k),N?r.a.createElement("a",Object.assign({href:k},E&&!y&&{target:"_blank",rel:"noopener noreferrer"},g)):r.a.createElement(_,Object.assign({},g,{onMouseEnter:()=>{w.current||(window.docusaurus.preload(k),w.current=!0)},innerRef:e=>{var t,n;D&&e&&y&&(t=e,n=()=>{window.docusaurus.prefetch(k)},P=new window.IntersectionObserver(e=>{e.forEach(e=>{t===e.target&&(e.isIntersecting||e.intersectionRatio>0)&&(P.unobserve(t),P.disconnect(),n())})}),P.observe(t))},to:k||""},n&&{isActive:h,activeClassName:m}))}},203:function(e,t,n){"use strict";var a=n(0),r=n(204);t.a=function(){const e=Object(a.useContext)(r.a);if(null==e)throw new Error("`useUserPreferencesContext` is used outside of `Layout` Component.");return e}},204:function(e,t,n){"use strict";var a=n(0);const r=Object(a.createContext)(void 0);t.a=r},207:function(e,t,n){try{e.exports=n(225)}catch(a){e.exports={}}},208:function(e,t,n){"use strict";n.r(t);var a=n(11);n.d(t,"MemoryRouter",(function(){return a.d})),n.d(t,"Prompt",(function(){return a.f})),n.d(t,"Redirect",(function(){return a.g})),n.d(t,"Route",(function(){return a.h})),n.d(t,"Router",(function(){return a.i})),n.d(t,"StaticRouter",(function(){return a.j})),n.d(t,"Switch",(function(){return a.k})),n.d(t,"generatePath",(function(){return a.l})),n.d(t,"matchPath",(function(){return a.m})),n.d(t,"useHistory",(function(){return a.n})),n.d(t,"useLocation",(function(){return a.o})),n.d(t,"useParams",(function(){return a.p})),n.d(t,"useRouteMatch",(function(){return a.q})),n.d(t,"withRouter",(function(){return a.r})),n.d(t,"BrowserRouter",(function(){return a.a})),n.d(t,"HashRouter",(function(){return a.b})),n.d(t,"Link",(function(){return a.c})),n.d(t,"NavLink",(function(){return a.e}))},209:function(e,t,n){"use strict";var a=n(0),r=n.n(a),o=n(200),c=n(69),s=n.n(c);var i=function(){return r.a.createElement("nav",{"aria-label":"Skip navigation links"},r.a.createElement("button",{type:"button",tabIndex:0,className:s.a.skipToContent,onKeyDown:e=>{if(13!==e.keyCode)return;document.activeElement.blur();const t=document.querySelector("main:first-of-type");t&&t.scrollIntoView()}},"Skip to main content"))},l=n(201),u=n(203),d=n(70),f=n.n(d);var m=function(){const{isAnnouncementBarClosed:e,closeAnnouncementBar:t}=Object(u.a)(),{announcementBar:n}=Object(l.useThemeConfig)();if(!n)return null;const{content:a,backgroundColor:c,textColor:s,isCloseable:i}=n;return!a||i&&e?null:r.a.createElement("div",{className:f.a.announcementBar,style:{backgroundColor:c,color:s},role:"banner"},r.a.createElement("div",{className:Object(o.a)(f.a.announcementBarContent,{[f.a.announcementBarCloseable]:i}),dangerouslySetInnerHTML:{__html:a}}),i?r.a.createElement("button",{type:"button",className:f.a.announcementBarClose,onClick:t,"aria-label":"Close"},r.a.createElement("span",{"aria-hidden":"true"},"\xd7")):null)},h=n(3),v=n(7),b=n(26),g=n(10),p=n(208),O=n(17),E=n(202),y=n(24),j=n(240);function k(){return r.a.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.a.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var C=n(241);function w(){return(w=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,a=new Array(t);nr.a.createElement("span",{className:Object(o.a)(F.a.toggle,F.a.dark),style:t},e),H=({icon:e,style:t})=>r.a.createElement("span",{className:Object(o.a)(F.a.toggle,F.a.light),style:t},e);var $=function(e){const{colorMode:{switchConfig:{darkIcon:t,darkIconStyle:n,lightIcon:a,lightIconStyle:o}}}=Object(l.useThemeConfig)(),{isClient:c}=Object(g.default)();return r.a.createElement(B.a,Object(h.a)({disabled:!c,icons:{checked:r.a.createElement(U,{icon:t,style:n}),unchecked:r.a.createElement(H,{icon:a,style:o})}},e))},X=n(212),G=n(243);var K=e=>{const t=Object(p.useLocation)(),[n,r]=Object(a.useState)(!e),o=Object(a.useRef)(!1),[c,s]=Object(a.useState)(0),[i,l]=Object(a.useState)(0),u=Object(a.useCallback)(e=>{null!==e&&l(e.getBoundingClientRect().height)},[]);return Object(G.a)(({scrollY:t})=>{if(!e)return;if(t=c?r(!1):t+a{e&&c&&r(!0)},[t.pathname]),Object(a.useEffect)(()=>{e&&(o.current=!0)},[t.hash]),{navbarRef:u,isNavbarVisible:n}},q=n(244),W=n(245),Y=n(216);function z({mobile:e,...t}){const{siteConfig:{baseUrl:n},i18n:{defaultLocale:a,currentLocale:o,locales:c,localeConfigs:s}}=Object(g.default)(),{pathname:i}=Object(p.useLocation)();function l(e){return s[e].label}const u=o===a?n:n.replace(`/${o}/`,"/"),d=i.replace(n,"");const f=c.map(e=>{const t=`${function(e){return e===a?""+u:`${u}${e}/`}(e)}${d}`;return{isNavLink:!0,label:l(e),to:"pathname://"+t,target:"_self",autoAddBaseUrl:!1,className:e===o?"dropdown__link--active":""}}),m=e?"Languages":l(o);return r.a.createElement(Y.a,Object(h.a)({},t,{mobile:e,label:m,items:f}))}const J={default:()=>Y.a,localeDropdown:()=>z,docsVersion:()=>n(261).default,docsVersionDropdown:()=>n(262).default,doc:()=>n(263).default};function Q({type:e,...t}){const n=((e="default")=>{const t=J[e];if(!t)throw new Error(`No NavbarItem component found for type=${e}.`);return t()})(e);return r.a.createElement(n,t)}var Z=n(255),ee=n(246),te=n(73),ne=n.n(te);const ae="right";var re=function(){const{navbar:{items:e,hideOnScroll:t,style:n},colorMode:{disableSwitch:c}}=Object(l.useThemeConfig)(),[s,i]=Object(a.useState)(!1),[u,d]=Object(a.useState)(!1),{isDarkTheme:f,setLightTheme:m,setDarkTheme:v}=Object(X.a)(),{navbarRef:b,isNavbarVisible:g}=K(t);Object(q.a)(s);const p=Object(a.useCallback)(()=>{i(!0)},[i]),O=Object(a.useCallback)(()=>{i(!1)},[i]),E=Object(a.useCallback)(e=>e.target.checked?v():m(),[m,v]),y=Object(W.a)();Object(a.useEffect)(()=>{y===W.b.desktop&&i(!1)},[y]);const{leftItems:j,rightItems:k}=function(e){return{leftItems:e.filter(e=>{var t;return"left"===(null!==(t=e.position)&&void 0!==t?t:ae)}),rightItems:e.filter(e=>{var t;return"right"===(null!==(t=e.position)&&void 0!==t?t:ae)})}}(e);return r.a.createElement("nav",{ref:b,className:Object(o.a)("navbar","navbar--fixed-top",{"navbar--dark":"dark"===n,"navbar--primary":"primary"===n,"navbar-sidebar--show":s,[ne.a.navbarHideable]:t,[ne.a.navbarHidden]:!g})},r.a.createElement("div",{className:"navbar__inner"},r.a.createElement("div",{className:"navbar__items"},null!=e&&0!==e.length&&r.a.createElement("div",{"aria-label":"Navigation bar toggle",className:"navbar__toggle",role:"button",tabIndex:0,onClick:p,onKeyDown:p},r.a.createElement(ee.a,null)),r.a.createElement(Z.a,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:Object(o.a)("navbar__title",{[ne.a.hideLogoText]:u})}),j.map((e,t)=>r.a.createElement(Q,Object(h.a)({},e,{key:t})))),r.a.createElement("div",{className:"navbar__items navbar__items--right"},k.map((e,t)=>r.a.createElement(Q,Object(h.a)({},e,{key:t}))),!c&&r.a.createElement($,{className:ne.a.displayOnlyInLargeViewport,"aria-label":"Dark mode toggle",checked:f,onChange:E}),r.a.createElement(x,{handleSearchBarToggle:d,isSearchBarExpanded:u}))),r.a.createElement("div",{role:"presentation",className:"navbar-sidebar__backdrop",onClick:O}),r.a.createElement("div",{className:"navbar-sidebar"},r.a.createElement("div",{className:"navbar-sidebar__brand"},r.a.createElement(Z.a,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title",onClick:O}),!c&&s&&r.a.createElement($,{"aria-label":"Dark mode toggle in sidebar",checked:f,onChange:E})),r.a.createElement("div",{className:"navbar-sidebar__items"},r.a.createElement("div",{className:"menu"},r.a.createElement("ul",{className:"menu__list"},e.map((e,t)=>r.a.createElement(Q,Object(h.a)({mobile:!0},e,{onClick:O,key:t}))))))))},oe=n(210),ce=n(12);const se="light",ie="dark",le=e=>e===ie?ie:se,ue=()=>ce.a.canUseDOM?le(document.documentElement.getAttribute("data-theme")):se,de=e=>{try{localStorage.setItem("theme",le(e))}catch(t){console.error(t)}};var fe=()=>{const{colorMode:{disableSwitch:e,respectPrefersColorScheme:t}}=Object(l.useThemeConfig)(),[n,r]=Object(a.useState)(ue),o=Object(a.useCallback)(()=>{r(se),de(se)},[]),c=Object(a.useCallback)(()=>{r(ie),de(ie)},[]);return Object(a.useEffect)(()=>{document.documentElement.setAttribute("data-theme",le(n))},[n]),Object(a.useEffect)(()=>{if(!e)try{const e=localStorage.getItem("theme");null!==e&&r(le(e))}catch(t){console.error(t)}},[r]),Object(a.useEffect)(()=>{e&&!t||window.matchMedia("(prefers-color-scheme: dark)").addListener(({matches:e})=>{r(e?ie:se)})},[]),{isDarkTheme:n===ie,setLightTheme:o,setDarkTheme:c}},me=n(242);var he=function(e){const{isDarkTheme:t,setLightTheme:n,setDarkTheme:a}=fe();return r.a.createElement(me.a.Provider,{value:{isDarkTheme:t,setLightTheme:n,setDarkTheme:a}},e.children)};const ve="docusaurus.tab.";var be=()=>{const[e,t]=Object(a.useState)({}),n=Object(a.useCallback)((e,t)=>{try{localStorage.setItem("docusaurus.tab."+e,t)}catch(n){console.error(n)}},[]);return Object(a.useEffect)(()=>{try{const e={};for(let t=0;t{t(t=>({...t,[e]:a})),n(e,a)}}};const ge="docusaurus.announcement.dismiss",pe="docusaurus.announcement.id";var Oe=()=>{const{announcementBar:e}=Object(l.useThemeConfig)(),[t,n]=Object(a.useState)(!0),r=Object(a.useCallback)(()=>{localStorage.setItem(ge,"true"),n(!0)},[]);return Object(a.useEffect)(()=>{if(!e)return;const{id:t}=e;let a=localStorage.getItem(pe);"annoucement-bar"===a&&(a="announcement-bar");const r=t!==a;localStorage.setItem(pe,t),r&&localStorage.setItem(ge,"false"),(r||"false"===localStorage.getItem(ge))&&n(!1)},[]),{isAnnouncementBarClosed:t,closeAnnouncementBar:r}},Ee=n(204);var ye=function(e){const{tabGroupChoices:t,setTabGroupChoices:n}=be(),{isAnnouncementBarClosed:a,closeAnnouncementBar:o}=Oe();return r.a.createElement(Ee.a.Provider,{value:{tabGroupChoices:t,setTabGroupChoices:n,isAnnouncementBarClosed:a,closeAnnouncementBar:o}},e.children)};function je({children:e}){return r.a.createElement(he,null,r.a.createElement(ye,null,r.a.createElement(l.DocsPreferredVersionContextProvider,null,e)))}function ke(e){var t=e.locale,n=e.version,a=e.tag,o=t;return r.a.createElement(y.a,null,o&&r.a.createElement("meta",{name:"docsearch:language",content:o}),n&&r.a.createElement("meta",{name:"docsearch:version",content:n}),a&&r.a.createElement("meta",{name:"docsearch:docusaurus_tag",content:a}))}function Ce(e){const{siteConfig:t,i18n:{currentLocale:n}}=Object(g.default)(),{favicon:a,themeConfig:{image:o,metadatas:c},url:s}=t,{title:i,description:u,image:d,keywords:f,permalink:m,searchMetadatas:v}=e,b=Object(l.useTitleFormatter)(i),p=d||o,E=Object(O.a)(p,{absolute:!0}),j=Object(O.a)(a),k=n.split("-")[0];return r.a.createElement(r.a.Fragment,null,r.a.createElement(y.a,null,r.a.createElement("html",{lang:k}),b&&r.a.createElement("title",null,b),b&&r.a.createElement("meta",{property:"og:title",content:b}),a&&r.a.createElement("link",{rel:"shortcut icon",href:j}),u&&r.a.createElement("meta",{name:"description",content:u}),u&&r.a.createElement("meta",{property:"og:description",content:u}),f&&f.length&&r.a.createElement("meta",{name:"keywords",content:f.join(",")}),p&&r.a.createElement("meta",{property:"og:image",content:E}),p&&r.a.createElement("meta",{name:"twitter:image",content:E}),p&&r.a.createElement("meta",{name:"twitter:image:alt",content:"Image for "+b}),m&&r.a.createElement("meta",{property:"og:url",content:s+m}),m&&r.a.createElement("link",{rel:"canonical",href:s+m}),r.a.createElement("meta",{name:"twitter:card",content:"summary_large_image"})),r.a.createElement(ke,Object(h.a)({tag:l.DEFAULT_SEARCH_TAG,locale:n},v)),r.a.createElement(y.a,null,c.map((e,t)=>r.a.createElement("meta",Object(h.a)({key:"metadata_"+t},e)))))}n(74);var we=function(){Object(a.useEffect)(()=>{const e="navigation-with-keyboard";function t(t){"keydown"===t.type&&"Tab"===t.key&&document.body.classList.add(e),"mousedown"===t.type&&document.body.classList.remove(e)}return document.addEventListener("keydown",t),document.addEventListener("mousedown",t),()=>{document.body.classList.remove(e),document.removeEventListener("keydown",t),document.removeEventListener("mousedown",t)}},[])};n(75);t.a=function(e){const{children:t,noFooter:n,wrapperClassName:a}=e;return we(),r.a.createElement(je,null,r.a.createElement(Ce,e),r.a.createElement(i,null),r.a.createElement(m,null),r.a.createElement(re,null),r.a.createElement("div",{className:Object(o.a)("main-wrapper",a)},t),!n&&r.a.createElement(oe.a,null))}},212:function(e,t,n){"use strict";var a=n(0),r=n(242);t.a=function(){const e=Object(a.useContext)(r.a);if(null==e)throw new Error("`useThemeContext` is used outside of `Layout` Component. See https://v2.docusaurus.io/docs/theme-classic#usethemecontext.");return e}},213:function(e,t,n){"use strict";var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useThemeConfig=void 0;const r=a(n(10));t.useThemeConfig=function(){return r.default().siteConfig.themeConfig}},214:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isDocsPluginEnabled=void 0;const a=n(207);t.isDocsPluginEnabled=!!a.useAllDocsData},215:function(e,t,n){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,n,a){void 0===a&&(a=n),Object.defineProperty(e,a,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,a){void 0===a&&(a=n),e[a]=t[n]}),r=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&a(t,e,n);return r(t,e),t},c=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useDocsPreferredVersionContext=t.DocsPreferredVersionContextProvider=void 0;const s=o(n(0)),i=n(213),l=n(214),u=n(207),d=c(n(231));function f({pluginIds:e,versionPersistence:t,allDocsData:n}){const a={};return e.forEach(e=>{a[e]=function(e){const a=d.default.read(e,t);return n[e].versions.some(e=>e.name===a)?{preferredVersionName:a}:(d.default.clear(e,t),{preferredVersionName:null})}(e)}),a}function m(){const e=u.useAllDocsData(),t=i.useThemeConfig().docs.versionPersistence,n=s.useMemo(()=>Object.keys(e),[e]),[a,r]=s.useState(()=>function(e){const t={};return e.forEach(e=>{t[e]={preferredVersionName:null}}),t}(n));s.useEffect(()=>{r(f({allDocsData:e,versionPersistence:t,pluginIds:n}))},[e,t,n]);return[a,s.useMemo(()=>({savePreferredVersion:function(e,n){d.default.save(e,t,n),r(t=>Object.assign(Object.assign({},t),{[e]:{preferredVersionName:n}}))}}),[r])]}const h=s.createContext(null);function v({children:e}){const t=m();return s.default.createElement(h.Provider,{value:t},e)}t.DocsPreferredVersionContextProvider=function({children:e}){return l.isDocsPluginEnabled?s.default.createElement(v,null,e):s.default.createElement(s.default.Fragment,null,e)},t.useDocsPreferredVersionContext=function(){const e=s.useContext(h);if(!e)throw new Error("Can't find docs preferred context, maybe you forgot to use the DocsPreferredVersionContextProvider ?");return e}},216:function(e,t,n){"use strict";var a=n(3),r=n(0),o=n.n(r),c=n(200),s=n(202),i=n(17),l=n(208),u=n(201);function d({activeBasePath:e,activeBaseRegex:t,to:n,href:r,label:c,activeClassName:l="navbar__link--active",prependBaseUrlToHref:u,...d}){const f=Object(i.a)(n),m=Object(i.a)(e),h=Object(i.a)(r,{forcePrependBaseUrl:!0});return o.a.createElement(s.a,Object(a.a)({},r?{target:"_blank",rel:"noopener noreferrer",href:u?h:r}:{isNavLink:!0,activeClassName:l,to:f,...e||t?{isActive:(e,n)=>t?new RegExp(t).test(n.pathname):n.pathname.startsWith(m)}:null},d),c)}function f({items:e,position:t,className:n,...s}){const i=Object(r.useRef)(null),l=Object(r.useRef)(null),[u,f]=Object(r.useState)(!1);Object(r.useEffect)(()=>{const e=e=>{i.current&&!i.current.contains(e.target)&&f(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}},[i]);const m=(e,t=!1)=>Object(c.a)({"navbar__item navbar__link":!t,dropdown__link:t},e);return e?o.a.createElement("div",{ref:i,className:Object(c.a)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--left":"left"===t,"dropdown--right":"right"===t,"dropdown--show":u})},o.a.createElement(d,Object(a.a)({className:m(n)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),f(!u))}}),s.label),o.a.createElement("ul",{ref:l,className:"dropdown__menu"},e.map(({className:t,...n},r)=>o.a.createElement("li",{key:r},o.a.createElement(d,Object(a.a)({onKeyDown:t=>{if(r===e.length-1&&"Tab"===t.key){t.preventDefault(),f(!1);const e=i.current.nextElementSibling;e&&e.focus()}},activeClassName:"dropdown__link--active",className:m(t,!0)},n)))))):o.a.createElement(d,Object(a.a)({className:m(n)},s))}function m({items:e,className:t,position:n,...s}){var i,f;const m=Object(r.useRef)(null),{pathname:h}=Object(l.useLocation)(),[v,b]=Object(r.useState)(()=>{var t;return null===(t=!(null!=e&&e.some(e=>Object(u.isSamePath)(e.to,h))))||void 0===t||t}),g=(e,t=!1)=>Object(c.a)("menu__link",{"menu__link--sublist":t},e);if(!e)return o.a.createElement("li",{className:"menu__list-item"},o.a.createElement(d,Object(a.a)({className:g(t)},s)));const p=null!==(i=m.current)&&void 0!==i&&i.scrollHeight?(null===(f=m.current)||void 0===f?void 0:f.scrollHeight)+"px":void 0;return o.a.createElement("li",{className:Object(c.a)("menu__list-item",{"menu__list-item--collapsed":v})},o.a.createElement(d,Object(a.a)({role:"button",className:g(t,!0)},s,{onClick:()=>{b(e=>!e)}}),s.label),o.a.createElement("ul",{className:"menu__list",ref:m,style:{height:v?void 0:p}},e.map(({className:e,...t},n)=>o.a.createElement("li",{className:"menu__list-item",key:n},o.a.createElement(d,Object(a.a)({activeClassName:"menu__link--active",className:g(e)},t,{onClick:s.onClick}))))))}t.a=function({mobile:e=!1,...t}){const n=e?m:f;return o.a.createElement(n,t)}},224:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.docVersionSearchTag=t.DEFAULT_SEARCH_TAG=void 0,t.DEFAULT_SEARCH_TAG="default",t.docVersionSearchTag=function(e,t){return`docs-${e}-${t}`}},225:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useDocVersionSuggestions=t.useActiveDocContext=t.useActiveVersion=t.useLatestVersion=t.useVersions=t.useActivePluginAndVersion=t.useActivePlugin=t.useDocsData=t.useAllDocsData=void 0;const a=n(208),r=n(226),o=n(227);t.useAllDocsData=()=>r.useAllPluginInstancesData("docusaurus-plugin-content-docs"),t.useDocsData=e=>r.usePluginData("docusaurus-plugin-content-docs",e),t.useActivePlugin=(e={})=>{const n=t.useAllDocsData(),{pathname:r}=a.useLocation();return o.getActivePlugin(n,r,e)},t.useActivePluginAndVersion=(e={})=>{const n=t.useActivePlugin(e),{pathname:r}=a.useLocation();if(n){return{activePlugin:n,activeVersion:o.getActiveVersion(n.pluginData,r)}}},t.useVersions=e=>t.useDocsData(e).versions,t.useLatestVersion=e=>{const n=t.useDocsData(e);return o.getLatestVersion(n)},t.useActiveVersion=e=>{const n=t.useDocsData(e),{pathname:r}=a.useLocation();return o.getActiveVersion(n,r)},t.useActiveDocContext=e=>{const n=t.useDocsData(e),{pathname:r}=a.useLocation();return o.getActiveDocContext(n,r)},t.useDocVersionSuggestions=e=>{const n=t.useDocsData(e),{pathname:r}=a.useLocation();return o.getDocVersionSuggestions(n,r)}},226:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return r})),n.d(t,"useAllPluginInstancesData",(function(){return o})),n.d(t,"usePluginData",(function(){return c}));var a=n(10);function r(){const{globalData:e}=Object(a.default)();if(!e)throw new Error("Docusaurus global data not found");return e}function o(e){const t=r()[e];if(!t)throw new Error("Docusaurus plugin global data not found for pluginName="+e);return t}function c(e,t="default"){const n=o(e)[t];if(!n)throw new Error(`Docusaurus plugin global data not found for pluginName=${e} and pluginId=${t}`);return n}},227:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getDocVersionSuggestions=t.getActiveDocContext=t.getActiveVersion=t.getLatestVersion=t.getActivePlugin=void 0;const a=n(208);t.getActivePlugin=function(e,t,n={}){const r=Object.entries(e).find(([e,n])=>!!a.matchPath(t,{path:n.path,exact:!1,strict:!1})),o=r?{pluginId:r[0],pluginData:r[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for pathname=${t}, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map(e=>e.path).join(", ")}`);return o},t.getLatestVersion=e=>e.versions.find(e=>e.isLast),t.getActiveVersion=(e,n)=>{const r=t.getLatestVersion(e);return[...e.versions.filter(e=>e!==r),r].find(e=>!!a.matchPath(n,{path:e.path,exact:!1,strict:!1}))},t.getActiveDocContext=(e,n)=>{const r=t.getActiveVersion(e,n),o=null==r?void 0:r.docs.find(e=>!!a.matchPath(n,{path:e.path,exact:!0,strict:!1}));return{activeVersion:r,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach(e=>{e.docs.forEach(a=>{a.id===t&&(n[e.name]=a)})}),n}(o.id):{}}},t.getDocVersionSuggestions=(e,n)=>{const a=t.getLatestVersion(e),r=t.getActiveDocContext(e,n),o=r.activeVersion!==a;return{latestDocSuggestion:o?null==r?void 0:r.alternateDocVersions[a.name]:void 0,latestVersionSuggestion:o?a:void 0}}},228:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isSamePath=void 0,t.isSamePath=(e,t)=>{const n=e=>!e||(null==e?void 0:e.endsWith("/"))?e:e+"/";return n(e)===n(t)}},229:function(e,t,n){"use strict";var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useTitleFormatter=void 0;const r=a(n(10));t.useTitleFormatter=e=>{const{siteConfig:t={}}=r.default(),{title:n,titleDelimiter:a="|"}=t;return e&&e.trim().length?`${e.trim()} ${a} ${n}`:n}},230:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useDocsPreferredVersionByPluginId=t.useDocsPreferredVersion=void 0;const a=n(0),r=n(215),o=n(207),c=n(232);t.useDocsPreferredVersion=function(e=c.DEFAULT_PLUGIN_ID){const t=o.useDocsData(e),[n,s]=r.useDocsPreferredVersionContext(),{preferredVersionName:i}=n[e];return{preferredVersion:i?t.versions.find(e=>e.name===i):null,savePreferredVersionName:a.useCallback(t=>{s.savePreferredVersion(e,t)},[s])}},t.useDocsPreferredVersionByPluginId=function(){const e=o.useAllDocsData(),[t]=r.useDocsPreferredVersionContext(),n=Object.keys(e),a={};return n.forEach(n=>{a[n]=function(n){const a=e[n],{preferredVersionName:r}=t[n];return r?a.versions.find(e=>e.name===r):null}(n)}),a}},231:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const a=e=>"docs-preferred-version-"+e,r={save:(e,t,n)=>{"none"===t||window.localStorage.setItem(a(e),n)},read:(e,t)=>"none"===t?null:window.localStorage.getItem(a(e)),clear:(e,t)=>{"none"===t||window.localStorage.removeItem(a(e))}};t.default=r},232:function(e,t,n){"use strict";n.r(t),n.d(t,"DEFAULT_PLUGIN_ID",(function(){return a}));const a="default"},240:function(e,t,n){"use strict";var a=n(208),r=n(12),o=n(10);t.a=function(){var e=Object(a.useHistory)(),t=Object(a.useLocation)(),n=Object(o.default)().siteConfig,c=(n=void 0===n?{}:n).baseUrl;return{searchValue:r.a.canUseDOM&&new URLSearchParams(t.search).get("q")||"",updateSearchPath:function(n){var a=new URLSearchParams(t.search);n?a.set("q",n):a.delete("q"),e.replace({search:a.toString()})},generateSearchPageLink:function(e){return c+"search?q="+encodeURIComponent(e)}}}},241:function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var a=n(0),r=n.n(a);function o(){return r.a.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20"},r.a.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},242:function(e,t,n){"use strict";var a=n(0);const r=n.n(a).a.createContext(void 0);t.a=r},243:function(e,t,n){"use strict";var a=n(0),r=n(12);const o=()=>({scrollX:r.a.canUseDOM?window.pageXOffset:0,scrollY:r.a.canUseDOM?window.pageYOffset:0});t.a=(e,t=[])=>{const[n,r]=Object(a.useState)(o()),c=()=>{const t=o();r(t),e&&e(t)};return Object(a.useEffect)(()=>{const e={passive:!0};return window.addEventListener("scroll",c,e),()=>window.removeEventListener("scroll",c,e)},t),n}},244:function(e,t,n){"use strict";var a=n(0);t.a=function(e=!0){Object(a.useEffect)(()=>(document.body.style.overflow=e?"hidden":"visible",()=>{document.body.style.overflow="visible"}),[e])}},245:function(e,t,n){"use strict";n.d(t,"b",(function(){return r}));var a=n(0);const r={desktop:"desktop",mobile:"mobile"};t.a=function(){const e="undefined"!=typeof window;function t(){if(e)return window.innerWidth>996?r.desktop:r.mobile}const[n,o]=Object(a.useState)(t);return Object(a.useEffect)(()=>{if(e)return window.addEventListener("resize",n),()=>window.removeEventListener("resize",n);function n(){o(t())}},[]),n}},246:function(e,t,n){"use strict";var a=n(3),r=n(0),o=n.n(r);t.a=({width:e=30,height:t=30,className:n,...r})=>o.a.createElement("svg",Object(a.a)({"aria-label":"Menu",className:n,width:e,height:t,viewBox:"0 0 30 30",role:"img",focusable:"false"},r),o.a.createElement("title",null,"Menu"),o.a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))},255:function(e,t,n){"use strict";var a=n(3),r=n(0),o=n.n(r),c=n(202),s=n(200),i=n(10),l=n(212),u=n(72),d=n.n(u);var f=e=>{const{isClient:t}=Object(i.default)(),{isDarkTheme:n}=Object(l.a)(),{sources:r,className:c,alt:u="",...f}=e,m=t?n?["dark"]:["light"]:["light","dark"];return o.a.createElement(o.a.Fragment,null,m.map(e=>o.a.createElement("img",Object(a.a)({key:e,src:r[e],alt:u,className:Object(s.a)(d.a.themedImage,d.a["themedImage--"+e],c)},f))))},m=n(17),h=n(201),v=n(25);t.a=e=>{const{isClient:t}=Object(i.default)(),{navbar:{title:n,logo:r={src:""}}}=Object(h.useThemeConfig)(),{imageClassName:s,titleClassName:l,...u}=e,d=Object(m.a)(r.href||"/"),b=r.target?{target:r.target}:Object(v.a)(d)?{}:{rel:"noopener noreferrer",target:"_blank"},g={light:Object(m.a)(r.src),dark:Object(m.a)(r.srcDark||r.src)};return o.a.createElement(c.a,Object(a.a)({to:d},u,b),r.src&&o.a.createElement(f,{key:t,className:s,sources:g,alt:r.alt||n||"Logo"}),null!=n&&o.a.createElement("strong",{className:l},n))}},256:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var a=Object.assign||function(e){for(var t=1;tthis.startX&&(this.setState({checked:!0}),this.startX=t,this.activated=tn?this.previouslyChecked!==this.state.checked&&(this.setState({checked:!1}),this.previouslyChecked=this.state.checked,t.click()):this.startX-4=0||Object.prototype.hasOwnProperty.call(e,a)&&(n[a]=e[a]);return n}(t,["className","icons"])),o=(0,s.default)("react-toggle",{"react-toggle--checked":this.state.checked,"react-toggle--focus":this.state.hasFocus,"react-toggle--disabled":this.props.disabled},n);return c.default.createElement("div",{className:o,onClick:this.handleClick,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd},c.default.createElement("div",{className:"react-toggle-track"},c.default.createElement("div",{className:"react-toggle-track-check"},this.getIcon("checked")),c.default.createElement("div",{className:"react-toggle-track-x"},this.getIcon("unchecked"))),c.default.createElement("div",{className:"react-toggle-thumb"}),c.default.createElement("input",a({},r,{ref:function(t){e.input=t},onFocus:this.handleFocus,onBlur:this.handleBlur,className:"react-toggle-screenreader-only",type:"checkbox"})))}}]),t}(o.PureComponent);t.default=m,m.displayName="Toggle",m.defaultProps={icons:{checked:c.default.createElement(l.default,null),unchecked:c.default.createElement(u.default,null)}},m.propTypes={checked:i.default.bool,disabled:i.default.bool,defaultChecked:i.default.bool,onChange:i.default.func,onFocus:i.default.func,onBlur:i.default.func,className:i.default.string,name:i.default.string,value:i.default.string,id:i.default.string,"aria-labelledby":i.default.string,"aria-label":i.default.string,icons:i.default.oneOfType([i.default.bool,i.default.shape({checked:i.default.node,unchecked:i.default.node})])}},257:function(e,t,n){var a;!function(){"use strict";var n={}.hasOwnProperty;function r(){for(var e=[],t=0;t0){var n=t[0];return{x:n.clientX,y:n.clientY}}var a=e.pageX;if(void 0!==a)return{x:a,y:e.pageY}}return{x:0,y:0}}},261:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return l}));var a=n(3),r=n(0),o=n.n(r),c=n(216),s=n(207),i=n(201);function l({label:e,to:t,docsPluginId:n,...r}){var l;const u=Object(s.useActiveVersion)(n),{preferredVersion:d}=Object(i.useDocsPreferredVersion)(n),f=Object(s.useLatestVersion)(n),m=null!==(l=null!=u?u:d)&&void 0!==l?l:f,h=null!=e?e:m.label,v=null!=t?t:(e=>e.docs.find(t=>t.id===e.mainDocId))(m).path;return o.a.createElement(c.a,Object(a.a)({},r,{label:h,to:v}))}},262:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return u}));var a=n(3),r=n(0),o=n.n(r),c=n(216),s=n(207),i=n(201);const l=e=>e.docs.find(t=>t.id===e.mainDocId);function u({mobile:e,docsPluginId:t,dropdownActiveClassDisabled:n,dropdownItemsBefore:r,dropdownItemsAfter:u,...d}){var f,m;const h=Object(s.useActiveDocContext)(t),v=Object(s.useVersions)(t),b=Object(s.useLatestVersion)(t),{preferredVersion:g,savePreferredVersionName:p}=Object(i.useDocsPreferredVersion)(t);const O=null!==(f=null!==(m=h.activeVersion)&&void 0!==m?m:g)&&void 0!==f?f:b,E=e?"Versions":O.label,y=e?void 0:l(O).path;return o.a.createElement(c.a,Object(a.a)({},d,{mobile:e,label:E,to:y,items:function(){const e=v.map(e=>{const t=(null==h?void 0:h.alternateDocVersions[e.name])||l(e);return{isNavLink:!0,label:e.label,to:t.path,isActive:()=>e===(null==h?void 0:h.activeVersion),onClick:()=>{p(e.name)}}}),t=[...r,...e,...u];if(!(t.length<=1))return t}(),isActive:n?()=>!1:void 0}))}},263:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return u}));var a=n(3),r=n(0),o=n.n(r),c=n(216),s=n(207),i=n(200),l=n(201);function u({docId:e,activeSidebarClassName:t,label:n,docsPluginId:r,...u}){var d;const{activeVersion:f,activeDoc:m}=Object(s.useActiveDocContext)(r),{preferredVersion:h}=Object(l.useDocsPreferredVersion)(r),v=Object(s.useLatestVersion)(r),b=null!==(d=null!=f?f:h)&&void 0!==d?d:v,g=b.docs.find(t=>t.id===e);if(!g)throw new Error(`DocNavbarItem: couldn't find any doc with id=${e} in version ${b.name}.\nAvailable docIds=\n- ${b.docs.join("\n- ")}`);return o.a.createElement(c.a,Object(a.a)({exact:!0},u,{className:Object(i.a)(u.className,{[t]:m&&m.sidebar===g.sidebar}),label:null!=n?n:g.id,to:g.path}))}}}]); \ No newline at end of file diff --git a/docs/119.06221260.js b/docs/119.06221260.js index 9499761dbc1..5c4918de376 100644 --- a/docs/119.06221260.js +++ b/docs/119.06221260.js @@ -1,2 +1 @@ -/*! For license information please see 119.06221260.js.LICENSE.txt */ (window.webpackJsonp=window.webpackJsonp||[]).push([[119],{157:function(e,t,n){"use strict";n.r(t);var r=n(0),i=n.n(r),a=n(274),s=n.n(a),c=n(264),u=n.n(c),o=n(200),f=n(24),h=n(202),l=n(12),m=n(201),d=n(10),v=n(207),p=n(240),g=n(209),y=n(158),R=n.n(y);var F=function(e){var t=e.docsSearchVersionsHelpers,n=Object.entries(t.allDocsData).filter((function(e){return e[1].versions.length>1}));return i.a.createElement("div",{className:Object(o.a)("col","col--3","padding-left--none",R.a.searchVersionColumn)},n.map((function(e){var r=e[0],a=e[1],s=n.length>1?r+": ":"";return i.a.createElement("select",{key:r,onChange:function(e){return t.setSearchVersion(r,e.target.value)},defaultValue:t.searchVersions[r],className:R.a.searchVersionInput},a.versions.map((function(e,t){return i.a.createElement("option",{key:t,label:""+s+e.label,value:e.name})})))})))};t.default=function(){var e,t,n,a,c,y=Object(d.default)().siteConfig,b=(y=void 0===y?{}:y).themeConfig.algolia,j=(b=void 0===b?{}:b).appId,P=void 0===j?"BH4D9OD16A":j,E=b.apiKey,O=b.indexName,x=(e=Object(v.useAllDocsData)(),t=Object(r.useState)((function(){return Object.entries(e).reduce((function(e,t){var n,r=t[0],i=t[1];return Object.assign({},e,((n={})[r]=i.versions[0].name,n))}),{})})),n=t[0],a=t[1],c=Object.values(e).some((function(e){return e.versions.length>1})),{allDocsData:e,versioningEnabled:c,searchVersions:n,setSearchVersion:function(e,t){return a((function(n){var r;return Object.assign({},n,((r={})[e]=t,r))}))}}),_=Object(p.a)(),w=_.searchValue,N=_.updateSearchPath,H=Object(r.useState)(w),S=H[0],A=H[1],Q={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},C=Object(r.useReducer)((function(e,t){var n=t.type,r=t.value;switch(n){case"reset":return Q;case"loading":return Object.assign({},e,{loading:!0});case"update":return S!==r.query?e:Object.assign({},r,{items:0===r.lastPage?r.items:e.items.concat(r.items)});case"advance":var i=e.totalPages>e.lastPage+1;return Object.assign({},e,{lastPage:i?e.lastPage+1:e.lastPage,hasMore:i});default:return e}}),Q),T=C[0],D=C[1],k=s()(P,E),I=u()(k,O,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:["docusaurus_tag"]});I.on("result",(function(e){var t=e.results,n=t.query,r=t.hits,i=t.page,a=t.nbHits,s=t.nbPages;if(""!==n&&r instanceof Array){var c=function(e){return e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match")},u=r.map((function(e){var t=e.url,n=e._highlightResult.hierarchy,r=e._snippetResult,i=void 0===r?{}:r,a=new URL(t),s=a.pathname,u=a.hash,o=Object.keys(n).map((function(e){return c(n[e].value)}));return{title:o.pop(),url:s+u,summary:i.content?c(i.content.value)+"...":"",breadcrumbs:o}}));D({type:"update",value:{items:u,query:n,totalResults:a,totalPages:s,lastPage:i,hasMore:s>i+1,loading:!1}})}else D({type:"reset"})}));var L,q,V=Object(r.useState)(null),B=V[0],M=V[1],z=Object(r.useRef)(0),J=Object(r.useRef)(l.a.canUseDOM&&new IntersectionObserver((function(e){var t=e[0],n=t.isIntersecting,r=t.boundingClientRect.y;n&&z.current>r&&D({type:"advance"}),z.current=r}),{threshold:1})),W=function(){return S?'Search results for "'+S+'"':"Search the documentation"},U=function(e){void 0===e&&(e=0),I.addDisjunctiveFacetRefinement("docusaurus_tag","default"),Object.entries(x.searchVersions).forEach((function(e){var t=e[0],n=e[1];I.addDisjunctiveFacetRefinement("docusaurus_tag","docs-"+t+"-"+n)})),I.setQuery(S).setPage(e).search()};return Object(r.useEffect)((function(){if(B)return J.current.observe(B),function(){J.current.unobserve(B)}}),[B]),Object(r.useEffect)((function(){N(S),D({type:"reset"}),S&&(D({type:"loading"}),setTimeout((function(){U()}),300))}),[S,x.searchVersions]),Object(r.useEffect)((function(){T.lastPage&&0!==T.lastPage&&U(T.lastPage)}),[T.lastPage]),Object(r.useEffect)((function(){w&&w!==S&&A(w)}),[w]),i.a.createElement(g.a,{wrapperClassName:"search-page-wrapper"},i.a.createElement(f.a,null,i.a.createElement("title",null,Object(m.useTitleFormatter)(W())),i.a.createElement("meta",{property:"robots",content:"noindex, follow"})),i.a.createElement("div",{className:"container margin-vert--lg"},i.a.createElement("h1",null,W()),i.a.createElement("form",{className:"row",onSubmit:function(e){return e.preventDefault()}},i.a.createElement("div",{className:Object(o.a)("col",R.a.searchQueryColumn,{"col--9":x.versioningEnabled,"col--12":!x.versioningEnabled})},i.a.createElement("input",{type:"search",name:"q",className:R.a.searchQueryInput,placeholder:"Type your search here","aria-label":"Search",onChange:function(e){return A(e.target.value)},value:S,autoComplete:"off",autoFocus:!0})),x.versioningEnabled&&i.a.createElement(F,{docsSearchVersionsHelpers:x})),i.a.createElement("div",{className:Object(o.a)("row","margin-vert--sm")},i.a.createElement("div",{className:Object(o.a)("col","col--8",R.a.searchResultsColumn)},!!T.totalResults&&i.a.createElement("strong",null,T.totalResults," ",(L=T.totalResults,q="document",L>1?q+"s":q)," found")),i.a.createElement("div",{className:Object(o.a)("col","col--4",R.a.searchLogoColumn)},i.a.createElement("a",{target:"_blank",rel:"noopener noreferrer",href:"https://www.algolia.com/","aria-label":"Search"},i.a.createElement("svg",{viewBox:"0 0 168 24",className:R.a.algoliaLogo,xmlns:"http://www.w3.org/2000/svg","aria-label":"Search by Algolia"},i.a.createElement("g",{fill:"none"},i.a.createElement("path",{className:R.a.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),i.a.createElement("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),i.a.createElement("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})))))),T.items.length>0?i.a.createElement("section",null,T.items.map((function(e,t){var n=e.title,r=e.url,a=e.summary,s=e.breadcrumbs;return i.a.createElement("article",{key:t,className:R.a.searchResultItem},i.a.createElement(h.a,{to:r,className:R.a.searchResultItemHeading,dangerouslySetInnerHTML:{__html:n}}),s.length>0&&i.a.createElement("span",{className:R.a.searchResultItemPath},s.map((function(e,t){return i.a.createElement(i.a.Fragment,null,0!==t&&i.a.createElement("span",{className:R.a.searchResultItemPathSeparator},"\u203a"),i.a.createElement("span",{dangerouslySetInnerHTML:{__html:e}}))}))),a&&i.a.createElement("p",{className:R.a.searchResultItemSummary,dangerouslySetInnerHTML:{__html:a}}))}))):[S&&!T.loading&&i.a.createElement("p",{key:"no-results"},"No results were found"),!!T.loading&&i.a.createElement("div",{key:"spinner",className:R.a.loadingSpinner})],T.hasMore&&i.a.createElement("div",{className:R.a.loader,ref:M},i.a.createElement("span",null,"Fetching new results..."))))}},221:function(e,t,n){"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var n=0;n0}},247:function(e,t,n){"use strict";var r=n(235),i=n(236),a=n(266),s=n(221),c=n(267),u=n(248),o=n(237),f=n(268);function h(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,n){return h(t[n],e)})):e===t}function l(e){var t=e?l._parseNumbers(e):{};this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var n=this;Object.keys(t).forEach((function(e){var r=-1!==l.PARAMETERS.indexOf(e),i=void 0!==t[e];!r&&i&&(n[e]=t[e])}))}l.PARAMETERS=Object.keys(new l),l._parseNumbers=function(e){if(e instanceof l)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(n){var r=e[n];if("string"==typeof r){var i=parseFloat(r);t[n]=isNaN(i)?r:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var n={};Object.keys(e.numericRefinements).forEach((function(t){var r=e.numericRefinements[t]||{};n[t]={},Object.keys(r).forEach((function(e){var i=r[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));n[t][e]=i}))})),t.numericRefinements=n}return r({},e,t)},l.make=function(e){var t=new l(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var n=t.getHierarchicalRefinement(e.name);n.length>0&&0!==n[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(n=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},l.validate=function(e,t){var n=t||{};return e.tagFilters&&n.tagRefinements&&n.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&n.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&n.numericRefinements&&o(n.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):o(e.numericRefinements)&&n.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},l.prototype={constructor:l,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,n){var i=c(n);if(this.isNumericRefined(e,t,i))return this;var a=r({},this.numericRefinements);return a[e]=r({},a[e]),a[e][t]?(a[e][t]=a[e][t].slice(),a[e][t].push(i)):a[e][t]=[i],this.setQueryParameters({numericRefinements:a})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,n){return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&h(r.val,c(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(n,r){return r===e&&n.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,n){return n===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return o(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return o(this.numericRefinements[e])?u(this.numericRefinements,[e]):this.numericRefinements;if("function"==typeof e){var t=!1,n=this.numericRefinements,r=Object.keys(n).reduce((function(r,i){var a=n[i],s={};return a=a||{},Object.keys(a).forEach((function(n){var r=a[n]||[],c=[];r.forEach((function(t){e({val:t,op:n},i,"numeric")||c.push(t)})),c.length!==r.length&&(t=!0),s[n]=c})),r[i]=s,r}),{});return t?r:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var n=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),r={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+n))?-1===t.indexOf(n)?r[e]=[]:r[e]=[t.slice(0,t.lastIndexOf(n))]:r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:i({},r,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var n={};return n[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:i({},n,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:i({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var n=this.getHierarchicalRefinement(e);return t?-1!==n.indexOf(t):n.length>0},isNumericRefined:function(e,t,n){if(void 0===n&&void 0===t)return!!this.numericRefinements[e];var r=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===n||!r)return r;var i,a,u=c(n),o=void 0!==(i=this.numericRefinements[e][t],a=u,s(i,(function(e){return h(e,a)})));return r&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=a(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets())},getRefinedHierarchicalFacets:function(){var e=this;return a(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0})))},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacets","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},n=this;return Object.keys(this).forEach((function(r){var i=n[r];-1===e.indexOf(r)&&void 0!==i&&(t[r]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var n={};return n[e]=t,this.setQueryParameters(n)},setQueryParameters:function(e){if(!e)return this;var t=l.validate(this,e);if(t)throw t;var n=this,r=l._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=n[t],e}),{}),a=Object.keys(r).reduce((function(e,t){var n=void 0!==e[t],i=void 0!==r[t];return n&&!i?u(e,[t]):(i&&(e[t]=r[t]),e)}),i);return new this.constructor(a)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return s(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var n=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(n).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=l},248:function(e,t,n){"use strict";e.exports=function(e,t){if(null===e)return{};var n,r,i={},a=Object.keys(e);for(r=0;r=0||(i[n]=e[n]);return i}},249:function(e,t,n){"use strict";var r=n(235),i=n(236),a=n(250),s=n(269),c=n(221),u=n(270),o=n(251),f=n(271);function h(e){var t={};return e.forEach((function(e,n){t[e]=n})),t}function l(e,t,n){t&&t[n]&&(e.stats=t[n])}function m(e,t){var n=t[0];this._rawResults=t;var a=this;Object.keys(n).forEach((function(e){a[e]=n[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var o=e.getRefinedDisjunctiveFacets(),m=h(e.facets),d=h(e.disjunctiveFacets),v=1,p=n.facets||{};Object.keys(p).forEach((function(t){var r,i,s=p[t],o=(r=e.hierarchicalFacets,i=t,c(r,(function(e){return(e.attributes||[]).indexOf(i)>-1})));if(o){var f=o.attributes.indexOf(t),h=u(e.hierarchicalFacets,(function(e){return e.name===o.name}));a.hierarchicalFacets[h][f]={attribute:t,data:s,exhaustive:n.exhaustiveFacetsCount}}else{var v,g=-1!==e.disjunctiveFacets.indexOf(t),y=-1!==e.facets.indexOf(t);g&&(v=d[t],a.disjunctiveFacets[v]={name:t,data:s,exhaustive:n.exhaustiveFacetsCount},l(a.disjunctiveFacets[v],n.facets_stats,t)),y&&(v=m[t],a.facets[v]={name:t,data:s,exhaustive:n.exhaustiveFacetsCount},l(a.facets[v],n.facets_stats,t))}})),this.hierarchicalFacets=s(this.hierarchicalFacets),o.forEach((function(s){var c=t[v],o=c&&c.facets?c.facets:{},f=e.getHierarchicalFacetByName(s);Object.keys(o).forEach((function(t){var s,h=o[t];if(f){s=u(e.hierarchicalFacets,(function(e){return e.name===f.name}));var m=u(a.hierarchicalFacets[s],(function(e){return e.attribute===t}));if(-1===m)return;a.hierarchicalFacets[s][m].data=r({},a.hierarchicalFacets[s][m].data,h)}else{s=d[t];var v=n.facets&&n.facets[t]||{};a.disjunctiveFacets[s]={name:t,data:i({},h,v),exhaustive:c.exhaustiveFacetsCount},l(a.disjunctiveFacets[s],c.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!a.disjunctiveFacets[s].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(n)>-1&&(a.disjunctiveFacets[s].data[n]=0)}))}})),v++})),e.getRefinedHierarchicalFacets().forEach((function(n){var r=e.getHierarchicalFacetByName(n),s=e._getHierarchicalFacetSeparator(r),c=e.getHierarchicalRefinement(n);if(!(0===c.length||c[0].split(s).length<2)){var o=t[v],f=o&&o.facets?o.facets:{};Object.keys(f).forEach((function(t){var n=f[t],o=u(e.hierarchicalFacets,(function(e){return e.name===r.name})),h=u(a.hierarchicalFacets[o],(function(e){return e.attribute===t}));if(-1!==h){var l={};if(c.length>0){var m=c[0].split(s)[0];l[m]=a.hierarchicalFacets[o][h].data[m]}a.hierarchicalFacets[o][h].data=i(l,n,a.hierarchicalFacets[o][h].data)}})),v++}})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],i=m[t];a.facets[i]={name:t,data:n.facets[t],exhaustive:n.exhaustiveFacetsCount},r.forEach((function(e){a.facets[i]=a.facets[i]||{name:t},a.facets[i].data=a.facets[i].data||{},a.facets[i].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(f(e)),this.facets=s(this.facets),this.disjunctiveFacets=s(this.disjunctiveFacets),this._state=e}function d(e,t){if(!t.data||0===t.data.length)return t;var n=t.data.map((function(t){return d(e,t)})),i=e(n);return r({},t,{data:i})}function v(e,t){var n=c(e,(function(e){return e.name===t}));return n&&n.stats}function p(e,t,n,r,i){var a=c(i,(function(e){return e.name===n})),s=a&&a.data&&a.data[r]?a.data[r]:0,u=a&&a.exhaustive||!1;return{type:t,attributeName:n,name:r,count:s,exhaustive:u}}m.prototype.getFacetByName=function(e){function t(t){return t.name===e}return c(this.facets,t)||c(this.disjunctiveFacets,t)||c(this.hierarchicalFacets,t)},m.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],m.prototype.getFacetValues=function(e,t){var n=function(e,t){function n(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var r=c(e.facets,n);return r?Object.keys(r.data).map((function(n){return{name:n,count:r.data[n],isRefined:e._state.isFacetRefined(t,n),isExcluded:e._state.isExcludeRefined(t,n)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=c(e.disjunctiveFacets,n);return i?Object.keys(i.data).map((function(n){return{name:n,count:i.data[n],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t))return c(e.hierarchicalFacets,n)}(this,e);if(n){var r=i({},t,{sortBy:m.DEFAULT_SORT});if(Array.isArray(r.sortBy)){var s=o(r.sortBy,m.DEFAULT_SORT);return Array.isArray(n)?a(n,s[0],s[1]):d((function(e){return a(e,s[0],s[1])}),n)}if("function"==typeof r.sortBy)return Array.isArray(n)?n.sort(r.sortBy):d((function(e){return function(e,t){return t.sort(e)}(r.sortBy,e)}),n);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}},m.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?v(this.facets,e):this._state.isDisjunctiveFacet(e)?v(this.disjunctiveFacets,e):void 0},m.prototype.getRefinements=function(){var e=this._state,t=this,n=[];return Object.keys(e.facetsRefinements).forEach((function(r){e.facetsRefinements[r].forEach((function(i){n.push(p(e,"facet",r,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(r){e.facetsExcludes[r].forEach((function(i){n.push(p(e,"exclude",r,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(r){e.disjunctiveFacetsRefinements[r].forEach((function(i){n.push(p(e,"disjunctive",r,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(r){e.hierarchicalFacetsRefinements[r].forEach((function(i){n.push(function(e,t,n,r){var i=e.getHierarchicalFacetByName(t),a=e._getHierarchicalFacetSeparator(i),s=n.split(a),u=c(r,(function(e){return e.name===t})),o=s.reduce((function(e,t){var n=e&&c(e.data,(function(e){return e.name===t}));return void 0!==n?n:e}),u),f=o&&o.count||0,h=o&&o.exhaustive||!1,l=o&&o.path||"";return{type:"hierarchical",attributeName:t,name:l,count:f,exhaustive:h}}(e,r,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var r=e.numericRefinements[t];Object.keys(r).forEach((function(e){r[e].forEach((function(r){n.push({type:"numeric",attributeName:t,name:r,numericValue:r,operator:e})}))}))})),e.tagRefinements.forEach((function(e){n.push({type:"tag",attributeName:"_tags",name:e})})),n},e.exports=m},250:function(e,t,n){"use strict";function r(e,t){if(e!==t){var n=void 0!==e,r=null===e,i=void 0!==t,a=null===t;if(!a&&e>t||r&&i||!n)return 1;if(!r&&e=n.length?a:"desc"===n[i]?-a:a}return e.index-t.index})),i.map((function(e){return e.value}))}},251:function(e,t,n){"use strict";var r=n(221);e.exports=function(e,t){var n=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),a=r(n,(function(e){return e[0]===i[0]}));return i.length>1||!a?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(a[0]),e[1].push(a[1]),e)}),[[],[]])}},252:function(e,t,n){"use strict";var r,i="object"==typeof Reflect?Reflect:null,a=i&&"function"==typeof i.apply?i.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};r=i&&"function"==typeof i.ownKeys?i.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function c(){c.init.call(this)}e.exports=c,e.exports.once=function(e,t){return new Promise((function(n,r){function i(){void 0!==a&&e.removeListener("error",a),n([].slice.call(arguments))}var a;"error"!==t&&(a=function(n){e.removeListener(t,i),r(n)},e.once("error",a)),e.once(t,i)}))},c.EventEmitter=c,c.prototype._events=void 0,c.prototype._eventsCount=0,c.prototype._maxListeners=void 0;var u=10;function o(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function f(e){return void 0===e._maxListeners?c.defaultMaxListeners:e._maxListeners}function h(e,t,n,r){var i,a,s,c;if(o(n),void 0===(a=e._events)?(a=e._events=Object.create(null),e._eventsCount=0):(void 0!==a.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),a=e._events),s=a[t]),void 0===s)s=a[t]=n,++e._eventsCount;else if("function"==typeof s?s=a[t]=r?[n,s]:[s,n]:r?s.unshift(n):s.push(n),(i=f(e))>0&&s.length>i&&!s.warned){s.warned=!0;var u=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");u.name="MaxListenersExceededWarning",u.emitter=e,u.type=t,u.count=s.length,c=u,console&&console.warn&&console.warn(c)}return e}function l(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function m(e,t,n){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},i=l.bind(r);return i.listener=n,r.wrapFn=i,i}function d(e,t,n){var r=e._events;if(void 0===r)return[];var i=r[t];return void 0===i?[]:"function"==typeof i?n?[i.listener||i]:[i]:n?function(e){for(var t=new Array(e.length),n=0;n0&&(s=t[0]),s instanceof Error)throw s;var c=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw c.context=s,c}var u=i[e];if(void 0===u)return!1;if("function"==typeof u)a(u,this,t);else{var o=u.length,f=p(u,o);for(n=0;n=0;a--)if(n[a]===t||n[a].listener===t){s=n[a].listener,i=a;break}if(i<0)return this;0===i?n.shift():function(e,t){for(;t+1=0;r--)this.removeListener(e,t[r]);return this},c.prototype.listeners=function(e){return d(this,e,!0)},c.prototype.rawListeners=function(e){return d(this,e,!1)},c.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):v.call(e,t)},c.prototype.listenerCount=v,c.prototype.eventNames=function(){return this._eventsCount>0?r(this._events):[]}},253:function(e,t,n){"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},254:function(e,t,n){"use strict";e.exports="3.2.2"},264:function(e,t,n){"use strict";var r=n(265),i=n(247),a=n(249);function s(e,t,n){return new r(e,t,n)}s.version=n(254),s.AlgoliaSearchHelper=r,s.SearchParameters=i,s.SearchResults=a,e.exports=s},265:function(e,t,n){"use strict";var r=n(247),i=n(249),a=n(272),s=n(273),c=n(252),u=n(253),o=n(237),f=n(254);function h(e,t,n){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+f+")"),this.setClient(e);var i=n||{};i.index=t,this.state=r.make(i),this.lastResults=null,this._queryId=0,this._lastQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0}function l(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function m(){return this.state.page}u(h,c.EventEmitter),h.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},h.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},h.prototype.getQuery=function(){var e=this.state;return s._getHitsSearchParams(e)},h.prototype.searchOnce=function(e,t){var n=e?this.state.setQueryParameters(e):this.state,r=s._getQueries(n.index,n),a=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:n}),!t)return this.client.search(r).then((function(e){return a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),{content:new i(n,e.results),state:n,_originalResponse:e}}),(function(e){throw a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),e}));this.client.search(r).then((function(e){a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),t(null,new i(n,e.results),n)})).catch((function(e){a._currentNbQueries--,0===a._currentNbQueries&&a.emit("searchQueueEmpty"),t(e,null,n)}))},h.prototype.searchForFacetValues=function(e,t,n,r){var i="function"==typeof this.client.searchForFacetValues;if(!i&&"function"!=typeof this.client.initIndex)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var a=this.state.setQueryParameters(r||{}),c=a.isDisjunctiveFacet(e),u=s.getSearchForFacetQuery(e,t,n,a);this._currentNbQueries++;var o=this;return this.emit("searchForFacetValues",{state:a,facet:e,query:t}),(i?this.client.searchForFacetValues([{indexName:a.index,params:u}]):this.client.initIndex(a.index).searchForFacetValues(u)).then((function(t){return o._currentNbQueries--,0===o._currentNbQueries&&o.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.isRefined=c?a.isDisjunctiveFacetRefined(e,t.value):a.isFacetRefined(e,t.value)})),t}),(function(e){throw o._currentNbQueries--,0===o._currentNbQueries&&o.emit("searchQueueEmpty"),e}))},h.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},h.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},h.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},h.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},h.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},h.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},h.prototype.addNumericRefinement=function(e,t,n){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,n),isPageReset:!0}),this},h.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},h.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},h.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},h.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},h.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},h.prototype.removeNumericRefinement=function(e,t,n){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,n),isPageReset:!0}),this},h.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},h.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},h.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},h.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},h.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},h.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},h.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},h.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},h.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},h.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},h.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},h.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},h.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},h.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},h.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},h.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},h.prototype.setCurrentPage=l,h.prototype.setPage=l,h.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},h.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},h.prototype.setState=function(e){return this._change({state:r.make(e),isPageReset:!1}),this},h.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new r(e),this},h.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},h.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},h.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},h.prototype.hasTag=function(e){return this.state.isTagRefined(e)},h.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},h.prototype.getIndex=function(){return this.state.index},h.prototype.getCurrentPage=m,h.prototype.getPage=m,h.prototype.getTags=function(){return this.state.tagRefinements},h.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var n=this.state.getNumericRefinements(e);return Object.keys(n).forEach((function(e){var r=n[e];t.push({value:r,operator:e,type:"numeric"})})),t},h.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},h.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},h.prototype._search=function(e){var t=this.state,n=[],r=[];e.onlyWithDerivedHelpers||(r=s._getQueries(t.index,t),n.push({state:t,queriesCount:r.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var r=e.getModifiedState(t),i=s._getQueries(r.index,r);return n.push({state:r,queriesCount:i.length,helper:e}),e.emit("search",{state:r,results:e.lastResults}),i})),a=Array.prototype.concat.apply(r,i),c=this._queryId++;this._currentNbQueries++;try{this.client.search(a).then(this._dispatchAlgoliaResponse.bind(this,n,c)).catch(this._dispatchAlgoliaError.bind(this,c))}catch(u){this.emit("error",{error:u})}},h.prototype._dispatchAlgoliaResponse=function(e,t,n){if(!(t0},h.prototype._change=function(e){var t=e.state,n=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:n}))},h.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},h.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+f+")"),this.client=e),this},h.prototype.getClient=function(){return this.client},h.prototype.derive=function(e){var t=new a(this,e);return this.derivedHelpers.push(t),t},h.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},h.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=h},266:function(e,t,n){"use strict";e.exports=function(e,t){return e.filter((function(n,r){return t.indexOf(n)>-1&&e.indexOf(n)===r}))}},267:function(e,t,n){"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},268:function(e,t,n){"use strict";var r=n(236),i=n(248),a=n(237),s={addRefinement:function(e,t,n){if(s.isRefined(e,t,n))return e;var i=""+n,a=e[t]?e[t].concat(i):[i],c={};return c[t]=a,r({},c,e)},removeRefinement:function(e,t,n){if(void 0===n)return s.clearRefinement(e,(function(e,n){return t===n}));var r=""+n;return s.clearRefinement(e,(function(e,n){return t===n&&r===e}))},toggleRefinement:function(e,t,n){if(void 0===n)throw new Error("toggleRefinement should be used with a value");return s.isRefined(e,t,n)?s.removeRefinement(e,t,n):s.addRefinement(e,t,n)},clearRefinement:function(e,t,n){if(void 0===t)return a(e)?{}:e;if("string"==typeof t)return i(e,[t]);if("function"==typeof t){var r=!1,s=Object.keys(e).reduce((function(i,a){var s=e[a]||[],c=s.filter((function(e){return!t(e,a,n)}));return c.length!==s.length&&(r=!0),i[a]=c,i}),{});return r?s:e}},isRefined:function(e,t,n){var r=!!e[t]&&e[t].length>0;if(void 0===n||!r)return r;var i=""+n;return-1!==e[t].indexOf(i)}};e.exports=s},269:function(e,t,n){"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},270:function(e,t,n){"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var n=0;n0){var h=0;for(f=c;h0&&s[0].split(c).length>1&&n.push({indexName:e,params:i._getDisjunctiveFacetSearchParams(t,r,!0)})})),n},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(i._getHitsHierarchicalFacetsAttributes(e)),n=i._getFacetFilters(e),a=i._getNumericFilters(e),s={facets:t,tagFilters:i._getTagFilters(e)};return n.length>0&&(s.facetFilters=n),a.length>0&&(s.numericFilters=a),r({},e.getQueryParams(),s)},_getDisjunctiveFacetSearchParams:function(e,t,n){var a=i._getFacetFilters(e,t,n),s=i._getNumericFilters(e,t),c={hitsPerPage:1,page:0,attributesToRetrieve:[],attributesToHighlight:[],attributesToSnippet:[],tagFilters:i._getTagFilters(e),analytics:!1,clickAnalytics:!1},u=e.getHierarchicalFacetByName(t);return c.facets=u?i._getDisjunctiveHierarchicalFacetAttribute(e,u,n):t,s.length>0&&(c.numericFilters=s),a.length>0&&(c.facetFilters=a),r({},e.getQueryParams(),c)},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var n=[];return Object.keys(e.numericRefinements).forEach((function(r){var i=e.numericRefinements[r]||{};Object.keys(i).forEach((function(e){var a=i[e]||[];t!==r&&a.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return r+e+t}));n.push(i)}else n.push(r+e+t)}))}))})),n},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,n){var r=[],i=e.facetsRefinements||{};Object.keys(i).forEach((function(e){(i[e]||[]).forEach((function(t){r.push(e+":"+t)}))}));var a=e.facetsExcludes||{};Object.keys(a).forEach((function(e){(a[e]||[]).forEach((function(t){r.push(e+":-"+t)}))}));var s=e.disjunctiveFacetsRefinements||{};Object.keys(s).forEach((function(e){var n=s[e]||[];if(e!==t&&n&&0!==n.length){var i=[];n.forEach((function(t){i.push(e+":"+t)})),r.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).forEach((function(i){var a=(c[i]||[])[0];if(void 0!==a){var s,u,o=e.getHierarchicalFacetByName(i),f=e._getHierarchicalFacetSeparator(o),h=e._getHierarchicalRootPath(o);if(t===i){if(-1===a.indexOf(f)||!h&&!0===n||h&&h.split(f).length===a.split(f).length)return;h?(u=h.split(f).length-1,a=h):(u=a.split(f).length-2,a=a.slice(0,a.lastIndexOf(f))),s=o.attributes[u]}else u=a.split(f).length-1,s=o.attributes[u];s&&r.push([s+":"+a])}})),r},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,n){var r=e.getHierarchicalRefinement(n.name)[0];if(!r)return t.push(n.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(n),a=r.split(i).length,s=n.attributes.slice(0,a+1);return t.concat(s)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,n){var r=e._getHierarchicalFacetSeparator(t);if(!0===n){var i=e._getHierarchicalRootPath(t),a=0;return i&&(a=i.split(r).length),[t.attributes[a]]}var s=(e.getHierarchicalRefinement(t.name)[0]||"").split(r).length-1;return t.attributes.slice(0,s+1)},getSearchForFacetQuery:function(e,t,n,a){var s=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,c={facetQuery:t,facetName:e};return"number"==typeof n&&(c.maxFacetHits=n),r({},i._getHitsSearchParams(s),c)}};e.exports=i},274:function(e,t,n){e.exports=function(){"use strict";function e(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function n(n){for(var r=1;r=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var n=[],r=!0,i=!1,a=void 0;try{for(var s,c=e[Symbol.iterator]();!(r=(s=c.next()).done)&&(n.push(s.value),!t||n.length!==t);r=!0);}catch(e){i=!0,a=e}finally{try{r||null==c.return||c.return()}finally{if(i)throw a}}return n}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function a(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){var n=JSON.stringify(e),r=a()[n];return Promise.all([r||t(),void 0!==r])})).then((function(e){var t=i(e,2),r=t[0],a=t[1];return Promise.all([r,a||n.miss(r)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=a();return i[JSON.stringify(e)]=t,r().setItem(n,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=a();delete t[JSON.stringify(e)],r().setItem(n,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){r().removeItem(n)}))}}}function c(e){var t=a(e.caches),n=t.shift();return void 0===n?{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,n.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,r){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(e,r,i).catch((function(){return c({caches:t}).get(e,r,i)}))},set:function(e,r){return n.set(e,r).catch((function(){return c({caches:t}).set(e,r)}))},delete:function(e){return n.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return n.clear().catch((function(){return c({caches:t}).clear()}))}}}function u(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(n,r){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},a=JSON.stringify(n);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);var s=r(),c=i&&i.miss||function(){return Promise.resolve()};return s.then((function(e){return c(e)})).then((function(){return s}))},set:function(n,r){return t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function o(e){for(var t=e.length-1;t>0;t--){var n=Math.floor(Math.random()*(t+1)),r=e[t];e[t]=e[n],e[n]=r}return e}function f(e,t){return Object.keys(void 0!==t?t:{}).forEach((function(n){e[n]=t[n](e)})),e}function h(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r0?r:void 0,timeout:n.timeout||t,headers:n.headers||{},queryParameters:n.queryParameters||{},cacheable:n.cacheable}}var d={Read:1,Write:2,Any:3},v=1,p=2,g=3;function y(e){return n({},e,{status:arguments.length>1&&void 0!==arguments[1]?arguments[1]:v,lastUpdate:Date.now()})}function R(e){return{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function j(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var n=e.filter((function(e){return function(e){return e.status===v||Date.now()-e.lastUpdate>12e4}(e)})),r=e.filter((function(e){return function(e){return e.status===g&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(a(n),a(r));return{getTimeout:function(e,t){return(0===r.length&&0===e?1:r.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function P(e,t,r,i){var s=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var r=Array.isArray(e.data)?e.data:n({},e.data,{},t.data);return JSON.stringify(r)}}(r,i),u=function(e,t){var r=n({},e.headers,{},t.headers),i={};return Object.keys(r).forEach((function(e){var t=r[e];i[e.toLowerCase()]=t})),i}(e,i),o=r.method,f=r.method!==F?{}:n({},r.data,{},i.data),h=n({"x-algolia-agent":e.userAgent.value},e.queryParameters,{},f,{},i.queryParameters),l=0,m=function t(n,a){var f=n.pop();if(void 0===f)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:_(s)};var m={data:c,headers:u,method:o,url:O(f,r.path,h),connectTimeout:a(l,e.timeouts.connect),responseTimeout:a(l,i.timeout)},d=function(e){var t={request:m,response:e,host:f,triesLeft:n.length};return s.push(t),t},v={onSucess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(r){var i=d(r);return r.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(f,y(f,r.isTimedOut?g:p))]).then((function(){return t(n,a)}))},onFail:function(e){throw d(e),function(e,t){var n=e.content,r=e.status,i=n;try{i=JSON.parse(n).message}catch(e){}return function(e,t,n){return{name:"ApiError",message:e,status:t,transporterStackTrace:n}}(i,r,t)}(e,_(s))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,n=e.status;return!t&&0==~~n}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSucess(e):t.onFail(e)}(e,v)}))};return j(e.hostsCache,t).then((function(e){return m(a(e.statelessHosts).reverse(),e.getTimeout)}))}function E(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var n="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(n)&&(t.value="".concat(t.value).concat(n)),t}};return t}function O(e,t,n){var r=x(n),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return r.length&&(i+="?".concat(r)),i}function x(e){return Object.keys(e).map((function(t){return h("%s=%s",t,(n=e[t],"[object Object]"===Object.prototype.toString.call(n)||"[object Array]"===Object.prototype.toString.call(n)?JSON.stringify(e[t]):e[t]));var n})).join("&")}function _(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return n({},e,{request:n({},e.request,{headers:n({},e.request.headers,{},t)})})}var N=function(e){var t=e.appId,r=function(e,t,n){var r={"x-algolia-api-key":n,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?r:{}},queryParameters:function(){return e===l.WithinQueryParameters?r:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),a=function(e){var t=e.hostsCache,n=e.logger,r=e.requester,a=e.requestsCache,s=e.responsesCache,c=e.timeouts,u=e.userAgent,o=e.hosts,f=e.queryParameters,h={hostsCache:t,logger:n,requester:r,requestsCache:a,responsesCache:s,timeouts:c,userAgent:u,headers:e.headers,queryParameters:f,hosts:o.map((function(e){return R(e)})),read:function(e,t){var n=m(t,h.timeouts.read),r=function(){return P(h,h.hosts.filter((function(e){return 0!=(e.accept&d.Read)})),e,n)};if(!0!==(void 0!==n.cacheable?n.cacheable:e.cacheable))return r();var a={request:e,mappedRequestOptions:n,transporter:{queryParameters:h.queryParameters,headers:h.headers}};return h.responsesCache.get(a,(function(){return h.requestsCache.get(a,(function(){return h.requestsCache.set(a,r()).then((function(e){return Promise.all([h.requestsCache.delete(a),e])}),(function(e){return Promise.all([h.requestsCache.delete(a),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return h.responsesCache.set(a,e)}})},write:function(e,t){return P(h,h.hosts.filter((function(e){return 0!=(e.accept&d.Write)})),e,m(t,h.timeouts.write))}};return h}(n({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(o([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e,{headers:n({},r.headers(),{},{"content-type":"application/x-www-form-urlencoded"},{},e.headers),queryParameters:n({},r.queryParameters(),{},e.queryParameters)}));return f({transporter:a,appId:t,addAlgoliaAgent:function(e,t){a.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([a.requestsCache.clear(),a.responsesCache.clear()]).then((function(){}))}},e.methods)},H=function(e){return function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return f({transporter:e.transporter,appId:e.appId,indexName:t},n.methods)}},S=function(e){return function(t,r){var i=t.map((function(e){return n({},e,{params:x(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},r)}},A=function(e){return function(t,i){return Promise.all(t.map((function(t){var a=t.params,s=a.facetName,c=a.facetQuery,u=r(a,["facetName","facetQuery"]);return H(e)(t.indexName,{methods:{searchForFacetValues:C}}).searchForFacetValues(s,c,n({},i,{},u))})))}},Q=function(e){return function(t,n){return e.transporter.read({method:b,path:h("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},n)}},C=function(e){return function(t,n,r){return e.transporter.read({method:b,path:h("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:n},cacheable:!0},r)}},T=1,D=2,k=3;function I(e,t,r){var i,a={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return n.setRequestHeader(t,e.headers[t])}));var r,i=function(e,r){return setTimeout((function(){n.abort(),t({status:0,content:r,isTimedOut:!0})}),1e3*e)},a=i(e.connectTimeout,"Connection timeout");n.onreadystatechange=function(){n.readyState>n.OPENED&&void 0===r&&(clearTimeout(a),r=i(e.responseTimeout,"Socket timeout"))},n.onerror=function(){0===n.status&&(clearTimeout(a),clearTimeout(r),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=function(){clearTimeout(a),clearTimeout(r),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)}))}},logger:(i=k,{debug:function(e,t){return T>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return D>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:u(),requestsCache:u({serializable:!1}),hostsCache:c({caches:[s({key:"".concat("4.4.0","-").concat(e)}),u()]}),userAgent:E("4.4.0").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return N(n({},a,{},r,{methods:{search:S,searchForFacetValues:A,multipleQueries:S,multipleSearchForFacetValues:A,initIndex:function(e){return function(t){return H(e)(t,{methods:{search:Q,searchForFacetValues:C}})}}}}))}return I.version="4.4.0",I}()}}]); \ No newline at end of file diff --git a/docs/1ca878db.c92cbf13.js b/docs/1ca878db.c92cbf13.js new file mode 100644 index 00000000000..1843b6249e4 --- /dev/null +++ b/docs/1ca878db.c92cbf13.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{199:function(e,t,a){"use strict";a.d(t,"a",(function(){return p})),a.d(t,"b",(function(){return O}));var i=a(0),b=a.n(i);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function r(e){for(var t=1;t=0||(b[a]=e[a]);return b}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(b[a]=e[a])}return b}var o=b.a.createContext({}),m=function(e){var t=b.a.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},p=function(e){var t=m(e.components);return b.a.createElement(o.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return b.a.createElement(b.a.Fragment,{},t)}},u=b.a.forwardRef((function(e,t){var a=e.components,i=e.mdxType,n=e.originalType,l=e.parentName,o=c(e,["components","mdxType","originalType","parentName"]),p=m(a),u=i,O=p["".concat(l,".").concat(u)]||p[u]||s[u]||n;return a?b.a.createElement(O,r(r({ref:t},o),{},{components:a})):b.a.createElement(O,r({ref:t},o))}));function O(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=a.length,l=new Array(n);l[0]=u;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,l[1]=r;for(var o=2;o")," \u6dfb\u52a0 ",Object(n.b)("inlineCode",{parentName:"li"},"Mvc")," \u8fc7\u6ee4\u5668\u62d3\u5c55 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I368BH"}),"#I368BH")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," \u6846\u67b6\u4f9d\u8d56\u7684 .NET 5 SDK \u81f3\u6700\u65b0\u7248 5.0.3 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I37YQQ"}),"#I37YQQ")),Object(n.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swashbuckle.AspNetCore")," \u7ec4\u4ef6\u5305\u5230 ",Object(n.b)("inlineCode",{parentName:"li"},"6.0.x")," \u7248\u672c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I37EZK"}),"#I37EZK")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6 ",Object(n.b)("inlineCode",{parentName:"li"},"JWT")," \u62d3\u5c55\u7c7b\uff0c\u53ea\u5728 ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Extras.Authentication.JwtBearer")," \u4e2d\u4fdd\u7559 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I35D59"}),"#I35D59")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f20\u5165\u9519\u8bef ",Object(n.b)("inlineCode",{parentName:"li"},"JWT Token")," \u5b57\u7b26\u4e32\u5bfc\u81f4\u81ea\u52a8\u5237\u65b0 ",Object(n.b)("inlineCode",{parentName:"li"},"Token")," \u51fa\u73b0\u5b57\u7b26\u4e32\u8fb9\u754c\u503c\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34ZE5"}),"#I34ZE5")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u77ac\u65f6\u4f5c\u7528\u57df\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u4f1a\u81ea\u52a8\u52a0\u5165\u5de5\u4f5c\u5355\u5143\u5bfc\u81f4\u5199\u65e5\u5fd7\u65f6\u8fde\u9501\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I37WTV"}),"#I37WTV")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u83b7\u53d6\u7cfb\u7edf\u73af\u5883\u53c2\u6570\u7684\u6027\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I36SR5"}),"#I36SR5")),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")," \u5e95\u5c42\u6dfb\u52a0 ",Object(n.b)("inlineCode",{parentName:"li"},"Mvc")," \u8fc7\u6ee4\u5668\u4ee3\u7801 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I36SKA"}),"#I36SKA")),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6dfb\u52a0\u9ed8\u8ba4 ",Object(n.b)("inlineCode",{parentName:"li"},"Json")," \u5e8f\u5217\u5316\u65f6\u95f4\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I36SL0"}),"#I36SL0")),Object(n.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," \u5347\u7ea7 ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u5305\u5230 ",Object(n.b)("inlineCode",{parentName:"li"},"5.0.2.6")," \u7248\u672c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I36SIG"}),"#I36SIG")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u5165\u95e8\u95ee ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I37Z8S"}),"#I37Z8S")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u66f4\u65b0\u65e5\u5fd7\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I36PI0"}),"#I36PI0")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8bf7\u6c42\u5ba1\u8ba1\u65e5\u5fd7\u3001\u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"Sql")," \u66f4\u65b0\u65e5\u5fd7\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I36PIK"}),"#I36PIK")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u524d\u7aef\u4f7f\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"axios")," \u8de8\u57df\u914d\u7f6e\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I36PIT"}),"#I36PIT")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App")," \u9759\u6001\u7c7b\u83b7\u53d6\u5e94\u7528\u3001\u73af\u5883\u66f4\u591a\u4fe1\u606f\u6570\u636e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I36SOV"}),"#I36SOV")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u82f1\u6587\u7248 ",Object(n.b)("inlineCode",{parentName:"li"},"README.md")," \u4ecb\u7ecd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I37QHP"}),"#I37QHP")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u591a\u8bed\u8a00\u8d44\u6e90\u6587\u4ef6\u81ea\u52a8\u521b\u5efa ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I35AA4"}),"#I35AA4")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u591a\u8bed\u8a00\u52a0\u4e0a\u7ef4\u543e\u5c14\u8bed\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I37X1L"}),"#I37X1L"))))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v1130\uff08\u5df2\u53d1\u5e03\uff09"},"v1.13.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u529f\u80fd\u53ca\u62d3\u5c55 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DOCL"}),"#I2DOCL")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u529f\u80fd\u53ca\u6d88\u606f\u4e2d\u5fc3 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I23BKN"}),"#I23BKN")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5206\u7ec4\u663e\u793a\u9690\u85cf\u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AHH8"}),"#I2AHH8")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u63d2\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AAN8"}),"#I2AAN8")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"cli.ps")," \u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"-Namespace")," \u547d\u540d\u7a7a\u95f4\u6307\u5b9a ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A175"}),"#I2A175")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u89c4\u8303\u5316\u5316\u6587\u6863\u6388\u6743\u5931\u6548\u540e\u81ea\u52a8\u53d6\u6d88\u6388\u6743\u9501 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AIWC"}),"#I2AIWC")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Request.Body")," \u652f\u6301\u91cd\u590d\u8bfb\u529f\u80fd\uff0c\u4e3b\u8981\u89e3\u51b3\u5fae\u4fe1 SDK \u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AMG0"}),"#I2AMG0")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u529f\u80fd\u53ca\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2APGJ"}),"#I2APGJ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u5305\u652f\u6301\u6253\u5370 ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u5230 ",Object(n.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e2d ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2ASLS"}),"#I2ASLS")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccesssor.Dapper")," \u62d3\u5c55\u63d2\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2ASYA"}),"#I2ASYA")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Extras.DatabaseAccessor.PetaPoco")," \u62d3\u5c55\u63d2\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AUGA"}),"#I2AUGA")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u5b57\u7b26\u4e32\u62d3\u5c55\u65b9\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CPQ0"}),"#I2CPQ0")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u65b0\u589e ",Object(n.b)("inlineCode",{parentName:"li"},"PagedList")," \u62d3\u5c55 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CW99"}),"#I2CW99")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u652f\u6301\u53c2\u6570\u7279\u6027\u9a8c\u8bc1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CX5L"}),"#I2CX5L")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.User")," \u83b7\u53d6\u5f53\u524d\u6388\u6743\u7528\u6237\u4fe1\u606f\u4fbf\u6377\u65b9\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CZLO"}),"#I2CZLO")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u6587\u6863\u53ef\u914d\u7f6e\u529f\u80fd\uff0c\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D1K9"}),"#I2D1K9")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u62e6\u622a\u5668\u6dfb\u52a0\u65b9\u6cd5\u548c\u65b9\u6cd5\u53c2\u6570 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D2CM"}),"#I2D2CM")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42\u51fa\u9519\u8fd4\u56de\u9ed8\u8ba4\u503c\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D44M"}),"#I2D44M")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u8bf7\u6c42 ",Object(n.b)("inlineCode",{parentName:"li"},"body")," \u53c2\u6570\u5e8f\u5217\u5316\u652f\u6301\u8bbe\u7f6e ",Object(n.b)("inlineCode",{parentName:"li"},"PropertyNamingPolicy")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D685"}),"#I2D685")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u5ba2\u6237\u7aef\u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D7PS"}),"#I2D7PS")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"AddInject")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"UseInject")," \u5141\u8bb8\u81ea\u5b9a\u4e49 ",Object(n.b)("inlineCode",{parentName:"li"},"SecurityDefinitions")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"SwaggerUI")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DIMG"}),"#I2DIMG")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"[SecurityDefine]")," \u9ed8\u8ba4\u6784\u9020\u51fd\u6570 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DNXT"}),"#I2DNXT")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"AspectDispatchProxy")," \u52a8\u6001\u4ee3\u7406\u7c7b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DO6I"}),"#I2DO6I")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"[QueryParameters]")," \u7279\u6027\uff0c\u652f\u6301\u4e00\u952e\u5c06 ",Object(n.b)("inlineCode",{parentName:"li"},"Action")," \u53c2\u6570\u6dfb\u52a0 ",Object(n.b)("inlineCode",{parentName:"li"},"[FromQuery]")," \u7279\u6027 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2G8TF"}),"#I2G8TF")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u65e5\u5fd7\u914d\u7f6e\u53ca\u62d3\u5c55\u65b9\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2GDGD"}),"#I2GDGD")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"WebApi")," \u8bf7\u6c42\u8c13\u8bcd\u9ed8\u8ba4\u89c4\u5219\u914d\u7f6e\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2M70X"}),"#I2M70X")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(n.b)("inlineCode",{parentName:"li"},".NET 5")," SDK \u5230 ",Object(n.b)("inlineCode",{parentName:"li"},".NET 5.0.2")," \u7248\u672c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D0PZ"}),"#I2D0PZ")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6846\u67b6\u5185\u6240\u6709\u62d3\u5c55\u7c7b\u547d\u540d\u7a7a\u95f4\uff0c\u5168\u90e8\u8fc1\u79fb\u5230 ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.\u6a21\u5757.Extensions")," \u4e0b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AH54"}),"#I2AH54")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u8bb0\u4f4f\u6388\u6743\u5b58\u50a8\u65b9\u5f0f\uff0c\u66ff\u6362 ",Object(n.b)("inlineCode",{parentName:"li"},"Session")," \u5b58\u50a8\u65b9\u5f0f\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"LocalStorage")," \u65b9\u5f0f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AKUA"}),"#I2AKUA")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")," \u6846\u67b6\u5305\u63cf\u8ff0\u6587\u4ef6\uff0c\u51cf\u5c11\u6846\u67b6\u4f53\u79ef ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2APAU"}),"#I2APAU")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.CanBeScanTypes")," \u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"App.EffectiveTypes")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2B0ZR"}),"#I2B0ZR")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")," \u5c5e\u6027\u5e76\u79fb\u9664 ",Object(n.b)("inlineCode",{parentName:"li"},"App.GetDuplicateXXX")," \u65b9\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CYZE"}),"#I2CYZE")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext")," \u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetNewDbContext")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CZ04"}),"#I2CZ04")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetSqlDispatchProxy")," \u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetSqlProxy")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DO9T"}),"#I2DO9T")),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Aop")," \u670d\u52a1\u62e6\u622a\u5668\uff0c\u652f\u6301\u5f02\u6b65\u3001\u540c\u6b65\u4e24\u79cd\u65b9\u5f0f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2B9HQ"}),"#I2B9HQ")),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u7f51\u7edc\u8bf7\u6c42\u6240\u6709\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BMR7"}),"#I2BMR7")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u89c4\u8303\u5316\u5316\u7ed3\u679c\u4e0d\u4e00\u81f4 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2ACF3"}),"#I2ACF3")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u64cd\u4f5c\u65b9\u6cd5\u62a5\u7a7a\u5f02\u5e38 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AB6C"}),"#I2AB6C")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Startup.cs")," Aop \u5168\u5c40\u62e6\u622a\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A7T2"}),"#I2A7T2")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Token")," \u8fc7\u671f\u540e\u81ea\u52a8\u5237\u65b0 ",Object(n.b)("inlineCode",{parentName:"li"},"Token")," \u65e0\u6cd5\u83b7\u53d6\u6700\u65b0\u7684\u7528\u6237\u4fe1\u606f bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AWQI"}),"#I2AWQI")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},'[ApiDescriptionSettings(Tag="xx")]')," \u5bfc\u81f4 ",Object(n.b)("inlineCode",{parentName:"li"},"swagger.json")," \u62a5\u9519 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2B47R"}),"#I2B47R")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Mysql")," sql \u6570\u636e\u5e93\u67e5\u8be2\u7ed3\u679c ",Object(n.b)("inlineCode",{parentName:"li"},"tinyint")," \u7c7b\u578b\u8f6c\u6362\u51fa\u9519 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BEBM"}),"#I2BEBM")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u591a\u6b21\u5305\u88f9\u7c7b\u578b bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BHHZ"}),"#I2BHHZ")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u57fa\u5143\u7c7b\u578b\u6570\u7ec4\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BMS5"}),"#I2BMS5")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u67e5\u8be2\u679a\u4e3e\u7c7b\u578b\u8f6c\u6362\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BS2Y"}),"#I2BS2Y")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"string.SqlQuerizeAsync()")," \u62d3\u5c55\u8fd4\u56de\u9519\u8bef bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BSTS"}),"#I2BSTS")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u5b50\u7c7b\u91cd\u5199\u7236\u7c7b\u65b9\u6cd5\u5e76\u53d6\u522b\u540d\u540e ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2C9VP"}),"#I2C9VP")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(n.b)("inlineCode",{parentName:"li"},"application/json")," \u5e8f\u5217\u5316\u5927\u5c0f\u5199\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CRJC"}),"#I2CRJC")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u5b9e\u4f53\u5d4c\u5957\u5173\u8054 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CVN0"}),"#I2CVN0")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8de8\u57df\u54cd\u5e94\u5934\u8bbe\u7f6e\u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CW5T"}),"#I2CW5T")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u7f51\u7edc\u8bf7\u6c42\u4ee3\u7406\u6253\u5370\u5230 ",Object(n.b)("inlineCode",{parentName:"li"},"MiniProfiler")," bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CZBC"}),"#I2CZBC")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u8bf7\u6c42\u54cd\u5e94\u62e6\u622a\u5668 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D4DG"}),"#I2D4DG")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6846\u67b6 ",Object(n.b)("inlineCode",{parentName:"li"},"AsQueryable()")," \u4e00\u76f4\u8ffd\u52a0\u53c2\u6570 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DH1D"}),"#I2DH1D")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u52a8\u5237\u65b0 ",Object(n.b)("inlineCode",{parentName:"li"},"Token")," \u7a7a\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DO29"}),"#I2DO29")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u751f\u6210 ",Object(n.b)("inlineCode",{parentName:"li"},"JWT Token")," \u4e0d\u4f20\u8fc7\u671f\u65f6\u95f4\u51fa\u73b0\u9a8c\u8bc1 401 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DO8L"}),"#I2DO8L")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"AppStartup")," \u6392\u5e8f\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DVD2"}),"#I2DVD2")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u591a\u8bed\u8a00\u670d\u52a1\u65f6\u53cb\u597d\u5f02\u5e38\u548c\u9a8c\u8bc1\u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2ECUJ"}),"#I2ECUJ")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u5b57\u6bcd\u548c\u6570\u5b57\u7ec4\u5408\u65e0\u6cd5\u5339\u914d bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2EF2Q"}),"#I2EF2Q")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u624b\u673a\u6216\u56fa\u8bdd\u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2M5IZ"}),"#I2M5IZ")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u89e3\u6790 ",Object(n.b)("inlineCode",{parentName:"li"},"SqlConnection")," \u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2M5P2"}),"#I2M5P2")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5f00\u542f\u591a\u8bed\u8a00\u540e\uff0c",Object(n.b)("inlineCode",{parentName:"li"},"EF")," \u8fc1\u79fb\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2M7DT"}),"#I2M7DT")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"IEntityTypeBuilder")," \u4e0d\u652f\u6301\u591a\u91cd\u7ee7\u627f bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2PAOD"}),"#I2PAOD")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"JwtHandler")," \u8bbe\u7f6e\u81ea\u52a8\u5237\u65b0\u540e\uff0c\u533f\u540d\u8bbf\u95ee\u65e0\u6cd5\u901a\u8fc7 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2SDOX"}),"#I2SDOX")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u4e2d ",Object(n.b)("inlineCode",{parentName:"li"},"SqlServer")," \u6570\u636e\u5e93\u83b7\u53d6\u8fde\u63a5\u5bf9\u8c61\u7c7b\u578b bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/159"}),"#PR159")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u79fb\u9664 ",Object(n.b)("inlineCode",{parentName:"li"},"Sql")," \u67e5\u8be2\u7ed3\u679c\u6620\u5c04\u68c0\u67e5 ",Object(n.b)("inlineCode",{parentName:"li"},"[NotMapper]")," \u7279\u6027\u673a\u5236 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XD0"}),"#I34XD0")),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f9d\u8d56\u6ce8\u5165\u65f6\u6392\u9664 ",Object(n.b)("inlineCode",{parentName:"li"},"IDynamicApiController")," \u63a5\u53e3 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2ECTG"}),"#I2ECTG")),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/158"}),"#PR158")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6587\u6863\u9996\u9875 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XBR"}),"#I34XBR")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2APGJ"}),"#I2APGJ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DOCL"}),"#I2DOCL")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6587\u6863\u5168\u6587\u641c\u7d22\u5f15\u64ce ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XAW"}),"#I34XAW")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u9759\u6001\u7c7b\u7c7b\u578b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XB4"}),"#I34XB4")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6846\u67b6\u53ef\u914d\u7f6e\u9009\u9879\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XB9"}),"#I34XB9")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XBI"}),"#I34XBI")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XC0"}),"#I34XC0")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8d21\u732e\u6307\u5357\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XC8"}),"#I34XC8")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContext")," \u53ca ",Object(n.b)("inlineCode",{parentName:"li"},"\u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d")," \u535a\u5ba2\u6587\u7ae0 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XCB"}),"#I34XCB")),Object(n.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u6587\u6863\u5c0f\u8c03\u6574\uff0c\u5c0f\u4f18\u5316"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u8de8\u57df\u8bbe\u7f6e\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2ASNJ"}),"#I2ASNJ")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MVC")," \u89c6\u56fe\u65e0\u6548\uff0c\u539f\u56e0\u662f ",Object(n.b)("inlineCode",{parentName:"li"},".cshtml")," \u6587\u4ef6\u6ca1\u6709\u8bbe\u7f6e\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"\u5185\u5bb9")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AXUU"}),"#I2AXUU")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Sql")," \u64cd\u4f5c\u53ef\u4ee5\u5b9e\u73b0\u4e8b\u52a1\u5417\uff1f",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2B0NX"}),"#I2B0NX")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"IRepository")," \u64cd\u4f5c\u6570\u636e\u5e93\u4f1a\u6253\u5f00\u591a\u6b21\u6570\u636e\u5e93\u8fde\u63a5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BB7B"}),"#I2BB7B")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5982\u4f55\u8fdb\u5165\u81ea\u5b9a\u4e49 ",Object(n.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u65ad\u70b9 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BGXY"}),"#I2BGXY")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6ce8\u5165\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2C2AQ"}),"#I2C2AQ")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5efa\u8bae\u589e\u52a0 API \u7b7e\u540d\u9a8c\u8bc1\uff0c\u65f6\u6548\u9a8c\u8bc1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2C6ET"}),"#I2C6ET")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u591a\u79df\u6237\u540c\u65f6\u4f7f\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CEHS"}),"#I2CEHS")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ISqlSugarRepository")," \u6ca1\u6709 ",Object(n.b)("inlineCode",{parentName:"li"},"Getxxx")," \u65b9\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CJLZ"}),"#I2CJLZ")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u5982\u4f55\u5c06 ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u91cc\u7684\u8868\u5bfc\u51fa\u6210 ",Object(n.b)("inlineCode",{parentName:"li"},"model")," \u7c7b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CSUL"}),"#I2CSUL")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u624b\u52a8\u4fee\u6539 ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u7ec8\u7ed3\u70b9\u8def\u5f84\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D608"}),"#I2D608")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"DefaultDbContext")," \u4e0d\u80fd\u8bc6\u522b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DCZX"}),"#I2DCZX")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5404\u5206\u5c42\u9879\u76ee ",Object(n.b)("inlineCode",{parentName:"li"},"Startup.cs")," \u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"Configuration")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DDUP"}),"#I2DDUP")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Aop")," \u65e0\u6cd5\u62e6\u622a\uff0c\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DEY8"}),"#I2DEY8")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DSB8"}),"#I2DSB8"),"\\"),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Entity")," \u521b\u5efa\u65f6\u95f4\u548c\u662f\u5426\u5220\u9664\u6dfb\u52a0\u9ed8\u8ba4\u503c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E04H"}),"#I2E04H")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"swagger")," \u4e2d\u591a\u4e2a ",Object(n.b)("inlineCode",{parentName:"li"},"servers")," \u8bbe\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E0IF"}),"#I2E0IF")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5168\u5c40\u7b5b\u9009\u5668 \u6ca1\u6709\u6267\u884c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E5R4"}),"#I2E5R4")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u7591\u95ee ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E77T"}),"#I2E77T")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"cli.ps")," \u9006\u5411\u5de5\u7a0b ",Object(n.b)("inlineCode",{parentName:"li"},"Mysql")," \u6570\u636e\u5e93\u62a5\u9519 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E7I5"}),"#I2E7I5")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f00\u53d1\u73af\u5883 ",Object(n.b)("inlineCode",{parentName:"li"},"applicationsettings.json")," \u4e2d\u6587\u4e71\u7801 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2EAG1"}),"#I2EAG1")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u589e\u52a0\u6307\u5b9a\u8def\u5f84\u7a0b\u5e8f\u96c6\u6620\u5c04 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2EEO2"}),"#I2EEO2")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u52a8\u6001\u7f16\u8bd1 ",Object(n.b)("inlineCode",{parentName:"li"},"cs")," \u811a\u672c\u6587\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2EH66"}),"#I2EH66")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6\uff0c\u8fd4\u56de\u7684\u9519\u8bef\u6ca1\u6709\u89c4\u8303\u5316\u7ed3\u679c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2NV8S"}),"#I2NV8S")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5faa\u73af\u5f15\u7528\u8bbe\u7f6e\u751f\u6210\u6587\u6863\u5c42\u7ea7\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2PLQQ"}),"#I2PLQQ")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u914d\u7f6e\u6587\u4ef6\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"yaml")," \u6587\u4ef6\u5417? ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2TJ3N"}),"#I2TJ3N")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u4fee\u6539\u6570\u636e\u5e93\u672a ",Object(n.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2VR64"}),"#I2VR64")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u4f7f\u7528\u5b9a\u4f4d\u5668\u65f6\u62a5\u9519 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2VR8F"}),"#I2VR8F")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Migration To Oracle")," \u5f02\u5e38 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2WBYQ"}),"#I2WBYQ")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5f00\u53d1\u65f6\u663e\u793a ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u4e0a\u7ebf\u65f6\u5173\u95ed ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u8fd9\u9700\u8981\u600e\u4e48\u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2WOYV"}),"#I2WOYV")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u517c\u5bb9 Mvc \u590d\u6742\u9a8c\u8bc1\u6ca1\u6709\u8bd5\u9a8c\u6210\u529f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2X3GV"}),"#I2X3GV")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Aop")," \u80fd\u4e0d\u80fd\u652f\u6301\u65e0\u63a5\u53e3\u7684\u7c7b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2X8AS"}),"#I2X8AS")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5173\u4e8e ",Object(n.b)("inlineCode",{parentName:"li"},"JWT Token")," \u81ea\u52a8\u5237\u65b0\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2YD4K"}),"#I2YD4K")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u80fd\u5426\u589e\u52a0\u4e00\u4e2a\u62d3\u5c55\u7684 ",Object(n.b)("inlineCode",{parentName:"li"},"Entity"),"\uff0c\u589e\u52a0\u4e00\u4e9b\u62d3\u5c55\u7684\u5c5e\u6027 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2YDKT"}),"#I2YDKT")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")," \u65e0\u6cd5\u8fd8\u539f\u5305\uff0c\u4f7f\u7528",Object(n.b)("inlineCode",{parentName:"li"},"Nuget")," \u4e0b\u8f7d\u548c\u901a\u8fc7\u6700\u65b0\u7684\u7684\u811a\u624b\u67b6\u4e0b\u8f7d\u90fd\u63d0\u793a\u8fd9\u4e2a\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I30446"}),"#I30446")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u590d\u6742\u6821\u9a8c\u4e0e\u7279\u6027\u9a8c\u8bc1\u4e0d\u80fd\u5e76\u884c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I3046U"}),"#I3046U")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 Webhook \u673a\u5236 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A3I0"}),"#I2A3I0")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u589e\u52a0 blog \u5b58\u50a8\u670d\u52a1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AMBP"}),"#I2AMBP")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Blazor Server \u73af\u5883\u4e0b EF \u7684 DbContext \u591a\u7ebf\u7a0b\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AMD2"}),"#I2AMD2")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5e0c\u671b\u5b9e\u73b0\u5de5\u4f5c\u5355\u5143\u64cd\u4f5c\u63a5\u53e3\uff08IUnitOfWork\uff09",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AOR5"}),"#I2AOR5")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(n.b)("inlineCode",{parentName:"li"},"string.ToPagedListAsync()")," \u64cd\u4f5c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BZ3Z"}),"#I2BZ3Z")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(n.b)("inlineCode",{parentName:"li"},"GraphQL"),"\uff0c",Object(n.b)("inlineCode",{parentName:"li"},"OData")," \u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2C9EH"}),"#I2C9EH")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u8feb\u5207\u671f\u671b\u652f\u6301 CAP \u5206\u5e03\u5f0f\u4e8b\u52a1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CBRF"}),"#I2CBRF")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5982\u4f55\u8ba9\u67d0\u4e2a\u65b9\u6cd5\u6216\u5b9e\u4f53\u53d8\u5316\u540e\uff0c\u4e0d\u88ab ",Object(n.b)("inlineCode",{parentName:"li"},"SavingChangesEvent")," \u7b49\u62e6\u622a ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CEM9"}),"#I2CEM9")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65e5\u5fd7\u5c01\u88c5\u589e\u52a0\u66f4\u591a\u62d3\u5c55\uff0c\u6bd4\u5982\uff1a\u81ea\u5b9a\u4e49\u4fdd\u5b58\u65e5\u5fd7\u6587\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CW8V"}),"#I2CW8V")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5bf9 ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u7684\u652f\u6301\uff0c\u589e\u52a0 ",Object(n.b)("inlineCode",{parentName:"li"},"Nuget")," \u811a\u624b\u67b6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D91U"}),"#I2D91U")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u4f7f\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"Middleware")," \u5b9e\u73b0\u53cd\u5411\u4ee3\u7406 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DKM1"}),"#I2DKM1")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u652f\u6301\u914d\u7f6e\u591a\u4e2a ",Object(n.b)("inlineCode",{parentName:"li"},"Aop")," \u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E6Z2"}),"#I2E6Z2")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u662f\u5426\u8ba1\u5212\u5f00\u53d1\u7c7b\u4f3c\u7f51\u5173\u7684\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2PD1L"}),"#I2PD1L")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," ",Object(n.b)("inlineCode",{parentName:"li"},"waring CS8002"),": \u5f15\u7528\u7a0b\u5e8f\u96c6 ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")," \u6ca1\u6709\u5f3a\u540d\u79f0 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2WDN2"}),"#I2WDN2")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Oracle \u6570\u636e\u5e93\u9a71\u52a8\u96c6\u6210 ",Object(n.b)("inlineCode",{parentName:"li"},"Devart.Data.Oracle.Entity.EFCore")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2XJIU"}),"#I2XJIU"))))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v170\uff08\u5df2\u53d1\u5e03\uff09"},"v1.7.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Extras.ObjectMapper.Mapster")," \u62d3\u5c55\u5305 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LSJ"}),"#I29LSJ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u5305 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AAN8"}),"#I2AAN8")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Extras.Web.HttpContext")," \u62d3\u5c55\u5305 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LSM"}),"#I29LSM")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5185\u7f6e ",Object(n.b)("inlineCode",{parentName:"li"},"Token")," \u5237\u65b0\u673a\u5236\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29K57"}),"#I29K57")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\uff0c\u652f\u6301\u8fd0\u884c\u65f6\u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"OnModelCreating")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28UDT"}),"#I28UDT")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u652f\u6301\u4f9d\u8d56\u6ce8\u5165\u6392\u9664\u6307\u5b9a\u63a5\u53e3 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29693"}),"#I29693")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u7ed3\u679c\u8fd4\u56de\u65f6\u95f4\u6233\u5b57\u6bb5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29697"}),"#I29697")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u57fa\u7840 ",Object(n.b)("inlineCode",{parentName:"li"},"CURD")," \u7236\u7c7b\u64cd\u4f5c\u4f8b\u5b50 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I296SR"}),"#I296SR")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},'sql.Change("\u5b9a\u4f4d\u5668\u5b8c\u6574\u7c7b\u578b\u540d\u79f0")')," \u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LAB"}),"#I29LAB")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u5ffd\u7565\u7a7a\u53c2\u6570\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29VUG"}),"#I29VUG")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5185\u7f6e\u5047\u5220\u9664\u67e5\u8be2\u8fc7\u6ee4\u5668\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29Y2R"}),"#I29Y2R")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5ffd\u7565\u7a7a\u503c\u6392\u9664\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29VUV"}),"#I29VUV")),Object(n.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u7ec4\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I297R9"}),"#I297R9")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u6388\u6743\u7ba1\u9053\u4e3a\u5f02\u6b65\u5904\u7406 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29MD9"}),"#I29MD9")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4\u542f\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"JWT")," \u6388\u6743\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LI4"}),"#I29LI4")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContextUtilities")," \u540d\u79f0\u6539\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContextLocal")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29KQE"}),"#I29KQE")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"UnifyResultContext")," \u540d\u79f0\u6539\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"UnifyContext")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LLZ"}),"#I29LLZ")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u53ea\u6709\u6267\u884c\u8fc1\u79fb\u547d\u4ee4\u624d\u626b\u63cf\u79cd\u5b50\u6570\u636e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29E6P"}),"#I29E6P")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u89c4\u8303\u5316\u7ed3\u679c ",Object(n.b)("inlineCode",{parentName:"li"},"Successed")," \u5c5e\u6027\u540d\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Succeeded")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29NMV"}),"#I29NMV")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Mapster")," \u5bf9\u8c61\u7ec4\u4ef6\uff0c\u91c7\u7528\u63d0\u4f9b\u62d3\u5c55\u65b9\u5f0f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29D2M"}),"#I29D2M")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"CacheManager")," \u62d3\u5c55\u7c7b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LU1"}),"#I29LU1")),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SaveChanges")," \u62e6\u622a\u5668 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I292LO"}),"#I292LO")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u6ce8\u518c\u7684\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u88ab\u5f15\u7528\u5168\u5c40\u67e5\u8be2\u62e6\u622a\u5668 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29ZXJ"}),"#I29ZXJ")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u624b\u52a8\u8fd4\u56de ",Object(n.b)("inlineCode",{parentName:"li"},"BadObjectResult")," \u6216 ",Object(n.b)("inlineCode",{parentName:"li"},"ValidationProblemDetails")," \u7ed3\u679c\u7c7b\u578b\u65f6\u89c4\u8303\u5316\u7ed3\u679c\u5931\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29ZU9"}),"#I29ZU9")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 WebApi ",Object(n.b)("inlineCode",{parentName:"li"},"KeepName"),"\uff0c",Object(n.b)("inlineCode",{parentName:"li"},"KeepVerb"),"\u3001",Object(n.b)("inlineCode",{parentName:"li"},"SplitCamelCase")," \u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29X90"}),"#I29X90")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de ",Object(n.b)("inlineCode",{parentName:"li"},"\u5143\u7ec4")," \u7c7b\u578b\u51fa\u9519 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29SMV"}),"#I29SMV")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"401\uff0c403")," \u72b6\u6001\u7801\u89c4\u8303\u5316\u8fd4\u56de\u503c\u5c5e\u6027\u53d8\u5927\u5199 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29M8Y"}),"#I29M8Y")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContext")," \u7a7a\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LU4"}),"#I29LU4")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u63a5\u53e3\u65e0\u8fd4\u56de\u503c\u6ca1\u6709\u5e94\u7528\u89c4\u8303\u5316\u7ed3\u679c bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29GT7"}),"#I29GT7")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u524d\u7aef ",Object(n.b)("inlineCode",{parentName:"li"},"Less")," \u914d\u7f6e\u6587\u4ef6\u5bfc\u81f4\u4e3b\u673a\u542f\u52a8\u5931\u8d25 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29E7P"}),"#I29E7P")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u7ed3\u679c\u8f6c\u6cdb\u578b\u540e\u5c5e\u6027\u91cd\u590d\u8d4b\u503c bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29BUO"}),"#I29BUO")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5173\u95ed ",Object(n.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e4b\u540e ",Object(n.b)("inlineCode",{parentName:"li"},"\u7ec4\u4e2d\u7ec4")," \u5931\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29789"}),"#I29789")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u5f02\u5e38\u8fd4\u56de ",Object(n.b)("inlineCode",{parentName:"li"},"System.Object")," \u5b57\u7b26 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2969A"}),"#I2969A")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6b63\u6570\u6570\u636e\u9a8c\u8bc1 0 \u4e5f\u9a8c\u8bc1\u901a\u8fc7 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2955T"}),"#I2955T")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u975e\u6cdb\u578b\u7c7b\u96c6\u6210\u6cdb\u578b\u63a5\u53e3\u4f9d\u8d56\u6ce8\u5165 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I294YT"}),"#I294YT")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e0d\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"new")," \u8986\u76d6\u7236\u7c7b\u7684 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28Z1A"}),"#I28Z1A")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"JsonSerializerUtility")," \u6ca1\u6709\u516c\u5f00 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28WMI"}),"#I28WMI")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u67e5\u8be2\u6cdb\u578b\u7c7b\u578b\u6ce8\u518c\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28VMT"}),"#I28VMT")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u4e0d\u652f\u6301\u751f\u6210\u4e0d\u540c\u547d\u540d\u7a7a\u95f4\u7684\u5b9e\u4f53 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A175"}),"#I2A175")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5168\u5c40\u62e6\u622a\u5668\u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A7T2"}),"#I2A7T2")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u7a7a\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AB6C"}),"#I2AB6C")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Token")," \u751f\u6210\u52a0\u5bc6\u7b97\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29KIH"}),"#I29KIH")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u65e5\u5fd7\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28Y9D"}),"#I28Y9D")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u5b9e\u4f53\u62e6\u622a\u5668\u3001\u914d\u7f6e\u3001\u4e00\u5206\u949f\u5165\u95e8\u7b49\u7b49\u6587\u6863"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5982\u4f55\u5b9e\u73b0\u6388\u6743\u8bbf\u95ee ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I294F2"}),"#I294F2")),Object(n.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u5982\u4f55\u5b9e\u73b0\u591a\u4e2a\u6570\u636e\u5e93\u591a\u5bf9\u591a\u5b9e\u4f53\u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29G6S"}),"#I29G6S")),Object(n.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u52a8\u6001 WebApi \u652f\u6301\u6587\u4ef6\u4e0a\u4f20\u5417 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29R5E"}),"#I29R5E")),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u591a\u4e2a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65e0\u6cd5\u751f\u6210\u8fc1\u79fb\u4ee3\u7801 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A6II"}),"#I2A6II")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5b9e\u73b0 ",Object(n.b)("inlineCode",{parentName:"li"},"BuildChange")," \u4f20\u5165\u8868\u540d ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I292SN"}),"#I292SN")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u6267\u884c\u6570\u636e\u5e93\u64cd\u4f5c\u7ed3\u679c\u4e0d\u652f\u6301\u5c5e\u6027\u5ffd\u7565\u5927\u5c0f\u5199\u8d4b\u503c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29DRQ"}),"#I29DRQ")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 ",Object(n.b)("inlineCode",{parentName:"li"},"Webhook")," \u673a\u5236 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A3I0"}),"#I2A3I0"))))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v140\uff08\u5df2\u53d1\u5e03\uff09"},"v1.4.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")," \u652f\u6301\u4e8c\u7ea7\u865a\u62df\u76ee\u5f55\u90e8\u7f72\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28B77"}),"#I28B77")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Template.RazorWithWebApi")," \u811a\u624b\u67b6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28QGI"}),"#I28QGI")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Template.BlazorWithWebApi")," \u811a\u624b\u67b6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27Z3O"}),"#I27Z3O")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u62d3\u5c55 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28AJ6"}),"#I28AJ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"[AppDbContext(\u8fde\u63a5\u5b57\u7b26\u4e32\uff0c\u6570\u636e\u5e93\u7c7b\u578b)]")," \u914d\u7f6e\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28QTB"}),"#I28QTB")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c ",Object(n.b)("inlineCode",{parentName:"li"},"DateTime")," \u62d3\u5c55\u65b9\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27MQA"}),"#I27MQA")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ValidationTypes")," \u9a8c\u8bc1\u6b63\u5219\u8868\u8fbe\u5f0f\u667a\u80fd\u63d0\u793a ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2801V"}),"#I2801V")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ValiationTypes.WordWithNumber")," \u9a8c\u8bc1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2805A"}),"#I2805")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u83b7\u53d6\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef IP \u5730\u5740 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28QV9"}),"#I28QV9")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," .NET 5.0 \u7248\u672c\u81f3 .NET 5.0.1 \u7248\u672c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28QU1"}),"#I28QU")),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u89c6\u56fe\u5f15\u64ce\u529f\u80fd\uff0c\u4f18\u5316\u4e0d\u89c4\u8303\u547d\u540d\u548c\u65b0\u589e\u5b57\u7b26\u4e32\u6a21\u677f\u7f16\u8bd1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28G0S"}),"#I28G0S")),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6570\u636e\u5e93\u5b9e\u4f53\u67e5\u627e\u7b97\u6cd5\uff0c\u5e76\u4f18\u5316\u6027\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28QUQ"}),"#I28QUQ")),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u5e94\u7528\u542f\u52a8\u521d\u59cb\u5316\u6027\u80fd\u548c\u6570\u636e\u5e93\u7b2c\u4e00\u6b21\u81ea\u52a8\u914d\u7f6e ",Object(n.b)("inlineCode",{parentName:"li"},"DbSet")," \u6027\u80fd"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u914d\u7f6e\u5b9a\u4f4d\u5668\u540e\u5b9e\u4f53\u65e0\u6cd5\u6b63\u786e\u751f\u6210 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2888L"}),"#I2888L")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u79df\u6237\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5b9e\u4f53\u751f\u6210 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2891G"}),"#I2891G")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u9a8c\u8bc1\u5931\u8d25\u63d0\u793a\u6d88\u606f\u6ca1\u6709\u5e94\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"JSON")," \u5927\u5c0f\u5199\u914d\u7f6e bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27UTX"}),"#I27UTX")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4ed3\u50a8 ",Object(n.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(n.b)("inlineCode",{parentName:"li"},"Update")," \u65b9\u6cd5\u6307\u5b9a ",Object(n.b)("inlineCode",{parentName:"li"},"ignoreNullValues")," \u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27UN6"}),"#I27UN6")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Controller")," \u6d3e\u751f\u7c7b\u5982\u679c\u8d34\u4e86 ",Object(n.b)("inlineCode",{parentName:"li"},"[Route]")," \u7279\u6027\u540e\u51fa\u73b0\u5728 ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e2d bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27TN7"}),"#I27TN7")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlScalar")," \u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u8fd4\u56de ",Object(n.b)("inlineCode",{parentName:"li"},"Nullable")," \u7c7b\u578b\u51fa\u73b0\u8f6c\u6362\u5931\u8d25 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27S2N"}),"#I27S2N")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u7279\u6027\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27MLM"}),"#I27MLM")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u9759\u6001\u6267\u884c\u65b9\u5f0f\u548c ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u9ad8\u7ea7\u4ee3\u7406\u65e0\u6cd5\u76d1\u542c\u6570\u636e\u5e93\u8fde\u63a5\u72b6\u6001 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27M4F"}),"#I27M4F")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4fee\u590d\u66f4\u6362 Json \u5e8f\u5217\u5316\u5e93\u65e0\u6548 bug\uff0c\u5982\u66ff\u6362\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Microsoft.AspNetCore.Mvc.NewtonsoftJson")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27M43"}),"#I27M43")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u5de5\u5177\u751f\u6210\u6a21\u578b bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27XI5"}),"#I27XI5")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8f6f\u5220\u9664\u6ca1\u6709\u751f\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2804I"}),"#I2804I")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u8bc6\u522b\u5e26\u591a\u4e2a ",Object(n.b)("inlineCode",{parentName:"li"},"\\\\")," \u7684\u8fde\u63a5\u5b57\u7b26\u4e32\u8bc6\u522b bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I280TS"}),"#I280TS"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/91"}),"#PR91")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u65e0\u6cd5\u53d6\u6d88\u751f\u6210 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2816M"}),"#I2816M")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c\u672c\u5730\u65f6\u95f4\u5dee 8 \u5c0f\u65f6 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28BA9"}),"#I28BA9")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u542f\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"bundle js&css")," \u538b\u7f29\u540e\u542f\u52a8\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28KRP"}),"#I28KR")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ValidationTypes.Required")," \u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/98"}),"#PR98")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c",Object(n.b)("inlineCode",{parentName:"li"},"OnValidateFailed")," \u53c2\u6570\u540d\u62fc\u5199\u9519\u8bef bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/93"}),"#PR93"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/92"}),"#PR92")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6388\u6743\u7ba1\u9053\u9a8c\u8bc1\u5931\u8d25\u8fd8\u663e\u793a\u7ed3\u679c bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/89"}),"#PR89")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md \u53cb\u60c5\u8fde\u63a5\u5730\u5740 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/88"}),"#PR88")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6a21\u677f\u811a\u624b\u67b6\u6e90\u7801\uff0c\u6dfb\u52a0 ",Object(n.b)("inlineCode",{parentName:"li"},"EFCore Tools")," \u5e93 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/87"}),"#PR87")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md Nuget \u56fe\u6807 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/85"}),"#PR85")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5c06 ",Object(n.b)("inlineCode",{parentName:"li"},"List")," \u8f6c ",Object(n.b)("inlineCode",{parentName:"li"},"DateTable")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/97"}),"#PR97")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c6\u56fe\u5f15\u64ce\u6a21\u677f\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27ZVA"}),"#I27ZVA")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28AJ6"}),"#I28AJ"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://monksoul.gitee.io/furion/docs/dbcontext-hight-query/#91111-%E6%97%B6%E6%80%81%E6%9F%A5%E8%AF%A2"}),"DOC")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4ed3\u50a8\u6587\u6863\u4e66\u5199\u7eb0\u6f0f bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/90"}),"#PR90")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u9009\u9879\u6587\u6863\u9519\u8bef bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/86"}),"#PR86")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(n.b)("inlineCode",{parentName:"li"},"\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668")," \u6587\u6863\u4e66\u5199\u9519\u8bef bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/83/files"}),"#PR83")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u811a\u624b\u67b6\u7b49\u6587\u6863"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b ",Object(n.b)("inlineCode",{parentName:"li"},"api")," \u8fd4\u56de\u7684\u503c\u81ea\u52a8\u5c06 null \u8f6c\u4e3a '' \u6216 ","[][#I286IJ]","(",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I286IJ)%EF%BC%8C%E3%80%90%E5%B7%B2%E5%85%B3%E9%97%AD%E3%80%91"}),"https://gitee.com/monksoul/Furion/issues/I286IJ)\uff0c\u3010\u5df2\u5173\u95ed\u3011")),Object(n.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u6dfb\u52a0\u7f51\u5173\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27TP7"}),"#I27TP7"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u65b0\u589e ",Object(n.b)("inlineCode",{parentName:"li"},"SqlQuery")," \u83b7\u53d6\u5355\u6761\u8bb0\u5f55\u65b9\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28M1V"}),"#I28M1V"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b\u53ef\u4ee5\u63d0\u4f9b\u96c6\u6210 ",Object(n.b)("inlineCode",{parentName:"li"},"Serilog")," \u4f8b\u5b50 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I282J4"}),"#I282J4"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u5982\u4f55\u901a\u8fc7\u7279\u6027\u914d\u7f6e\u552f\u4e00\u7ea6\u675f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2891L"}),"#I2891L"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u600e\u4e48\u8bfb\u53d6 ",Object(n.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u6570\u7ec4 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27WUR"}),"#I27WU"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," ",Object(n.b)("inlineCode",{parentName:"li"},"IRepository")," \u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I281IE"}),"#I281IE"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u89c4\u8303\u5316\u63a5\u53e3\u95ee\u9898\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28NMZ"}),"#I28NMZ"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u7edf\u4e00\u8fd4\u56de\u503c\u6a21\u578b\u4e2d OnResponseStatusCodes \u672a\u6267\u884c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28NNL"}),"#I28NNL"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011")))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v120\uff08\u5df2\u53d1\u5e03\uff09"},"v1.2.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26OXG"}),"#I26OXG"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/78"}),"#PR78")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"[AppDbContext]")," \u914d\u7f6e\u6570\u636e\u5e93\u63d0\u4f9b\u5668\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27G3T"}),"#I27G3T")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(n.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278DD"}),"#I278DD"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278LQ"}),"#I278LQ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278CP"}),"#I278CP")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9a\u4f4d\u5668\u4ed3\u50a8 ",Object(n.b)("inlineCode",{parentName:"li"},"IDbRepository")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I276Q3"}),"#I276Q3")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(n.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u6392\u9664\u7a7a\u5b57\u7b26\u4e32\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I272OG"}),"#I272OG")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(n.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u533f\u540d\u5bf9\u8c61\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I271X0"}),"#I271X0")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u9a8c\u8bc1\u4f20\u5165\u7a7a\u5bf9\u8c61\u8df3\u8fc7\u9a8c\u8bc1\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I273R4"}),"#I273R4")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5e94\u7528\u542f\u52a8\u65f6\u652f\u6301\u6392\u9664\u7279\u5b9a\u914d\u7f6e\u6587\u4ef6\u81ea\u52a8\u52a0\u8f7d ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26U0A"}),"#I26U0A")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5355\u4e2a\u5b9e\u4f53\u8868\u540d\u524d\u7f00\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26LX0"}),"#I26LX0")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u81ea\u52a8\u914d\u7f6e\u9ed8\u8ba4\u7248\u672c\u53f7 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26XQ6"}),"#I26XQ6")),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6388\u6743\u5904\u7406\u7a0b\u5e8f\u4ee3\u7801"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(n.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278DD"}),"#I278DD"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278LQ"}),"#I278LQ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278CP"}),"#I278CP")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26OXG"}),"#I26OXG"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/78"}),"#PR78")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c6\u56fe\u5f15\u64ce\u52a0\u8f7d\u5916\u90e8\u7a0b\u5e8f\u96c6\u51fa\u9519 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f9d\u8d56\u6ce8\u5165\u4ee3\u7406\u63a5\u53e3\u62a5\u7a7a\u5bf9\u8c61\u5f02\u5e38 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"EFCore")," \u53d6\u6d88\u9644\u52a0\u5b9e\u4f53\u51fa\u9519 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4ed3\u50a8\u5728\u975e Web \u8bf7\u6c42\u4e0b\u51fa\u73b0\u7a7a\u5f02\u5e38 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u4e2a\u6388\u6743\u7b56\u7565\u5171\u5b58\u95ee\u9898\u51fa\u73b0\u65e0\u6548 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u53cb\u597d\u5f02\u5e38 ",Object(n.b)("inlineCode",{parentName:"li"},"Oop.Oh")," \u4e0d\u652f\u6301\u666e\u901a\u65b9\u6cd5 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u83b7\u53d6\u591a\u79df\u6237\u5bf9\u8c61\u65f6\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u51fa\u73b0\u4f5c\u7528\u57df\u9a8c\u8bc1\u5931\u8d25 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143\u4e0d\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u62e6\u622a bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27GST"}),"#I27GST")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I26O1F]","(",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26O1F"}),"https://gitee.com/monksoul/Furion/issues/I26O1F"),"), ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27B2I"}),"#I27B2I"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27BJ6"}),"#I27BJ6"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27E5Z"}),"#I27E5Z"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27EL4"}),"#I27EL4")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e][\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668]","(",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://monksoul.gitee.io/furion/docs/dbcontext-entitytrigger"}),"https://monksoul.gitee.io/furion/docs/dbcontext-entitytrigger"),") \u6587\u6863"),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5e94\u7528\u542f\u52a8\u3001\u5b98\u65b9\u811a\u624b\u67b6\u3001\u6570\u636e\u5e93\u64cd\u4f5c\u6307\u5357\u3001\u5bf9\u8c61\u6620\u5c04\u3001\u89c4\u8303\u5316\u6587\u6863\u3001\u5f02\u5e38\u5904\u7406\u3001\u9274\u6743\u6388\u6743\u6587\u6863")))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v110\uff08\u5df2\u53d1\u5e03\uff09"},"v1.1.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetDbContext()")," \u83b7\u53d6\u9ed8\u8ba4\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65b9\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContextUtility.GetCurrentHttpContext()")," \u83b7\u53d6\u5168\u5c40 ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContext")," \u4e0a\u4e0b\u6587"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.GetRequiredService<>")," \u89e3\u6790\u670d\u52a1\u65b9\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"object.GetService<>")," \u5bf9\u8c61\u62d3\u5c55\u65b9\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7b56\u7565\u6388\u6743 ",Object(n.b)("inlineCode",{parentName:"li"},"PolicyPipeline")," \u57fa\u7c7b\u65b9\u6cd5\uff0c\u652f\u6301\u591a\u91cd\u5224\u65ad\u6388\u6743"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"JWTEncryption.ValidateJwtBearerToken")," \u624b\u52a8\u9a8c\u8bc1\u9759\u6001\u65b9\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u6570\u636e\u5e93\u4e0a\u4e0b\u6587 ",Object(n.b)("inlineCode",{parentName:"li"},"InsertOrUpdateIgnoreNullValues")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"EnabledEntityStateTracked")," \u5168\u5c40\u914d\u7f6e"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger Jwt\u6388\u6743")," \u5168\u5c40\u6388\u6743\u53c2\u6570 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26GLR"}),"#I26GLR")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u81ea\u5b9a\u4e49\u5224\u65ad\u6761\u4ef6\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I269Q1"}),"#I269Q1")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u5b57\u6bb5\u5c0f\u5199\u547d\u540d\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2695D"}),"#I2695D")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u6587\u672c\u5bf9\u6bd4\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I268LE"}),"#I268LE")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u5f02\u5e38\u7279\u6027\u6d88\u606f\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2662O"}),"#I2662O")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(n.b)("inlineCode",{parentName:"li"},"Update")," \u6570\u636e\u5e93\u5ffd\u7565\u7a7a\u503c\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I264Q4"}),"#I264Q4")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Fur")," \u9879\u76ee\u540d\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetRequestDbContext<>()")," \u547d\u540d\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")," \u547d\u540d\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext<>()")),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.GetService<>")," \u89e3\u6790\u670d\u52a1\u7684\u5e95\u5c42\u903b\u8f91\uff0c\u5927\u5927\u63d0\u9ad8\u4e86\u89e3\u6790\u670d\u52a1\u7684\u6027\u80fd"),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6388\u6743\u6838\u5fc3\u4ee3\u7801\uff0c\u4fdd\u6301\u548c\u5fae\u8f6f\u4e00\u81f4\u7684\u6388\u6743\u89c4\u8303 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26DCB"}),"#I26DCB")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>")," \u65b9\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ValidateJwtBearer")," Jwt \u6388\u6743\u65b9\u6cd5\uff0c\u65e0\u9700\u624b\u52a8\u5224\u65ad\u4e86"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," Furion \u5b98\u65b9\u811a\u624b\u67b6\u751f\u6210\u540e\u7f16\u8bd1\u5f02\u5e38 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Tenant")," \u5185\u7f6e\u5c5e\u6027\u4e0d\u662f ",Object(n.b)("inlineCode",{parentName:"li"},"virtual")," \u4fee\u9970 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"dockerfile")," \u65b0\u547d\u540d\u6784\u5efa\u5931\u8d25 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u5b9a\u4e49\u89d2\u8272\u6388\u6743\u548c\u591a\u4e2a\u6388\u6743\u5171\u5b58\u51fa\u73b0 403 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26H1L"}),"#I26H1L")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"httpContext.GetEndpoint()")," \u7a7a\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/73"}),"#PR73")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Oops.Oh")," \u7a7a\u5f02\u5e38\u548c\u4e0d\u652f\u6301\u670d\u52a1\u670d\u52a1\u629b\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26EFU"}),"#I26EFU"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26GM4"}),"#I26GM4")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"cli.ps")," \u751f\u6210\u6587\u4ef6\u7f16\u7801\u4e71\u7801 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26DVT"}),"#I26DVT")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u6587\u4ef6\u4e0a\u4f20\u6309\u94ae\u4e0d\u663e\u793a ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26B6U"}),"#I26B6U")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u6388\u6743\u72b6\u6001\u7801\u5e8f\u5217\u5316\u5927\u5c0f\u5199\u4e0d\u4e00\u81f4\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26B26"}),"#I26B26")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u4e2d\u6587\u4e71\u7801 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I268T5"}),"#I268T5")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MySql")," \u5f02\u6b65\u5f02\u5e38\u6355\u83b7\u4e0d\u5230 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I265SO"}),"#I265SO")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u63d0\u793a\u627e\u4e0d\u5230\u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2647U"}),"#I2647U")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u4ee3\u7801\u6027\u80fd\u5c0f\u4f18\u5316\u548c\u5c0f\u8c03\u6574"),Object(n.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I265JV]","(",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I265JV)%EF%BC%8C%5B#I26ERA%5D(https://gitee.com/monksoul/Furion/issues/I26ERA)%EF%BC%8C"}),"https://gitee.com/monksoul/Furion/issues/I265JV)\uff0c[#I26ERA](https://gitee.com/monksoul/Furion/issues/I26ERA)\uff0c")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26EVW"}),"#I26EVW"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26GHC"}),"#I26GHC"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26GJ1"}),"#I26GJ1"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26O1F"}),"#I26O1F")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5b89\u5168\u9274\u6743\u3001\u6570\u636e\u5e93\u7b49\u6587\u6863")))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v103\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.3\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc \u6a21\u677f\u811a\u624b\u67b6\uff1a",Object(n.b)("inlineCode",{parentName:"li"},"Fur.Template.Mvc")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," WebApi \u6a21\u677f\uff1a",Object(n.b)("inlineCode",{parentName:"li"},"Fur.Template.Api")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc/WebApi \u6a21\u677f\uff1a",Object(n.b)("inlineCode",{parentName:"li"},"Fur.Template.App")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Razar Pages \u6a21\u677f\uff1a",Object(n.b)("inlineCode",{parentName:"li"},"Fur.Template.Razor")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Blazor \u6a21\u677f\uff1a",Object(n.b)("inlineCode",{parentName:"li"},"Fur.Template.Blazor")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"PagedList")," \u5230 ",Object(n.b)("inlineCode",{parentName:"li"},"System.Collections.Generic")," \u547d\u540d\u7a7a\u95f4\u4e0b"),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u89e3\u6790\u670d\u52a1\u6027\u80fd\u95ee\u9898\uff0c\u5e95\u5c42\u4ee3\u7801\u5927\u91cf\u4f18\u5316"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ApiSears.ControllerEnd"),"\u4e0d\u8d77\u4f5c\u7528 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I25KH6"}),"#I25KH6")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u8bf7\u6c42\u5b8c\u6210\u7ed3\u679c\u5e8f\u5217\u5316\u5c5e\u6027\u5927\u5c0f\u5199\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I25I8R"}),"#I25I8R")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContext.GetEndpoinet()")," \u7a7a\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/pulls/73"}),"#PR73")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"\u65e0"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u5165\u95e8\u6587\u6863\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6587\u6863\u3001\u591a\u6570\u636e\u5e93\u64cd\u4f5c\u6587\u6863")))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v102\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.2\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Pomelo.EntityFrameworkCore.MySql")," \u6700\u65b0 .NET 5 \u5305\u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24ZQK"}),"#I24ZQK")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},".AddDateTimeJsonConverter(format)")," \u65f6\u95f4\u683c\u5f0f\u5e8f\u5217\u5316\u914d\u7f6e"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"DateTime")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u7c7b\u578b\u5e8f\u5217\u5316\u683c\u5f0f\u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I253FI"}),"#I253FI")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Mapster")," \u5305\u81f3 ",Object(n.b)("inlineCode",{parentName:"li"},"7.0.0")," \u7248"),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.Services")," \u540d\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.ApplicationServices")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>()")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u975e Web \u4e3b\u673a\u6ce8\u5165\u62d3\u5c55"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"services.AddFriendlyException()")," \u7f3a\u5c11\u914d\u7f6e\u6ce8\u5165 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6c60\u88ab\u91ca\u653e\u548c\u9ad8\u5e76\u53d1\u4e0b\u5185\u5b58\u6ea2\u51fa bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I2524K"}),"#I2524K"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24UMN"}),"#I24UMN")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de\u7a7a\u6570\u636e\u65f6\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24TCK"}),"#I24TCK")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143 ",Object(n.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u591a\u6570\u636e\u5e93\u88ab\u91ca\u653e bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24Q6W"}),"#I24Q6W")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"EntityBase")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"Entity")," \u6240\u6709\u5c5e\u6027\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"vitural")," \u4fee\u9970"),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Jwt")," \u8bfb\u53d6\u548c\u89e3\u6790\u6027\u80fd"),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f18\u5316\u4ee3\u7801\u652f\u6301 C# 9.0 \u6700\u65b0\u8bed\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/pulls/71"}),"#PR71")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u65e0\u7528\u6216\u672a\u4f7f\u7528\u4ee3\u7801"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u4e00\u5206\u949f\u5165\u95e8\u6587\u6863")))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v100\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(n.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u7ec4\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I1YYWD"}),"#I1YYWD")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},".AddInjectBase()")," \u6ce8\u5165\uff0c\u53ea\u5305\u542b\u57fa\u7840\u670d\u52a1\u6ce8\u5165"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6240\u6709\u670d\u52a1\u90fd\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"IServiceCollection")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"IMvcBuilder")," \u6ce8\u5165"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u629b\u5f02\u5e38\u72b6\u6001\u7801\u8bbe\u7f6e\u529f\u80fd ",Object(n.b)("inlineCode",{parentName:"li"},"StatusCode")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5e8f\u5217\u5316\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"Pascal")," \u5c5e\u6027\u547d\u540d\u65b9\u5f0f"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(n.b)("strong",{parentName:"li"},"\u6240\u6709\u7684\u5305\u4e3a ",Object(n.b)("inlineCode",{parentName:"strong"},".NET 5")," \u6b63\u5f0f\u7248")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlProxy")," \u4ee3\u7406\u5f02\u6b65\u5904\u7406 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u7c7b\u578b ",Object(n.b)("inlineCode",{parentName:"li"},"Datetime")," \u8f6c ",Object(n.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5c5e\u6027\u9996\u5b57\u6bcd\u5927\u5c0f\u5199\u5e8f\u5217\u5316\u4e0d\u5339\u914d\u51fa\u73b0 ",Object(n.b)("inlineCode",{parentName:"li"},"null")," bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u5e8f\u5217\u5316\u4e2d\u6587\u51fa\u73b0\u4e71\u7801 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u9ed8\u8ba4\u5e8f\u5217\u5316\u914d\u7f6e\u65e0\u6548 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u975e\u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f\u63d0\u4ea4\u65e0\u6548 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5e94\u7528\u7a0b\u5e8f\u6c60\u63d0\u4ea4\u6240\u6709 ",Object(n.b)("inlineCode",{parentName:"li"},"DbContext")," \u7a7a\u5f02\u5e38 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Saas")," \u591a\u79df\u6237 ",Object(n.b)("inlineCode",{parentName:"li"},"Tenant")," \u7c7b\u578b\u5b57\u7b26\u4e32\u5c5e\u6027\u5728 ",Object(n.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u4e0b\u51fa\u73b0 ",Object(n.b)("inlineCode",{parentName:"li"},"longtext")," \u7c7b\u578b bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Mvc")," \u81ea\u52a8\u9a8c\u8bc1\u5b57\u7b26\u4e32\u7a7a\u503c bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24M2T"}),"#I24M2T")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u679a\u4e3e\u6ce8\u91ca\u88ab\u8986\u76d6 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24N6J"}),"#I24N6J")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5ffd\u7565\u89c4\u8303\u5316\u7ed3\u679c\u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24B8P"}),"#I24B8P")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4 ",Object(n.b)("inlineCode",{parentName:"li"},"ContentType")," \u4e0d\u662f ",Object(n.b)("inlineCode",{parentName:"li"},"applicaiton/json")," bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24F3U"}),"#I24F3U")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5185\u7f6e ",Object(n.b)("inlineCode",{parentName:"li"},"System.Text.Json")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"Newtonsoft.Json")," \u51b2\u7a81 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24F3U"}),"#I24F3U")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Fur")," \u6846\u67b6\u57df\u540d\u4e3a\uff1a",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://furos.cn"}),"https://furos.cn")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u4ed3\u50a8 ",Object(n.b)("inlineCode",{parentName:"li"},"FromSqlRaw")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"FromSqlInterpolated")," \u63a5\u53e3\u4f4d\u7f6e"),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6027\u80fd\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/pulls/70"}),"#PR70")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md\u3001\u6846\u67b6\u4ecb\u7ecd\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u914d\u7f6e\u9009\u9879\u3001\u591a\u79df\u6237\u3001\u8de8\u57df\u6587\u6863")))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/docs/1ca878db.d7b4851f.js b/docs/1ca878db.d7b4851f.js deleted file mode 100644 index 859c47ef20c..00000000000 --- a/docs/1ca878db.d7b4851f.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[13],{199:function(e,t,a){"use strict";a.d(t,"a",(function(){return p})),a.d(t,"b",(function(){return O}));var i=a(0),b=a.n(i);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,i)}return a}function r(e){for(var t=1;t=0||(b[a]=e[a]);return b}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(b[a]=e[a])}return b}var o=b.a.createContext({}),m=function(e){var t=b.a.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):r(r({},t),e)),a},p=function(e){var t=m(e.components);return b.a.createElement(o.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return b.a.createElement(b.a.Fragment,{},t)}},u=b.a.forwardRef((function(e,t){var a=e.components,i=e.mdxType,n=e.originalType,l=e.parentName,o=c(e,["components","mdxType","originalType","parentName"]),p=m(a),u=i,O=p["".concat(l,".").concat(u)]||p[u]||s[u]||n;return a?b.a.createElement(O,r(r({ref:t},o),{},{components:a})):b.a.createElement(O,r({ref:t},o))}));function O(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=a.length,l=new Array(n);l[0]=u;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,l[1]=r;for(var o=2;o()")," \u62d3\u5c55\u8fd4\u56de\u9519\u8bef bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BSTS"}),"#I2BSTS")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 Api \u5b50\u7c7b\u91cd\u5199\u7236\u7c7b\u65b9\u6cd5\u5e76\u53d6\u522b\u540d\u540e ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2C9VP"}),"#I2C9VP")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(n.b)("inlineCode",{parentName:"li"},"application/json")," \u5e8f\u5217\u5316\u5927\u5c0f\u5199\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CRJC"}),"#I2CRJC")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u5b9e\u4f53\u5d4c\u5957\u5173\u8054 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CVN0"}),"#I2CVN0")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8de8\u57df\u54cd\u5e94\u5934\u8bbe\u7f6e\u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CW5T"}),"#I2CW5T")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u7f51\u7edc\u8bf7\u6c42\u4ee3\u7406\u6253\u5370\u5230 ",Object(n.b)("inlineCode",{parentName:"li"},"MiniProfiler")," bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CZBC"}),"#I2CZBC")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8fdc\u7a0b\u8bf7\u6c42\u54cd\u5e94\u62e6\u622a\u5668 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D4DG"}),"#I2D4DG")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6846\u67b6 ",Object(n.b)("inlineCode",{parentName:"li"},"AsQueryable()")," \u4e00\u76f4\u8ffd\u52a0\u53c2\u6570 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DH1D"}),"#I2DH1D")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u52a8\u5237\u65b0 ",Object(n.b)("inlineCode",{parentName:"li"},"Token")," \u7a7a\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DO29"}),"#I2DO29")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u751f\u6210 ",Object(n.b)("inlineCode",{parentName:"li"},"JWT Token")," \u4e0d\u4f20\u8fc7\u671f\u65f6\u95f4\u51fa\u73b0\u9a8c\u8bc1 401 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DO8L"}),"#I2DO8L")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"AppStartup")," \u6392\u5e8f\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DVD2"}),"#I2DVD2")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u591a\u8bed\u8a00\u670d\u52a1\u65f6\u53cb\u597d\u5f02\u5e38\u548c\u9a8c\u8bc1\u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2ECUJ"}),"#I2ECUJ")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u5b57\u6bcd\u548c\u6570\u5b57\u7ec4\u5408\u65e0\u6cd5\u5339\u914d bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2EF2Q"}),"#I2EF2Q")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u6821\u9a8c\u624b\u673a\u6216\u56fa\u8bdd\u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2M5IZ"}),"#I2M5IZ")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u89e3\u6790 ",Object(n.b)("inlineCode",{parentName:"li"},"SqlConnection")," \u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2M5P2"}),"#I2M5P2")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5f00\u542f\u591a\u8bed\u8a00\u540e\uff0c",Object(n.b)("inlineCode",{parentName:"li"},"EF")," \u8fc1\u79fb\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2M7DT"}),"#I2M7DT")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"IEntityTypeBuilder")," \u4e0d\u652f\u6301\u591a\u91cd\u7ee7\u627f bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2PAOD"}),"#I2PAOD")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"JwtHandler")," \u8bbe\u7f6e\u81ea\u52a8\u5237\u65b0\u540e\uff0c\u533f\u540d\u8bbf\u95ee\u65e0\u6cd5\u901a\u8fc7 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2SDOX"}),"#I2SDOX")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Dapper")," \u62d3\u5c55\u4e2d ",Object(n.b)("inlineCode",{parentName:"li"},"SqlServer")," \u6570\u636e\u5e93\u83b7\u53d6\u8fde\u63a5\u5bf9\u8c61\u7c7b\u578b bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/159"}),"#PR159")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u79fb\u9664 ",Object(n.b)("inlineCode",{parentName:"li"},"Sql")," \u67e5\u8be2\u7ed3\u679c\u6620\u5c04\u68c0\u67e5 ",Object(n.b)("inlineCode",{parentName:"li"},"[NotMapper]")," \u7279\u6027\u673a\u5236 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XD0"}),"#I34XD0")),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f9d\u8d56\u6ce8\u5165\u65f6\u6392\u9664 ",Object(n.b)("inlineCode",{parentName:"li"},"IDynamicApiController")," \u63a5\u53e3 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2ECTG"}),"#I2ECTG")),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/158"}),"#PR158")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6587\u6863\u9996\u9875 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XBR"}),"#I34XBR")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2APGJ"}),"#I2APGJ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u591a\u8bed\u8a00\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DOCL"}),"#I2DOCL")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6587\u6863\u5168\u6587\u641c\u7d22\u5f15\u64ce ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XAW"}),"#I34XAW")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u9759\u6001\u7c7b\u7c7b\u578b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XB4"}),"#I34XB4")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6846\u67b6\u53ef\u914d\u7f6e\u9009\u9879\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XB9"}),"#I34XB9")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u4e8b\u4ef6\u603b\u7ebf\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XBI"}),"#I34XBI")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XC0"}),"#I34XC0")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u8d21\u732e\u6307\u5357\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XC8"}),"#I34XC8")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContext")," \u53ca ",Object(n.b)("inlineCode",{parentName:"li"},"\u6587\u4ef6\u4e0a\u4f20\u4e0b\u8f7d")," \u535a\u5ba2\u6587\u7ae0 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I34XCB"}),"#I34XCB")),Object(n.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u6587\u6863\u5c0f\u8c03\u6574\uff0c\u5c0f\u4f18\u5316"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u8de8\u57df\u8bbe\u7f6e\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2ASNJ"}),"#I2ASNJ")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MVC")," \u89c6\u56fe\u65e0\u6548\uff0c\u539f\u56e0\u662f ",Object(n.b)("inlineCode",{parentName:"li"},".cshtml")," \u6587\u4ef6\u6ca1\u6709\u8bbe\u7f6e\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"\u5185\u5bb9")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AXUU"}),"#I2AXUU")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Sql")," \u64cd\u4f5c\u53ef\u4ee5\u5b9e\u73b0\u4e8b\u52a1\u5417\uff1f",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2B0NX"}),"#I2B0NX")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"IRepository")," \u64cd\u4f5c\u6570\u636e\u5e93\u4f1a\u6253\u5f00\u591a\u6b21\u6570\u636e\u5e93\u8fde\u63a5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BB7B"}),"#I2BB7B")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5982\u4f55\u8fdb\u5165\u81ea\u5b9a\u4e49 ",Object(n.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u65ad\u70b9 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BGXY"}),"#I2BGXY")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u6ce8\u5165\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2C2AQ"}),"#I2C2AQ")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5efa\u8bae\u589e\u52a0 API \u7b7e\u540d\u9a8c\u8bc1\uff0c\u65f6\u6548\u9a8c\u8bc1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2C6ET"}),"#I2C6ET")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u591a\u79df\u6237\u540c\u65f6\u4f7f\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CEHS"}),"#I2CEHS")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ISqlSugarRepository")," \u6ca1\u6709 ",Object(n.b)("inlineCode",{parentName:"li"},"Getxxx")," \u65b9\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CJLZ"}),"#I2CJLZ")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u5982\u4f55\u5c06 ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u91cc\u7684\u8868\u5bfc\u51fa\u6210 ",Object(n.b)("inlineCode",{parentName:"li"},"model")," \u7c7b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CSUL"}),"#I2CSUL")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u624b\u52a8\u4fee\u6539 ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u7ec8\u7ed3\u70b9\u8def\u5f84\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D608"}),"#I2D608")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"DefaultDbContext")," \u4e0d\u80fd\u8bc6\u522b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DCZX"}),"#I2DCZX")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5404\u5206\u5c42\u9879\u76ee ",Object(n.b)("inlineCode",{parentName:"li"},"Startup.cs")," \u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"Configuration")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DDUP"}),"#I2DDUP")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Aop")," \u65e0\u6cd5\u62e6\u622a\uff0c\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DEY8"}),"#I2DEY8")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DSB8"}),"#I2DSB8"),"\\"),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Entity")," \u521b\u5efa\u65f6\u95f4\u548c\u662f\u5426\u5220\u9664\u6dfb\u52a0\u9ed8\u8ba4\u503c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E04H"}),"#I2E04H")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"swagger")," \u4e2d\u591a\u4e2a ",Object(n.b)("inlineCode",{parentName:"li"},"servers")," \u8bbe\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E0IF"}),"#I2E0IF")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5168\u5c40\u7b5b\u9009\u5668 \u6ca1\u6709\u6267\u884c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E5R4"}),"#I2E5R4")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u5b9a\u4f4d\u5668\u7591\u95ee ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E77T"}),"#I2E77T")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"cli.ps")," \u9006\u5411\u5de5\u7a0b ",Object(n.b)("inlineCode",{parentName:"li"},"Mysql")," \u6570\u636e\u5e93\u62a5\u9519 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E7I5"}),"#I2E7I5")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5f00\u53d1\u73af\u5883 ",Object(n.b)("inlineCode",{parentName:"li"},"applicationsettings.json")," \u4e2d\u6587\u4e71\u7801 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2EAG1"}),"#I2EAG1")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u589e\u52a0\u6307\u5b9a\u8def\u5f84\u7a0b\u5e8f\u96c6\u6620\u5c04 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2EEO2"}),"#I2EEO2")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u52a8\u6001\u7f16\u8bd1 ",Object(n.b)("inlineCode",{parentName:"li"},"cs")," \u811a\u672c\u6587\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2EH66"}),"#I2EH66")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u81ea\u5b9a\u4e49\u4e2d\u95f4\u4ef6\uff0c\u8fd4\u56de\u7684\u9519\u8bef\u6ca1\u6709\u89c4\u8303\u5316\u7ed3\u679c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2NV8S"}),"#I2NV8S")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5faa\u73af\u5f15\u7528\u8bbe\u7f6e\u751f\u6210\u6587\u6863\u5c42\u7ea7\u65e0\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2PLQQ"}),"#I2PLQQ")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u914d\u7f6e\u6587\u4ef6\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"yaml")," \u6587\u4ef6\u5417? ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2TJ3N"}),"#I2TJ3N")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u4fee\u6539\u6570\u636e\u5e93\u672a ",Object(n.b)("inlineCode",{parentName:"li"},"mysql")," \u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"Add-Migration")," \u62a5\u9519 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2VR64"}),"#I2VR64")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u591a\u6570\u636e\u5e93\u4f7f\u7528\u5b9a\u4f4d\u5668\u65f6\u62a5\u9519 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2VR8F"}),"#I2VR8F")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Migration To Oracle")," \u5f02\u5e38 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2WBYQ"}),"#I2WBYQ")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5f00\u53d1\u65f6\u663e\u793a ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u4e0a\u7ebf\u65f6\u5173\u95ed ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger"),"\uff0c\u8fd9\u9700\u8981\u600e\u4e48\u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2WOYV"}),"#I2WOYV")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u517c\u5bb9 Mvc \u590d\u6742\u9a8c\u8bc1\u6ca1\u6709\u8bd5\u9a8c\u6210\u529f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2X3GV"}),"#I2X3GV")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Aop")," \u80fd\u4e0d\u80fd\u652f\u6301\u65e0\u63a5\u53e3\u7684\u7c7b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2X8AS"}),"#I2X8AS")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u5173\u4e8e ",Object(n.b)("inlineCode",{parentName:"li"},"JWT Token")," \u81ea\u52a8\u5237\u65b0\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2YD4K"}),"#I2YD4K")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u80fd\u5426\u589e\u52a0\u4e00\u4e2a\u62d3\u5c55\u7684 ",Object(n.b)("inlineCode",{parentName:"li"},"Entity"),"\uff0c\u589e\u52a0\u4e00\u4e9b\u62d3\u5c55\u7684\u5c5e\u6027 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2YDKT"}),"#I2YDKT")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")," \u65e0\u6cd5\u8fd8\u539f\u5305\uff0c\u4f7f\u7528",Object(n.b)("inlineCode",{parentName:"li"},"Nuget")," \u4e0b\u8f7d\u548c\u901a\u8fc7\u6700\u65b0\u7684\u7684\u811a\u624b\u67b6\u4e0b\u8f7d\u90fd\u63d0\u793a\u8fd9\u4e2a\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I30446"}),"#I30446")),Object(n.b)("li",{parentName:"ul"},"[\u7b54\u7591]"," \u590d\u6742\u6821\u9a8c\u4e0e\u7279\u6027\u9a8c\u8bc1\u4e0d\u80fd\u5e76\u884c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I3046U"}),"#I3046U")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 Webhook \u673a\u5236 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A3I0"}),"#I2A3I0")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u589e\u52a0 blog \u5b58\u50a8\u670d\u52a1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AMBP"}),"#I2AMBP")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Blazor Server \u73af\u5883\u4e0b EF \u7684 DbContext \u591a\u7ebf\u7a0b\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AMD2"}),"#I2AMD2")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5e0c\u671b\u5b9e\u73b0\u5de5\u4f5c\u5355\u5143\u64cd\u4f5c\u63a5\u53e3\uff08IUnitOfWork\uff09",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AOR5"}),"#I2AOR5")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(n.b)("inlineCode",{parentName:"li"},"string.ToPagedListAsync()")," \u64cd\u4f5c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2BZ3Z"}),"#I2BZ3Z")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65b0\u589e ",Object(n.b)("inlineCode",{parentName:"li"},"GraphQL"),"\uff0c",Object(n.b)("inlineCode",{parentName:"li"},"OData")," \u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2C9EH"}),"#I2C9EH")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u8feb\u5207\u671f\u671b\u652f\u6301 CAP \u5206\u5e03\u5f0f\u4e8b\u52a1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CBRF"}),"#I2CBRF")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5982\u4f55\u8ba9\u67d0\u4e2a\u65b9\u6cd5\u6216\u5b9e\u4f53\u53d8\u5316\u540e\uff0c\u4e0d\u88ab ",Object(n.b)("inlineCode",{parentName:"li"},"SavingChangesEvent")," \u7b49\u62e6\u622a ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CEM9"}),"#I2CEM9")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5efa\u8bae\u65e5\u5fd7\u5c01\u88c5\u589e\u52a0\u66f4\u591a\u62d3\u5c55\uff0c\u6bd4\u5982\uff1a\u81ea\u5b9a\u4e49\u4fdd\u5b58\u65e5\u5fd7\u6587\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2CW8V"}),"#I2CW8V")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5bf9 ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u7684\u652f\u6301\uff0c\u589e\u52a0 ",Object(n.b)("inlineCode",{parentName:"li"},"Nuget")," \u811a\u624b\u67b6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2D91U"}),"#I2D91U")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u4f7f\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"Middleware")," \u5b9e\u73b0\u53cd\u5411\u4ee3\u7406 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2DKM1"}),"#I2DKM1")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u652f\u6301\u914d\u7f6e\u591a\u4e2a ",Object(n.b)("inlineCode",{parentName:"li"},"Aop")," \u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2E6Z2"}),"#I2E6Z2")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u662f\u5426\u8ba1\u5212\u5f00\u53d1\u7c7b\u4f3c\u7f51\u5173\u7684\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2PD1L"}),"#I2PD1L")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," ",Object(n.b)("inlineCode",{parentName:"li"},"waring CS8002"),": \u5f15\u7528\u7a0b\u5e8f\u96c6 ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")," \u6ca1\u6709\u5f3a\u540d\u79f0 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2WDN2"}),"#I2WDN2")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," Oracle \u6570\u636e\u5e93\u9a71\u52a8\u96c6\u6210 ",Object(n.b)("inlineCode",{parentName:"li"},"Devart.Data.Oracle.Entity.EFCore")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2XJIU"}),"#I2XJIU"))))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v170\uff08\u5df2\u53d1\u5e03\uff09"},"v1.7.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Extras.ObjectMapper.Mapster")," \u62d3\u5c55\u5305 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LSJ"}),"#I29LSJ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Extras.Logging.Serilog")," \u62d3\u5c55\u5305 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AAN8"}),"#I2AAN8")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Extras.Web.HttpContext")," \u62d3\u5c55\u5305 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LSM"}),"#I29LSM")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5185\u7f6e ",Object(n.b)("inlineCode",{parentName:"li"},"Token")," \u5237\u65b0\u673a\u5236\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29K57"}),"#I29K57")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u52a8\u6001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\uff0c\u652f\u6301\u8fd0\u884c\u65f6\u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"OnModelCreating")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28UDT"}),"#I28UDT")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u652f\u6301\u4f9d\u8d56\u6ce8\u5165\u6392\u9664\u6307\u5b9a\u63a5\u53e3 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29693"}),"#I29693")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c4\u8303\u5316\u7ed3\u679c\u8fd4\u56de\u65f6\u95f4\u6233\u5b57\u6bb5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29697"}),"#I29697")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u57fa\u7840 ",Object(n.b)("inlineCode",{parentName:"li"},"CURD")," \u7236\u7c7b\u64cd\u4f5c\u4f8b\u5b50 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I296SR"}),"#I296SR")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},'sql.Change("\u5b9a\u4f4d\u5668\u5b8c\u6574\u7c7b\u578b\u540d\u79f0")')," \u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LAB"}),"#I29LAB")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u5ffd\u7565\u7a7a\u53c2\u6570\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29VUG"}),"#I29VUG")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5185\u7f6e\u5047\u5220\u9664\u67e5\u8be2\u8fc7\u6ee4\u5668\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29Y2R"}),"#I29Y2R")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5ffd\u7565\u7a7a\u503c\u6392\u9664\u9ed8\u8ba4\u65f6\u95f4\u683c\u5f0f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29VUV"}),"#I29VUV")),Object(n.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u7ec4\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I297R9"}),"#I297R9")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"AppAuthorizeHandler")," \u6388\u6743\u7ba1\u9053\u4e3a\u5f02\u6b65\u5904\u7406 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29MD9"}),"#I29MD9")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4\u542f\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"JWT")," \u6388\u6743\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LI4"}),"#I29LI4")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContextUtilities")," \u540d\u79f0\u6539\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContextLocal")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29KQE"}),"#I29KQE")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"UnifyResultContext")," \u540d\u79f0\u6539\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"UnifyContext")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LLZ"}),"#I29LLZ")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u53ea\u6709\u6267\u884c\u8fc1\u79fb\u547d\u4ee4\u624d\u626b\u63cf\u79cd\u5b50\u6570\u636e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29E6P"}),"#I29E6P")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u89c4\u8303\u5316\u7ed3\u679c ",Object(n.b)("inlineCode",{parentName:"li"},"Successed")," \u5c5e\u6027\u540d\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Succeeded")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29NMV"}),"#I29NMV")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Mapster")," \u5bf9\u8c61\u7ec4\u4ef6\uff0c\u91c7\u7528\u63d0\u4f9b\u62d3\u5c55\u65b9\u5f0f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29D2M"}),"#I29D2M")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"CacheManager")," \u62d3\u5c55\u7c7b ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LU1"}),"#I29LU1")),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SaveChanges")," \u62e6\u622a\u5668 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I292LO"}),"#I292LO")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u6ce8\u518c\u7684\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u4e5f\u88ab\u5f15\u7528\u5168\u5c40\u67e5\u8be2\u62e6\u622a\u5668 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29ZXJ"}),"#I29ZXJ")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u624b\u52a8\u8fd4\u56de ",Object(n.b)("inlineCode",{parentName:"li"},"BadObjectResult")," \u6216 ",Object(n.b)("inlineCode",{parentName:"li"},"ValidationProblemDetails")," \u7ed3\u679c\u7c7b\u578b\u65f6\u89c4\u8303\u5316\u7ed3\u679c\u5931\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29ZU9"}),"#I29ZU9")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u52a8\u6001 WebApi ",Object(n.b)("inlineCode",{parentName:"li"},"KeepName"),"\uff0c",Object(n.b)("inlineCode",{parentName:"li"},"KeepVerb"),"\u3001",Object(n.b)("inlineCode",{parentName:"li"},"SplitCamelCase")," \u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29X90"}),"#I29X90")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de ",Object(n.b)("inlineCode",{parentName:"li"},"\u5143\u7ec4")," \u7c7b\u578b\u51fa\u9519 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29SMV"}),"#I29SMV")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"401\uff0c403")," \u72b6\u6001\u7801\u89c4\u8303\u5316\u8fd4\u56de\u503c\u5c5e\u6027\u53d8\u5927\u5199 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29M8Y"}),"#I29M8Y")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContext")," \u7a7a\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29LU4"}),"#I29LU4")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u63a5\u53e3\u65e0\u8fd4\u56de\u503c\u6ca1\u6709\u5e94\u7528\u89c4\u8303\u5316\u7ed3\u679c bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29GT7"}),"#I29GT7")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u524d\u7aef ",Object(n.b)("inlineCode",{parentName:"li"},"Less")," \u914d\u7f6e\u6587\u4ef6\u5bfc\u81f4\u4e3b\u673a\u542f\u52a8\u5931\u8d25 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29E7P"}),"#I29E7P")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u7ed3\u679c\u8f6c\u6cdb\u578b\u540e\u5c5e\u6027\u91cd\u590d\u8d4b\u503c bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29BUO"}),"#I29BUO")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5173\u95ed ",Object(n.b)("inlineCode",{parentName:"li"},"MiniProfiler")," \u4e4b\u540e ",Object(n.b)("inlineCode",{parentName:"li"},"\u7ec4\u4e2d\u7ec4")," \u5931\u6548 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29789"}),"#I29789")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u5f02\u5e38\u8fd4\u56de ",Object(n.b)("inlineCode",{parentName:"li"},"System.Object")," \u5b57\u7b26 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2969A"}),"#I2969A")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6b63\u6570\u6570\u636e\u9a8c\u8bc1 0 \u4e5f\u9a8c\u8bc1\u901a\u8fc7 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2955T"}),"#I2955T")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u975e\u6cdb\u578b\u7c7b\u96c6\u6210\u6cdb\u578b\u63a5\u53e3\u4f9d\u8d56\u6ce8\u5165 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I294YT"}),"#I294YT")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e0d\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"new")," \u8986\u76d6\u7236\u7c7b\u7684 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28Z1A"}),"#I28Z1A")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"JsonSerializerUtility")," \u6ca1\u6709\u516c\u5f00 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28WMI"}),"#I28WMI")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlSugar")," \u62d3\u5c55\u67e5\u8be2\u6cdb\u578b\u7c7b\u578b\u6ce8\u518c\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28VMT"}),"#I28VMT")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u4e0d\u652f\u6301\u751f\u6210\u4e0d\u540c\u547d\u540d\u7a7a\u95f4\u7684\u5b9e\u4f53 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A175"}),"#I2A175")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5168\u5c40\u62e6\u622a\u5668\u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A7T2"}),"#I2A7T2")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u65b0\u589e\u6216\u66f4\u65b0\u5ffd\u7565\u7a7a\u503c\u7a7a\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2AB6C"}),"#I2AB6C")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Token")," \u751f\u6210\u52a0\u5bc6\u7b97\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29KIH"}),"#I29KIH")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u65e5\u5fd7\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28Y9D"}),"#I28Y9D")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u5b9e\u4f53\u62e6\u622a\u5668\u3001\u914d\u7f6e\u3001\u4e00\u5206\u949f\u5165\u95e8\u7b49\u7b49\u6587\u6863"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5982\u4f55\u5b9e\u73b0\u6388\u6743\u8bbf\u95ee ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I294F2"}),"#I294F2")),Object(n.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u5982\u4f55\u5b9e\u73b0\u591a\u4e2a\u6570\u636e\u5e93\u591a\u5bf9\u591a\u5b9e\u4f53\u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29G6S"}),"#I29G6S")),Object(n.b)("li",{parentName:"ul"},"[\u95ee\u7b54]"," \u52a8\u6001 WebApi \u652f\u6301\u6587\u4ef6\u4e0a\u4f20\u5417 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29R5E"}),"#I29R5E")),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u591a\u4e2a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65e0\u6cd5\u751f\u6210\u8fc1\u79fb\u4ee3\u7801 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A6II"}),"#I2A6II")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u4e0d\u505a\u5b9e\u73b0")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5b9e\u73b0 ",Object(n.b)("inlineCode",{parentName:"li"},"BuildChange")," \u4f20\u5165\u8868\u540d ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I292SN"}),"#I292SN")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u6267\u884c\u6570\u636e\u5e93\u64cd\u4f5c\u7ed3\u679c\u4e0d\u652f\u6301\u5c5e\u6027\u5ffd\u7565\u5927\u5c0f\u5199\u8d4b\u503c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I29DRQ"}),"#I29DRQ")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5f15\u5165 ",Object(n.b)("inlineCode",{parentName:"li"},"Webhook")," \u673a\u5236 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2A3I0"}),"#I2A3I0"))))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v140\uff08\u5df2\u53d1\u5e03\uff09"},"v1.4.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")," \u652f\u6301\u4e8c\u7ea7\u865a\u62df\u76ee\u5f55\u90e8\u7f72\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28B77"}),"#I28B77")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Template.RazorWithWebApi")," \u811a\u624b\u67b6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28QGI"}),"#I28QGI")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion.Template.BlazorWithWebApi")," \u811a\u624b\u67b6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27Z3O"}),"#I27Z3O")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u62d3\u5c55 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28AJ6"}),"#I28AJ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"[AppDbContext(\u8fde\u63a5\u5b57\u7b26\u4e32\uff0c\u6570\u636e\u5e93\u7c7b\u578b)]")," \u914d\u7f6e\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28QTB"}),"#I28QTB")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c ",Object(n.b)("inlineCode",{parentName:"li"},"DateTime")," \u62d3\u5c55\u65b9\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27MQA"}),"#I27MQA")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ValidationTypes")," \u9a8c\u8bc1\u6b63\u5219\u8868\u8fbe\u5f0f\u667a\u80fd\u63d0\u793a ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2801V"}),"#I2801V")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ValiationTypes.WordWithNumber")," \u9a8c\u8bc1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2805A"}),"#I2805")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u83b7\u53d6\u5ba2\u6237\u7aef\u548c\u670d\u52a1\u7aef IP \u5730\u5740 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28QV9"}),"#I28QV9")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5347\u7ea7]"," .NET 5.0 \u7248\u672c\u81f3 .NET 5.0.1 \u7248\u672c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28QU1"}),"#I28QU")),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u89c6\u56fe\u5f15\u64ce\u529f\u80fd\uff0c\u4f18\u5316\u4e0d\u89c4\u8303\u547d\u540d\u548c\u65b0\u589e\u5b57\u7b26\u4e32\u6a21\u677f\u7f16\u8bd1 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28G0S"}),"#I28G0S")),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6570\u636e\u5e93\u5b9e\u4f53\u67e5\u627e\u7b97\u6cd5\uff0c\u5e76\u4f18\u5316\u6027\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28QUQ"}),"#I28QUQ")),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u5e94\u7528\u542f\u52a8\u521d\u59cb\u5316\u6027\u80fd\u548c\u6570\u636e\u5e93\u7b2c\u4e00\u6b21\u81ea\u52a8\u914d\u7f6e ",Object(n.b)("inlineCode",{parentName:"li"},"DbSet")," \u6027\u80fd"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u914d\u7f6e\u5b9a\u4f4d\u5668\u540e\u5b9e\u4f53\u65e0\u6cd5\u6b63\u786e\u751f\u6210 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2888L"}),"#I2888L")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u79df\u6237\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u5b9e\u4f53\u751f\u6210 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2891G"}),"#I2891G")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u9a8c\u8bc1\u5931\u8d25\u63d0\u793a\u6d88\u606f\u6ca1\u6709\u5e94\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"JSON")," \u5927\u5c0f\u5199\u914d\u7f6e bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27UTX"}),"#I27UTX")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4ed3\u50a8 ",Object(n.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(n.b)("inlineCode",{parentName:"li"},"Update")," \u65b9\u6cd5\u6307\u5b9a ",Object(n.b)("inlineCode",{parentName:"li"},"ignoreNullValues")," \u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27UN6"}),"#I27UN6")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Controller")," \u6d3e\u751f\u7c7b\u5982\u679c\u8d34\u4e86 ",Object(n.b)("inlineCode",{parentName:"li"},"[Route]")," \u7279\u6027\u540e\u51fa\u73b0\u5728 ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u4e2d bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27TN7"}),"#I27TN7")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlScalar")," \u6267\u884c ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u8fd4\u56de ",Object(n.b)("inlineCode",{parentName:"li"},"Nullable")," \u7c7b\u578b\u51fa\u73b0\u8f6c\u6362\u5931\u8d25 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27S2N"}),"#I27S2N")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u7279\u6027\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27MLM"}),"#I27MLM")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u9759\u6001\u6267\u884c\u65b9\u5f0f\u548c ",Object(n.b)("inlineCode",{parentName:"li"},"sql")," \u9ad8\u7ea7\u4ee3\u7406\u65e0\u6cd5\u76d1\u542c\u6570\u636e\u5e93\u8fde\u63a5\u72b6\u6001 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27M4F"}),"#I27M4F")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4fee\u590d\u66f4\u6362 Json \u5e8f\u5217\u5316\u5e93\u65e0\u6548 bug\uff0c\u5982\u66ff\u6362\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Microsoft.AspNetCore.Mvc.NewtonsoftJson")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27M43"}),"#I27M43")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u5de5\u5177\u751f\u6210\u6a21\u578b bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27XI5"}),"#I27XI5")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u8f6f\u5220\u9664\u6ca1\u6709\u751f\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2804I"}),"#I2804I")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u8bc6\u522b\u5e26\u591a\u4e2a ",Object(n.b)("inlineCode",{parentName:"li"},"\\\\")," \u7684\u8fde\u63a5\u5b57\u7b26\u4e32\u8bc6\u522b bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I280TS"}),"#I280TS"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/91"}),"#PR91")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Furion Tools")," \u65e0\u6cd5\u53d6\u6d88\u751f\u6210 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2816M"}),"#I2816M")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u8f6c\u672c\u5730\u65f6\u95f4\u5dee 8 \u5c0f\u65f6 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28BA9"}),"#I28BA9")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u542f\u7528 ",Object(n.b)("inlineCode",{parentName:"li"},"bundle js&css")," \u538b\u7f29\u540e\u542f\u52a8\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28KRP"}),"#I28KR")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ValidationTypes.Required")," \u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/98"}),"#PR98")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c",Object(n.b)("inlineCode",{parentName:"li"},"OnValidateFailed")," \u53c2\u6570\u540d\u62fc\u5199\u9519\u8bef bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/93"}),"#PR93"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/92"}),"#PR92")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6388\u6743\u7ba1\u9053\u9a8c\u8bc1\u5931\u8d25\u8fd8\u663e\u793a\u7ed3\u679c bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/89"}),"#PR89")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md \u53cb\u60c5\u8fde\u63a5\u5730\u5740 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/88"}),"#PR88")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6a21\u677f\u811a\u624b\u67b6\u6e90\u7801\uff0c\u6dfb\u52a0 ",Object(n.b)("inlineCode",{parentName:"li"},"EFCore Tools")," \u5e93 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/87"}),"#PR87")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md Nuget \u56fe\u6807 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/85"}),"#PR85")),Object(n.b)("li",{parentName:"ul"},"[\u5e9f\u5f03]"," \u5c06 ",Object(n.b)("inlineCode",{parentName:"li"},"List")," \u8f6c ",Object(n.b)("inlineCode",{parentName:"li"},"DateTable")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/97"}),"#PR97")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u89c6\u56fe\u5f15\u64ce\u6a21\u677f\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27ZVA"}),"#I27ZVA")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"EFCore")," \u65f6\u6001\u67e5\u8be2\u6587\u6863 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28AJ6"}),"#I28AJ"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://monksoul.gitee.io/furion/docs/dbcontext-hight-query/#91111-%E6%97%B6%E6%80%81%E6%9F%A5%E8%AF%A2"}),"DOC")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4ed3\u50a8\u6587\u6863\u4e66\u5199\u7eb0\u6f0f bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/90"}),"#PR90")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u9009\u9879\u6587\u6863\u9519\u8bef bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/86"}),"#PR86")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(n.b)("inlineCode",{parentName:"li"},"\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668")," \u6587\u6863\u4e66\u5199\u9519\u8bef bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/83/files"}),"#PR83")),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u811a\u624b\u67b6\u7b49\u6587\u6863"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u7b54\u7b54\u7591")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b ",Object(n.b)("inlineCode",{parentName:"li"},"api")," \u8fd4\u56de\u7684\u503c\u81ea\u52a8\u5c06 null \u8f6c\u4e3a '' \u6216 ","[][#I286IJ]","(",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I286IJ)%EF%BC%8C%E3%80%90%E5%B7%B2%E5%85%B3%E9%97%AD%E3%80%91"}),"https://gitee.com/monksoul/Furion/issues/I286IJ)\uff0c\u3010\u5df2\u5173\u95ed\u3011")),Object(n.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u6dfb\u52a0\u7f51\u5173\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27TP7"}),"#I27TP7"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u65b0\u589e ",Object(n.b)("inlineCode",{parentName:"li"},"SqlQuery")," \u83b7\u53d6\u5355\u6761\u8bb0\u5f55\u65b9\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28M1V"}),"#I28M1V"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u5efa\u8bae]"," \u5e0c\u671b\u53ef\u4ee5\u63d0\u4f9b\u96c6\u6210 ",Object(n.b)("inlineCode",{parentName:"li"},"Serilog")," \u4f8b\u5b50 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I282J4"}),"#I282J4"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u5982\u4f55\u901a\u8fc7\u7279\u6027\u914d\u7f6e\u552f\u4e00\u7ea6\u675f ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2891L"}),"#I2891L"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u600e\u4e48\u8bfb\u53d6 ",Object(n.b)("inlineCode",{parentName:"li"},"appsettings.json")," \u6570\u7ec4 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27WUR"}),"#I27WU"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," ",Object(n.b)("inlineCode",{parentName:"li"},"IRepository")," \u51fa\u73b0\u7a7a\u5f02\u5e38 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I281IE"}),"#I281IE"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u89c4\u8303\u5316\u63a5\u53e3\u95ee\u9898\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28NMZ"}),"#I28NMZ"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011"),Object(n.b)("li",{parentName:"ul"},"[\u7591\u95ee]"," \u7edf\u4e00\u8fd4\u56de\u503c\u6a21\u578b\u4e2d OnResponseStatusCodes \u672a\u6267\u884c ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I28NNL"}),"#I28NNL"),"\uff0c\u3010\u5df2\u5173\u95ed\u3011")))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v120\uff08\u5df2\u53d1\u5e03\uff09"},"v1.2.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26OXG"}),"#I26OXG"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/78"}),"#PR78")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"[AppDbContext]")," \u914d\u7f6e\u6570\u636e\u5e93\u63d0\u4f9b\u5668\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27G3T"}),"#I27G3T")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(n.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278DD"}),"#I278DD"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278LQ"}),"#I278LQ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278CP"}),"#I278CP")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9a\u4f4d\u5668\u4ed3\u50a8 ",Object(n.b)("inlineCode",{parentName:"li"},"IDbRepository")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I276Q3"}),"#I276Q3")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(n.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u6392\u9664\u7a7a\u5b57\u7b26\u4e32\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I272OG"}),"#I272OG")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u5e93\u64cd\u4f5c ",Object(n.b)("inlineCode",{parentName:"li"},"UpdateInclude")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"UpdateExclude")," \u533f\u540d\u5bf9\u8c61\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I271X0"}),"#I271X0")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6570\u636e\u9a8c\u8bc1\u4f20\u5165\u7a7a\u5bf9\u8c61\u8df3\u8fc7\u9a8c\u8bc1\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I273R4"}),"#I273R4")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5e94\u7528\u542f\u52a8\u65f6\u652f\u6301\u6392\u9664\u7279\u5b9a\u914d\u7f6e\u6587\u4ef6\u81ea\u52a8\u52a0\u8f7d ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26U0A"}),"#I26U0A")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5355\u4e2a\u5b9e\u4f53\u8868\u540d\u524d\u7f00\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26LX0"}),"#I26LX0")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u81ea\u52a8\u914d\u7f6e\u9ed8\u8ba4\u7248\u672c\u53f7 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26XQ6"}),"#I26XQ6")),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6388\u6743\u5904\u7406\u7a0b\u5e8f\u4ee3\u7801"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b9e\u4f53\u8868\u6570\u636e\u66f4\u6539\u76d1\u542c\u63a5\u53e3 ",Object(n.b)("inlineCode",{parentName:"li"},"IEntityDataChangedListener")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278DD"}),"#I278DD"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278LQ"}),"#I278LQ")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u670d\u52a1\u63a5\u53e3 AOP \u62e6\u622a\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I278CP"}),"#I278CP")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u96ea\u82b1\u7b97\u6cd5 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26OXG"}),"#I26OXG"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/78"}),"#PR78")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c6\u56fe\u5f15\u64ce\u52a0\u8f7d\u5916\u90e8\u7a0b\u5e8f\u96c6\u51fa\u9519 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u4f9d\u8d56\u6ce8\u5165\u4ee3\u7406\u63a5\u53e3\u62a5\u7a7a\u5bf9\u8c61\u5f02\u5e38 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"EFCore")," \u53d6\u6d88\u9644\u52a0\u5b9e\u4f53\u51fa\u9519 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4ed3\u50a8\u5728\u975e Web \u8bf7\u6c42\u4e0b\u51fa\u73b0\u7a7a\u5f02\u5e38 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u591a\u4e2a\u6388\u6743\u7b56\u7565\u5171\u5b58\u95ee\u9898\u51fa\u73b0\u65e0\u6548 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u53cb\u597d\u5f02\u5e38 ",Object(n.b)("inlineCode",{parentName:"li"},"Oop.Oh")," \u4e0d\u652f\u6301\u666e\u901a\u65b9\u6cd5 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u83b7\u53d6\u591a\u79df\u6237\u5bf9\u8c61\u65f6\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u51fa\u73b0\u4f5c\u7528\u57df\u9a8c\u8bc1\u5931\u8d25 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143\u4e0d\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u62e6\u622a bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27GST"}),"#I27GST")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I26O1F]","(",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26O1F"}),"https://gitee.com/monksoul/Furion/issues/I26O1F"),"), ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27B2I"}),"#I27B2I"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27BJ6"}),"#I27BJ6"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27E5Z"}),"#I27E5Z"),", ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I27EL4"}),"#I27EL4")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e][\u5b9e\u4f53\u6570\u636e\u76d1\u542c\u5668]","(",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://monksoul.gitee.io/furion/docs/dbcontext-entitytrigger"}),"https://monksoul.gitee.io/furion/docs/dbcontext-entitytrigger"),") \u6587\u6863"),Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5e94\u7528\u542f\u52a8\u3001\u5b98\u65b9\u811a\u624b\u67b6\u3001\u6570\u636e\u5e93\u64cd\u4f5c\u6307\u5357\u3001\u5bf9\u8c61\u6620\u5c04\u3001\u89c4\u8303\u5316\u6587\u6863\u3001\u5f02\u5e38\u5904\u7406\u3001\u9274\u6743\u6388\u6743\u6587\u6863")))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v110\uff08\u5df2\u53d1\u5e03\uff09"},"v1.1.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetDbContext()")," \u83b7\u53d6\u9ed8\u8ba4\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u65b9\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContextUtility.GetCurrentHttpContext()")," \u83b7\u53d6\u5168\u5c40 ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContext")," \u4e0a\u4e0b\u6587"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.GetRequiredService<>")," \u89e3\u6790\u670d\u52a1\u65b9\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"object.GetService<>")," \u5bf9\u8c61\u62d3\u5c55\u65b9\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7b56\u7565\u6388\u6743 ",Object(n.b)("inlineCode",{parentName:"li"},"PolicyPipeline")," \u57fa\u7c7b\u65b9\u6cd5\uff0c\u652f\u6301\u591a\u91cd\u5224\u65ad\u6388\u6743"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"JWTEncryption.ValidateJwtBearerToken")," \u624b\u52a8\u9a8c\u8bc1\u9759\u6001\u65b9\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u6570\u636e\u5e93\u4e0a\u4e0b\u6587 ",Object(n.b)("inlineCode",{parentName:"li"},"InsertOrUpdateIgnoreNullValues")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"EnabledEntityStateTracked")," \u5168\u5c40\u914d\u7f6e"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger Jwt\u6388\u6743")," \u5168\u5c40\u6388\u6743\u53c2\u6570 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26GLR"}),"#I26GLR")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"InsertOrUpdate")," \u652f\u6301\u81ea\u5b9a\u4e49\u5224\u65ad\u6761\u4ef6\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I269Q1"}),"#I269Q1")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u5b57\u6bb5\u5c0f\u5199\u547d\u540d\u652f\u6301 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2695D"}),"#I2695D")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5b57\u7b26\u4e32\u6587\u672c\u5bf9\u6bd4\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I268LE"}),"#I268LE")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u5168\u5c40\u5f02\u5e38\u7279\u6027\u6d88\u606f\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2662O"}),"#I2662O")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Insert")," \u6216 ",Object(n.b)("inlineCode",{parentName:"li"},"Update")," \u6570\u636e\u5e93\u5ffd\u7565\u7a7a\u503c\u529f\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I264Q4"}),"#I264Q4")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Fur")," \u9879\u76ee\u540d\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Furion")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetRequestDbContext<>()")," \u547d\u540d\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetDbContext<>()")," \u547d\u540d\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"Db.GetDuplicateDbContext<>()")),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.GetService<>")," \u89e3\u6790\u670d\u52a1\u7684\u5e95\u5c42\u903b\u8f91\uff0c\u5927\u5927\u63d0\u9ad8\u4e86\u89e3\u6790\u670d\u52a1\u7684\u6027\u80fd"),Object(n.b)("li",{parentName:"ul"},"[\u91cd\u6784]"," \u6388\u6743\u6838\u5fc3\u4ee3\u7801\uff0c\u4fdd\u6301\u548c\u5fae\u8f6f\u4e00\u81f4\u7684\u6388\u6743\u89c4\u8303 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26DCB"}),"#I26DCB")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>")," \u65b9\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ValidateJwtBearer")," Jwt \u6388\u6743\u65b9\u6cd5\uff0c\u65e0\u9700\u624b\u52a8\u5224\u65ad\u4e86"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," Furion \u5b98\u65b9\u811a\u624b\u67b6\u751f\u6210\u540e\u7f16\u8bd1\u5f02\u5e38 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Tenant")," \u5185\u7f6e\u5c5e\u6027\u4e0d\u662f ",Object(n.b)("inlineCode",{parentName:"li"},"virtual")," \u4fee\u9970 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"dockerfile")," \u65b0\u547d\u540d\u6784\u5efa\u5931\u8d25 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u81ea\u5b9a\u4e49\u89d2\u8272\u6388\u6743\u548c\u591a\u4e2a\u6388\u6743\u5171\u5b58\u51fa\u73b0 403 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26H1L"}),"#I26H1L")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"httpContext.GetEndpoint()")," \u7a7a\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/pulls/73"}),"#PR73")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Oops.Oh")," \u7a7a\u5f02\u5e38\u548c\u4e0d\u652f\u6301\u670d\u52a1\u670d\u52a1\u629b\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26EFU"}),"#I26EFU"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26GM4"}),"#I26GM4")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"cli.ps")," \u751f\u6210\u6587\u4ef6\u7f16\u7801\u4e71\u7801 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26DVT"}),"#I26DVT")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u6587\u4ef6\u4e0a\u4f20\u6309\u94ae\u4e0d\u663e\u793a ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26B6U"}),"#I26B6U")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u89c4\u8303\u5316\u7ed3\u679c\u6388\u6743\u72b6\u6001\u7801\u5e8f\u5217\u5316\u5927\u5c0f\u5199\u4e0d\u4e00\u81f4\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26B26"}),"#I26B26")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u672a\u542f\u7528\u89c4\u8303\u5316\u7ed3\u679c\u65f6\u4e2d\u6587\u4e71\u7801 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I268T5"}),"#I268T5")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MySql")," \u5f02\u6b65\u5f02\u5e38\u6355\u83b7\u4e0d\u5230 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I265SO"}),"#I265SO")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"cli.ps1")," \u63d0\u793a\u627e\u4e0d\u5230\u6570\u636e\u5e93\u8fde\u63a5\u5b57\u7b26\u4e32 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I2647U"}),"#I2647U")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u5176\u4ed6]"," \u4ee3\u7801\u6027\u80fd\u5c0f\u4f18\u5316\u548c\u5c0f\u8c03\u6574"),Object(n.b)("li",{parentName:"ul"},"[\u5173\u95ed][#I265JV]","(",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I265JV)%EF%BC%8C%5B#I26ERA%5D(https://gitee.com/monksoul/Furion/issues/I26ERA)%EF%BC%8C"}),"https://gitee.com/monksoul/Furion/issues/I265JV)\uff0c[#I26ERA](https://gitee.com/monksoul/Furion/issues/I26ERA)\uff0c")," ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26EVW"}),"#I26EVW"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26GHC"}),"#I26GHC"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26GJ1"}),"#I26GJ1"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Furion/issues/I26O1F"}),"#I26O1F")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u4e00\u5206\u949f\u5165\u95e8\u3001\u5b89\u5168\u9274\u6743\u3001\u6570\u636e\u5e93\u7b49\u6587\u6863")))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v103\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.3\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc \u6a21\u677f\u811a\u624b\u67b6\uff1a",Object(n.b)("inlineCode",{parentName:"li"},"Fur.Template.Mvc")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," WebApi \u6a21\u677f\uff1a",Object(n.b)("inlineCode",{parentName:"li"},"Fur.Template.Api")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Mvc/WebApi \u6a21\u677f\uff1a",Object(n.b)("inlineCode",{parentName:"li"},"Fur.Template.App")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Razar Pages \u6a21\u677f\uff1a",Object(n.b)("inlineCode",{parentName:"li"},"Fur.Template.Razor")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," Blazor \u6a21\u677f\uff1a",Object(n.b)("inlineCode",{parentName:"li"},"Fur.Template.Blazor")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"PagedList")," \u5230 ",Object(n.b)("inlineCode",{parentName:"li"},"System.Collections.Generic")," \u547d\u540d\u7a7a\u95f4\u4e0b"),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u89e3\u6790\u670d\u52a1\u6027\u80fd\u95ee\u9898\uff0c\u5e95\u5c42\u4ee3\u7801\u5927\u91cf\u4f18\u5316"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"ApiSears.ControllerEnd"),"\u4e0d\u8d77\u4f5c\u7528 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I25KH6"}),"#I25KH6")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u8bf7\u6c42\u5b8c\u6210\u7ed3\u679c\u5e8f\u5217\u5316\u5c5e\u6027\u5927\u5c0f\u5199\u95ee\u9898 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I25I8R"}),"#I25I8R")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"HttpContext.GetEndpoinet()")," \u7a7a\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/pulls/73"}),"#PR73")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"\u65e0"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u5165\u95e8\u6587\u6863\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6587\u6863\u3001\u591a\u6570\u636e\u5e93\u64cd\u4f5c\u6587\u6863")))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v102\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.2\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Pomelo.EntityFrameworkCore.MySql")," \u6700\u65b0 .NET 5 \u5305\u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24ZQK"}),"#I24ZQK")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},".AddDateTimeJsonConverter(format)")," \u65f6\u95f4\u683c\u5f0f\u5e8f\u5217\u5316\u914d\u7f6e"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"DateTime")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," \u7c7b\u578b\u5e8f\u5217\u5316\u683c\u5f0f\u914d\u7f6e ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I253FI"}),"#I253FI")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Mapster")," \u5305\u81f3 ",Object(n.b)("inlineCode",{parentName:"li"},"7.0.0")," \u7248"),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.Services")," \u540d\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"App.ServiceProvider")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," ",Object(n.b)("inlineCode",{parentName:"li"},"App.ApplicationServices")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"App.GetRequestService<>()")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u975e Web \u4e3b\u673a\u6ce8\u5165\u62d3\u5c55"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"services.AddFriendlyException()")," \u7f3a\u5c11\u914d\u7f6e\u6ce8\u5165 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u6c60\u88ab\u91ca\u653e\u548c\u9ad8\u5e76\u53d1\u4e0b\u5185\u5b58\u6ea2\u51fa bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I2524K"}),"#I2524K"),"\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24UMN"}),"#I24UMN")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Sql\u4ee3\u7406")," \u8fd4\u56de\u7a7a\u6570\u636e\u65f6\u5f02\u5e38 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24TCK"}),"#I24TCK")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5de5\u4f5c\u5355\u5143 ",Object(n.b)("inlineCode",{parentName:"li"},"[UnitOfWork]")," \u591a\u6570\u636e\u5e93\u88ab\u91ca\u653e bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24Q6W"}),"#I24Q6W")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"EntityBase")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"Entity")," \u6240\u6709\u5c5e\u6027\u4e3a ",Object(n.b)("inlineCode",{parentName:"li"},"vitural")," \u4fee\u9970"),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Jwt")," \u8bfb\u53d6\u548c\u89e3\u6790\u6027\u80fd"),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u4f18\u5316\u4ee3\u7801\u652f\u6301 C# 9.0 \u6700\u65b0\u8bed\u6cd5"),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," ",Object(n.b)("inlineCode",{parentName:"li"},"MD5")," \u52a0\u5bc6\u6027\u80fd ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/pulls/71"}),"#PR71")),Object(n.b)("li",{parentName:"ul"},"[\u79fb\u9664]"," \u65e0\u7528\u6216\u672a\u4f7f\u7528\u4ee3\u7801"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," \u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u591a\u6570\u636e\u5e93\u3001\u4e00\u5206\u949f\u5165\u95e8\u6587\u6863")))),Object(n.b)("hr",null),Object(n.b)("h2",{id:"v100\uff08\u5df2\u53d1\u5e03\uff09"},"v1.0.0\uff08\u5df2\u53d1\u5e03\uff09"),Object(n.b)("ul",null,Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u65b0\u7279\u6027")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u7f51\u7edc\u8bf7\u6c42 ",Object(n.b)("inlineCode",{parentName:"li"},"RemoteRequest")," \u7ec4\u4ef6 ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I1YYWD"}),"#I1YYWD")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},".AddInjectBase()")," \u6ce8\u5165\uff0c\u53ea\u5305\u542b\u57fa\u7840\u670d\u52a1\u6ce8\u5165"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u6240\u6709\u670d\u52a1\u90fd\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"IServiceCollection")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"IMvcBuilder")," \u6ce8\u5165"),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," \u629b\u5f02\u5e38\u72b6\u6001\u7801\u8bbe\u7f6e\u529f\u80fd ",Object(n.b)("inlineCode",{parentName:"li"},"StatusCode")),Object(n.b)("li",{parentName:"ul"},"[\u65b0\u589e]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u5e8f\u5217\u5316\u652f\u6301 ",Object(n.b)("inlineCode",{parentName:"li"},"Pascal")," \u5c5e\u6027\u547d\u540d\u65b9\u5f0f"))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u7a81\u7834\u6027\u53d8\u5316")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," ",Object(n.b)("strong",{parentName:"li"},"\u6240\u6709\u7684\u5305\u4e3a ",Object(n.b)("inlineCode",{parentName:"strong"},".NET 5")," \u6b63\u5f0f\u7248")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u95ee\u9898\u4fee\u590d")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"SqlProxy")," \u4ee3\u7406\u5f02\u6b65\u5904\u7406 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u7c7b\u578b ",Object(n.b)("inlineCode",{parentName:"li"},"Datetime")," \u8f6c ",Object(n.b)("inlineCode",{parentName:"li"},"DateTimeOffset")," bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5c5e\u6027\u9996\u5b57\u6bcd\u5927\u5c0f\u5199\u5e8f\u5217\u5316\u4e0d\u5339\u914d\u51fa\u73b0 ",Object(n.b)("inlineCode",{parentName:"li"},"null")," bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5bf9\u8c61\u5e8f\u5217\u5316\u4e2d\u6587\u51fa\u73b0\u4e71\u7801 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u9ed8\u8ba4\u5e8f\u5217\u5316\u914d\u7f6e\u65e0\u6548 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u6570\u636e\u5e93\u975e\u4f9d\u8d56\u6ce8\u5165\u65b9\u5f0f\u63d0\u4ea4\u65e0\u6548 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5e94\u7528\u7a0b\u5e8f\u6c60\u63d0\u4ea4\u6240\u6709 ",Object(n.b)("inlineCode",{parentName:"li"},"DbContext")," \u7a7a\u5f02\u5e38 bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Saas")," \u591a\u79df\u6237 ",Object(n.b)("inlineCode",{parentName:"li"},"Tenant")," \u7c7b\u578b\u5b57\u7b26\u4e32\u5c5e\u6027\u5728 ",Object(n.b)("inlineCode",{parentName:"li"},"MySql")," \u6570\u636e\u5e93\u4e0b\u51fa\u73b0 ",Object(n.b)("inlineCode",{parentName:"li"},"longtext")," \u7c7b\u578b bug"),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Mvc")," \u81ea\u52a8\u9a8c\u8bc1\u5b57\u7b26\u4e32\u7a7a\u503c bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24M2T"}),"#I24M2T")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u679a\u4e3e\u6ce8\u91ca\u88ab\u8986\u76d6 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24N6J"}),"#I24N6J")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5ffd\u7565\u89c4\u8303\u5316\u7ed3\u679c\u65e0\u6548 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24B8P"}),"#I24B8P")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Swagger")," \u9ed8\u8ba4 ",Object(n.b)("inlineCode",{parentName:"li"},"ContentType")," \u4e0d\u662f ",Object(n.b)("inlineCode",{parentName:"li"},"applicaiton/json")," bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24F3U"}),"#I24F3U")),Object(n.b)("li",{parentName:"ul"},"[\u4fee\u590d]"," \u5185\u7f6e ",Object(n.b)("inlineCode",{parentName:"li"},"System.Text.Json")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"Newtonsoft.Json")," \u51b2\u7a81 bug ",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/issues/I24F3U"}),"#I24F3U")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u5176\u4ed6\u66f4\u6539")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," ",Object(n.b)("inlineCode",{parentName:"li"},"Fur")," \u6846\u67b6\u57df\u540d\u4e3a\uff1a",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://furos.cn"}),"https://furos.cn")),Object(n.b)("li",{parentName:"ul"},"[\u8c03\u6574]"," \u4ed3\u50a8 ",Object(n.b)("inlineCode",{parentName:"li"},"FromSqlRaw")," \u548c ",Object(n.b)("inlineCode",{parentName:"li"},"FromSqlInterpolated")," \u63a5\u53e3\u4f4d\u7f6e"),Object(n.b)("li",{parentName:"ul"},"[\u4f18\u5316]"," \u6570\u636e\u52a0\u89e3\u5bc6\u6027\u80fd\uff0c",Object(n.b)("a",Object(i.a)({parentName:"li"},{href:"https://gitee.com/monksoul/Fur/pulls/70"}),"#PR70")))),Object(n.b)("li",{parentName:"ul"},Object(n.b)("p",{parentName:"li"},Object(n.b)("strong",{parentName:"p"},"\u6587\u6863")),Object(n.b)("ul",{parentName:"li"},Object(n.b)("li",{parentName:"ul"},"[\u66f4\u65b0]"," README.md\u3001\u6846\u67b6\u4ecb\u7ecd\u3001\u6570\u636e\u5e93\u4e0a\u4e0b\u6587\u3001\u914d\u7f6e\u9009\u9879\u3001\u591a\u79df\u6237\u3001\u8de8\u57df\u6587\u6863")))))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/docs/404.html b/docs/404.html index 198d87ab2bf..203c8ac110f 100644 --- a/docs/404.html +++ b/docs/404.html @@ -8,14 +8,14 @@ Page Not Found | Furion - +
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- + \ No newline at end of file diff --git a/docs/blog/fileupload-download/index.html b/docs/blog/fileupload-download/index.html index cc6cc5cb082..581893efd3d 100644 --- a/docs/blog/fileupload-download/index.html +++ b/docs/blog/fileupload-download/index.html @@ -8,7 +8,7 @@ 3. 文件上传下载 | Furion - + @@ -29,7 +29,7 @@
using (var stream = System.IO.File.Create(filePath))
{
await formFile.CopyToAsync(stream);
}
}
}
return Ok(new { count = files.Count, size });
}
- + diff --git a/docs/blog/httpcontext/index.html b/docs/blog/httpcontext/index.html index 8f7d34821c0..24de3395643 100644 --- a/docs/blog/httpcontext/index.html +++ b/docs/blog/httpcontext/index.html @@ -8,7 +8,7 @@ 2. HttpContext 应用 | Furion - + @@ -26,7 +26,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

ControllerBase 派生类中#

ControllerBase 派生类中,我们可以直接通过 HttpContext 属性获取 HttpContext 对象。

通过注入 IHttpContextAccessor#

Furion 框架中,默认已经注册了 IHttpContextAccessor 服务,所以我们可以通过构造函数注入该对象获取。

public class AppService
{
public AppService(IHttpContextAccessor httpContextAccessor)
{
var httpContext = httpContextAccessor.HttpContext;
}
}

通过 HttpContextLocal 静态类#

Furion 框架提供了 HttpContextLocal 静态类方式获取 HttpContext,如:

var HttpContext = HttpContextLocal.Current();

通过 App.HttpContext#

App 静态类也提供了 App.HttpContext 获取 HttpContext 对象。

HttpContext 拓展方法#

Furion 框架也提供了一些常用的 HttpContext 拓展方法

获取当前请求的特性#

var attribute = httpContext.GetMetadata<SomeAttribute>();

设置 Swagger 自动授权#

httpContext.SigninToSwagger("你的token");

退出 Swagger 授权#

httpContext.SignoutToSwagger();

获取本地 IP 地址#

var ipv4 = httpContext.GetLocalIpAddressToIPv4();
var ipv6 = httpContext.GetLocalIpAddressToIPv6();

获取客户端 IP 地址#

var ipv4 = httpContext.GetRemoteIpAddressToIPv4();
var ipv6 = httpContext.GetRemoteIpAddressToIPv6();

判断是否是 Ajax 请求#

var isAjaxRequest = httpContext.IsAjaxRequest();
- + diff --git a/docs/blog/index.html b/docs/blog/index.html index 10184e13701..0386304d8e4 100644 --- a/docs/blog/index.html +++ b/docs/blog/index.html @@ -8,7 +8,7 @@ Blog | Furion - + @@ -29,7 +29,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/download/index.html b/docs/blog/tags/download/index.html index 19bc0424672..c0254597e7b 100644 --- a/docs/blog/tags/download/index.html +++ b/docs/blog/tags/download/index.html @@ -8,7 +8,7 @@ Posts tagged "download" | Furion - + @@ -27,7 +27,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1 post tagged with "download"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}
- + diff --git a/docs/blog/tags/furion/index.html b/docs/blog/tags/furion/index.html index 90e6ee82dcb..e91d8a059b2 100644 --- a/docs/blog/tags/furion/index.html +++ b/docs/blog/tags/furion/index.html @@ -8,7 +8,7 @@ Posts tagged "furion" | Furion - + @@ -29,7 +29,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with "furion"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/furos/index.html b/docs/blog/tags/furos/index.html index 9c1294489fb..32a1c5dfecd 100644 --- a/docs/blog/tags/furos/index.html +++ b/docs/blog/tags/furos/index.html @@ -8,7 +8,7 @@ Posts tagged "furos" | Furion - + @@ -29,7 +29,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with "furos"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/httpcontext/index.html b/docs/blog/tags/httpcontext/index.html index a2e97baf038..430fe175054 100644 --- a/docs/blog/tags/httpcontext/index.html +++ b/docs/blog/tags/httpcontext/index.html @@ -8,7 +8,7 @@ Posts tagged "httpcontext" | Furion - + @@ -27,7 +27,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1 post tagged with "httpcontext"

View All Tags

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/index.html b/docs/blog/tags/index.html index aa42ebe1258..725e19f73ae 100644 --- a/docs/blog/tags/index.html +++ b/docs/blog/tags/index.html @@ -8,7 +8,7 @@ Tags | Furion - + @@ -25,7 +25,7 @@ - + diff --git a/docs/blog/tags/net-5/index.html b/docs/blog/tags/net-5/index.html index feff9467ffe..a75598320bb 100644 --- a/docs/blog/tags/net-5/index.html +++ b/docs/blog/tags/net-5/index.html @@ -8,7 +8,7 @@ Posts tagged ".net5" | Furion - + @@ -29,7 +29,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with ".net5"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/net/index.html b/docs/blog/tags/net/index.html index d74688cb519..3cc090b25f2 100644 --- a/docs/blog/tags/net/index.html +++ b/docs/blog/tags/net/index.html @@ -8,7 +8,7 @@ Posts tagged ".net" | Furion - + @@ -29,7 +29,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with ".net"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/netcore/index.html b/docs/blog/tags/netcore/index.html index 5f299621c35..fbbacbb9feb 100644 --- a/docs/blog/tags/netcore/index.html +++ b/docs/blog/tags/netcore/index.html @@ -8,7 +8,7 @@ Posts tagged ".netcore" | Furion - + @@ -29,7 +29,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3 posts tagged with ".netcore"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}

2. HttpContext 应用

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

HttpContext 重大调整#

ASP.NET 的时代,我们通常通过 HttpContext 全局静态类获取请求上下文,但在 ASP.NET Core 中,HttpContext 是一个非静态的抽象类,无法手动创建,也无法通过静态获取。

虽然在 ASP.NET Core 中无法直接获取 HttpContext 对象。但是微软也提供了注入 IHttpContextAccessor 方式获取。

HttpContext 多种获取方式#

- + diff --git a/docs/blog/tags/upload/index.html b/docs/blog/tags/upload/index.html index 452a4ac88c4..b00dc1b0620 100644 --- a/docs/blog/tags/upload/index.html +++ b/docs/blog/tags/upload/index.html @@ -8,7 +8,7 @@ Posts tagged "upload" | Furion - + @@ -27,7 +27,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1 post tagged with "upload"

View All Tags

3. 文件上传下载

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

文件下载#

[HttpGet, NonUnify]
public IActionResult FileDownload(string path, string fileName)
{
string filePath = Path.GetFullPath("~/temp/").Replace("~\\", "") + path;
return new FileStreamResult(new FileStream(filePath, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName };
}
- + diff --git a/docs/blog/welcome/index.html b/docs/blog/welcome/index.html index 559692349a6..9a4f1dac6ff 100644 --- a/docs/blog/welcome/index.html +++ b/docs/blog/welcome/index.html @@ -8,7 +8,7 @@ 1. Furion 介绍 | Furion - + @@ -26,7 +26,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1. Furion 介绍

dotNET China

dotNET China

为中国 .NET 开发者提供优质的资讯和技术分享。

star fork GitHub stars GitHub forks GitHub license nuget

让 .NET 开发更简单,更通用,更流行。

💐 序言#

无私奉献不是天方夜谭,有时候,我们也可以做到。

🍕 名字的由来#

故事是这样子的:

自微软宣布 .NET 5 平台消息之后,就琢磨着开发一个基于 .NET 5 平台的开发框架,想做第一个吃 .NET 5 螃蟹尝鲜之人。

一开始想到了 Lazier 作为框架的名称,中文有 更懒 的意思。符合我的 “一切从简,只为了更懒” 的开发理念。

但是 更懒更烂 中文读音相近且没有特色,而且寓意也不是很好,对此换名问题苦恼了好些天。

刚好有一次在 QQ 群中无意间刷到了群友发的 “先知” 单词:Furion,就那一刻,就认定它了!

Furion 中文有 先知 的意思,恰好符合我创造框架的初衷。所以,Furion 就诞生了。

🍔 关于 LOGO#

Furion 标志设计理念是借鉴著名的 袋鼠理论 设计的。

袋鼠具有长腿、育袋、自我奔跑特点。

  • 长腿:代表着 Furion 拥有稳健的双腿,走在科技的前沿,走的更远,跑的更快。
  • 育袋:小育袋、大作为。期待 Furion 能够育孕出更多 .NET 优秀开发者和生机勃勃的生态。
  • 自我奔跑Furion 自身也要不断学习、不断进步、不断创新、不断开拓。

🍯 开源案例#

  • 考试君:基于 Furion 的在线考试系统
  • 园丁:基于 Furion + Blazor 的超简单后台管理系统
  • Queer:基于 Furion + Layui 的通用型管理系统
  • Pear Admin:基于 Furion + PearAdmin 管理系统
  • JoyAdmin:基于 Furion + iviewadmin 开发的管理系统
  • YShop:基于 Furion + Vue 开发的移动电商项目

🍟 文档地址#

目前文档正在逐步完善中。

🥦 系列教程#

🌭 开源地址#

🍿 Docker 镜像#

  • Docker Hub 线上镜像
docker run --name furion -p 5000:80 monksoul/furion:v1.4.3
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Furion 项目根目录打包 Furion 镜像:

docker build -t furion:v1.4.3 .

打包成功后,直接 docker run

docker run --name furion -p 5000:80 furion:v1.4.3

🥥 框架拓展包#

包类型名称版本描述
nugetFurionnugetFurion 核心包
nugetFurion.Extras.Authentication.JwtBearernugetFurion Jwt 拓展包
nugetFurion.Extras.DependencyModel.CodeAnalysisnugetFurion CodeAnalysis 拓展包
nugetFurion.Extras.Web.HttpContextnugetFurion HttpContext 拓展包
nugetFurion.Extras.ObjectMapper.MapsternugetFurion Mapster 拓展包
nugetFurion.Extras.DatabaseAccessor.SqlSugarnugetFurion SqlSugar 拓展包
nugetFurion.Extras.DatabaseAccessor.DappernugetFurion Dapper 拓展包
nugetFurion.Extras.Logging.SerilognugetFurion Serilog 拓展包

🍄 框架脚手架#

模板类型名称版本描述
nugetFurion.Template.MvcnugetMvc 模板
nugetFurion.Template.ApinugetWebApi 模板
nugetFurion.Template.AppnugetMvc/WebApi 模板
nugetFurion.Template.RazornugetRazorPages 模板
nugetFurion.Template.RazorWithWebApinugetRazorPages/WebApi 模板
nugetFurion.Template.BlazornugetBlazor 模板
nugetFurion.Template.BlazorWithWebApinugetBlazor/WebApi 模板

如何使用脚手架

🍎 框架特点#

  • 全新面貌:基于 .NET 5 平台,没有历史包袱
  • 极易入门:只需要一个 Inject() 即可完成配置
  • 极速开发:内置丰富的企业应用开发功能
  • 极少依赖:框架只依赖两个第三方包
  • 极其灵活:轻松面对多变复杂的需求
  • 极易维护:采用独特的架构思想,只为长久维护设计
  • 完整文档:提供完善的开发文档

🥞 架构设计#

正在整理中...

🥝 功能模块#

🥐 框架依赖#

Furion 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Furion 仅集成了以下两个依赖:

麻雀虽小五脏俱全。Furion 即使只集成了这两个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求#

  • Visual Studio 2019 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台#

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • MariaDB
    • PostgreSQL
    • InMemoryDatabase
    • Oracle
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能#

Furion 目前采用 Visual Studio 2019 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🌴 Stars 趋势图#

Stargazers over time

🍚 关于作者#

一个拥有近 13 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎,MIP(dotNET China Most Influential Professionals) 专家,同时多次获得开源中国 Gitee 授予 GVP 证书。

🍤 项目成员#

🎈 欢迎更多的开发者加入 Furion 大家庭。

🍝 他们都在用#

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 夫上技术(阳江)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司
  • 上海奥达科股份有限公司
  • 中山市泓升软件科技有限公司
  • 唐山天权建筑科技有限公司
  • 北京帝龙科技有限公司
  • 深圳市希立网络有限公司
  • 广州市飞帆计算机技术有限公司
  • 泉州市润海信息科技有限公司
  • 成都市彼岸里信息科技有限公司
  • 福建省山水生活服务集团有限公司
  • 安徽宝典网络科技有限公司
  • 西安空岛网络科技有限公司
  • 果糖大数据科技(南通)有限公司
  • 上海楷青信息技术有限公司
  • 上海邮银通信发展有限公司
  • 合纵动力软件科技有限公司
  • 深圳合纵动力软件科技有限公司
  • 北京帝龙科技有限公司

如果您的项目使用到 Furion 开发,可以告诉我们。

🍻 贡献代码#

Furion 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南

🍍 捐赠列表#

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10Nice 的小僧,我们的 dotnetchina 马上火起来了
😮 木木 Woody10感谢您的开源项目!
😚 Joker HouQQ 超级会员一个月
🤠 ccdfzQQ 专属红包 199
🌝 天夫李总支付宝 6666Furion 非常有意思,持续关注
😝 六尘子微信红包 199公司已经使用,小小敬意
🤠 ccdfzQQ 专属红包 200赞助一根内存条
🤑 邓亮灯28.88感谢您的开源项目!
😬 天道酬勤微信二维码 188小小心意
🥰 却月居士QQ 专属红包 100恭喜发财
🤩 鲁旭100感谢您的开源项目!
😬 散客行微信二维码 666终于找到一个不错的框架
😌 本心100项目功能很强大
🙆‍♂️ 毕业生100请你喝杯咖啡
🦹‍♀️ 猪鼻子微信二维码 668
🧟‍♂️ 明年·今日200使用的框架里最爽的,最理想的!加油
👨‍🎓 过去的过去50感谢您的开源项目!
👨‍🔧 万里兮100新公司的第一个项目从 Furion 开始
👴 Muphalem20很热心很亲切的开发者,加油!
💂‍♂️ 吃锅巴的码农微信二维码 500就冲你的文档写得好!
🤴 三重罗生门微信红包 200下次烤鱼你请!
🤵 李涛10加油,我们看到了 dotnet 美好的明天 :)
😂 !@#$%^&QQ 专属红包 100刚接触 furion,文档真棒
😵 李斌20看到一个不错的框架,学习学习,感谢作者的无私奉献
😞 逞强QQ 专属红包 20恭喜发财
🤒 顾锦松QQ 专属红包 200期待文档完成时候
🧟‍♀️ 哈哈微信赞赏码 1000点赞作者!
🍍 Z微信赞赏码 100恭喜孩子诞生,谢谢大佬
🍲 海涛50恭喜
😣 h微信赞赏码 100qq82683656
👱‍♀️ 冷大大微信赞赏码 100加快文档和教学补充哦,另外需要钉钉群,平常不用 QQ
👜 腾坤微信赞赏码 10感谢您的开源项目,QQ:565728589
🚆 文耶耶微信赞赏码 10很棒
🎟 Cynthiax微信转账 5000一路看着过来,小小心意
🥴 一花一世界微信赞赏码 10感谢开源,感谢持续更新
🥪 。微信赞赏码 2感谢
🎄微信赞赏码 20感谢你的开源项目

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Furion 越走越远。

如果想成为 Furion 支持者或赞助商,请考虑:

🥔 QQ 交流群#

dotNET 中国 ① 🥇(已满

dotNET 中国 ②(空余)

🧆 友情链接#

👉 Furion 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor 👉 IoTSharp 👉 Anno.Core 👉 WaterCloud 👉 OpenAuth.Net

🍵 特别鸣谢#

在这里特别感谢 QQ 网名:蓝狐星Furion 提供演示云服务器。

- + diff --git a/docs/docs/appstartup/index.html b/docs/docs/appstartup/index.html index e88db2de484..43a76ed5d7b 100644 --- a/docs/docs/appstartup/index.html +++ b/docs/docs/appstartup/index.html @@ -8,7 +8,7 @@ 3. 应用启动 | Furion - + @@ -48,7 +48,7 @@
namespace Furion.Web.Entry
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
}
}
}
Startup.cs 代码迁移

只需要将 ConfigureServicesConfigure 方法代码迁移到 Furion.Web.Core.Startup.cs 中即可,而 Startup.cs 中两个方法留空即可。

非常简单吧。我们后续创建任何 MVCRazorPagesBlazor 项目只需要添加 Furion.Web.Core 引用和调用 Inject() 即可。

3.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/auth-control/index.html b/docs/docs/auth-control/index.html index 624333da882..c2c2cc2f9e9 100644 --- a/docs/docs/auth-control/index.html +++ b/docs/docs/auth-control/index.html @@ -8,7 +8,7 @@ 15. 安全鉴权 | Furion - + @@ -30,7 +30,7 @@
namespace Furion.Web.Core
{
/// <summary>
/// JWT 授权自定义处理程序
/// </summary>
public class JwtHandler : AppAuthorizeHandler
{
/// <summary>
/// 重写 Handler 添加自动刷新收取逻辑
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override async Task HandleAsync(AuthorizationHandlerContext context)
{
// 自动刷新 token
if (JWTEncryption.AutoRefreshToken(context, context.GetCurrentHttpContext()))
{
await AuthorizeHandleAsync(context);
}
}
/// <summary>
/// 验证管道,也就是验证核心代码
/// </summary>
/// <param name="context"></param>
/// <param name="httpContext"></param>
/// <returns></returns>
public override Task<bool> PipelineAsync(AuthorizationHandlerContext context, DefaultHttpContext httpContext)
{
// 检查权限,如果方法时异步的就不用 Task.FromResult 包裹,直接使用 async/await 即可
return Task.FromResult(true);
}
}
}

15.5.3 客户端部分#

客户端每次请求需将 accessTokenrefreshToken 放到请求报文头中传送到服务端,格式为:

Authorization: Bearer 你的token
X-Authorization: Bearer 你的刷新token
特别注意

在正常开发中,refreshToken 无需每次请求携带,而是 accessToken 即将过期之后携带即可。可以在客户端自行判断 accessToken 是否即将过期。

如果 Token 过期,那么 Furion 将自动根据有效期内的 refreshToken 自动生成新的 AceessToken,并在 响应报文 中返回,如:

access-token: 新的token
x-access-token: 新的刷新token
存储新的 Token

前端需要获取 响应报文 新的 token 和刷新 token 替换之前在客户处存储旧的 token 和刷新 token。

15.6 获取 Jwt 存储的信息#

// 获取 `Jwt` 存储的信息
var userId = App.User?.FindFirstValue("键");

注意引入 System.Security.Claims 命名空间

15.7 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 鉴权授权 知识可查阅 ASP.NET Core - 安全和标识 章节。

Last updated on by Monk
- + diff --git a/docs/docs/author/index.html b/docs/docs/author/index.html index 0b841cdd54a..b80c61a8987 100644 --- a/docs/docs/author/index.html +++ b/docs/docs/author/index.html @@ -8,7 +8,7 @@ 1.2 关于作者 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.2 关于作者

互联网账号#

  • 百小僧
  • Monk/MonkSoul

技术能力#

自 2008 年 接触 IT 这个行业也有十余年了,在 后端(.NET/.NET Core/Java/PHP)、移动端(Xamarin/小程序/Java/Objective-C)、桌面端(Winform/WPF/Electron)、前端(Node/React/Vue/Angular)、设计(Photoshop、CDR、AI)等主流领域略知一二。

同时在技术培训领域也多有涉足。MIP(dotNET China Most Influential Professionals) 专家,同时多次获得开源中国 Gitee 授予 GVP 证书。

兴趣爱好#

对新技术颇感兴趣,喜欢开源事业,喜欢分享技术。

喜欢看博客园、看开源中国、看 Github/Gitee、看抖音、看动漫、看美剧。

个人主页#

https://gitee.com/monksoul

https://github.com/monksoul

Last updated on by Monk
- + diff --git a/docs/docs/benchmark/index.html b/docs/docs/benchmark/index.html index 97327c6507a..7fe0e332954 100644 --- a/docs/docs/benchmark/index.html +++ b/docs/docs/benchmark/index.html @@ -8,7 +8,7 @@ 29.3 基准测试 | Furion - + @@ -27,7 +27,7 @@
[Benchmark]
public byte[] Md5() => md5.ComputeHash(data);
}
public class Program
{
public static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<Md5VsSha256>();
}
}
}

29.3.3.2 查看结果#

运行控制器程序,将得到以下结果

BenchmarkDotNet=v0.12.0, OS=Windows 10.0.17763.805 (1809/October2018Update/Redstone5)
Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
[Host] : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
Net472 : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
NetCoreApp30 : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT
CoreRt30 : .NET CoreRT 1.0.28231.02 @Commit: 741d61493c560ba96e8151f9e56876d4d3828489, X64 AOT
Mono : Mono 6.4.0 (Visual Studio), X64
MethodRuntimeNMeanErrorStdDevRatio
Sha256.NET 4.7.210007.735 us0.1913 us0.4034 us1.00
Sha256.NET Core 3.010003.989 us0.0796 us0.0745 us0.50
Sha256CoreRt 3.010004.091 us0.0811 us0.1562 us0.53
Sha256Mono100013.117 us0.2485 us0.5019 us1.70
Md5.NET 4.7.210002.872 us0.0552 us0.0737 us1.00
Md5.NET Core 3.010001.848 us0.0348 us0.0326 us0.64
Md5CoreRt 3.010001.817 us0.0359 us0.0427 us0.63
Md5Mono10003.574 us0.0678 us0.0753 us1.24
Sha256.NET 4.7.21000074.509 us1.5787 us4.6052 us1.00
Sha256.NET Core 3.01000036.049 us0.7151 us1.0025 us0.49
Sha256CoreRt 3.01000036.253 us0.7076 us0.7571 us0.49
Sha256Mono10000116.350 us2.2555 us3.0110 us1.58
Md5.NET 4.7.21000017.308 us0.3361 us0.4250 us1.00
Md5.NET Core 3.01000015.726 us0.2064 us0.1930 us0.90
Md5CoreRt 3.01000015.627 us0.2631 us0.2461 us0.89
Md5Mono1000030.205 us0.5868 us0.6522 us1.74

29.3.3.3 导出报表#

也可以导出各种图表

29.3.4 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 BenchmarkDotNet 知识可查阅 BenchmarkDotNet 官网

Last updated on by Monk
- + diff --git a/docs/docs/cache/index.html b/docs/docs/cache/index.html index 65e90cc123f..1d558a5697a 100644 --- a/docs/docs/cache/index.html +++ b/docs/docs/cache/index.html @@ -8,7 +8,7 @@ 14. 分布式缓存 | Furion - + @@ -42,7 +42,7 @@
await _cache.SetAsync("cachedTimeUTC", encodedCurrentTimeUTC, options);
return RedirectToPage();
}
}

14.6 分布式缓存建议#

确定 IDistributedCache 最适合你的应用的实现时,请考虑以下事项:

  • 现有基础结构
  • 性能要求
  • 成本
  • 团队经验

缓存解决方案通常依赖于内存中的存储以快速检索缓存的数据,但是,内存是有限的资源,并且很昂贵。 仅将常用数据存储在缓存中。

通常,Redis 缓存提供比 SQL Server 缓存更高的吞吐量和更低的延迟。 但是,通常需要进行基准测试来确定缓存策略的性能特征。

SQL Server 用作分布式缓存后备存储时,对缓存使用同一数据库,并且应用的普通数据存储和检索会对这两种情况的性能产生负面影响。 建议使用分布式缓存后备存储的专用 SQL Server 实例。

14.7 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 分布式缓存 知识可查阅 ASP.NET Core - 分布式缓存 章节。

Last updated on by Monk
- + diff --git a/docs/docs/configuration/index.html b/docs/docs/configuration/index.html index 4f234db38f2..36e2f14227b 100644 --- a/docs/docs/configuration/index.html +++ b/docs/docs/configuration/index.html @@ -8,7 +8,7 @@ 4.1 配置 | Furion - + @@ -24,7 +24,7 @@
namespace Furion.Web.Entry.Controllers
{
[Route("api/[controller]")]
public class DefaultController : ControllerBase
{
[HttpGet]
public string Get([FromServices] IConfiguration configuration)
{
return $@"名称:{configuration["AppInfo:Name"]},
版本:{configuration["AppInfo:Version"]},
公司:{configuration["AppInfo:Company"]}";
}
}
}
依赖注入的方式

通过依赖注入注入实例有几种方式:

  • 构造函数注入方式
private readonly IConfiguration _configuration;
public DefaultController(IConfiguration configuration)
{
_configuration = configuration;
}
  • 参数注入方式 [FromServices]
public string Get([FromServices] IConfiguration configuration)
{
}
  • 属性注入方式
public IConfiguration Configuration { get; set; }

想了解更多关于《ASP.NET Core - 依赖注入》 知识

4.1.2.3 如何选择读取方式#

  • 在可依赖注入类中,依赖注入 IConfiguration 读取
  • 在静态类/非依赖注入类中,选择 App.Configuration[jsonKey] 读取

4.1.3 路径符 查找节点#

ASP.NET Core 中,配置采用 : 分隔符来读取分层配置数据。如上述例子中的 AppInfo:Name。如有更多层级数据则只需要通过 : 进入下一层节点即可。

假设我们有以下配置信息:

{
"AppInfo": {
"Name": "Furion",
"Version": "1.0.0",
"Company": {
"Name": "Baiqian",
"Address": {
"City": "中国",
"Province": "广东省",
"Detail": "中山市东区紫马公园西门"
}
}
}
}
var companyName = App.Configuration["AppInfo:Name"]; // => Furion

4.1.4 自定义配置文件#

大多情况下,我们的配置只需要在 appsettings.json 中配置即可,但一些特殊情况下,我们希望某些组件或功能拥有独立的配置,这个时候就需要用到自定义配置,Furion 目前支持 .json.xml 两种方式配置,如:

Furion.Web.Entry/emailsetting.json
{
"outlook": {
"smtp": {
"server": "smtp.office365.com",
"port": "587",
"ssl": "STARTTLS"
},
"pop": {
"server": "outlook.office365.com",
"port": "995",
"ssl": "TLS"
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<MyKey>MyXMLFile Value</MyKey>
<Position>
<Title>Title from MyXMLFile</Title>
<Name>Name from MyXMLFile</Name>
</Position>
<Logging>
<LogLevel>
<Default>Information</Default>
<Microsoft>Warning</Microsoft>
</LogLevel>
</Logging>
</configuration>
xml 配置事项

如果采用 xml 配置,那么文件名必须以 .config.xml 结尾(不区分大小写)。

特别说明

Furion 框架会在启动时自动扫描每一个项目层根目录下的 *.json*.xml 文件加入配置中,所以无需手工配置。

新增 *.json*.xml 文件的属性复制到输出目录设置为始终复制或较新复制,否则不会载入。另外配置文件不能出现重名,也就是保证整个项目中配置文件名字唯一。

同时 Furion 提供了非常灵活的方式支持自定义配置文件读取,如:

4.1.4.1 读取 emailsetting.json 配置#

读取自定义配置文件和读取 appsettings.json 一致,系统会自动从多个配置文件中读取输入,如:

var smtpServer = App.Configuration["outlook:smtp:server"]; // => smtp.office365.com

4.1.4.2 排除特定配置文件#

有些时候,我们不需要 .json.xml 自动载入配置中,我们只需要在启动层 appsettings.json 中添加 IgnoreConfigurationFiles 节点即可:

{
"IgnoreConfigurationFiles": ["runtime.json"]
}

4.1.5 不同环境读取#

在实际应用开发中,我们可能会根据不同的环境加载不同的配置文件,如 数据库连接字符串

这时我们只需要遵循特定命名规范 {name}.{Environment}.json 即可。如:

  • appsettings.Development.json
  • appsettings.Staging.json
  • appsettings.Production.json
  • emailsetting.Development.json
  • emailsetting.Staging.json
  • emailsetting.Production.json

这时,ASP.NET Core 会在应用启动时自动加载不同环境的配置文件。

4.1.6 配置更改通知(热更新#

.NET Core 应用程序中,配置支持更改通知,也就是热更新操作。一旦监听到 appsetting.json 或自定义配置文件发生变动,就会触发 OnChange 方法。代码如下:

var appInfoConfiguration = App.Configuration["AppInfo"];
ChangeToken.OnChange(() => appInfoConfiguration.GetReloadToken(), () =>
{
var name = appInfoConfiguration["Name"]; // 实时的最新值
var version = appInfoConfiguration["Version"]; // 实时的最新值
});

4.1.7 手动添加配置文件#

有些时候,我们的配置文件没有放在项目的根目录下,这时候我们需要手动载入自定义配置文件,只需要在 Program.cs 中加载即可:

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
// 加载自定义配置
config.AddJsonFile("MyConfig.json", optional: true, reloadOnChange: true);
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
补充说明
  • 获取项目目录:AppContext.BaseDirectory
  • 获取网站根目录:Directory.GetCurrentDirectory()

4.1.8 配置的优缺点#

  • 优点

    • 能够在系统运行时快速读取
    • 无需额外配置
  • 缺点

    • 存在重复读取
    • 通过硬编码字符串读取,容易出错
    • 不能设置默认值
    • 不能在运行环境中动态配置
    • 不能验证配置有效性
    • 不支持更改通知

4.1.9 配置使用场景#

如果只需要一次性读取配置信息,则使用配置,否则应该使用 《4.2 选项》代替。

4.1.10 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 配置 知识可查阅 ASP.NET Core - 配置 章节。

Last updated on by Monk
- + diff --git a/docs/docs/contribute/index.html b/docs/docs/contribute/index.html index ac737615578..f399010f8d9 100644 --- a/docs/docs/contribute/index.html +++ b/docs/docs/contribute/index.html @@ -8,7 +8,7 @@ 30. 贡献指南 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

30. 贡献指南

提交错误报告#

如果您在 XXX 中发现了一个不存在安全问题的漏洞,请在 XXX 仓库中的 Issues 中搜索,以防该漏洞已被提交,如果找不到漏洞可以创建一个新的 Issues,如果发现了一个安全问题请不要将其公开,请参阅安全问题处理方式,提交错误报告时应该详尽。

安全问题处理#

本项目中对安全问题处理的形式,项目核心人员确认编辑,该部分内容可以根据项目情况添加。

解决现有问题#

通过查看仓库的 Issues 列表何以发现需要处理的问题信息,可以尝试解决其中的某个问题。

如何提出新功能#

提出新功能有些项目使用 Issues 的 Feature 标签进行管理,有些则通过邮件的形式统一收集,在收集后项目内人员会进行确认开发,一般的将确认开发的功能会放入下一个版本的任务列表。

如何设置开发环境并运行测试#

如果是通过 Git 管理可以从 git clone xxx 开始编写,将开发环境的配置信息,IDE 的设置等信息配置文档编写。

变更日志填写规则#

  1. 使用现在时态
  2. 第一行字数限制
  3. 提交内容的约束

编码约定#

  • 项目内编码约定文件:.editorconfig

分支处理约定#

  • 分支处理形式,如 gitFlow

合并 PR 的形式#

在什么情况下可以合并到 master/main:

  1. 通过 CI
  2. 两个及以上的维护者通过.
  3. 最新版本
Last updated on by Monk
- + diff --git a/docs/docs/cooperate/index.html b/docs/docs/cooperate/index.html index f6deb21869e..e2176e25adf 100644 --- a/docs/docs/cooperate/index.html +++ b/docs/docs/cooperate/index.html @@ -8,7 +8,7 @@ 1.4 项目合作 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.4 项目合作

本人提供以下技术服务项目:

  • 技术指导、技术培训:(.NET、Docker、Devops/Jenkins、K8s、Nginx、Saga、Xamarin、小程序等)
  • Furion 文档广告投放:(800 元/月,覆盖所有文档页面)

如有项目合作意愿可发送邮件至:monksoul@outlook.com 电子邮箱。

Last updated on by Monk
- + diff --git a/docs/docs/cors/index.html b/docs/docs/cors/index.html index 18c890fc207..533f872b10c 100644 --- a/docs/docs/cors/index.html +++ b/docs/docs/cors/index.html @@ -8,7 +8,7 @@ 16. CORS 跨域 | Furion - + @@ -26,7 +26,7 @@
app.UseCorsAccessor();
// ...
}
}
}
特别注意

services.AddCorsAccessor(); 需在 services.AddControllers() 之前注册。

app.UseCorsAccessor(); 需在 app.UseRouting();app.UseAuthentication(); 之间注册。

16.4.2 配置允许跨域域名#

小提醒

默认情况下,Furion 允许所有域名来源访问,也就是无需配置任何来源域名,另外前端也需要设置请求参数:withCredentials:false

如果需要指定特定域名,则添加以下配置即可:

{
"CorsAccessorSettings": {
"PolicyName": "自定义跨域策略名",
"WithOrigins": ["http://localhost:4200", "https://furion.pro"]
}
}

16.5 CorsAccessorSettings 配置#

  • CorsAccessorSettings
    • PolicyName:跨域策略名,字符串类型,必填,默认 FurCorsAccessor
    • WithOrigins:允许跨域的域名列表,字符串数组类型,默认 [ "http://localhost:4200" ]
    • WithHeaders:请求表头,没有配置则允许所有表头,字符串数组类型
    • WithExposedHeaders:响应标头,字符串数组类型
    • WithMethods:设置跨域允许请求谓词,没有配置则允许所有,字符串数组类型
    • AllowCredentials:跨域请求中的凭据,bool 类型
    • SetPreflightMaxAge:设置预检过期时间,int 类型

16.6 使用 axios 前端注意事项#

由于 axios 对跨域有特定的需要,需要响应报文中添加特定 Header 才能放行,如:Access-Control-Expose-Headers: xxxxx,所以,如果前端使用了 axios 请求,需要添加以下配置:

{
"CorsAccessorSettings": {
"WithExposedHeaders": ["X-Pagination","access-token","x-access-token"]
}
}

16.7 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 跨域请求 知识可查阅 ASP.NET Core - 启用跨域请求 章节。

Last updated on by Monk
- + diff --git a/docs/docs/dapper/index.html b/docs/docs/dapper/index.html index d40e01a7140..1aae1fb338d 100644 --- a/docs/docs/dapper/index.html +++ b/docs/docs/dapper/index.html @@ -8,7 +8,7 @@ 10.2. Dapper 集成 | Furion - + @@ -32,7 +32,7 @@
while (reader.Read())
{
IShape shape;
var type = (ShapeType)reader.GetInt32(typeColumnIndex);
switch (type)
{
case ShapeType.Circle:
shape = circleParser(reader);
break;
case ShapeType.Square:
shape = squareParser(reader);
break;
case ShapeType.Triangle:
shape = triangleParser(reader);
break;
default:
throw new NotImplementedException();
}
shapes.Add(shape);
}
}

10.2.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 Dapper 知识可查阅 Dapper 官网

Last updated on by Monk
- + diff --git a/docs/docs/data-validation/index.html b/docs/docs/data-validation/index.html index 6d25dfdfd17..00ddcf9fa16 100644 --- a/docs/docs/data-validation/index.html +++ b/docs/docs/data-validation/index.html @@ -8,7 +8,7 @@ 8. 数据校验 | Furion - + @@ -73,7 +73,7 @@
namespace Furion.Application
{
public class FurionAppService : IDynamicApiController
{
[TypeFilter(typeof(DataValidationFilter))]
public TestDto Post(TestDto testDto)
{
return testDto;
}
}
}

8.9.4 [ApiController] 控制器范围验证#

[ApiController]Mvc 提供的控制器范围(含所有动作方法)的验证。

using Microsoft.AspNetCore.Mvc;
namespace Furion.Web.Entry.Controllers
{
[ApiController]
public class MvcController : Controller
{
public IActionResult Index()
{
return View();
}
}
}

8.10 MiniProfiler 查看#

如下图所示:

8.11 多语言支持#

参见 【全球化和本地化(多语言)】 章节

8.12 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-Interceptor/index.html b/docs/docs/dbcontext-Interceptor/index.html index b8ffc82bbf9..8a67e75bc2e 100644 --- a/docs/docs/dbcontext-Interceptor/index.html +++ b/docs/docs/dbcontext-Interceptor/index.html @@ -8,7 +8,7 @@ 9.24 数据库操作拦截器 | Furion - + @@ -56,7 +56,7 @@
// 获取所有新增和更新的实体
var entities = dbContext.ChangeTracker.Entries()
.Where(u => u.State == EntityState.Added || u.State == EntityState.Modified);
foreach (var entity in entities)
{
switch (entity.State)
{
// 自动设置租户Id
case EntityState.Added:
entity.Property(nameof(Entity.TenantId)).CurrentValue = GetTenantId();
break;
// 排除租户Id
case EntityState.Modified:
entity.Property(nameof(Entity.TenantId)).IsModified = false;
break;
}
}
}

9.24.3 注册自定义过滤器#

定义好过滤器之后,我们需要在数据库上下文中注册:

services.AddDbPool<FurionDbContext>(interceptors: new IInterceptor[] {
new YourSqlConnectionProfilerInterceptor(),
new YourDbContextSaveChangesInterceptor(),
new YourSqlCommandProfilerInterceptor()
});

9.24.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-add-or-update/index.html b/docs/docs/dbcontext-add-or-update/index.html index 8a45a71f3c9..5776ef61226 100644 --- a/docs/docs/dbcontext-add-or-update/index.html +++ b/docs/docs/dbcontext-add-or-update/index.html @@ -8,7 +8,7 @@ 9.7 新增或更新操作 | Furion - + @@ -99,7 +99,7 @@
// 示例七
await user.InsertOrUpdateExcludeNowAsync(new[] { u=>u.Name, u=>u.Age});
// 示例八
await user.InsertOrUpdateExcludeNowAsync(new[] {"Age", "Name"});

9.5.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-add/index.html b/docs/docs/dbcontext-add/index.html index 6d56c7e9cd7..37baa326708 100644 --- a/docs/docs/dbcontext-add/index.html +++ b/docs/docs/dbcontext-add/index.html @@ -8,7 +8,7 @@ 9.5 新增操作 | Furion - + @@ -50,7 +50,7 @@
// 示例二
await repository.InsertNowAsync(new List<User> { user, user2 });
// 示例三
await repository.InsertNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.5.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-audit/index.html b/docs/docs/dbcontext-audit/index.html index 5a62a0434d8..617492e53b1 100644 --- a/docs/docs/dbcontext-audit/index.html +++ b/docs/docs/dbcontext-audit/index.html @@ -8,7 +8,7 @@ 9.22 审计日志 | Furion - + @@ -60,7 +60,7 @@
// 判断是否请求成功,没有异常就是请求成功
var isRequestSucceed = actionContext.Exception == null;
// 这里写入日志~~~~~~~~~~~~~~~~~~~~
}
}
}
  1. 注册 RequestAuditFilter 筛选器
services.AddMvcFilter<RequestAuditFilter>();
关于筛选器注册顺序

通常先注册的会先执行,也可以通过实现 IOrderedFilter 接口配置 Order 属性,数值越小,越先执行。

9.22.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-batch/index.html b/docs/docs/dbcontext-batch/index.html index 242a15a4132..392c8659906 100644 --- a/docs/docs/dbcontext-batch/index.html +++ b/docs/docs/dbcontext-batch/index.html @@ -8,7 +8,7 @@ 9.9 批量操作 | Furion - + @@ -29,7 +29,7 @@
// 根据条件批量更新
repository.Where(a => a.ItemId <= 500).BatchUpdate(a => new Item { Quantity = a.Quantity + 100 });
repository.Where(a => a.ItemId <= 500).BatchUpdate(new Item { Description = "Updated" });
await repository.Where(a => a.ItemId <= 500).BatchUpdateAsync(new Item { Description = "Updated" });
// 批量更新指定列
var updateColumns = new List<string> { nameof(Item.Quantity) };
var q = repository.Where(a => a.ItemId <= 500);
int affected = q.BatchUpdate(new Item { Description = "Updated" }, updateColumns);

9.9.3 批量操作性能#

Operations\Rows100,000 EF100,000 EFBulk1,000,000 EFBulk
Insert38.98 s2.10 s17.99 s
Update109.25 s3.96 s31.45 s
Delete7.26 s2.04 s12.18 s
---------------------------------------------------------------
Together70.70 s5.88 s56.84 s

9.9.4 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 EFCore.BulkExtensions 知识可查阅 EFCore.BulkExtensions 开源仓库

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-code-first/index.html b/docs/docs/dbcontext-code-first/index.html index be356d9c7f9..df3dc7f1877 100644 --- a/docs/docs/dbcontext-code-first/index.html +++ b/docs/docs/dbcontext-code-first/index.html @@ -8,7 +8,7 @@ 9.20 模型生成数据库 | Furion - + @@ -25,7 +25,7 @@
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 住址
/// </summary>
public string Address { get; set; }
}
}
实体约定

所有数据库实体必须直接或间接继承 IEntity 接口。

9.20.2.2 打开 程序包管理控制台#

9.20.2.3 切换默认项目#

程序包管理控制台 默认项目设置为 Furion.Database.Migrations

9.20.2.4 创建模型版本#

Add-Migration v1.0.0
特别说明

v1.0.0 是此处数据库更改的版本号,可以写任何字符串,但推荐写版本号,每次 +1

最终命令如下:

PM> Add-Migration v1.0.0
Build started...
Build succeeded.
Microsoft.EntityFrameworkCore.Model.Validation[10400]
Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data, this mode should only be enabled during development.
Microsoft.EntityFrameworkCore.Infrastructure[10403]
Entity Framework Core 5.0.0-rc.1.20451.13 initialized 'FurionDbContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: SensitiveDataLoggingEnabled DetailedErrorsEnabled MaxPoolSize=100 MigrationsAssembly=Furion.Database.Migrations
To undo this action, use Remove-Migration.
PM>

生成成功后,Furion.Database.Migrations 项目下会新增 Migrations 文件夹(如果没有),同时本次的架构生成文件,如:

9.20.2.5 更新到数据库#

Update-Database

执行该命令后,数据库就会自动根据模型生成对于的表。

小知识

如果 Update-Database 后面带字符串参数,则会自动还原数据库到指定版本,如:

Update-Database v0.0.3

将数据库还原到 v0.0.3 版本

9.20.3 更新模型#

如果模型改变了,重复上面操作即可,如:

Add-Migration v1.0.1
Update-Database

9.20.4 导出 Sql#

有些时候,我们没有直接更新数据库的权限,或者怕出问题,我们都会先生成 Sql 看看,这时候只需要通过 Script-Migration 导出即可,如:

Script-Migration

9.20.5 VS Code 方式#

9.20.5.1 安装 dotnet ef#

dotnet tool install --global dotnet-ef --version 5.0.0-rc.2.20475.6

9.20.5.2 cd 目录#

通过 VS Code 打开 .sln 所在的目录,如:framework

之后进入 Furion.Database.Migrations 目录

cd Furion.Database.Migrations

9.20.5.3 执行命令#

dotnet ef migrations add v1.0.0 -s "../Furion.Web.Entry"
dotnet ef database update -s "../Furion.Web.Entry"

9.20.6 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 正向工厂 知识可查阅 EF Core - 管理数据库架构 章节。

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-db-first/index.html b/docs/docs/dbcontext-db-first/index.html index 29d5e80ba78..127975d7575 100644 --- a/docs/docs/dbcontext-db-first/index.html +++ b/docs/docs/dbcontext-db-first/index.html @@ -8,7 +8,7 @@ 9.19 数据库生成模型 | Furion - + @@ -58,7 +58,7 @@
}
}
Furion Tools v1.0.0 全部实体生成成功!
PM>

9.19.4 命令参数配置#

Furion Tools Cli 支持多个参数配置,使用方法只需要在命令后面添加即可,如:

&"../tools/cli.ps1" -Context 数据库上下文名 -ConnectionName 连接字符串Key

支持参数如下:

  • -Tables:配置要生成的数据库表,数组类型,如果为空,则生成数据库所有表和视图。如:-Tables Person,PersonDetails
  • -Context:配置数据库上下文,默认 FurionDbContext,如果有多个数据库上下文,则此参数必须配置
  • -ConnectionName:配置数据库连接字符串,对于 appsetting.json 中的 Key
  • -OutputDir:生成实体代码输出目录,默认为:./Furion.Core/Entities/
  • -DbProvider:数据库提供器,默认是 Microsoft.EntityFrameworkCore.SqlServer,其他数据库请指定对应程序集
    • SqlServerMicrosoft.EntityFrameworkCore.SqlServer
    • SqliteMicrosoft.EntityFrameworkCore.Sqlite
    • CosmosMicrosoft.EntityFrameworkCore.Cosmos
    • InMemoryDatabaseMicrosoft.EntityFrameworkCore.InMemory
    • MySqlPomelo.EntityFrameworkCore.MySql
    • PostgreSQLNpgsql.EntityFrameworkCore.PostgreSQL
    • OracleOracle.EntityFrameworkCore
    • DmMicrosoft.EntityFrameworkCore.Dm
  • -EntryProject:Web 启用项目层名,默认 Furion.Web.Entry
  • -CoreProject:实体项目层名,默认 Furion.Core
  • -DbContextLocators:多数据库上下文定位器,默认 MasterDbContextLocator,支持多个,如:MasterDbContextLocator,MySqlDbContextLocator
  • -Product:解决方案默认前缀,如 Furion
  • -UseDatabaseNames:是否保持生成和数据库、表一致的名称
  • -Namespace:指定实体命名空间

9.19.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/docs/docs/dbcontext-delete/index.html b/docs/docs/dbcontext-delete/index.html index c0414c4be6f..945572d4947 100644 --- a/docs/docs/dbcontext-delete/index.html +++ b/docs/docs/dbcontext-delete/index.html @@ -8,7 +8,7 @@ 9.8 删除操作 | Furion - + @@ -66,7 +66,7 @@
// 示例五
await entity.FakeDeleteAsync();
// 示例六
await repository.UpdateIncludeAsync(user, u => u.IsDeleted);

9.8.8 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-entitytrigger/index.html b/docs/docs/dbcontext-entitytrigger/index.html index 55680817399..0b9742c50a7 100644 --- a/docs/docs/dbcontext-entitytrigger/index.html +++ b/docs/docs/dbcontext-entitytrigger/index.html @@ -8,7 +8,7 @@ 9.25. 实体数据监听器 | Furion - + @@ -28,7 +28,7 @@
/// <summary>
/// 监听数据改变之后(仅支持EFCore操作)
/// </summary>
/// <param name="entity"></param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
/// <param name="state"></param>
void OnChanged(TEntity entity, DbContext dbContext, Type dbContextLocator, EntityState state);
/// <summary>
/// 监听数据改变失败(仅支持EFCore操作)
/// </summary>
/// <param name="entity"></param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
/// <param name="state"></param>
void OnChangeFailed(TEntity entity, DbContext dbContext, Type dbContextLocator, EntityState state) { }
}

9.29.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-filter/index.html b/docs/docs/dbcontext-filter/index.html index 397fa0f56ff..4333926c005 100644 --- a/docs/docs/dbcontext-filter/index.html +++ b/docs/docs/dbcontext-filter/index.html @@ -8,7 +8,7 @@ 9.23 实体/全局查询筛选器 | Furion - + @@ -33,7 +33,7 @@
// 创建表达式元素
var parameter = Expression.Parameter(metadata.ClrType, "u");
var properyName = Expression.Constant(nameof(Entity.IsDeleted));
var propertyValue = Expression.Constant(false);
// 构建表达式 u => EF.Property<bool>(u, "IsDeleted") == false
var expressionBody = Expression.Equal(Expression.Call(typeof(EF), nameof(EF.Property), new[] { typeof(bool) }, parameter, properyName), propertyValue);
var expression = Expression.Lambda(expressionBody, parameter);
return expression;
}
}
}
小建议

如果对动态构建 LambdaExpression 不熟悉的朋友,可以使用 System.Linq.Dynamic.Corehttps://github.com/zzzprojects/System.Linq.Dynamic.Core

9.23.3 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-function/index.html b/docs/docs/dbcontext-function/index.html index e4608f0d404..1e8ecdc50c7 100644 --- a/docs/docs/dbcontext-function/index.html +++ b/docs/docs/dbcontext-function/index.html @@ -8,7 +8,7 @@ 9.14 函数操作 | Furion - + @@ -45,7 +45,7 @@
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity(typeof(F_Person)).HasNoKey();
modelBuilder.HasDbFunction(() => GetPersons(default));
}
}
}

9.14.5.4 在 Linq 中使用#

IQueryable<F_Person> query = _repository.DynamicDbContext.GetPersons(1);
var result = query.Where(u => u.Name.Equals("Furion")).ToList();

最终生成 Sql

SELECT [g].Id, [g].Name, [g].Age, [g].Address
FROM dbo.GetPersons(1) AS [g]
WHERE [g].Name == N'Furion';

9.14.6 在 EF Core 内置函数#

EF Core 为我们提供了很多常用的内置函数,可以在 Lambda 条件中使用,主要是通过 EF.Functions 调用,如:

_repository.Where(u => EF.Functions.DateDiffHour(u.CreatedDt, DateTime.Now) > 8).FirstOrDefault();

这个语句使用了 EF.Functions.DateDiffHour 最终生成的 Sql 如下:

SELECT TOP(1) [a].*
FROM [dbo].[TEST] AS [a]
WHERE DATEDIFF(HOUR, [a].[CREATED_DT], GETDATE()) > 8

EF Core 内置函数就不一一列出了,可以通过 EF.Functions 查看更多,如果不能满足自己的需求,那么可以自定义 Linq 标量函数

9.14.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-hight-query/index.html b/docs/docs/dbcontext-hight-query/index.html index 9e2cd552dc4..960d0a53214 100644 --- a/docs/docs/dbcontext-hight-query/index.html +++ b/docs/docs/dbcontext-hight-query/index.html @@ -8,7 +8,7 @@ 9.11 高级查询操作 | Furion - + @@ -67,7 +67,7 @@
namespace Furion.Core
{
public class Person : Entity, IEntityTypeBuilder<Person>
{
public string Name { get; set; }
/// <summary>
/// 配置实体关系
/// </summary>
/// <param name="entityBuilder"></param>
/// <param name="dbContext"></param>
/// <param name="dbContextLocator"></param>
public void Configure(EntityTypeBuilder<City> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.ToSqlQuery(
@"select * from dbo.person.2020-09-19
union all
select * from dbo.person.2020-09-20");
}
}
}
var posts = repository.Where(u => u.Id > 10).ToList();

9.11.14 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-locator/index.html b/docs/docs/dbcontext-locator/index.html index d8da1fcf1c2..057bcf72707 100644 --- a/docs/docs/dbcontext-locator/index.html +++ b/docs/docs/dbcontext-locator/index.html @@ -8,7 +8,7 @@ 9.2 数据库上下文定位器 | Furion - + @@ -24,7 +24,7 @@
namespace Furion.EntityFramework.Core
{
[AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]
public class DefaultDbContext : AppDbContext<DefaultDbContext> // 无需指定定位器
{
public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)
{
}
}
}
关于多数据库定位器

默认数据库的定位器默认为 MasterDbContextLocator,所以无需显示指定定位器,但从第二个数据库开始,都必须指定数据库定位器。如:

  • 注册上下文:
options.AddDbPool<OtherDbContext, OtherDbContextLocator>();
  • 定义上下文
using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
namespace Furion.EntityFramework.Core
{
[AppDbContext("Sqlite3ConnectionString", DbProvider.Sqlite)]
public class OtherDbContext : AppDbContext<OtherDbContext, OtherDbContextLocator> // 需指定定位器
{
public OtherDbContext(DbContextOptions<OtherDbContext> options) : base(options)
{
}
}
}

另外,Entity/IEntityIRepository 等都需要指定定位器,如:IEntity<TKey, TLocator>IRepository<TEntity, TLocator> 操作。

9.2.5 数据库上下文定位器支持对象#

目前数据库上下文支持以下多个对象:

  • AppDbContext<TEntity, TDbContextLocator>:数据上下文
  • IRepository<TEntity, TDbContextLocator:实体仓储
  • ISqlRepository<TDbContextLocator>: Sql 操作仓储
  • Func<Type, DbContext>:依赖注入获取数据库上下文
  • Entity<Tkey, TDbContextLocator> :实体配置
  • EntityBase<Tkey, TDbContextLocator1, ... TDbContextLocator8>:实体配置
  • EntityNotKey<TDbContextLocator1, ... TDbContextLocator8>:无键实体配置
  • IEntitySeedData<TEntity, TDbContextLocator1, ... TDbContextLocator8>:种子数据配置
  • IEntityTypeBuilder<TEntity, TDbContextLocator1, ... TDbContextLocator8>:实体类型构建器
  • IModelBuilderFilter<TDbContextLocator1, ... TDbContextLocator8>:模型构建筛选器
  • [QueryableFunction(DbContextLocators=Type[])]:查询函数

9.2.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-multi-database/index.html b/docs/docs/dbcontext-multi-database/index.html index d1776cdc622..769ffec9509 100644 --- a/docs/docs/dbcontext-multi-database/index.html +++ b/docs/docs/dbcontext-multi-database/index.html @@ -8,7 +8,7 @@ 9.18 多数据库操作 | Furion - + @@ -38,7 +38,7 @@
// 支持一个数据库
public class Person: IEntity<MySqlDbContextLocator>
{
// ....
}
// 支持多个数据库
public class Person: IEntity<MySqlDbContextLocator, SqliteDbContextLocator>
{
// ....
}
小知识

所有的 实体依赖接口或抽象类 都支持泛型方式 指定 数据库上下文定位器,最多支持 8 个。

9.18.3.5 Linq 函数方式#

public static class QueryFunctions
{
[QueryableFunction("FN_GetId", "dbo", typeof(MySqlDbContextLocator), typeof(SqliteDbContextLocator))]
public static int GetId(int id) => throw new NotSupportedException();
}

9.18.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/docs/docs/dbcontext-proc/index.html b/docs/docs/dbcontext-proc/index.html index 23e6658c101..09ef7cb80c8 100644 --- a/docs/docs/dbcontext-proc/index.html +++ b/docs/docs/dbcontext-proc/index.html @@ -8,7 +8,7 @@ 9.13 存储过程操作 | Furion - + @@ -116,7 +116,7 @@
// 获取 RETURN 返回值
var reval = result.ReturnValue;
// 获取返回结果集
var (list1,list2) = result.Result;
关于异步

Furion 框架每一个数据库操作都支持异步方式,由于篇幅有限,就不列举异步方式了。

9.13.3 关于 [DbParameter]#

[DbParameter] 特性是用来标注 Sql函数存储过程 参数的,可配置属性:

  • Direction:设置参数方向,ParameterDirection 枚举类型,默认 ParameterDirection.Input
  • DbType:设置参数类型,DbType 枚举类型,无默认
  • Size:设置参数长度的,int 类型

其中 Direction 属性是默认构造函数参数。

9.13.4 关于 ProcedureOutputResult#

ProcedureOutputResultProcedureOutputResult<TResult> 是复杂存储过程执行返回模型类,有以下属性:

  • OutputValues:多个输出值,ProcedureOutputValue 类型
  • ReturnValue:返回值,object 类型
  • Result:结果集,非泛型版本是 DataSet类型,否则是 泛型类型

9.13.5 存储过程参数#

所有 sql 参数都支持四种方式:

  • DbParameter[]:数组类型
  • new {}:匿名类型
  • new Class{}:强类型类型(支持复杂存储过程参数)
  • Dictionary<string,object> 类型

9.13.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-query/index.html b/docs/docs/dbcontext-query/index.html index 824de667c05..4842099c2ad 100644 --- a/docs/docs/dbcontext-query/index.html +++ b/docs/docs/dbcontext-query/index.html @@ -8,7 +8,7 @@ 9.10 查询操作 | Furion - + @@ -133,7 +133,7 @@
// 示例二
_testRepository.Where(u => u.Name.EndWith("Furion"));
// 示例三
_testRepository.Where(u => u.Name.Contains("Furion"));

9.10.6.9 Case When#

数据库中的 Case When 实际上对应的是我们程序中的 三元表达式 ,也就是使用 三元表达式 即可自动生成 Case When 语句。

9.10.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-read-write/index.html b/docs/docs/dbcontext-read-write/index.html index 2c9fdb19679..82618d53de9 100644 --- a/docs/docs/dbcontext-read-write/index.html +++ b/docs/docs/dbcontext-read-write/index.html @@ -8,7 +8,7 @@ 9.27 读写分离/主从复制 | Furion - + @@ -33,7 +33,7 @@
/// <summary>
/// 查询走从库
/// </summary>
/// <returns></returns>
public List<Person> Get()
{
return _msRepository.Slave1<Person>().AsEnumerable();
}
}
}

9.27.3 主从复制#

主从复制:是一种数据备份的方案。

简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。

9.27.4 主从复制几种方式#

9.27.4.1 同步复制#

所谓的同步复制,意思是 Master 的变化,必须等待 Slave-1,Slave-2,...,Slave-n 完成后才能返回。 这样,显然不可取,比如,在 Web 前端页面上,用户增加了条记录,需要等待很长时间。

9.27.4.2 异步复制#

如同 AJAX 请求一样。Master 只需要完成自己的数据库操作即可。至于 Slaves 是否收到二进制日志,是否完成操作,不用关心。(推荐方式)

9.27.4.3 半同步复制#

Master 只保证 Slaves 中的一个操作成功,就返回,其他 Slave 不管。

下面将使用 SqlServer 简单配置主从复制功能。

9.27.5 SqlServer 主库配置#

9.27.5.1 添加 本地发布#

9.27.5.2 选择 分发服务器#

9.27.5.3 启用 代理#

9.27.5.4 发布数据库#

9.27.5.5 快照发布#

具体选择何种发布类型,视具体业务场景而定。

9.27.5.6 选择发布项目#

9.27.5.7 配置分发计划#

9.27.5.8 配置安全设置#

9.27.5.9 完成配置#

9.27.6 SqlServer 从库配置#

9.27.6.1 添加 本地订阅#

9.27.6.2 选择 分发服务器#

9.27.6.3 选择 分发代理位置#

9.27.6.4 选择 订阅数据库#

9.27.6.5 选择 分发安全设置#

9.27.6.6 选择 同步计划#

9.27.6.7 完成订阅#

9.27.7 分发定义监视#

9.27.8 查看主从复制结果#

特别特性

主从复制有一定迟延性,所以系统设计要有一定“容忍性"。

9.27.9 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-repository/index.html b/docs/docs/dbcontext-repository/index.html index e9cba00cb08..2a9188db9b9 100644 --- a/docs/docs/dbcontext-repository/index.html +++ b/docs/docs/dbcontext-repository/index.html @@ -8,7 +8,7 @@ 9.4 仓储模式 | Furion - + @@ -28,7 +28,7 @@
// 其他更多数据库一样的操作

另外任何仓储或实体配置都支持多个数据库同时操作#

仓储方式

IRepository<Person, MsSqlDbContextLocator> mssqlRepository
ISqlRepository<MsSqlDbContextLocator> mssqlRepository;

动态 sql 方式

"select * from person".Change<MsSqlDbContextLocator>().SqlQuery();

实体配置方式

public class User:Entity<int, MsSqlDbContextLocator, MySqlDbContextLocator>
{
}

Sql 代理方式

[SqlFunction("funcName", DbContextLocator = typeof(MySqlDbContextLocator))]
int GetAge(int id);

Linq 中方式

[QueryableFunction("funcName","dbo", DbContextLocator = typeof(MySqlDbContextLocator))]
string GetName()=> throw Oops.Oh("不支持该数据库操作");

9.4.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Lu_Cao
- + diff --git a/docs/docs/dbcontext-seed-data/index.html b/docs/docs/dbcontext-seed-data/index.html index a42c5fbf817..860bc80fc2b 100644 --- a/docs/docs/dbcontext-seed-data/index.html +++ b/docs/docs/dbcontext-seed-data/index.html @@ -8,7 +8,7 @@ 9.21 实体种子数据 | Furion - + @@ -27,7 +27,7 @@
namespace Furion.Application
{
public class PersonSeedData : IEntitySeedData<Person>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

9.21.3 导航属性#

通常我们的实体有 一对多多对多等外键关系,那么我们需要单独为每一个实体添加数据种子,而不是直接写在主表中。

9.21.4 多个数据库种子数据#

Furion 提供泛型的方式支持多个数据库种子数据设定,如:

using Furion.DatabaseAccessor;
using System.Collections.Generic;
namespace Furion.Application
{
public class PersonSeedData : IEntitySeedData<Person, MySqlDbContextLocator, SqliteDbContextLocator>
{
// 配置种子数据
public IEnumerable<Person> HasData(DbContext dbContext, Type dbContextLocator)
{
return new List<Person>
{
new Person { Id = 1, Name = "百小僧", Address = "广东省中山市" },
new Person { Id = 2, Name = "新生帝", Address = "广东省珠海市" }
};
}
}
}

上面的例子表示同时为 MySqlDbContextSqliteDbContext 创建种子数据。

9.21.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 数据种子 知识可查阅 EF Core - 数据种子设定 章节。

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-sql-proxy/index.html b/docs/docs/dbcontext-sql-proxy/index.html index 59fa4bd2fdb..3d72d62a335 100644 --- a/docs/docs/dbcontext-sql-proxy/index.html +++ b/docs/docs/dbcontext-sql-proxy/index.html @@ -8,7 +8,7 @@ 9.17 Sql 高级代理 | Furion - + @@ -71,7 +71,7 @@
namespace Furion.Application
{
public interface ISql : ISqlDispatchProxy
{
[SqlFunction("FN_Name")] // 标量函数
string GetValue(MyParam dto);
[SqlProcedure("FN_Name")] // 表值函数
List<Person> GetPersons(int id);
}
}
补充说明

Sql 代理会自动判断返回值然后自动执行特定函数类型。

9.17.6 为什么用它?#

通过上面的例子大家就可以了解,这种方式操作 sql 非常简单,而且极易维护。大家不用去关心返回值,关心用哪个方法,所有东西会自动给你处理好。

所以,如果需要用 Sql 操作,推荐使用 Sql 高级代理。

9.17.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-sql-template/index.html b/docs/docs/dbcontext-sql-template/index.html index 71dacc4a1a1..c060c6eb767 100644 --- a/docs/docs/dbcontext-sql-template/index.html +++ b/docs/docs/dbcontext-sql-template/index.html @@ -8,7 +8,7 @@ 9.16 Sql 模板 | Furion - + @@ -23,7 +23,7 @@
// 懒人方式
var users = "#(Select.User)".SqlQuery<User>(new { id = 1});
// Sql 代理方式
[SqlExecute("#(Select.User)")]
List<User> GetUser(int id);

9.16.3.2 高级嵌套#

var users = repository.SqlQuery<User>(
@"select * from user u
left join #(User.Detail) d on u.Id = d.UserId
where id > @id");

9.16.4 Sql 模板配置#

9.16.4.1 普通模式#

{
"Select.User": "select * from User"
}

9.16.4.2 更多配置#

{
"Select.User": {
"Sql": "select * from User where id > @id and Name = @name",
"Params": [
{
"Name": " Id",
"Value": "1",
"DbType": "Int16",
"Size": 10
},
{
"Name": " Name",
"Value": "百小僧",
"DbType": "String",
"Size": 10
}
]
}
}

9.16.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-sql/index.html b/docs/docs/dbcontext-sql/index.html index 2c26602407e..6a1cd92dff8 100644 --- a/docs/docs/dbcontext-sql/index.html +++ b/docs/docs/dbcontext-sql/index.html @@ -8,7 +8,7 @@ 9.15 Sql 操作 | Furion - + @@ -168,7 +168,7 @@
// 不再举例子。。。
补充说明

不管是那种方式操作 Sql ,方法名参数都是一致的,如:

  • SqlQuery
  • SqlQueryAsync
  • SqlQueries
  • SqlQueriesAsync
  • SqlNonQuery
  • SqlNonQueryAsync
  • SqlScalar
  • SqlScalarAsync
  • SqlProcedureQuery
  • SqlProcedureQueryAsync
  • SqlProcedureQueries
  • SqlProcedureQueriesAsync
  • SqlProcedureScalar
  • SqlProcedureScalarAsync
  • SqlProcedureNonQuery
  • SqlProcedureNonQueryAsync
  • SqlProcedureOutput
  • SqlProcedureOutputAsync
  • SqlFunctionScalar
  • SqlFunctionScalarAsync
  • SqlFunctionQuery
  • SqlFunctionQuery

9.15.6 IRepository 操作#

IRepository 也能操作 sql,调用方法也是和上面一致的,如:

var dataTable = repository.Sql().SqlQuery("select * from person");
特别说明

由于篇幅有限,不再列举所有例子。

9.15.7 IRepository<TEntity> 操作#

IRepository<TEntity> 也能操作 sql,调用方法也是和上面一致的,如:

var dataTable = personRepository.SqlQuery("select * from person");
特别说明

由于篇幅有限,不再列举所有例子。

9.15.8 关于 Sql 参数#

所有 sql存储过程函数 参数都支持四种方式:

  • DbParameter[]:数组类型
  • new {}:匿名类型
  • new Class{}:强类型类型(支持复杂存储过程参数)
  • Dictionary<string,object> 类型
小知识

建议除了复杂的存储过程(带 OUTPUT/RETURN)的以外,所有参数建议使用 new {} 匿名类型,如果需要动态参数,则可以使用 Dictionary<string,object> 类型。

9.15.9 多数据库 Sql 操作 💯 💛#

Furion 框架拥有非常灵活的多数据库操作方式,只需通过多数据库上下文定位器即可动态切换数据库。

9.15.9.1 懒人无敌 🐮 方式#

var dataTable = "select * from person".Change<MySqlDbContextLocator>().SqlQuery();
var persons = "select * from person whre id > @id".Change<SqliteDbContextLocator>().SqlQuery<Person>();
补充说明

懒人方式 只需要通过 Change<TDbContextLocator> 方式即可动态切换数据库。

9.15.9.2 ISqlRepository 方式#

只需要通过 ISqlRepository<TDbContextLocator> 注入或通过 sqlRepository.Change<TDbContextLocator>() 切换。

9.15.9.3 IRepository 方式#

只需要通过 repository.Change<TDbContextLocator>() 获取即可。

9.15.9.4 IRepository<TEntity> 方式#

只需要通过 IRepository<TEntity, TDbContextLocator> 注入或通过 personRepository.Change<TEntity, TDbContextLocator>() 切换。

9.15.10 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-start/index.html b/docs/docs/dbcontext-start/index.html index 535fb4343f9..8feea72cd7b 100644 --- a/docs/docs/dbcontext-start/index.html +++ b/docs/docs/dbcontext-start/index.html @@ -8,7 +8,7 @@ 9.0 入门简要 | Furion - + @@ -26,7 +26,7 @@
namespace Furion.EntityFramework.Core
{
[AppStartup(600)]
public sealed class FurEntityFrameworkCoreStartup : AppStartup
{
public void ConfigureServices(IServiceCollection services)
{
// 配置数据库上下文,支持N个数据库
services.AddDatabaseAccessor(options =>
{
// 配置默认数据库
options.AddDbPool<FurionDbContext>(DbProvider.SqlServer, connectionString:"连接字符串");
// 配置多个数据库,多个数据库必须指定数据库上下文定位器
options.AddDbPool<SqliteDbContext, SqliteDbContextLocaotr>(DbProvider.Sqlite, connectionString:"连接字符串");
});
}
}
}
新版 MySQL 注意

MySQL 在新版本包中注册有所修改,所以注册方式为:

services.AddDatabaseAccessor(options =>
{
options.AddDbPool<FurionDbContext>($"{DbProvider.MySql}@8.0.22");
});

9.0.1.5 Code First 说明#

特别注意

Furion 框架默认数据迁移的程序集为:Furion.Database.Migrations,所以如果您改了程序集名称或通过 Nuget 方式安装的 Furion 包,则需要配置迁移程序集名称:

services.AddDatabaseAccessor(options =>
{
options.AddDbPool<FurionDbContext>(DbProvider.Sqlite);
}, "自定义迁移名称");

另外,如果应用中配置了多个数据库上下文,那么所有的 迁移命令 都需要指定 -Context 数据库上下文名称 参数。如:

Add-Migration v1.0.0 -Context FurionDbContext

9.0.2 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/docs/docs/dbcontext-update/index.html b/docs/docs/dbcontext-update/index.html index dfe9d6c9d24..14498a287d5 100644 --- a/docs/docs/dbcontext-update/index.html +++ b/docs/docs/dbcontext-update/index.html @@ -8,7 +8,7 @@ 9.6 更新操作 | Furion - + @@ -169,7 +169,7 @@
// 示例二
await repository.UpdateNowAsync(new List<User> { user, user2 });
// 示例三
await repository.UpdateNowAsync(new[] {user, user2 });
小知识

所有带 Now 结尾的表示立即提交到数据库,也就是立即调用 SaveChangesSaveChangesAsync

9.6.15 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext-view/index.html b/docs/docs/dbcontext-view/index.html index 7511e5646d5..e7014245c3c 100644 --- a/docs/docs/dbcontext-view/index.html +++ b/docs/docs/dbcontext-view/index.html @@ -8,7 +8,7 @@ 9.12 视图操作 | Furion - + @@ -29,7 +29,7 @@
public FurionService(IRepository<V_Person> repository)
{
// 初始化只读仓储
_readableRepository = repository.Constraint<IReadableRepository<V_Person>>();
}
/// <summary>
/// 读取视图
/// </summary>
/// <returns></returns>
public async Task<List<V_Person>> GetVPerson()
{
var list = await _readableRepository.AsAsyncEnumerable();
return list;
}
}
}
小知识

通过 .Constraint<TEntity,TDbContextLocator> 方法可以将仓储约束为特定仓储,如只读仓储,可读可写仓储,只新增仓储等。

9.12.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/dbcontext/index.html b/docs/docs/dbcontext/index.html index 079369d3ccc..70aeb665e70 100644 --- a/docs/docs/dbcontext/index.html +++ b/docs/docs/dbcontext/index.html @@ -8,7 +8,7 @@ 9.1 数据库上下文 | Furion - + @@ -32,7 +32,7 @@
options.AddDbPool<SecondDbContext, SecondDbContextDbContextLocator>(DbProvider.SqlServer); // 第二个数据库
options.AddDbPool<ThirdDbContext, ThirdDbContextDbContextLocator>(DbProvider.SqlServer); // 第三个数据库

9.1.8 动态数据库上下文对象#

Furion 框架中,数据库上下文是定义在 Furion.EntityFramework.Core 项目层,并且该层不被 Furion.ApplicationFurion.Core 等层引用。

所以就不能直接在 Furion.Application 项目层直接使用 Furion.EntityFramework.Core 定义的数据库上下文。

Furion 为了解决这个问题,提供了两种方式处理:

  • respository.Context :当前数据库上下文对象,返回是 DbContext 抽象类型
  • respository.DynamicContext:当前数据库上下文对象,返回的是 dynamic 类型

如果你只是想使用 DbContext 的功能,直接使用 respository.Context 即可,如:

respository.Context.SaveChanges();

如果你想能够获取具体的数据库上下文类型,如 MyDbContext,那么使用 respository.DynamicContext 就可以获取到具体的 MyDbContext 类型。如:

var persons = respository.DynamicContext.Persons.Find(1);
var users = respository.DynamicContext.Users;

这样就可以直接操作 MyDbContext 定义的属性和方法了。

9.1.9 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 数据库上下文 知识可查阅 EF Core - 配置 DbContext 章节。

Last updated on by 百小僧
- + diff --git a/docs/docs/dependency-injection/index.html b/docs/docs/dependency-injection/index.html index 015ffbc131f..0f15edbdfde 100644 --- a/docs/docs/dependency-injection/index.html +++ b/docs/docs/dependency-injection/index.html @@ -8,7 +8,7 @@ 12. 依赖注入/控制反转 | Furion - + @@ -62,7 +62,7 @@
return result;
}
}
}

之后我们只需要为 TestService 增加 [Injection] 特性即可,如:

[Injection(Proxy = typeof(LogDispatchProxy))]
public class TestService: ITestService, ITransient
{
public string SayHello(string word)
{
return $"Hello {word}";
}
}

之后 SayHello 方法被调用的时候就可以实现动态拦截了,比如这里写日志。

12.12.1 全局Aop拦截#

Furion 框架也提供了全局拦截的方式,只需要将 IDispatchProxy 修改为 IGlobalDispatchProxy 即可。

using Furion;
using System.Reflection;
namespace Furion.Application
{
public class LogDispatchProxy : AspectDispatchProxy, IGlobalDispatchProxy
{
// ....
}
}

这样就会拦截所有的 Service,当然也可以通过给特定类贴 [SkipProxy] 跳过全局拦截操作。

拦截优先级

[SkipProxy] > [Injection(Proxy = typeof(LogDispatchProxy))] > 全局拦截

12.12.2 AOP 的作用#

这种面向切面的能力(动态拦截/代理)可以实现很多很多功能,如:

  • 动态日志记录
  • 动态修改参数
  • 动态修改返回值
  • 动态方法重定向
  • 动态修改代码逻辑
  • 动态实现异常监听

还可以做更多更多的事情。

12.13 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/deploy-docker/index.html b/docs/docs/deploy-docker/index.html index c5b7b788e27..0c19b795d20 100644 --- a/docs/docs/deploy-docker/index.html +++ b/docs/docs/deploy-docker/index.html @@ -8,7 +8,7 @@ 27.2 在 Docker 部署 | Furion - + @@ -25,7 +25,7 @@
# Restore And Publish
WORKDIR /source/samples
RUN dotnet restore
RUN dotnet publish -c release -o /app --no-restore
# Run
FROM mcr.microsoft.com/dotnet/aspnet:5.0.1
WORKDIR /app
COPY --from=build /app ./
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["dotnet", "Furion.Web.Entry.dll"]
  • 👉 在 Dockerfile 所在路径构建

接下来的步骤和上述步骤一致,不再重复编写

27.2.3 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/deploy-iis/index.html b/docs/docs/deploy-iis/index.html index 59cafc033cd..6a5fb9e7ff7 100644 --- a/docs/docs/deploy-iis/index.html +++ b/docs/docs/deploy-iis/index.html @@ -8,7 +8,7 @@ 27.1 在 IIS 部署 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

27.1 在 IIS 部署

27.1.1 发布网站#

27.1.1.1 选择启动项发布#

27.1.1.2 选择发布到文件夹#

27.1.1.3 配置发布后路径#

27.1.1.4 点击发布#

27.1.2 服务器环境配置#

27.1.2.1 第一步#

安装.NET Core 运行时捆绑包:点击下载

27.1.2.2 第二步(命令)#

net stop was /y

27.1.2.3 第三步(命令)#

net start w3svc

27.1.2.4 第四步(命令)#

set ASPNETCORE_ENVIRONMENT=Production

27.1.3 部署到 IIS#

27.1.3.1 添加新网站#

27.1.3.2 配置网站信息#

27.1.3.3 配置应用程序池#

27.1.3.4 设置为 非托管#

27.1.3.5 重启网站#

只需重启网站或应用程序池即可。

27.1.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/deploy-nginx/index.html b/docs/docs/deploy-nginx/index.html index 2376ba70eea..9dd31353f26 100644 --- a/docs/docs/deploy-nginx/index.html +++ b/docs/docs/deploy-nginx/index.html @@ -8,7 +8,7 @@ 27.3 在 Nginx 部署 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
- + diff --git a/docs/docs/devops/index.html b/docs/docs/devops/index.html index f94deba7313..d6f2c8fa636 100644 --- a/docs/docs/devops/index.html +++ b/docs/docs/devops/index.html @@ -8,7 +8,7 @@ 28. 持续部署集成 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
- + diff --git a/docs/docs/donate/index.html b/docs/docs/donate/index.html index a04092d4e90..aa9b18e69d7 100644 --- a/docs/docs/donate/index.html +++ b/docs/docs/donate/index.html @@ -8,7 +8,7 @@ 1.5 赞助 Furion | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.5 赞助 Furion

如果想成为 Furion 支持者或赞助商,请考虑:

🍍 赞助列表#

注:排序按赞助顺序书写

赞助人昵称赞助金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10Nice 的小僧,我们的 dotnetchina 马上火起来了
😮 木木 Woody10感谢您的开源项目!
😚 Joker HouQQ 超级会员一个月
🤠 ccdfzQQ 专属红包 199
🌝 天夫李总支付宝 6666Furion 非常有意思,持续关注
😝 六尘子微信红包 199公司已经使用,小小敬意
🤠 ccdfzQQ 专属红包 200赞助一根内存条
🤑 邓亮灯28.88感谢您的开源项目!
😬 天道酬勤微信二维码 188小小心意
🥰 却月居士QQ 专属红包 100恭喜发财
🤩 鲁旭100感谢您的开源项目!
😬 散客行微信二维码 666终于找到一个不错的框架
😌 本心100项目功能很强大
🙆‍♂️ 毕业生100请你喝杯咖啡
🦹‍♀️ 猪鼻子微信二维码 668
🧟‍♂️ 明年·今日200使用的框架里最爽的,最理想的!加油
👨‍🎓 过去的过去50感谢您的开源项目!
👨‍🔧 万里兮100新公司的第一个项目从 Furion 开始
👴 Muphalem20很热心很亲切的开发者,加油!
💂‍♂️ 吃锅巴的码农微信二维码 500就冲你的文档写得好!
🤴 三重罗生门微信红包 200下次烤鱼你请!
🤵 李涛10加油,我们看到了 dotnet 美好的明天 :)
😂 !@#$%^&QQ 专属红包 100刚接触 furion,文档真棒
😵 李斌20看到一个不错的框架,学习学习,感谢作者的无私奉献
😞 逞强QQ 专属红包 20恭喜发财
🤒 顾锦松QQ 专属红包 200期待文档完成时候
🧟‍♀️ 哈哈微信赞赏码 1000点赞作者!
🍍 Z微信赞赏码 100恭喜孩子诞生,谢谢大佬
🍲 海涛50恭喜
😣 h微信赞赏码 100qq82683656
👱‍♀️ 冷大大微信赞赏码 100加快文档和教学补充哦,另外需要钉钉群,平常不用 QQ
👜 腾坤微信赞赏码 10感谢您的开源项目,QQ:565728589
🚆 文耶耶微信赞赏码 10很棒
🎟 Cynthiax微信转账 5000一路看着过来,小小心意
🥴 一花一世界微信赞赏码 10感谢开源,感谢持续更新
🥪 。微信赞赏码 2感谢
🎄微信赞赏码 20感谢你的开源项目

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Furion 越走越远。

Last updated on by 百小僧
- + diff --git a/docs/docs/dynamic-api-controller/index.html b/docs/docs/dynamic-api-controller/index.html index 69eced90597..437c8079ff8 100644 --- a/docs/docs/dynamic-api-controller/index.html +++ b/docs/docs/dynamic-api-controller/index.html @@ -8,7 +8,7 @@ 5. 动态 WebAPI | Furion - + @@ -81,7 +81,7 @@
// 异常拦截
if(resultContext.Exception != null)
{
}
}
}

详细用法可参见 ASP.NET Core 5.0 - 筛选器

5.12 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/encryption/index.html b/docs/docs/encryption/index.html index 3128b4754f2..38ab2552185 100644 --- a/docs/docs/encryption/index.html +++ b/docs/docs/encryption/index.html @@ -8,7 +8,7 @@ 20. 数据加解密 | Furion - + @@ -24,7 +24,7 @@
var tokenData = JWTEncryption.ReadJwtToken("你的token"); // 解密
var (isValid, tokenData) = JWTEncryption.Validate("你的token"); // 验证token有效期
特别注意

JWTEncryption 加解密并未包含在 Furion 框架中,需要安装 Furion 框架提供的 Furion.Extras.Authentication.JwtBearer 拓展包。

20.3 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/docs/docs/entity/index.html b/docs/docs/entity/index.html index b7fe22cf8f0..ef7c1a5b3a6 100644 --- a/docs/docs/entity/index.html +++ b/docs/docs/entity/index.html @@ -8,7 +8,7 @@ 9.3 数据库实体 | Furion - + @@ -34,7 +34,7 @@
// 配置数据库实体
public void Configure(EntityTypeBuilder<User> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasKey(u => u.Id);
entityBuilder.HasIndex(u => u.Name);
}
}
}

9.3.3.2 在任何实例类中配置#

using Furion.DatabaseAccessor;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System;
namespace Furion.Core
{
public class SomeClass : IEntityTypeBuilder<User>
{
public void Configure(EntityTypeBuilder<User> entityBuilder, DbContext dbContext, Type dbContextLocator)
{
entityBuilder.HasKey(u => u.Id);
entityBuilder.HasIndex(u => u.Name);
}
}
}

如,上面例子,通过 SomeClass 配置 User 数据库实体。

9.3.4 数据库实体配置说明#

Furion 框架会自动扫描所有继承 IEntity 接口的类进行 DbSet<TEntity> 注册,也就是实现自动配置 DbContextOnModelCreating

如果需要跳过自动注册,只需要贴 [NonAutomatic][SkipScan] 特性即可。一旦贴了此特性,那么就需要手动配置 DbContextOnModelCreating

9.3.5 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/event-bus/index.html b/docs/docs/event-bus/index.html index 9e83f9a74dd..7017cf235e8 100644 --- a/docs/docs/event-bus/index.html +++ b/docs/docs/event-bus/index.html @@ -8,7 +8,7 @@ 22. 事件总线 | Furion - + @@ -23,7 +23,7 @@
// 多条消息共用同一个处理程序
[SubscribeMessage("delete:user")]
[SubscribeMessage("remove:user")]
public void RemoveUser(string eventId, object payload)
{
Console.WriteLine("我是"+eventId);
}
}

22.2.3 发布消息#

定义好订阅处理程序后,我们就可以在程序任何地方进行广播消息,事件总线会自动根据消息 Id 触发对应的处理程序方法:

MessageCenter.Send("create:user", new User {}); // => 打印:我是create:user
MessageCenter.Send("delete:user", new User {}); // => 打印:我是delete:user
MessageCenter.Send("remove:user", new User {}); // => 打印:我是remove:user

22.2.4 直接订阅消息#

在上面的例子中,我们需要创建 ISubscribeHandler 的派生类进行相关配置才能实现订阅处理。

在某些特殊情况下,可能只需要订阅一次即可。所以,在 Furion 框架中,为了更简便的订阅消息,也提供了 MessageCenter.Subscribe<T> 静态方法,如:

MessageCenter.Subscribe<User>("create:user", (i,p) => {
// do something。。。
});

22.3 MediatR#

Furion 框架默认只实现了轻量级的事件总线机制,可能还远远未达到大型项目和高并发数据的处理需求。

这个时候,推荐使用 MediatR 这个第三方库进行处理,Github 地址:https://github.com/jbogard/MediatR

MediatR 是非常优秀的事件总线库,支持单播、多播、消息通知推送、智能调度等操作,非常小巧。

22.3.1 MediatR 使用文档#

https://github.com/jbogard/MediatR/wiki

22.4 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/friendly-exception/index.html b/docs/docs/friendly-exception/index.html index 7590fc5bea3..36b6109e06f 100644 --- a/docs/docs/friendly-exception/index.html +++ b/docs/docs/friendly-exception/index.html @@ -8,7 +8,7 @@ 7. 友好异常处理 | Furion - + @@ -59,7 +59,7 @@
namespace Furion.Application
{
public class LogExceptionHandler : IGlobalExceptionHandler, ISingleton
{
public Task OnExceptionAsync(ExceptionContext context)
{
// 写日志
return Task.CompletedTask;
}
}
}

7.15 FriendlyExceptionSettings 配置#

  • HideErrorCode:隐藏错误码,bool 类型,默认 false
  • DefaultErrorCode:默认错误码,string 类型
  • DefaultErrorMessage:默认错误消息,string 类型

配置示例

{
"FriendlyExceptionSettings": {
"DefaultErrorMessage": "系统异常,请联系管理员"
}
}

7.16 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/get-start/index.html b/docs/docs/get-start/index.html index 6fc6e8e3b83..ce56b432d02 100644 --- a/docs/docs/get-start/index.html +++ b/docs/docs/get-start/index.html @@ -8,7 +8,7 @@ 2.1 一分钟上手 | Furion - + @@ -32,7 +32,7 @@
// 添加这一行,如果是 MVC和API共存项目,无需添加 string.Empty
app.UseInject(string.Empty);
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
小提醒

如果 app.UseInject() 不输入参数,则默认地址为 /api,如果输入 string.Empty 则为 / 目录。如果输入任意字符串,则为 /任意字符串 目录。

2.4 启动浏览器#

启动浏览器查看效果。

说好一分钟上手,你们用了多长时间。😁

Last updated on by Monk
- + diff --git a/docs/docs/global/app/index.html b/docs/docs/global/app/index.html index 1ae1b32fa69..9663499ccd5 100644 --- a/docs/docs/global/app/index.html +++ b/docs/docs/global/app/index.html @@ -8,7 +8,7 @@ 1. App 静态类 | Furion - + @@ -30,7 +30,7 @@
// 获取进程架构
var processArchitecture = RuntimeInformation.ProcessArchitecture; // => X64
// 是否是64位操作系统
var is64BitOperatingSystem = Environment.Is64BitOperatingSystem; // => True
Last updated on by Monk
- + diff --git a/docs/docs/global/datavalidator/index.html b/docs/docs/global/datavalidator/index.html index b26e779e710..3d09de9ca9b 100644 --- a/docs/docs/global/datavalidator/index.html +++ b/docs/docs/global/datavalidator/index.html @@ -8,7 +8,7 @@ 3. DataValidator 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3. DataValidator 静态类

3.1 验证对象数据#

var result = DataValidator.TryValidateObject(obj);

3.2 验证单个值#

var result = DataValidator.TryValidateValue(value, typeof(RequiredAttribure), typeof(RangeAttribute));

3.3 正则表达式验证单个值#

var result = DataValidator.TryValidateValue(value,"正则表达式");

3.4 验证类型验证单个值#

var result = DataValidator.TryValidateValue(value, ValidationTypes.Number);
var result2 = DataValidator.TryValidateValue(value, ValidationPattern.AllOfThem, ValidationTypes.Number, ValidationTypes.Required);
Last updated on by Monk
- + diff --git a/docs/docs/global/db/index.html b/docs/docs/global/db/index.html index 457d36ad367..c750b15f05a 100644 --- a/docs/docs/global/db/index.html +++ b/docs/docs/global/db/index.html @@ -8,7 +8,7 @@ 2. Db 静态类 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2. Db 静态类

2.1 获取非泛型仓储#

var repository = Db.GetRepository();

2.2 获取泛型仓储#

var entityRepository = Db.GetRepository<TEntity>();

2.3 获取带定位器泛型仓储#

var locatorRepository = Db.GetRepository<TEntity, TDbContextLocator>();

2.4 获取 Sql 仓储#

var sqlRepository = Db.GetSqlRepository();

2.5 获取 Sql 定位器仓储#

var sqlLocatorRepository = Db.GetSqlRepository<TDbContextLocator>();

2.6 获取 Sql 代理对象#

var sqlProxy= Db.GetSqlProxy<TSqlDispatchProxy>();

2.7 获取默认数据库上下文#

var dbContext = Db.GetDbContext();

2.7 获取定位器数据库上下文#

var locatorDbContext = Db.GetDbContext<TDbContextLocator>();
var locatorDbContext2 = Db.GetDbContext(typeof(TDbContextLocator));

2.8 创建新的默认数据库上下文#

var dbContext = Db.GetNewDbContext();

2.9 创建新的定位器数据库上下文#

var locatorDbContext = Db.GetNewDbContext<TDbContextLocator>();
var locatorDbContext2 = Db.GetNewDbContext(typeof(TDbContextLocator));
Last updated on by Monk
- + diff --git a/docs/docs/global/jsonserializer/index.html b/docs/docs/global/jsonserializer/index.html index 37de58f3b86..31d012e705c 100644 --- a/docs/docs/global/jsonserializer/index.html +++ b/docs/docs/global/jsonserializer/index.html @@ -8,7 +8,7 @@ 7. JsonSerializerUtility 静态类 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

7. JsonSerializerUtility 静态类

7.1 序列化#

var str = JsonSerializerUtility.Serialize(obj, [options]);

7.3 反序列化#

var obj = JsonSerializerUtility.Deserialize<T>(str, [options]);

7.4 获取默认序列化配置#

var options = JsonSerializerUtility.GetDefaultJsonSerializerOptionss);

7.5 设置序列化属性首字母大写#

services.AddControllersWithViews()
.AddJsonSerializerPascalPropertyNaming();

7.6 设置时间输出统一格式化#

services.AddControllersWithViews()
.AddDateTimeJsonConverter("yyyy-MM-dd HH:mm:ss");
Last updated on by Monk
- + diff --git a/docs/docs/global/l/index.html b/docs/docs/global/l/index.html index a4cdff144b6..0fc1d3e3119 100644 --- a/docs/docs/global/l/index.html +++ b/docs/docs/global/l/index.html @@ -8,7 +8,7 @@ 8. L 静态类 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

8. L 静态类

8.1 转换文本多语言#

var apiInterface = L.Text["API 接口"];

8.2 转换 Html 多语言#

var name = L.Html["<b>Hello</b><i> {0}</i>", name];

8.3 设置当前语言#

L.SetCulture("en-US");

8.4 获取系统语言列表#

var list = L.GetCultures();
Last updated on by Monk
- + diff --git a/docs/docs/global/linqexpression/index.html b/docs/docs/global/linqexpression/index.html index bd49c6325f4..f8e32ff8cb6 100644 --- a/docs/docs/global/linqexpression/index.html +++ b/docs/docs/global/linqexpression/index.html @@ -8,7 +8,7 @@ 5. LinqExpression 静态类 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

5. LinqExpression 静态类

5.1 创建一个表达式#

var expression = LinqExpression.Create<T>(u => u.Id == 1);
var expression2 = LinqExpression.Create<T>((u,i) => u.Id ==1 && i > 0);

5.2 拼接两个表达式#

var expression = LinqExpression.And(expression1, expression2);
var expression2 = LinqExpression.IndexAnd(expression1, expression2);
var expression3 = LinqExpression.Or(expression2, expression3);
var expression4 = LinqExpression.IndexOr(expression2, expression3);
Last updated on by Monk
- + diff --git a/docs/docs/global/messagecenter/index.html b/docs/docs/global/messagecenter/index.html index 147b490320a..5ccece8b55e 100644 --- a/docs/docs/global/messagecenter/index.html +++ b/docs/docs/global/messagecenter/index.html @@ -8,7 +8,7 @@ 9. MessageCenter 静态类 | Furion - + @@ -22,7 +22,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

9. MessageCenter 静态类

9.1 订阅消息#

MessageCenter.Subscribe<T>("messageId", (i,p) => {
});

9.2 发送消息#

MessageCenter.Send("messageId", new {});

9.3 取消订阅#

MessageCenter.Unsubscribe("messageId");
Last updated on by Monk
- + diff --git a/docs/docs/global/oops/index.html b/docs/docs/global/oops/index.html index b0275d6f319..4202c71687e 100644 --- a/docs/docs/global/oops/index.html +++ b/docs/docs/global/oops/index.html @@ -8,7 +8,7 @@ 4. Oops 静态类 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

4. Oops 静态类

4.1 抛出字符串异常#

throw Oops.Oh("异常消息");
throw Oops.Oh("异常消息:{0}", "出错了");

4.2 指定类型的异常#

throw Oops.Oh("异常消息", typeof(ArgumentNullException));
throw Oops.Oh("异常消息:{0}", typeof(ArgumentNullException), "出错了");

4.3 状态码异常#

throw Oops.Oh(1000);
throw Oops.Oh(1000, "出错了");

4.4 状态码异常#

throw Oops.Oh(1000, typeof(ArgumentNullException));
throw Oops.Oh(1000, typeof(ArgumentNullException), "出错了");
Last updated on by Monk
- + diff --git a/docs/docs/global/shttp/index.html b/docs/docs/global/shttp/index.html index e229cf65391..497b40e2f0d 100644 --- a/docs/docs/global/shttp/index.html +++ b/docs/docs/global/shttp/index.html @@ -8,7 +8,7 @@ 6. Http 静态类 | Furion - + @@ -21,7 +21,7 @@ - + diff --git a/docs/docs/grpc/index.html b/docs/docs/grpc/index.html index bcf22bf8d63..87347e5d70b 100644 --- a/docs/docs/grpc/index.html +++ b/docs/docs/grpc/index.html @@ -8,7 +8,7 @@ 26. Grpc 服务 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/http/index.html b/docs/docs/http/index.html index c2f70e28514..6e0b0951aae 100644 --- a/docs/docs/http/index.html +++ b/docs/docs/http/index.html @@ -8,7 +8,7 @@ 19. 远程请求 | Furion - + @@ -63,7 +63,7 @@
// 配置 Facebook 基本信息
options.AddHttpClient("facebook", c =>
{
c.BaseAddress = new Uri("https://api.facebook.com/");
c.DefaultRequestHeaders.Add("Accept", "application/vnd.facebook.v3+json");
c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});
})

配置了命名客户端后,每次请求都会自动加上这些配置。

代理请求 使用

[Get("api/getdata"), Client("github")]
Task<User> GetData();
[Put("api/getdata"), Client("facebook")]
Task<User> GetData();

字符串拓展 使用

// 设置请求拦截
var data = await "http://47.100.247.61/api/sysdata/categories".PostAsAsync<object>(new { parm1="", parm2="" }, clientName = "github");

19.6 代理内置特性#

19.6.1 接口特性#

  • 主机 特性
    • [Host]:配置主机地址和端口
  • 请求头 特性
    • [Header]:配置请求报文头,支持多个
  • 客户端 特性
    • [Client]:配置客户端

接口的特性会影响所有的成员方法,也就是会应用到每一个方法中,当然方法可可以重写或忽略。

19.6.2 方法特性#

  • 请求谓词 特性
    • [Get]Get 请求方式
    • [Post]Post 请求方式
    • [Put]Put 请求方式
    • [Delete]Delete 请求方式
    • [Patch]Patch 请求方式
    • [Head]Head 请求方式
  • 主机 特性
    • [Host]:配置主机地址和端口
  • 请求头 特性
    • [Header]:配置请求报文头,支持多个
  • 客户端 特性
    • [Client]:配置客户端
  • 内容类型 特性
    • [MediaTypeHeader]:配置内容类型

19.6.3 方法参数特性#

  • [Query]:自动将参数替换地址中的占位符,占位符格式 {参数名},如:https://www.furion.pro/user/{id},默认基元类型或基元类型数组应用该特性
  • [Body]:自动将参数添加到请求报文体中,默认非基元类型会引用该特性。

19.7 关于同步请求#

Furion 框架内部默认不提供同步请求操作,建议总是使用异步的方式请求。如在不能使用异步的情况下,可自行转换为同步执行。

19.8 异常处理#

默认情况下,如果接口请求异常会抛出请求异常,有时这不是我们想要的结果,我们希望如果接口请求异常,那么直接返回默认值即可,这时候我们只需要在接口或方法贴 [Safety] 特性即可。

19.9 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 日志 知识可查阅 ASP.NET Core - HTTP 请求 章节

Last updated on by Monk
- + diff --git a/docs/docs/index.html b/docs/docs/index.html index 63ab3380e48..4f04699f540 100644 --- a/docs/docs/index.html +++ b/docs/docs/index.html @@ -8,7 +8,7 @@ 1.1 介绍 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.1 介绍

star fork GitHub stars GitHub forks GitHub license nuget

让 .NET 开发更简单,更通用,更流行。

💐 序言#

无私奉献不是天方夜谭,有时候,我们也可以做到。

🍕 名字的由来#

故事是这样子的:

自微软宣布 .NET 5 平台消息之后,就琢磨着开发一个基于 .NET 5 平台的开发框架,想做第一个吃 .NET 5 螃蟹尝鲜之人。

一开始想到了 Lazier 作为框架的名称,中文有 更懒 的意思。符合我的 “一切从简,只为了更懒” 的开发理念。

但是 更懒更烂 中文读音相近且没有特色,而且寓意也不是很好,对此换名问题苦恼了好些天。

刚好有一次在 QQ 群中无意间刷到了群友发的 “先知” 单词:Furion,就那一刻,就认定它了!

Furion 中文有 先知 的意思,恰好符合我创造框架的初衷。所以,Furion 就诞生了。

🍔 关于 LOGO#

Furion 标志设计理念是借鉴著名的 袋鼠理论 设计的。

袋鼠具有长腿、育袋、自我奔跑特点。

  • 长腿:代表着 Furion 拥有稳健的双腿,走在科技的前沿,走的更远,跑的更快。
  • 育袋:小育袋、大作为。期待 Furion 能够育孕出更多 .NET 优秀开发者和生机勃勃的生态。
  • 自我奔跑Furion 自身也要不断学习、不断进步、不断创新、不断开拓。

🍯 开源案例#

  • 考试君:基于 Furion 的在线考试系统
  • 园丁:基于 Furion + Blazor 的超简单后台管理系统
  • Queer:基于 Furion + Layui 的通用型管理系统
  • Pear Admin:基于 Furion + PearAdmin 管理系统
  • JoyAdmin:基于 Furion + iviewadmin 开发的管理系统
  • YShop:基于 Furion + Vue 开发的移动电商项目

🍟 文档地址#

目前文档正在逐步完善中。

🥦 系列教程#

🌭 开源地址#

🍿 Docker 镜像#

  • Docker Hub 线上镜像
docker run --name furion -p 5000:80 monksoul/furion:v1.4.3
  • 手动 打包镜像

打开 CMD/Shell/PowerShell 进入 Furion 项目根目录打包 Furion 镜像:

docker build -t furion:v1.4.3 .

打包成功后,直接 docker run

docker run --name furion -p 5000:80 furion:v1.4.3

🥥 框架拓展包#

包类型名称版本描述
nugetFurionnugetFurion 核心包
nugetFurion.Extras.Authentication.JwtBearernugetFurion Jwt 拓展包
nugetFurion.Extras.DependencyModel.CodeAnalysisnugetFurion CodeAnalysis 拓展包
nugetFurion.Extras.Web.HttpContextnugetFurion HttpContext 拓展包
nugetFurion.Extras.ObjectMapper.MapsternugetFurion Mapster 拓展包
nugetFurion.Extras.DatabaseAccessor.SqlSugarnugetFurion SqlSugar 拓展包
nugetFurion.Extras.DatabaseAccessor.DappernugetFurion Dapper 拓展包
nugetFurion.Extras.Logging.SerilognugetFurion Serilog 拓展包

🍄 框架脚手架#

模板类型名称版本描述
nugetFurion.Template.MvcnugetMvc 模板
nugetFurion.Template.ApinugetWebApi 模板
nugetFurion.Template.AppnugetMvc/WebApi 模板
nugetFurion.Template.RazornugetRazorPages 模板
nugetFurion.Template.RazorWithWebApinugetRazorPages/WebApi 模板
nugetFurion.Template.BlazornugetBlazor 模板
nugetFurion.Template.BlazorWithWebApinugetBlazor/WebApi 模板

如何使用脚手架

🍎 框架特点#

  • 全新面貌:基于 .NET 5 平台,没有历史包袱
  • 极易入门:只需要一个 Inject() 即可完成配置
  • 极速开发:内置丰富的企业应用开发功能
  • 极少依赖:框架只依赖两个第三方包
  • 极其灵活:轻松面对多变复杂的需求
  • 极易维护:采用独特的架构思想,只为长久维护设计
  • 完整文档:提供完善的开发文档

🥞 架构设计#

正在整理中...

🥝 功能模块#

🥐 框架依赖#

Furion 为了追求极速入门,极致性能,尽可能的不使用或减少第三方依赖。目前 Furion 仅集成了以下两个依赖:

麻雀虽小五脏俱全。Furion 即使只集成了这两个依赖,但是主流的 依赖注入/控制反转AOP 面向切面编程,事件总线数据验证数据库操作 等等一个都不少。

🥗 环境要求#

  • Visual Studio 2019 16.8 +
  • .NET 5 SDK +
  • .Net Standard 2.1 +

🥪 支持平台#

  • 运行环境
    • Windows
    • Linux
    • MacOS
    • Docker/K8S/K3S/Rancher
    • Xamarin/MAUI
  • 数据库
    • SqlServer
    • Sqlite
    • Azure Cosmos
    • MySql
    • MariaDB
    • PostgreSQL
    • InMemoryDatabase
    • Oracle(并未完全适配
    • Firebird
    • 达梦数据库
  • 应用部署
    • Kestrel
    • Nginx
    • Jexus
    • IIS
    • Apache
    • PM2
    • Supervisor
    • 单文件
    • 容器(Docker/K8S/K3S/Rancher)

🍖 关于性能#

Furion 目前采用 Visual Studio 2019 16.8 自带性能测试和 JMeter 进行测试,由于篇幅有限,只贴部分测试图,测试结果如下:


🌴 Stars 趋势图#

Stargazers over time

🍚 关于作者#

一个拥有近 13 年开发经验 .NETer。喜欢分享,喜欢新技术,在互联网多个技术领域皆有涉猎,MIP(dotNET China Most Influential Professionals) 专家,同时多次获得开源中国 Gitee 授予 GVP 证书。

🍤 项目成员#

🎈 欢迎更多的开发者加入 Furion 大家庭。

🍝 他们都在用#

  • 百签科技(广东)有限公司
  • 码为科技(广州)有限公司
  • 夫上技术(阳江)有限公司
  • 广州启顺国际货运代理有限公司
  • 森丰供应链服务(广州)有限公司
  • 中山赢友网络科技有限公司
  • 中山模思软件科技有限公司
  • 珠海市恒泰新软件有限责任公司
  • 珠海思诺锐创软件有限公司
  • 深圳市易胜科技有限公司
  • 重庆虫儿飞科技有限公司
  • 重庆林木森科技有限公司
  • 深圳市品立方科技有限公司
  • 上海奥达科股份有限公司
  • 中山市泓升软件科技有限公司
  • 唐山天权建筑科技有限公司
  • 北京帝龙科技有限公司
  • 深圳市希立网络有限公司
  • 广州市飞帆计算机技术有限公司
  • 泉州市润海信息科技有限公司
  • 成都市彼岸里信息科技有限公司
  • 福建省山水生活服务集团有限公司
  • 安徽宝典网络科技有限公司
  • 西安空岛网络科技有限公司
  • 果糖大数据科技(南通)有限公司
  • 上海楷青信息技术有限公司
  • 上海邮银通信发展有限公司
  • 合纵动力软件科技有限公司
  • 深圳合纵动力软件科技有限公司
  • 北京帝龙科技有限公司

如果您的项目使用到 Furion 开发,可以告诉我们。

🍻 贡献代码#

Furion 遵循 Apache-2.0 开源协议,欢迎大家提交 PRIssue

如果要为项目做出贡献,请查看贡献指南

🍍 捐赠列表#

注:排序按捐赠顺序书写

捐赠人昵称捐赠金额(元)附语
🤴 爱吃油麦菜100感谢您的开源项目!
👳‍♂️ 麦壳饼200感谢您的开源项目!
👨 Sun100感谢您的开源项目!
👶 d61761720感谢您的开源项目!
👦 Diqiguoji00816.66见贤思齐
👲 nodyang100感谢您的开源项目!
👳‍♀️ mictxd100吹过的牛都实现。
🧓 欧流全10希望将来超越 Spring
👨‍⚕️ lionkon10...看了框架感觉拿来学习是很不错的...
😤 好人!10Nice 的小僧,我们的 dotnetchina 马上火起来了
😮 木木 Woody10感谢您的开源项目!
😚 Joker HouQQ 超级会员一个月
🤠 ccdfzQQ 专属红包 199
🌝 天夫李总支付宝 6666Furion 非常有意思,持续关注
😝 六尘子微信红包 199公司已经使用,小小敬意
🤠 ccdfzQQ 专属红包 200赞助一根内存条
🤑 邓亮灯28.88感谢您的开源项目!
😬 天道酬勤微信二维码 188小小心意
🥰 却月居士QQ 专属红包 100恭喜发财
🤩 鲁旭100感谢您的开源项目!
😬 散客行微信二维码 666终于找到一个不错的框架
😌 本心100项目功能很强大
🙆‍♂️ 毕业生100请你喝杯咖啡
🦹‍♀️ 猪鼻子微信二维码 668
🧟‍♂️ 明年·今日200使用的框架里最爽的,最理想的!加油
👨‍🎓 过去的过去50感谢您的开源项目!
👨‍🔧 万里兮100新公司的第一个项目从 Furion 开始
👴 Muphalem20很热心很亲切的开发者,加油!
💂‍♂️ 吃锅巴的码农微信二维码 500就冲你的文档写得好!
🤴 三重罗生门微信红包 200下次烤鱼你请!
🤵 李涛10加油,我们看到了 dotnet 美好的明天 :)
😂 !@#$%^&QQ 专属红包 100刚接触 furion,文档真棒
😵 李斌20看到一个不错的框架,学习学习,感谢作者的无私奉献
😞 逞强QQ 专属红包 20恭喜发财
🤒 顾锦松QQ 专属红包 200期待文档完成时候
🧟‍♀️ 哈哈微信赞赏码 1000点赞作者!
🍍 Z微信赞赏码 100恭喜孩子诞生,谢谢大佬
🍲 海涛50恭喜
😣 h微信赞赏码 100qq82683656
👱‍♀️ 冷大大微信赞赏码 100加快文档和教学补充哦,另外需要钉钉群,平常不用 QQ
👜 腾坤微信赞赏码 10感谢您的开源项目,QQ:565728589
🚆 文耶耶微信赞赏码 10很棒
🎟 Cynthiax微信转账 5000一路看着过来,小小心意
🥴 一花一世界微信赞赏码 10感谢开源,感谢持续更新
🥪 。微信赞赏码 2感谢
🎄微信赞赏码 20感谢你的开源项目

非常感谢您们的支持,正是因为您们,中国开源才可以越走越远,Furion 越走越远。

如果想成为 Furion 支持者或赞助商,请考虑:

🥔 QQ 交流群#

dotNET 中国 ① 🥇(已满

dotNET 中国 ②(空余)

🧆 友情链接#

👉 Furion 👉 SqlSugar 👉 Layx 👉 t-io 👉 ThinkPHP 👉 Hutool 👉 BootstrapAdmin 👉 BootstrapBlazor 👉 IoTSharp 👉 Anno.Core 👉 WaterCloud 👉 OpenAuth.Net

🍵 特别鸣谢#

在这里特别感谢 QQ 网名:蓝狐星Furion 提供演示云服务器。

Last updated on by 百小僧
- + diff --git a/docs/docs/job/index.html b/docs/docs/job/index.html index 35d43399252..2245cc88c38 100644 --- a/docs/docs/job/index.html +++ b/docs/docs/job/index.html @@ -8,7 +8,7 @@ 24. 任务调度 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/local-language/index.html b/docs/docs/local-language/index.html index de4229654ec..888dcfe3deb 100644 --- a/docs/docs/local-language/index.html +++ b/docs/docs/local-language/index.html @@ -8,7 +8,7 @@ 21. 全球化和本地化 | Furion - + @@ -30,7 +30,7 @@
public TestController(IStringLocalizerFactory factory)
{
_localizer = factory.Create(L.LangType);
}
public IActionResult About()
{
ViewData["Message"] = _localizer["Your application description page."];
}
}

21.9 LocalizationSettings 配置#

  • LocalizationSettings 多语言配置根节点
    • ResourcesPath:资源目录,string 类型,默认 Resources
    • SupportedCultures:支持的语言区域码类别,string[] 类型
    • DefaultCulture:默认语言区域码,如果为空,则取 SupportedCultures 第一项

21.10 区域码列表#

  • af 公用荷兰语
  • af-ZA 公用荷兰语 - 南非
  • sq 阿尔巴尼亚
  • sq-AL 阿尔巴尼亚 -阿尔巴尼亚
  • ar 阿拉伯语
  • ar-DZ 阿拉伯语 -阿尔及利亚
  • ar-BH 阿拉伯语 -巴林
  • ar-EG 阿拉伯语 -埃及
  • ar-IQ 阿拉伯语 -伊拉克
  • ar-JO 阿拉伯语 -约旦
  • ar-KW 阿拉伯语 -科威特
  • ar-LB 阿拉伯语 -黎巴嫩
  • ar-LY 阿拉伯语 -利比亚
  • ar-MA 阿拉伯语 -摩洛哥
  • ar-OM 阿拉伯语 -阿曼
  • ar-QA 阿拉伯语 -卡塔尔
  • ar-SA 阿拉伯语 - 沙特阿拉伯
  • ar-SY 阿拉伯语 -叙利亚共和国
  • ar-TN 阿拉伯语 -北非的共和国
  • ar-AE 阿拉伯语 - 阿拉伯联合酋长国
  • ar-YE 阿拉伯语 -也门
  • hy 亚美尼亚
  • hy-AM 亚美尼亚的 -亚美尼亚
  • az Azeri
  • az-AZ-Cyrl Azeri-(西里尔字母的) 阿塞拜疆
  • az-AZ-Latn Azeri(拉丁文)- 阿塞拜疆
  • eu 巴斯克
  • eu-ES 巴斯克 -巴斯克
  • be Belarusian
  • be-BY Belarusian-白俄罗斯
  • bg 保加利亚
  • bg-BG 保加利亚 -保加利亚
  • ca 嘉泰罗尼亚
  • ca-ES 嘉泰罗尼亚 -嘉泰罗尼亚
  • zh-HK 华 - 香港的 SAR
  • zh-MO 华 - 澳门的 SAR
  • zh-CN 华 -中国
  • zh-CHS 华 (单一化)
  • zh-SG 华 -新加坡
  • zh-TW 华 -台湾
  • zh-CHT 华 (传统的)
  • hr 克罗埃西亚
  • hr-HR 克罗埃西亚 -克罗埃西亚
  • cs 捷克
  • cs-CZ 捷克 - 捷克
  • da 丹麦文
  • da-DK 丹麦文 -丹麦
  • div Dhivehi
  • div-MV Dhivehi-马尔代夫
  • nl 荷兰
  • nl-BE 荷兰 -比利时
  • nl-NL 荷兰 - 荷兰
  • en 英国
  • en-AU 英国 -澳洲
  • en-BZ 英国 -伯利兹
  • en-CA 英国 -加拿大
  • en-CB 英国 -加勒比海
  • en-IE 英国 -爱尔兰
  • en-JM 英国 -牙买加
  • en-NZ 英国 - 新西兰
  • en-PH 英国 -菲律宾共和国
  • en-ZA 英国 - 南非
  • en-TT 英国 - 千里达托贝哥共和国
  • en-GB 英国 - 英国
  • en-US 英国 - 美国
  • en-ZW 英国 -津巴布韦
  • et 爱沙尼亚
  • et-EE 爱沙尼亚的 -爱沙尼亚
  • fo Faroese
  • fo-FO Faroese- 法罗群岛
  • fa 波斯语
  • fa-IR 波斯语 -伊朗王国
  • fi 芬兰语
  • fi-FI 芬兰语 -芬兰
  • fr 法国
  • fr-BE 法国 -比利时
  • fr-CA 法国 -加拿大
  • fr-FR 法国 -法国
  • fr-LU 法国 -卢森堡
  • fr-MC 法国 -摩纳哥
  • fr-CH 法国 -瑞士
  • gl 加利西亚
  • gl-ES 加利西亚 -加利西亚
  • ka 格鲁吉亚州
  • ka-GE 格鲁吉亚州 -格鲁吉亚州
  • de 德国
  • de-AT 德国 -奥地利
  • de-DE 德国 -德国
  • de-LI 德国 -列支敦士登
  • de-LU 德国 -卢森堡
  • de-CH 德国 -瑞士
  • el 希腊
  • el-GR 希腊 -希腊
  • gu Gujarati
  • gu-IN Gujarati-印度
  • he 希伯来
  • he-IL 希伯来 -以色列
  • hi 北印度语
  • hi-IN 北印度的 -印度
  • hu 匈牙利
  • hu-HU 匈牙利的 -匈牙利
  • is 冰岛语
  • is-IS 冰岛的 -冰岛
  • id 印尼
  • id-ID 印尼 -印尼
  • it 意大利
  • it-IT 意大利 -意大利
  • it-CH 意大利 -瑞士
  • ja 日本
  • ja-JP 日本 -日本
  • kn 卡纳达语
  • kn-IN 卡纳达语 -印度
  • kk Kazakh
  • kk-KZ Kazakh-哈萨克
  • kok Konkani
  • kok-IN Konkani-印度
  • ko 韩国
  • ko-KR 韩国 -韩国
  • ky Kyrgyz
  • ky-KZ Kyrgyz-哈萨克
  • lv 拉脱维亚
  • lv-LV 拉脱维亚的 -拉脱维亚
  • lt 立陶宛
  • lt-LT 立陶宛 -立陶宛
  • mk 马其顿
  • mk-MK 马其顿 -FYROM
  • ms 马来
  • ms-BN 马来 -汶莱
  • ms-MY 马来 -马来西亚
  • mr 马拉地语
  • mr-IN 马拉地语 -印度
  • mn 蒙古
  • mn-MN 蒙古 -蒙古
  • no 挪威
  • nb-NO 挪威 (Bokm?l) - 挪威
  • nn-NO 挪威 (Nynorsk)- 挪威
  • pl 波兰
  • pl-PL 波兰 -波兰
  • pt 葡萄牙
  • pt-BR 葡萄牙 -巴西
  • pt-PT 葡萄牙 -葡萄牙
  • pa Punjab 语
  • pa-IN Punjab 语 -印度
  • ro 罗马尼亚语
  • ro-RO 罗马尼亚语 -罗马尼亚
  • ru 俄国
  • ru-RU 俄国 -俄国
  • sa 梵文
  • sa-IN 梵文 -印度
  • sr-SP-Cyrl 塞尔维亚 -(西里尔字母的) 塞尔维亚共和国
  • sr-SP-Latn 塞尔维亚 (拉丁文)- 塞尔维亚共和国
  • sk 斯洛伐克
  • sk-SK 斯洛伐克 -斯洛伐克
  • sl 斯洛文尼亚
  • sl-SI 斯洛文尼亚 -斯洛文尼亚
  • es 西班牙
  • es-AR 西班牙 -阿根廷
  • es-BO 西班牙 -玻利维亚
  • es-CL 西班牙 -智利
  • es-CO 西班牙 -哥伦比亚
  • es-CR 西班牙 - 哥斯达黎加
  • es-DO 西班牙 - 多米尼加共和国
  • es-EC 西班牙 -厄瓜多尔
  • es-SV 西班牙 - 萨尔瓦多
  • es-GT 西班牙 -危地马拉
  • es-HN 西班牙 -洪都拉斯
  • es-MX 西班牙 -墨西哥
  • es-NI 西班牙 -尼加拉瓜
  • es-PA 西班牙 -巴拿马
  • es-PY 西班牙 -巴拉圭
  • es-PE 西班牙 -秘鲁
  • es-PR 西班牙 - 波多黎各
  • es-ES 西班牙 -西班牙
  • es-UY 西班牙 -乌拉圭
  • es-VE 西班牙 -委内瑞拉
  • sw Swahili
  • sw-KE Swahili-肯尼亚
  • sv 瑞典
  • sv-FI 瑞典 -芬兰
  • sv-SE 瑞典 -瑞典
  • syr Syriac
  • syr-SY Syriac-叙利亚共和国
  • ta 坦米尔
  • ta-IN 坦米尔 -印度
  • tt Tatar
  • tt-RU Tatar-俄国
  • te Telugu
  • te-IN Telugu-印度
  • th 泰国
  • th-TH 泰国 -泰国
  • tr 土耳其语
  • tr-TR 土耳其语 -土耳其
  • uk 乌克兰
  • uk-UA 乌克兰 -乌克兰
  • ur Urdu
  • ur-PK Urdu-巴基斯坦
  • uz Uzbek
  • uz-UZ-Cyrl Uzbek-(西里尔字母的) 乌兹别克斯坦
  • uz-UZ-Latn Uzbek(拉丁文)- 乌兹别克斯坦
  • vi 越南
  • vi-VN 越南 -越南

21.11 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 多语言 知识可查阅 ASP.NET Core - 全局化和本地化 章节。

Last updated on by Monk
- + diff --git a/docs/docs/logging/index.html b/docs/docs/logging/index.html index b2cfcd4fa57..d0f5c1c22b8 100644 --- a/docs/docs/logging/index.html +++ b/docs/docs/logging/index.html @@ -8,7 +8,7 @@ 18. 日志记录 | Furion - + @@ -29,7 +29,7 @@
namespace Furion.Web.Entry
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Inject()
.UseStartup<Startup>();
})
.UseSerilogDefault();
}
}
}
特别注意

.UseSerilogDefault() 默认集成了 控制台文件 方式。如需自定义写入,则传入需要写入的介质即可:

.UseSerilogDefault(config =>
{
config.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} {Properties:j}{NewLine}{Exception}")
.WriteTo.File("log.txt", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true);
});
  • 替换 appsetting.json 默认日志内容
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore": "Information"
}
}

替换为:

"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"System": "Warning",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"Microsoft.EntityFrameworkCore": "Information"
}
}
}

18.5.2 记录请求日志#

Serilog 日志组件也提供了非常方便快捷的请求日志中间件,只需要在 Startup.cs 中启用即可。如:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStaticFiles();
app.UseSerilogRequestLogging(); // 必须在 UseStaticFiles 和 UseRouting 之间
app.UseRouting();
}

18.6 日志示例#

下面便是日志输出日志的模板,支持各种自定义方式

2020-12-21 15:54:43.775 +08:00 [INF] Application started. Press Ctrl+C to shut down.
2020-12-21 15:54:43.897 +08:00 [INF] Hosting environment: Development
2020-12-21 15:54:43.899 +08:00 [INF] Content root path: D:\MONK\Furion\samples\Furion.Web.Entry
2020-12-21 15:55:00.651 +08:00 [WRN] Sensitive data logging is enabled. Log entries and exception messages may include sensitive application data; this mode should only be enabled during development.
2020-12-21 15:55:00.817 +08:00 [INF] Entity Framework Core 5.0.1 initialized 'DefaultDbContext' using provider 'Microsoft.EntityFrameworkCore.Sqlite' with options: SensitiveDataLoggingEnabled DetailedErrorsEnabled MaxPoolSize=100 MigrationsAssembly=Furion.Database.Migrations
2020-12-21 15:55:01.711 +08:00 [WRN] Compiling a query which loads related collections for more than one collection navigation either via 'Include' or through projection but no 'QuerySplittingBehavior' has been configured. By default Entity Framework will use 'QuerySplittingBehavior.SingleQuery' which can potentially result in slow query performance. See https://go.microsoft.com/fwlink/?linkid=2134277 for more information. To identify the query that's triggering this warning call 'ConfigureWarnings(w => w.Throw(RelationalEventId.MultipleCollectionIncludeWarning))'
2020-12-21 15:55:01.919 +08:00 [INF] Executed DbCommand (31ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Name", "p"."Age", "p"."Address", "p0"."PhoneNumber", "p0"."QQ", "p"."CreatedTime", "p0"."Id", "c"."Id", "c"."Name", "c"."Gender", "t"."Id", "t"."Name", "t"."PersonsId", "t"."PostsId"
FROM "Person" AS "p"
LEFT JOIN "PersonDetail" AS "p0" ON "p"."Id" = "p0"."PersonId"
LEFT JOIN "Children" AS "c" ON "p"."Id" = "c"."PersonId"
LEFT JOIN (
SELECT "p2"."Id", "p2"."Name", "p1"."PersonsId", "p1"."PostsId"
FROM "PersonPost" AS "p1"
INNER JOIN "Post" AS "p2" ON "p1"."PostsId" = "p2"."Id"
) AS "t" ON "p"."Id" = "t"."PersonsId"
ORDER BY "p"."Id", "p0"."Id", "c"."Id", "t"."PersonsId", "t"."PostsId", "t"."Id"
2020-12-21 15:55:25.354 +08:00 [INF] Executed DbCommand (3ms) [Parameters=[], CommandType='"Text"', CommandTimeout='30']
SELECT "p"."Id", "p"."Name", "p"."Age", "p"."Address", "p0"."PhoneNumber", "p0"."QQ", "p"."CreatedTime", "p0"."Id", "c"."Id", "c"."Name", "c"."Gender", "t"."Id", "t"."Name", "t"."PersonsId", "t"."PostsId"
FROM "Person" AS "p"
LEFT JOIN "PersonDetail" AS "p0" ON "p"."Id" = "p0"."PersonId"
LEFT JOIN "Children" AS "c" ON "p"."Id" = "c"."PersonId"
LEFT JOIN (
SELECT "p2"."Id", "p2"."Name", "p1"."PersonsId", "p1"."PostsId"
FROM "PersonPost" AS "p1"
INNER JOIN "Post" AS "p2" ON "p1"."PostsId" = "p2"."Id"
) AS "t" ON "p"."Id" = "t"."PersonsId"
ORDER BY "p"."Id", "p0"."Id", "c"."Id", "t"."PersonsId", "t"."PostsId", "t"."Id"
2020-12-21 15:58:27.328 +08:00 [INF] Application started. Press Ctrl+C to shut down.
2020-12-21 15:58:27.442 +08:00 [INF] Hosting environment: Development
2020-12-21 15:58:27.444 +08:00 [INF] Content root path: D:\MONK\Furion\samples\Furion.Web.Entry
2020-12-21 15:58:27.909 +08:00 [INF] HTTP GET / responded 200 in 457.0657 ms
2020-12-21 15:58:33.336 +08:00 [INF] HTTP GET /api/index.html responded 200 in 95.9277 ms
2020-12-21 15:58:34.187 +08:00 [INF] HTTP GET /swagger/Default/swagger.json responded 200 in 674.9800 ms

18.7 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 日志 知识可查阅 ASP.NET Core - 日志 章节 和 Serilog 文档。

Last updated on by Monk
- + diff --git a/docs/docs/object-mapper/index.html b/docs/docs/object-mapper/index.html index 9654cd4926a..43e99618243 100644 --- a/docs/docs/object-mapper/index.html +++ b/docs/docs/object-mapper/index.html @@ -8,7 +8,7 @@ 13. 对象数据映射 | Furion - + @@ -23,7 +23,7 @@
var dto = new Dto();
dto.Id = entity.Id;
dto.Name = entity.Name;
dto.Age = entity.Age;
dto.Address = entity.Address;
dto.FullName = entity.FirstName + entity.LastName;
dto.IdCard = entity.IdCard.Replace("1234", "****");

上面的例子似乎没有任何问题,但是如果很多地方需要这样的赋值操作、或者相同的赋值操作在多个地方使用,又或者一个类中含有非常多的属性或自定义赋值操作。那么这样的操作效率极低,容易出错,且代码非常臃肿和冗余。

所以,实现自动映射赋值和支持特殊配置的需求就有了。目前 C# 平台有两个优秀的对象映射工具:MapsterAutoMapperFurion 框架中,默认集成的是 MapsterMapster 是一款极易使用且超高性能的对象映射框架。

13.3 Mapster 使用#

现在,我们可以通过 Mapster 提供的对象映射方法:Adapt 方法改造上面的例子:

安装拓展包

Furion.Core 层(推荐)安装 Furion.Extras.ObjectMapper.Mapster 拓展包,无需手动调用,Furion 会自动加载并调用。

13.3.1 极易入门#

var entity = repository.Find(1);
var dto = entity.Adapt<Dto>();

仅仅一行代码就可以实现 entity -> dto 的转换,如果涉及到赋值的复制操作,如 dto.FullNamedto.IdCard,我们只需要自定义映射规则类即可。

13.3.2 自定义映射规则#

using Mapster;
using System;
namespace Furion.Application
{
public class Mapper : IRegister
{
public void Register(TypeAdapterConfig config)
{
config.ForType<Entity, Dto>()
.Map(dest => dest.FullName, src => src.FirstName + src.LastName)
.Map(dest => dest.IdCard, src => src.IdCard.Replace("1234", "****"));
}
}
}
小知识

该映射文件 Mapper.cs 可以放在任何项目或文件夹中,Furion 会在程序启动的时候自动扫描并注入配置。

13.3.3 依赖注入方式#

Mapster 除了提供 Adapt 拓展方法以外,同时还提供依赖注入的方式。

public Person(IMapper mapper)
{
var dto = _mapper.Map<Dto>(entity);
}

13.3.4 和 EFCore 配合#

Mapster 还提供了 ProjectToType Linq 拓展方法减少我们手动 Select 操作,如:

正常的操作:

var destinations = context.Sources
.Select(c => new Destination {
Id = p.Id,
Name = p.Name,
Surname = p.Surname,
....
})
.ToList();

使用 Mapster 之后:

var destinations = context.Sources.ProjectToType<Destination>().ToList();

13.5 全局默认配置#

Furion 提供全局默认映射配置选项 TypeAdapterConfig.GlobalSettings.Default,可在 Startup 中配置即可,如:

TypeAdapterConfig.GlobalSettings.Default
.PreserveReference(true);

13.6 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 Mapster 知识可查阅 Mapster - Wiki 文档。

Last updated on by Monk
- + diff --git a/docs/docs/options/index.html b/docs/docs/options/index.html index 16417c50854..d590fb46ee5 100644 --- a/docs/docs/options/index.html +++ b/docs/docs/options/index.html @@ -8,7 +8,7 @@ 4.2 选项 | Furion - + @@ -51,7 +51,7 @@
public void OnListener(AppInfoOptions options, IConfiguration configuration)
{
var name = options.Name; // 实时的最新值
var version = options.Version; // 实时的最新值
}
public void PostConfigure(AppInfoOptions options, IConfiguration configuration)
{
}
}
特别说明

IConfigurableOptionsListener<TOptions> 继承自 IConfigurableOptions<TOptions>

4.2.10 选项的优缺点#

  • 优点

    • 强类型配置
    • 提供多种读取方式
    • 支持热加载
    • 支持设置默认值/后期配置
    • 支持在运行环境中动态配置
    • 支持验证配置有效性
    • 支持更改通知
    • 支持命名选项
  • 缺点

    • 需要定义对应类型
    • 需要在启动时注册

4.2.11 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 选项 知识可查阅 ASP.NET Core - 选项 章节。

Last updated on by Monk
- + diff --git a/docs/docs/performance/index.html b/docs/docs/performance/index.html index cb04ef24a1f..680df0f1c12 100644 --- a/docs/docs/performance/index.html +++ b/docs/docs/performance/index.html @@ -8,7 +8,7 @@ 29.2 性能测试 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/process-service/index.html b/docs/docs/process-service/index.html index 96530154cab..4d6e80e6a65 100644 --- a/docs/docs/process-service/index.html +++ b/docs/docs/process-service/index.html @@ -8,7 +8,7 @@ 23. 辅助角色服务 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/reference/index.html b/docs/docs/reference/index.html index 2d8d040c1b3..a86112e9238 100644 --- a/docs/docs/reference/index.html +++ b/docs/docs/reference/index.html @@ -8,7 +8,7 @@ 2.3 框架项目引用 | Furion - + @@ -23,7 +23,7 @@
namespace Furion.Web.Entry
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.Inject()
.UseStartup<Startup>();
});
}
}
}

2.3.3 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/saas/index.html b/docs/docs/saas/index.html index 5447cace04c..201c014ed6e 100644 --- a/docs/docs/saas/index.html +++ b/docs/docs/saas/index.html @@ -8,7 +8,7 @@ 11. SaaS 多租户 | Furion - + @@ -58,7 +58,7 @@
public string Name { get; set; }
public string Host { get; set; }
}
}

如果需要查询该租户信息,可通过以下代码获取,如:

var tenantDbContext = Db.GetDbContext<MultiTenantDbContextLocator>();
var myTenant = tenantDbContext.Set<MyTenant>();

11.9 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by 百小僧
- + diff --git a/docs/docs/settings/appsettings/index.html b/docs/docs/settings/appsettings/index.html index 686d3fbcb9b..20d1d76810c 100644 --- a/docs/docs/settings/appsettings/index.html +++ b/docs/docs/settings/appsettings/index.html @@ -8,7 +8,7 @@ 1. 应用配置 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1. 应用配置

1.1 关于配置#

应用配置指的是 Furion 框架全局配置选项。

1.2 配置信息#

  • AppSettings:配置根节点
    • InjectMiniProfiler:是否注入 MiniProfilerbool 类型,默认 true关闭 Swagger 左上角监听
    • InjectSpecificationDocument:是否启用 Swagger 文档,bool 类型,默认 true生产环境可关闭
    • EnabledReferenceAssemblyScan:是否启用通过 dll 方式添加的引用程序集扫描,bool 类型,默认 false
    • ExternalAssemblies:配置外部程序集完整路径,支持动态加载,string[] 类型,默认 []
    • DynamicLogLevel:配置动态日志级别,LogLevel 枚举类型,默认 LogLevel.Information
    • PrintDbConnectionInfo:是否打印数据库连接信息到 MiniProfiler 中,bool 类型,默认 true

1.3 配置示例#

{
"AppSettings": {
"InjectMiniProfiler": false
}
}

1.4 特别注意#

默认情况下,Furion 框架会自动扫描 *.json*.config.xml 文件载入配置中,如需忽略个别文件,需在 appsettings.json 配置文件根节点下配置 IgnoreConfigurationFiles 节点即可,string[] 类型,如:

{
"IgnoreConfigurationFiles": ["runtime.json"]
}

必须在 appsettings.json 文件中配置才有效

Last updated on by 百小僧
- + diff --git a/docs/docs/settings/corsaccessorsettings/index.html b/docs/docs/settings/corsaccessorsettings/index.html index 4049a6c0580..6c13ee8a1c2 100644 --- a/docs/docs/settings/corsaccessorsettings/index.html +++ b/docs/docs/settings/corsaccessorsettings/index.html @@ -8,7 +8,7 @@ 2. 跨域配置 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2. 跨域配置

2.1 关于配置#

跨域配置指的是 Furion 框架客户端跨域配置选项。

2.2 配置信息#

  • CorsAccessorSettings:配置根节点
    • PolicyName:跨域策略名,sting 类型,必填,默认 FurCorsAccessor
    • WithOrigins:允许跨域的域名列表,string[] 类型,默认 [ "http://localhost:4200" ]
    • WithHeaders:请求表头,没有配置则允许所有表头,string[] 类型
    • WithExposedHeaders:响应标头,string[] 类型
    • WithMethods:设置跨域允许请求谓词,没有配置则允许所有,string[] 类型
    • AllowCredentials:跨域请求中的凭据,bool 类型
    • SetPreflightMaxAge:设置预检过期时间,int 类型

2.3 配置示例#

{
"CorsAccessorSettings": {
"PolicyName": "MyPolicy",
"WithOrigins": ["http://localhost:4200", "https://furion.pro"]
}
}

2.4 使用 axios 前端注意事项#

由于 axios 对跨域有特定的需要,需要响应报文中添加特定 Header 才能放行,如:Access-Control-Expose-Headers: xxxxx,所以,如果前端使用了 axios 请求,需要添加以下配置:

{
"CorsAccessorSettings": {
"WithExposedHeaders": ["X-Pagination","access-token","x-access-token"]
}
}
Last updated on by Monk
- + diff --git a/docs/docs/settings/dependencyinjectionsettings/index.html b/docs/docs/settings/dependencyinjectionsettings/index.html index 8b07bb330cb..a598061b028 100644 --- a/docs/docs/settings/dependencyinjectionsettings/index.html +++ b/docs/docs/settings/dependencyinjectionsettings/index.html @@ -8,7 +8,7 @@ 4. 依赖注入配置 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

4. 依赖注入配置

4.1 关于配置#

依赖注入配置指的是 Furion 框架依赖注入配置选项。

4.2 配置信息#

  • DependencyInjectionSettings:依赖注入配置根节点
    • Definitions:动态依赖注入配置节点,ExternalService 数组类型
      • ExternalService:配置单个依赖注入信息
        • Interface:配置依赖接口信息,格式:程序集名称;接口完整名称,如:Furion.Application;Furion.Application.ITestService
        • Service:配置接口实现信息,格式同上
        • RegisterType:配置依赖注入的对象生存期,取值:TransientScopedSingleton
        • Action:注册行为,可选值:AddTryAdd,参见 依赖注入-特性配置
        • Pattern:注册选项,参见 依赖注入-特性配置置
        • Named:注册别名,参见 依赖注入-特性配置
        • Order:注册排序,参见 依赖注入-特性配置
        • Proxy:配置代理拦截,,格式:程序集名称;代理类完整名称,参见 依赖注入-特性配置

4.3 配置示例#

{
"DependencyInjectionSettings": {
"Definitions": [
{
"Interface": "Furion.Application;Furion.Application.ITestService",
"Service": "Furion.Application;Furion.Application.TestService",
"RegisterType": "Transient",
"Action": "Add",
"Pattern": "SelfWithFirstInterface",
"Named": "TestService",
"Order": 1,
"Proxy": "Furion.Application;Furion.Application.LogDispathProxy"
}
]
}
}
Last updated on by Monk
- + diff --git a/docs/docs/settings/dynamicapicontrollersettings/index.html b/docs/docs/settings/dynamicapicontrollersettings/index.html index 38776057bf8..54f1f693f51 100644 --- a/docs/docs/settings/dynamicapicontrollersettings/index.html +++ b/docs/docs/settings/dynamicapicontrollersettings/index.html @@ -8,7 +8,7 @@ 5. 动态API配置 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

5. 动态API配置

5.1 关于配置#

动态 API 配置指的是 Furion 框架动态 API 配置选项。

5.2 配置信息#

  • DynamicApiControllerSettings:配置根节点

    • DefaultRoutePrefix:默认路由前缀,string,默认 api
    • DefaultHttpMethod:默认请求谓词,string,默认:POST
    • DefaultModule:默认模块名称(区域),可用作接口版本,string,默认:v1
    • LowercaseRoute:小写路由格式,bool,默认:true
    • KeepVerb:是否保留动作谓词,bool,默认:false
    • KeepName:是否保留默认名称,bool,默认:fasle
    • CamelCaseSeparator:骆驼命名分隔符,string,默认:-
    • VersionSeparator:版本分隔符,string,默认:@
    • ModelToQueryGET/HEAD 请求将 类类型参数转查询参数bool,默认 false
    • SupportedMvcController:是否支持 Mvc Controller 动态配置,bool,默认 false
    • AbandonControllerAffixes:默认去除控制器名称前后缀列表名,string[],默认:
      • AppServices
      • AppService
      • ApiController
      • Controller
      • Services
      • Service
    • AbandonActionAffixes:默认去除动作方法名称前后缀列表名,string[],默认:
      • Async
    • VerbToHttpMethods:复写默认方法名转 [HttpMethod] 规则,string[][] 二维数组类型,内置匹配规则为:
      ["post"] = "POST",
      ["add"] = "POST",
      ["create"] = "POST",
      ["insert"] = "POST",
      ["submit"] = "POST",
      ["get"] = "GET",
      ["find"] = "GET",
      ["fetch"] = "GET",
      ["query"] = "GET",
      ["getlist"] = "GET",
      ["getall"] = "GET",
      ["put"] = "PUT",
      ["update"] = "PUT",
      ["delete"] = "DELETE",
      ["remove"] = "DELETE",
      ["clear"] = "DELETE",
      ["patch"] = "PATCH"
      • 复写示例
      "DynamicApiControllerSettings": {
      "VerbToHttpMethods": [
      [ "getall", "HEAD" ], // => getall 会被复写为 `[HttpHead]`
      [ "other", "PUT" ] // => 新增一条新规则,比如,一 `[other]` 开头会转换为 `[HttpPut]` 请求
      ]
      }

5.3 配置示例#

{
"DynamicApiControllerSettings": {
"SupportedMvcController": true
}
}
Last updated on by Monk
- + diff --git a/docs/docs/settings/friendlyexceptionsettings/index.html b/docs/docs/settings/friendlyexceptionsettings/index.html index b293b64defb..186d482d7fb 100644 --- a/docs/docs/settings/friendlyexceptionsettings/index.html +++ b/docs/docs/settings/friendlyexceptionsettings/index.html @@ -8,7 +8,7 @@ 6. 友好异常配置 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

6. 友好异常配置

6.1 关于配置#

友好异常配置指的是 Furion 框架友好异常配置选项。

6.2 配置信息#

  • FriendlyExceptionSettings:配置根节点
    • HideErrorCode:隐藏错误码,bool 类型,默认 false
    • DefaultErrorCode:默认错误码,string 类型
    • DefaultErrorMessage:默认错误消息,string 类型

6.3 配置示例#

{
"FriendlyExceptionSettings": {
"DefaultErrorMessage": "系统异常,请联系管理员"
}
}

6.4 异常消息配置#

Furion 框架还为友好异常消息提供外部配置

6.4.1 配置信息#

  • ErrorCodeMessageSettings:配置根节点
    • Definitions:配置异常错误码消息类型,[错误状态码,错误消息][] 类型,如:[5000, "{0} 不能小于 {1}"]

6.4.2 配置示例#

{
"ErrorCodeMessageSettings": {
"Definitions": [
[5000, "{0} 不能小于 {1}"],
[5001, "我叫 {0} 名字", "百小僧"],
[5002, "Oops! 出错了"]
]
}
}
Last updated on by Monk
- + diff --git a/docs/docs/settings/localizationsettings/index.html b/docs/docs/settings/localizationsettings/index.html index 8b87d4156ea..ff7f9dca8cf 100644 --- a/docs/docs/settings/localizationsettings/index.html +++ b/docs/docs/settings/localizationsettings/index.html @@ -8,7 +8,7 @@ 8. 多语言配置 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

8. 多语言配置

8.1 关于配置#

多语言配置指的是 Furion 框架全球化和本地化选项。

8.2 配置信息#

  • LocalizationSettings 多语言配置根节点
    • ResourcesPath:资源目录,string 类型,默认 Resources
    • SupportedCultures:支持的语言区域码类别,string[] 类型
    • DefaultCulture:默认语言区域码,如果为空,则取 SupportedCultures 第一项

8.3 配置示例#

{
"LocalizationSettings": {
"SupportedCultures": ["zh-CN", "en-US"], // 配置支持的语言列表
"DefaultCulture": "zh-CN" // 配置默认语言,如果不配置,取 SupportedCultures 的第一项
}
}
Last updated on by Monk
- + diff --git a/docs/docs/settings/specificationdocumentsettings/index.html b/docs/docs/settings/specificationdocumentsettings/index.html index d47116cec61..249fba7872a 100644 --- a/docs/docs/settings/specificationdocumentsettings/index.html +++ b/docs/docs/settings/specificationdocumentsettings/index.html @@ -8,7 +8,7 @@ 7. 规范化文档配置 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

7. 规范化文档配置

7.1 关于配置#

规范化文档配置指的是 Furion 框架 Swagger 文档配置选项。

7.2 配置信息#

  • SpecificationDocumentSettings:配置根节点
    • DocumentTitle:文档标题,string,默认 Specification Api Document
    • DefaultGroupName:默认分组名,string,默认 Default
    • EnableAuthorized:是否启用权限控制,bool,默认 true
    • FormatAsV2:采用 Swagger 2.0 版本,bool,默认 false
    • RoutePrefix:规范化文档地址,string,默认 api如果希望在首页,改为空字符串即可
    • DocExpansionState:文档显示方式,DocExpansion,默认 List,取值:
      • List:列表式(展开子类),默认值
      • Full:完全展开
      • None:列表式(不展开子类)
    • XmlComments:程序集注释描述文件名(可带 .xmlstring,默认 Furion.Application, Furion.Web.Entry, Furion.Web.Core
    • GroupOpenApiInfos:分组信息配置,SpecificationOpenApiInfo[],默认 { 'Group': 'Default'}
    • SecurityDefinitions:安全策略定义配置,SpecificationOpenApiSecurityScheme[],默认 []
    • Servers:配置 Server 下拉列表,OpenApiServer[] 类型,默认 [],如:{Servers:[ { Url:"地址", Description:"描述"} ]}
    • HideServers:是否隐藏 Server 下拉列表,bool 类型,默认 false

7.3 配置示例#

{
"SpecificationDocumentSettings": {
"GroupOpenApiInfos": [
{
"Group": "Group1",
"Title": "分组标题",
"Description": "这里是分组描述",
"Version": "版本号",
"TermsOfService": "https://furion.pro",
"Contact": {
"Name": "百小僧",
"Url": "https://gitee.com/monksoul",
"Email": "monksoul@outlook.com"
},
"License": {
"Name": "Apache-2.0",
"Url": "https://gitee.com/monksoul/Furion/blob/alpha/LICENSE"
}
}
]
}
}
Last updated on by Monk
- + diff --git a/docs/docs/settings/validationTypemessagesettings/index.html b/docs/docs/settings/validationTypemessagesettings/index.html index 78790d21b51..48860942475 100644 --- a/docs/docs/settings/validationTypemessagesettings/index.html +++ b/docs/docs/settings/validationTypemessagesettings/index.html @@ -8,7 +8,7 @@ 3. 验证消息配置 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

3. 验证消息配置

3.1 关于配置#

验证消息配置指的是 Furion 框架数据校验中验证类型默认消息配置选项。

3.2 配置信息#

  • ValidationTypeMessageSettings:配置根节点
    • Definitions:配置验证类型对应的消息类型,[类型名称,类型消息][] 类型,如:["Required", "值不能为空或Null"]

3.3 配置示例#

{
"ValidationTypeMessageSettings": {
"Definitions": [
["Required", "值不能为空或Null"],
["Numeric", "必须是数值类型"],
["StrongPassword", "密码太简单了!!!"]
]
}
}
Last updated on by Monk
- + diff --git a/docs/docs/signalr/index.html b/docs/docs/signalr/index.html index 849abc41f8f..7cef50bacb6 100644 --- a/docs/docs/signalr/index.html +++ b/docs/docs/signalr/index.html @@ -8,7 +8,7 @@ 25. 即时通讯 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/source/index.html b/docs/docs/source/index.html index 94289e460a0..efc92150616 100644 --- a/docs/docs/source/index.html +++ b/docs/docs/source/index.html @@ -8,7 +8,7 @@ 1.3 源码结构 | Furion - + @@ -53,7 +53,7 @@
#prefer fields not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_field = false:suggestion
#prefer methods not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_method = false:suggestion
#prefer properties not to be prefaced with this. or Me. in Visual Basic
dotnet_style_qualification_for_property = false:suggestion
# Add file header
file_header_template = -----------------------------------------------------------------------------\nFur 是 .NET 5 平台下企业应用开发最佳实践框架。\nCopyright © 2020 Furion, Baiqian Co.,Ltd.\n\n框架名称:Furion\n框架作者:百小僧\n框架版本:1.0.0\n源码地址:Gitee:https://gitee.com/monksoul/Furion \n Github:https://github.com/monksoul/Furion \n开源协议:Apache-2.0(http://www.apache.org/licenses/LICENSE-2.0)\n-----------------------------------------------------------------------------

1.3.4 Furion 核心层#

Furion 核心层是 Furion 框架的中心,也是 Furion 能够支撑起来的必备层。

源码结构:

Furion
├─Furion.csproj
├─Furion.csproj.user
├─FurStartup.cs
├─ViewEngine
| ├─IViewEngine.cs
| ├─ViewEngine.cs
| ├─Templates
| | ├─IViewEngineCompiledTemplate.cs
| | ├─IViewEngineTemplate.cs
| | ├─ViewEngineCompiledTemplate.cs
| | └ViewEngineTemplate.cs
| ├─Options
| | └ViewEngineCompilationOptions.cs
| ├─Models
| | └AnonymousTypeWrapper.cs
| ├─Exceptions
| | ├─ViewEngineCompilationException.cs
| | └ViewEngineException.cs
| ├─Compilations
| | ├─IViewEngineCompilationOptionsBuilder.cs
| | └ViewEngineCompilationOptionsBuilder.cs
├─UnifyResult
| ├─Providers
| | ├─IUnifyResultProvider.cs
| | └RESTfulResultProvider.cs
| ├─Models
| | └RESTfulResult.cs
| ├─Filters
| | └SuccessUnifyResultFilter.cs
| ├─Extensions
| | └UnifyResultServiceCollectionExtensions.cs
├─SpecificationDocument
| ├─Options
| | └SpecificationDocumentSettingsOptions.cs
| ├─Models
| | ├─GroupOrder.cs
| | ├─SpecificationOpenApiInfo.cs
| | ├─SpecificationOpenApiSecurityRequirementItem.cs
| | └SpecificationOpenApiSecurityScheme.cs
| ├─Extensions
| | ├─SpecificationDocumentApplicationBuilderExtensions.cs
| | └SpecificationDocumentServiceCollectionExtensions.cs
| ├─Builders
| | └SpecificationDocumentBuilder.cs
| ├─Assets
| | └index-mini-profiler.html
├─ObjectMapper
| ├─Extensions
| | └ObjectMapperServiceCollectionExtensions.cs
| ├─Dependencies
| | └IObjectMapper.cs
├─LinqBuilder
| ├─Visitors
| | └ParameterReplaceExpressionVisitor.cs
| ├─Extensions
| | └LinqExtensions.cs
| ├─Builders
| | └LinqExpression.cs
├─FriendlyException
| ├─Oops.cs
| ├─Providers
| | └IErrorCodeTypeProvider.cs
| ├─Options
| | └ErrorCodeMessageSettingsOptions.cs
| ├─Models
| | └MethodIfException.cs
| ├─Filters
| | └FriendlyExceptionFilter.cs
| ├─Extensions
| | └FriendlyExceptionServiceCollectionExtensions.cs
| ├─Attributes
| | ├─ErrorCodeItemMetadataAttribute.cs
| | ├─ErrorCodeTypeAttribute.cs
| | └IfExceptionAttribute.cs
├─DynamicApiController
| ├─Penetrates.cs
| ├─Providers
| | └DynamicApiControllerFeatureProvider.cs
| ├─Options
| | └DynamicApiControllerSettingsOptions.cs
| ├─Models
| | └ParameterRouteTemplate.cs
| ├─Extensions
| | └DynamicApiControllerServiceCollectionExtensions.cs
| ├─Enums
| | └ApiSeats.cs
| ├─Dependencies
| | └IDynamicApiController.cs
| ├─Conventions
| | └DynamicApiControllerApplicationModelConvention.cs
| ├─Attributes
| | ├─ApiDescriptionSettingsAttribute.cs
| | ├─ApiSeatAttribute.cs
| | └DynamicApiControllerAttribute.cs
├─DependencyInjection
| ├─Options
| | └DependencyInjectionSettingsOptions.cs
| ├─Models
| | └ExternalService.cs
| ├─Extensions
| | └DependencyInjectionServiceCollectionExtensions.cs
| ├─Enums
| | ├─InjectionActions.cs
| | ├─InjectionPatterns.cs
| | └RegisterType.cs
| ├─Dependencies
| | ├─IPrivateDependency.cs
| | ├─IScoped.cs
| | ├─ISingleton.cs
| | ├─ITransient.cs
| | ├─Proxies
| | | └IDispatchProxy.cs
| ├─Attributes
| | ├─InjectionAttribute.cs
| | └SkipScanAttribute.cs
├─DataValidation
| ├─Validators
| | └DataValidator.cs
| ├─Providers
| | └IValidationMessageTypeProvider.cs
| ├─Options
| | └ValidationTypeMessageSettingsOptions.cs
| ├─Models
| | └DataValidationResult.cs
| ├─Filters
| | └DataValidationFilter.cs
| ├─Extensions
| | ├─DataValidationExtensions.cs
| | └DataValidationServiceCollectionExtensions.cs
| ├─Enums
| | ├─ValidationPattern.cs
| | └ValidationTypes.cs
| ├─Attributes
| | ├─DataValidationAttribute.cs
| | ├─NonValidationAttribute.cs
| | ├─ValidationItemMetadataAttribute.cs
| | ├─ValidationMessageAttribute.cs
| | ├─ValidationMessageTypeAttribute.cs
| | └ValidationTypeAttribute.cs
├─DataEncryption
| ├─AESEncryption.cs
| ├─DESCEncryption.cs
| └MD5Encryption.cs
├─DatabaseAccessor
| ├─UnitOfWork
| | ├─Filters
| | | └UnitOfWorkFilter.cs
| | ├─Attributes
| | | ├─NonTransactAttribute.cs
| | | └UnitOfWorkAttribute.cs
| ├─Repositories
| | ├─EFCoreRepository.cs
| | ├─IMSRepository.cs
| | ├─IRepository.cs
| | ├─ISqlRepository.cs
| | ├─MSRepository.cs
| | ├─SqlRepository.cs
| | ├─Implantations
| | | ├─DeletableRepository.cs
| | | ├─InsertableRepository.cs
| | | ├─OperableRepository.cs
| | | ├─ReadableRepository.cs
| | | ├─SqlExecutableRepository.cs
| | | ├─SqlReaderRepository.cs
| | | ├─UpdateableRepository.cs
| | | └WritableRepository.cs
| | ├─Dependencies
| | | ├─IDeletableRepository.cs
| | | ├─IInsertableRepository.cs
| | | ├─IOperableRepository.cs
| | | ├─IReadableRepository.cs
| | | ├─IRepositoryDependency.cs
| | | ├─ISqlExecutableRepository.cs
| | | ├─ISqlReaderRepository.cs
| | | ├─IUpdateableRepository.cs
| | | └IWritableRepository.cs
| ├─Pools
| | ├─DbContextPool.cs
| | └IDbContextPool.cs
| ├─MultiTenants
| | ├─Locators
| | | └MultiTenantDbContextLocator.cs
| | ├─Enums
| | | └MultiTenantOptions.cs
| | ├─Entities
| | | └Tenant.cs
| | ├─Dependencies
| | | ├─IMultiTenantOnDatabase.cs
| | | ├─IMultiTenantOnSchema.cs
| | | ├─IMultiTenantOnTable.cs
| | | └IPrivateMultiTenant.cs
| ├─Models
| | ├─DbProvider.cs
| | ├─PagedList.cs
| | ├─ProcedureOutputResult.cs
| | ├─ProcedureOutputValue.cs
| | ├─SqlTemplate.cs
| | └SqlTemplateParameter.cs
| ├─Locators
| | ├─IDbContextLocator.cs
| | └MasterDbContextLocator.cs
| ├─Interceptors
| | ├─DbContextSaveChangesInterceptor.cs
| | ├─SqlCommandProfilerInterceptor.cs
| | └SqlConnectionProfilerInterceptor.cs
| ├─Helpers
| | └DbHelpers.cs
| ├─Extensions
| | ├─DatabaseAccessorServiceCollectionExtensions.cs
| | ├─PagedQueryableExtensions.cs
| | ├─Repositories
| | | ├─IEntityExtensions.cs
| | | ├─IEntityWithDbContextLocatorExtensions.cs
| | | └SqlExtensions.cs
| | ├─DatabaseProvider
| | | ├─DatabaseProviderServiceCollectionExtensions.cs
| | | └Penetrates.cs
| | ├─DatabaseFacade
| | | ├─DbDataConvertExtensions.cs
| | | ├─DbObjectExtensions.cs
| | | └SqlAdoNetExtensions.cs
| ├─Enums
| | ├─DbFunctionType.cs
| | ├─EFCoreErrorCodes.cs
| | └ManualOptions.cs
| ├─Entities
| | ├─Dependencies
| | | ├─Entity.cs
| | | ├─EntityBase.cs
| | | ├─EntityNotKey.cs
| | | ├─IEntity.cs
| | | └IEntityNotKey.cs
| | ├─Configures
| | | ├─IEntitySeedData.cs
| | | ├─IEntityTypeBuilder.cs
| | | ├─IModelBuilderFilter.cs
| | | └IPrivateModelBuilder.cs
| | ├─Attributes
| | | ├─FakeDeleteAttribute.cs
| | | ├─NonAutomaticAttribute.cs
| | | └QueryableFunctionAttribute.cs
| ├─DynamicModels
| | ├─DynamicModelCacheKeyFactory.cs
| | └IEntityMutableTable.cs
| ├─Contexts
| | ├─AppDbContext.cs
| | ├─Builders
| | | ├─AppDbContextBuilder.cs
| | | ├─Models
| | | | └DbContextCorrelationType.cs
| | ├─Attributes
| | | └AppDbContextAttribute.cs
| ├─Attributes
| | └DbParameterAttribute.cs
| ├─Advances
| | ├─Proxies
| | | └SqlDispatchProxy.cs
| | ├─Models
| | | └SqlProxyMethod.cs
| | ├─Dependencies
| | | └ISqlDispatchProxy.cs
| | ├─Attributes
| | | ├─SqlExecuteAttribute.cs
| | | ├─SqlFunctionAttribute.cs
| | | ├─SqlProcedureAttribute.cs
| | | ├─Basics
| | | | ├─SqlObjectProxyAttribute.cs
| | | | ├─SqlProxyAttribute.cs
| | | | └SqlSentenceProxyAttribute.cs
├─CorsAccessor
| ├─Options
| | └CorsAccessorSettingsOptions.cs
| ├─Extensions
| | ├─CorsAccessorApplicationBuilderExtensions.cs
| | └CorsAccessorServiceCollectionExtensions.cs
├─ConfigurableOptions
| ├─Options
| | └IConfigurableOptions.cs
| ├─Extensions
| | └ConfigurableOptionsServiceCollectionExtensions.cs
| ├─Attributes
| | └OptionsSettingsAttribute.cs
├─Authorization
| ├─Penetrates.cs
| ├─Requirements
| | └AuthorizePolicyRequirement.cs
| ├─Providers
| | └AuthorizePolicyProvider.cs
| ├─Options
| | └JWTSettingsOptions.cs
| ├─Handlers
| | └AuthorizePolicyHandler.cs
| ├─Extensions
| | └PolicyAuthorizationServiceCollectionExtensions.cs
| ├─Attributes
| | └AuthorizePolicyAttribute.cs
├─App
| ├─App.cs
| ├─Startups
| | ├─AppStartup.cs
| | └HostingStartup.cs
| ├─Options
| | └AppSettingsOptions.cs
| ├─Filters
| | └StartupFilter.cs
| ├─Extensions
| | ├─AppApplicationBuilderExtensions.cs
| | ├─AppServiceCollectionExtensions.cs
| | ├─WebHostBuilderExtensions.cs
| | ├─Types
| | | └ObjectExtensions.cs
| ├─Attributes
| | └AppStartupAttribute.cs

1.3.5 Furion.Application 业务应用层#

Furion.Application 业务应用层是最常用的层,几乎所有的业务代码都在这个层中编写。

源码结构:

Furion.Application
├─Furion.Application.Core.csproj
├─Furion.Application.Core.xml
└FurApplicationStartup.cs

1.3.6 Furion.Core 仓储实体层#

Furion.Core 主要是存储自定义仓储和定义实体的层。

源码结构:

Furion.Core
├─Furion.Core.csproj
└FurCoreStartup.cs

1.3.7 Furion.Database.Migrations 数据库架构维护层#

Furion.Database.Migrations 主要是用来存放 Database FirstCode First 生成的维护文件。

源码结构:

Furion.Database.Migrations
└Furion.Database.Migrations.csproj

1.3.8 Furion.EntityFramework.Core 数据库上下文配置层#

Furion.EntityFramework.Core 主要是用来配置数据库上下文和其他数据库相关配置信息的。

源码结构:

Furion.EntityFramework.Core
└Furion.EntityFramework.Core.csproj

1.3.9 Furion.Web.Core 应用核心层#

Furion.Web.Core 主要是用来配置 Web 入口一些代码,如 FilterMiddlewares 等。

源码结构:

Furion.Web.Core
├─Furion.Web.Core.xml
└FurWebCoreStartup.cs

1.3.10 Furion.Web.Entry 应用入口层#

Furion.Web.Entry 是我们的应用层,也就是我们的 Web 项目层,发布层。

源码结构:

Furion.Web.Entry
├─appsettings.Development.json
├─appsettings.json
├─Furion.Web.Entry.csproj
├─Furion.Web.Entry.csproj.user
├─Furion.Web.Entry.xml
├─Program.cs
├─Startup.cs
├─wwwroot
| └README.md
├─Properties
| └launchSettings.json
├─Controllers
Last updated on by Monk
- + diff --git a/docs/docs/specification-document/index.html b/docs/docs/specification-document/index.html index 06766e97bdc..6b86c8b6f71 100644 --- a/docs/docs/specification-document/index.html +++ b/docs/docs/specification-document/index.html @@ -8,7 +8,7 @@ 6. 规范化接口文档 | Furion - + @@ -55,7 +55,7 @@
/// <summary>
/// 处理输出状态码
/// </summary>
/// <param name="context"></param>
/// <param name="statusCode"></param>
/// <returns></returns>
public async Task OnResponseStatusCodes(HttpContext context, int statusCode)
{
switch (statusCode)
{
// 处理 401 状态码
case StatusCodes.Status401Unauthorized:
await context.Response.WriteAsJsonAsync(new RESTfulResult<object>
{
StatusCode = StatusCodes.Status401Unauthorized,
Succeeded = false,
Data = null,
Errors = "401 Unauthorized",
Extras = UnifyContext.Take(),
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
}, JsonSerializerUtility.GetDefaultJsonSerializerOptions());
break;
// 处理 403 状态码
case StatusCodes.Status403Forbidden:
await context.Response.WriteAsJsonAsync(new RESTfulResult<object>
{
StatusCode = StatusCodes.Status403Forbidden,
Succeeded = false,
Data = null,
Errors = "403 Forbidden",
Extras = UnifyContext.Take(),
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
}, JsonSerializerUtility.GetDefaultJsonSerializerOptions());
break;
default:
break;
}
}
}
}

之后在 Startup.cs 中注册即可:

services.AddControllers()
.AddInjectWithUnifyResult<RESTfulResultProvider>();
特别注意

默认情况下,规范化结果不会对 401403 状态码进行规范化处理,如需启动该状态码处理,只需在 Startup.cs 中的 Configure 中启用接口:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// 添加规范化结果状态码,需要在这里注册
app.UseUnifyResultStatusCodes();
// 其他注册...
}

6.7.1 排除规范化处理#

有些时候,我们某些接口不需要进行规范化处理,这时,我们只需要帖 [NonUnify] 特性即可。

6.7.2 规范化结果添加额外数据#

默认的规范化结果中包含 extras 属性,可以配置额外数据返回到客户端:

UnifyContext.Fill(new { Message = "操作成功" });

6.8 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/split-db/index.html b/docs/docs/split-db/index.html index 84dff755095..aaffc7739de 100644 --- a/docs/docs/split-db/index.html +++ b/docs/docs/split-db/index.html @@ -8,7 +8,7 @@ 9.28 分表分库 | Furion - + @@ -24,7 +24,7 @@ 例如按时间字段分片,有些分片存储最近时间段内的数据,可能会被频繁的读写,而有些分片存储的历史数据,则很少被查询

9.28.4.3 一致性 Hash 算法#

一致性 Hash 算法能很好的解决因为 Hash 取模而产生的分片集群扩容时,需要迁移旧的数据的难题。具体原理可参考 https://www.cnblogs.com/duhuo/p/4996105.html

9.28.5 分库分表带来的问题#

任何事情都有两面性,分库分表也不例外,如果采用分库分表,会引入新的的问题:

9.28.5.1 分布式事务问题#

使用分布式事务中间件解决,具体是通过最终一致性还是强一致性分布式事务,看业务需求,这里就不多说。

9.28.5.2 跨节点关联查询 Join 问题#

切分之前,我们可以通过 Join 来完成。而切分之后,数据可能分布在不同的节点上,此时 Join 带来的问题就比较麻烦了,考虑到性能,尽量避免使用 Join 查询。

解决这个问题的一些方法:

  • 全局表

全局表,也可看做是 "数据字典表",就是系统中所有模块都可能依赖的一些表,为了避免跨库 Join 查询,可以将 这类表在每个数据库中都保存一份。这些数据通常很少会进行修改,所以也不担心一致性的问题。

  • 字段冗余

利用空间换时间,为了性能而避免 join 查询。例:订单表保存 userId 时候,也将 userName 冗余保存一份,这样查询订单详情时就不需要再去查询"买家 user 表"了。

  • 数据组装

在系统层面,分两次查询。第一次查询的结果集中找出关联数据 id,然后根据 id 发起第二次请求得到关联数据。最后将获得到的数据进行字段拼装。

9.28.5.3 跨节点分页、排序、函数问题#

跨节点多库进行查询时,会出现 Limit 分页、Order by 排序等问题。分页需要按照指定字段进行排序,当排序字段就是分片字段时,通过分片规则就比较容易定位到指定的分片;

当排序字段非分片字段时,就变得比较复杂了。需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序,最终返回给用户。

9.28.5.4 全局主键避重问题#

如果都用主键自增肯定不合理,如果用 UUID 那么无法做到根据主键排序,所以我们可以考虑通过雪花 ID 来作为数据库的主键,

9.28.5.5 数据迁移问题#

采用双写的方式,修改代码,所有涉及到分库分表的表的增、删、改的代码,都要对新库进行增删改。同时,再有一个数据抽取服务,不断地从老库抽数据,往新库写,

边写边按时间比较数据是不是最新的。

9.28.6 如何实现#

特别说明

由于分表分库不仅仅需要内置代码的支持,同时还需要集成数据库中间件,这里推荐 MyCat 中间件。MyCat 官方网站

Furion 框架中提供了轻量级的 分表分库 支持:

  • 动态切换数据库
// 直接改变数据库
repository.ChangeDatabase("数据库连接字符串");
// 通过数据库上下文定位器切换
repository.Change<Entity, MyDbContextLocator2>();

如需跨库查询,需用到数据库技术,如 SqlServer 链接服务器或同义词。

  • 动态切换数据库表

第一步、配置数据库上下文特性[AppDbContext( Mode=DbContextMode.Dynamic)]

第二步、需要动态修改表名的实体继承 IEntityMutableTable<TEntity> 接口,并实现 GetTableName() 返回表名方法

最后通过 BuildChange<TEntity> 切换即可。

var rep = repository.BuildChange<Persion>();

调用 BuildChange 方法之后会自动调用 GetTableName() 方法。

了解更多

想了解更多 DynamicModelCacheKeyFactory 知识可查阅 EF Core - 多个模型之间交替 章节。

9.28.7 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/sqlsugar/index.html b/docs/docs/sqlsugar/index.html index e3e66ae8b8f..0a5b1611fdc 100644 --- a/docs/docs/sqlsugar/index.html +++ b/docs/docs/sqlsugar/index.html @@ -8,7 +8,7 @@ 10.1. SqlSugar 集成 | Furion - + @@ -41,7 +41,7 @@
//存储过程用法
var nameP= new SugarParameter("@name", "张三");
var ageP= new SugarParameter("@age", null, true);//设置为output
var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school",nameP,ageP);
方法名描述返回值
SqlQuery< T >查询所有返回实体集合List
SqlQuery<T,T2>可以返回 2 个结果集Tuple<List, List>
SqlQuerySingle查询第一条记录T
GetDataTable查询所有DataTable
GetDataReader读取 DR 需要手动释放 DRDataReader
GetDataSetAll获取多个结果集DataSet
ExecuteCommand返回受影响行数,一般用于增删改int
GetScalar获取首行首列object
GetString获取首行首列string
GetInt获取首行首列int
GetLong获取首行首列long
GetDouble获取首行首列Double
GetDecimal获取首行首列Decimal
GetDateTime获取首行首列DateTime

想了解更多 SqlSugar 知识可查阅 SqlSugar 官网

10.1.7 打印 sqlSwagger#

services.AddSqlSugar(new ConnectionConfig
{
ConnectionString = "Server=.xxxxx",//连接符字串
DbType = DbType.SqlServer,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute//从特性读取主键自增信息
},
db =>
{
db.Aop.OnLogExecuting = (sql, pars) =>
{
App.PrintToMiniProfiler("SqlSugar", "Info", sql + "\r\n" +string.Join(",", pars?.Select(it => it.ParameterName + ":" + it.Value)));
};
});

10.1.8 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/template/index.html b/docs/docs/template/index.html index e7ac87b31f4..39ee53cbb1f 100644 --- a/docs/docs/template/index.html +++ b/docs/docs/template/index.html @@ -8,7 +8,7 @@ 2.2 官方脚手架 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

2.2 官方脚手架

特别说明

脚手架不是安装在项目中的! 而是通过 CMDPowerShell 安装到操作系统中的。

2.2.1 脚手架#

Furion 官方提供了多种 Web 应用类型的脚手架,方便大家快速创建多层架构项目。目前支持以下应用脚手架:

模板类型名称版本关键词描述
nugetFurion.Template.Mvcnuget👉 furionmvcMvc 模板
nugetFurion.Template.Apinuget👉 furionapiWebApi 模板
nugetFurion.Template.Appnuget👉 furionappMvc/WebApi 模板
nugetFurion.Template.Razornuget👉 furionrazorRazorPages 模板
nugetFurion.Template.RazorWithWebApinuget👉 furionrazorapiRazorPages/WebApi 模板
nugetFurion.Template.Blazornuget👉 furionblazorBlazor 模板
nugetFurion.Template.BlazorWithWebApinuget👉 furionblazorapiBlazor/WebApi 模板

2.2.2 安装脚手架#

打开 CMDPowershell 执行模板安装命令:

dotnet new --install Furion.Template.Mvc::1.13.0

2.2.3 使用脚手架#

dotnet new furionmvc -n 项目名称

这样就可以生成项目代码了,生成之后推荐将所有的 nuget 包更新到最新版本。

特别提醒

furionmvc 对应的是上面列表的 关键字,我们也可以通过 dotnet new --list 查看。

想了解更多可以使用 dotnet new 关键字 --help 查看更多参数。

2.2.4 脚手架更新#

只需要重新安装最新版替换即可,如:

dotnet new --install Furion.Template.Mvc::1.x.x

不带版本号总是安装最新的版本。

2.2.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 模板知识 知识可查阅 dotnet-new 模板 章节。

Last updated on by Monk
- + diff --git a/docs/docs/tran/index.html b/docs/docs/tran/index.html index 02f106a6faf..68207817ba8 100644 --- a/docs/docs/tran/index.html +++ b/docs/docs/tran/index.html @@ -8,7 +8,7 @@ 9.26 事务和工作单元 | Furion - + @@ -33,7 +33,7 @@
// 框架封装的仓储
_testRepository.Insert(new Blog { Url = "http://blogs.msdn.com/dotnet" });
_testRepository.SaveChanges();
// 提交事务
scope.Complete();
}
catch (System.Exception)
{
// 自动回滚
}
}
}

9.26.4 工作单元特性说明#

9.26.4.1 [UnitOfWork]#

[UnitOfWork] 特性用来标记事务信息,如作用范围,隔离级别等。

  • Enabled:是否启动工作单元,默认 true
  • ScopeOption:定义事务范围行为,默认 TransactionScopeOption.Required
  • IsolationLevel:设置事务隔离级别,默认 IsolationLevel.ReadCommitted;
  • AsyncFlowOption:允许跨线程连续任务的事务流,如有异步操作需开启该选项,默认开启
特别注意

一旦方法贴了 [UnitOfWork(false)] 特性后,那么该方法不再启用工作单元模式,也就是不包含事务,也不会自动提交数据库。慎用!

9.26.5 反馈与建议#

与我们交流

给 Furion 提 Issue


了解更多

想了解更多 事务 知识可查阅 EF Core - 使用事务 章节。

Last updated on by Monk
- + diff --git a/docs/docs/unittest/index.html b/docs/docs/unittest/index.html index 81d3906b991..2f0df53f663 100644 --- a/docs/docs/unittest/index.html +++ b/docs/docs/unittest/index.html @@ -8,7 +8,7 @@ 29.1 单元测试 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️
Last updated on by Monk
- + diff --git a/docs/docs/upgrade/index.html b/docs/docs/upgrade/index.html index c97e8d7786a..f1330b3d39c 100644 --- a/docs/docs/upgrade/index.html +++ b/docs/docs/upgrade/index.html @@ -8,26 +8,26 @@ 1.6 更新日志 | Furion - + - +
-
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.6 更新日志

此章节只记录重大版本更新日志,小迭代版本不做更新。想了解更多更新内容,可查阅 CHANGELOG.md

v1.13.0(当前版本)#

  • 新特性

    • [新增] 多语言功能及拓展 #I2DOCL
    • [新增] 事件总线功能及消息中心 #I23BKN
    • [新增] Swagger 分组显示隐藏配置 #I2AHH8
    • [新增] Furion.Extras.Logging.Serilog 拓展插件 #I2AAN8
    • [新增] cli.ps 支持 -Namespace 命名空间指定 #I2A175
    • [新增] Swagger 规范化化文档授权失效后自动取消授权锁 #I2AIWC
    • [新增] Request.Body 支持重复读功能,主要解决微信 SDK 问题 #I2AMG0
    • [新增] 网络请求功能及文档 #I2APGJ
    • [新增] SqlSugar 拓展包支持打印 sqlMiniProfiler#I2ASLS
    • [新增] Furion.Extras.DatabaseAccesssor.Dapper 拓展插件 #I2ASYA
    • [新增] Furion.Extras.DatabaseAccessor.PetaPoco 拓展插件 #I2AUGA
    • [新增] 网络请求字符串拓展方法 #I2CPQ0
    • [新增] SqlSugar 拓展新增 PagedList 拓展 #I2CW99
    • [新增] 远程请求支持参数特性验证 #I2CX5L
    • [新增] App.User 获取当前授权用户信息便捷方法 #I2CZLO
    • [新增] 规范化文档可配置功能,支持 appsettings.json 配置 #I2D1K9
    • [新增] 远程请求拦截器添加方法和方法参数 #I2D2CM
    • [新增] 远程请求出错返回默认值支持 #I2D44M
    • [新增] 远程请求 body 参数序列化支持设置 PropertyNamingPolicy #I2D685
    • [新增] 远程服务接口客户端配置 #I2D7PS
    • [新增] AddInjectUseInject 允许自定义 SecurityDefinitionsSwaggerUI #I2DIMG
    • [新增] [SecurityDefine] 默认构造函数 #I2DNXT
    • [新增] AspectDispatchProxy 动态代理类 #I2DO6I
    • [新增] [QueryParameters] 特性,支持一键将 Action 参数添加 [FromQuery] 特性 #I2G8TF
    • [新增] 动态日志配置及拓展方法 #I2GDGD
    • [新增] WebApi 请求谓词默认规则配置功能 #I2M70X
  • 突破性变化

    • [升级] .NET 5 SDK 到 .NET 5.0.2 版本 #I2D0PZ
    • [调整] 框架内所有拓展类命名空间,全部迁移到 Furion.模块.Extensions#I2AH54
    • [调整] Swagger 记住授权存储方式,替换 Session 存储方式为 LocalStorage 方式 #I2AKUA
    • [调整] Furion 框架包描述文件,减少框架体积 #I2APAU
    • [调整] App.CanBeScanTypesApp.EffectiveTypes #I2B0ZR
    • [调整] App.ServiceProvider 属性并移除 App.GetDuplicateXXX 方法 #I2CYZE
    • [调整] Db.GetDuplicateDbContextDb.GetNewDbContext #I2CZ04
    • [调整] Db.GetSqlDispatchProxyDb.GetSqlProxy #I2DO9T
    • [重构] Aop 服务拦截器,支持异步、同步两种方式 #I2B9HQ
    • [重构] 网络请求所有功能 #I2BMR7
  • 问题修复

    • [修复] Swagger 规范化化结果不一致 bug #I2ACF3
    • [修复] 数据库新增或更新忽略空值操作方法报空异常 #I2AB6C
    • [修复] Startup.cs Aop 全局拦截无效 #I2A7T2
    • [修复] Token 过期后自动刷新 Token 无法获取最新的用户信息 bug #I2AWQI
    • [修复] [ApiDescriptionSettings(Tag="xx")] 导致 swagger.json 报错 bug #I2B47R
    • [修复] Mysql sql 数据库查询结果 tinyint 类型转换出错 bug #I2BEBM
    • [修复] 规范化结果多次包裹类型 bug #I2BHHZ
    • [修复] 动态 Api 基元类型数组问题 #I2BMS5
    • [修复] sql 查询枚举类型转换异常 bug #I2BS2Y
    • [修复] string.SqlQuerizeAsync<T1>() 拓展返回错误 bug #I2BSTS
    • [修复] 动态 Api 子类重写父类方法并取别名后 Swagger 异常 bug #I2C9VP
    • [修复] 网络请求 application/json 序列化大小写问题 #I2CRJC
    • [修复] 多数据库定位器实体嵌套关联 bug #I2CVN0
    • [修复] 跨域响应头设置无效 bug #I2CW5T
    • [修复] 远程网络请求代理打印到 MiniProfiler bug #I2CZBC
    • [修复] 远程请求响应拦截器 bug #I2D4DG
    • [修复] SqlSugar 框架 AsQueryable() 一直追加参数 #I2DH1D
    • [修复] 自动刷新 Token 空异常 bug #I2DO29
    • [修复] 生成 JWT Token 不传过期时间出现验证 401 bug #I2DO8L
    • [修复] AppStartup 排序无效 #I2DVD2
    • [修复] 未启用多语言服务时友好异常和验证出现空异常 #I2ECUJ
    • [修复] 数据校验字母和数字组合无法匹配 bug #I2EF2Q
    • [修复] 数据校验手机或固话无效 bug #I2M5IZ
    • [修复] Dapper 拓展解析 SqlConnection 异常 bug #I2M5P2
    • [修复] 开启多语言后,EF 迁移异常 bug #I2M7DT
    • [修复] IEntityTypeBuilder 不支持多重继承 bug #I2PAOD
    • [修复] JwtHandler 设置自动刷新后,匿名访问无法通过 bug #I2SDOX
    • [修复] Dapper 拓展中 SqlServer 数据库获取连接对象类型 bug #PR159
  • 其他更改

    • [优化] 移除 Sql 查询结果映射检查 [NotMapper] 特性机制 #I34XD0
    • [优化] 依赖注入时排除 IDynamicApiController 接口 #I2ECTG
    • [优化] MD5 加密性能 #PR158
  • 文档变化

    • [重构] 文档首页 #I34XBR
    • [新增] 网络请求文档 #I2APGJ
    • [新增] 多语言文档 #I2DOCL
    • [新增] 文档全文搜索引擎 #I34XAW
    • [新增] 全局静态类类型 #I34XB4
    • [新增] 框架可配置选项文档 #I34XB9
    • [新增] 事件总线文档 #I34XBI
    • [新增] 数据加解密文档 #I34XC0
    • [新增] 贡献指南文档 #I34XC8
    • [新增] HttpContext文件上传下载 博客文章 #I34XCB
    • [其他] 文档小调整,小优化
  • 问答答疑

    • [答疑] 跨域设置无效 #I2ASNJ
    • [答疑] MVC 视图无效,原因是 .cshtml 文件没有设置为 内容 #I2AXUU
    • [答疑] Sql 操作可以实现事务吗?#I2B0NX
    • [答疑] IRepository 操作数据库会打开多次数据库连接 #I2BB7B
    • [答疑] 如何进入自定义 AppAuthorizeHandler 断点 #I2BGXY
    • [答疑] SqlSugar 注入问题 #I2C2AQ
    • [答疑] 建议增加 API 签名验证,时效验证 #I2C6ET
    • [答疑] 多数据库多租户同时使用 Add-Migration 报错 #I2CEHS
    • [答疑] ISqlSugarRepository 没有 Getxxx 方法 #I2CJLZ
    • [答疑] cli.ps1 如何将 sql 里的表导出成 model#I2CSUL
    • [答疑] 手动修改 Swagger 终结点路径无效 #I2D608
    • [答疑] DefaultDbContext 不能识别 #I2DCZX
    • [答疑] 各分层项目 Startup.cs 支持 Configuration #I2DDUP
    • [答疑] Aop 无法拦截,无效 #I2DEY8
    • [答疑] mysql 执行 Add-Migration 报错 #I2DSB8\
    • [答疑] Entity 创建时间和是否删除添加默认值 #I2E04H
    • [答疑] swagger 中多个 servers 设置 #I2E0IF
    • [答疑] 全局筛选器 没有执行 #I2E5R4
    • [答疑] 多数据库定位器疑问 #I2E77T
    • [答疑] cli.ps 逆向工程 Mysql 数据库报错 #I2E7I5
    • [答疑] Swagger 开发环境 applicationsettings.json 中文乱码 #I2EAG1
    • [答疑] 增加指定路径程序集映射 #I2EEO2
    • [答疑] 动态编译 cs 脚本文件 #I2EH66
    • [答疑] 自定义中间件,返回的错误没有规范化结果 #I2NV8S
    • [答疑] Swagger 循环引用设置生成文档层级无效 #I2PLQQ
    • [答疑] 配置文件支持 yaml 文件吗? #I2TJ3N
    • [答疑] 修改数据库未 mysql 执行 Add-Migration 报错 #I2VR64
    • [答疑] 多数据库使用定位器时报错 #I2VR8F
    • [答疑] Migration To Oracle 异常 #I2WBYQ
    • [答疑] 开发时显示 Swagger,上线时关闭 Swagger,这需要怎么配置 #I2WOYV
    • [答疑] 兼容 Mvc 复杂验证没有试验成功 #I2X3GV
    • [答疑] Aop 能不能支持无接口的类 #I2X8AS
    • [答疑] 关于 JWT Token 自动刷新问题 #I2YD4K
    • [答疑] 能否增加一个拓展的 Entity,增加一些拓展的属性 #I2YDKT
    • [答疑] Furion 无法还原包,使用Nuget 下载和通过最新的的脚手架下载都提示这个问题 #I30446
    • [答疑] 复杂校验与特性验证不能并行 #I3046U
  • 不做实现

    • [废弃] 引入 Webhook 机制 #I2A3I0
    • [废弃] 增加 blog 存储服务 #I2AMBP
    • [废弃] Blazor Server 环境下 EF 的 DbContext 多线程问题 #I2AMD2
    • [废弃] 希望实现工作单元操作接口(IUnitOfWork)#I2AOR5
    • [废弃] 建议新增 string.ToPagedListAsync() 操作 #I2BZ3Z
    • [废弃] 建议新增 GraphQLOData 功能 #I2C9EH
    • [废弃] 迫切期望支持 CAP 分布式事务 #I2CBRF
    • [废弃] 如何让某个方法或实体变化后,不被 SavingChangesEvent 等拦截 #I2CEM9
    • [废弃] 建议日志封装增加更多拓展,比如:自定义保存日志文件 #I2CW8V
    • [废弃] 对 SqlSugar 的支持,增加 Nuget 脚手架 #I2D91U
    • [废弃] 使用 Middleware 实现反向代理 #I2DKM1
    • [废弃] 支持配置多个 Aop 功能 #I2E6Z2
    • [废弃] 是否计划开发类似网关的功能 #I2PD1L
    • [废弃] waring CS8002: 引用程序集 Furion 没有强名称 #I2WDN2
    • [废弃] Oracle 数据库驱动集成 Devart.Data.Oracle.Entity.EFCore #I2XJIU

v1.7.0(已发布)#

  • 新特性

    • [新增] Furion.Extras.ObjectMapper.Mapster 拓展包 #I29LSJ
    • [新增] Furion.Extras.Logging.Serilog 拓展包 #I2AAN8
    • [新增] Furion.Extras.Web.HttpContext 拓展包 #I29LSM
    • [新增] 内置 Token 刷新机制支持 #I29K57
    • [新增] 动态数据库上下文,支持运行时执行 OnModelCreating #I28UDT
    • [新增] 支持依赖注入排除指定接口 #I29693
    • [新增] 规范化结果返回时间戳字段 #I29697
    • [新增] 基础 CURD 父类操作例子 #I296SR
    • [新增] sql.Change("定位器完整类型名称") 支持 #I29LAB
    • [新增] UpdateIncludeUpdateExclude 忽略空参数支持 #I29VUG
    • [新增] 数据库上下文内置假删除查询过滤器支持 #I29Y2R
    • [新增] 忽略空值排除默认时间格式 #I29VUV
    • [升级] MiniProfiler 组件 #I297R9
  • 突破性变化

    • [调整] AppAuthorizeHandler 授权管道为异步处理 #I29MD9
    • [调整] Swagger 默认启用 JWT 授权支持 #I29LI4
    • [调整] HttpContextUtilities 名称改为 HttpContextLocal #I29KQE
    • [调整] UnifyResultContext 名称改为 UnifyContext #I29LLZ
    • [调整] 只有执行迁移命令才扫描种子数据 #I29E6P
    • [调整] 规范化结果 Successed 属性名为 Succeeded #I29NMV
    • [移除] Mapster 对象组件,采用提供拓展方式 #I29D2M
    • [移除] CacheManager 拓展类 #I29LU1
    • [重构] SaveChanges 拦截器 #I292LO
  • 问题修复

    • [修复] 未注册的数据库上下文也被引用全局查询拦截器 bug #I29ZXJ
    • [修复] 手动返回 BadObjectResultValidationProblemDetails 结果类型时规范化结果失效 bug #I29ZU9
    • [修复] 动态 WebApi KeepNameKeepVerbSplitCamelCase 无效 bug #I29X90
    • [修复] Sql代理 返回 元组 类型出错 bug #I29SMV
    • [修复] 401,403 状态码规范化返回值属性变大写 bug #I29M8Y
    • [修复] HttpContext 空异常 bug #I29LU4
    • [修复] 接口无返回值没有应用规范化结果 bug #I29GT7
    • [修复] 前端 Less 配置文件导致主机启动失败 bug #I29E7P
    • [修复] 执行 sql 结果转泛型后属性重复赋值 bug #I29BUO
    • [修复] Swagger 关闭 MiniProfiler 之后 组中组 失效 #I29789
    • [修复] 未启用规范化结果时异常返回 System.Object 字符 #I2969A
    • [修复] 正数数据验证 0 也验证通过 bug #I2955T
    • [修复] 非泛型类集成泛型接口依赖注入 bug #I294YT
    • [修复] Swagger 不支持 new 覆盖父类的 bug #I28Z1A
    • [修复] JsonSerializerUtility 没有公开 bug #I28WMI
    • [修复] SqlSugar 拓展查询泛型类型注册异常 bug #I28VMT
    • [修复] Furion Tools 不支持生成不同命名空间的实体 bug #I2A175
    • [修复] 全局拦截器无效 bug #I2A7T2
    • [修复] 新增或更新忽略空值空异常 bug #I2AB6C
  • 其他更改

    • [优化] Token 生成加密算法 #I29KIH
  • 文档变化

    • [新增] 日志文档 #I28Y9D
    • [调整] 数据库上下文、实体拦截器、配置、一分钟入门等等文档
  • 问答答疑

    • [问答] Swagger 如何实现授权访问 #I294F2
    • [问答] 如何实现多个数据库多对多实体配置 #I29G6S
    • [问答] 动态 WebApi 支持文件上传吗 #I29R5E
    • [疑问] 多个数据库上下文无法生成迁移代码 #I2A6II
  • 不做实现

    • [废弃] 实现 BuildChange 传入表名 #I292SN
    • [废弃] 执行数据库操作结果不支持属性忽略大小写赋值 #I29DRQ
    • [废弃] 引入 Webhook 机制 #I2A3I0

v1.4.0(已发布)#

  • 新特性

    • [新增] Furion 支持二级虚拟目录部署功能 #I28B77
    • [新增] Furion.Template.RazorWithWebApi 脚手架 #I28QGI
    • [新增] Furion.Template.BlazorWithWebApi 脚手架 #I27Z3O
    • [新增] EFCore 时态查询拓展 #I28AJ
    • [新增] [AppDbContext(连接字符串,数据库类型)] 配置支持 #I28QTB
    • [新增] DateTimeOffsetDateTime 拓展方法 #I27MQA
    • [新增] ValidationTypes 验证正则表达式智能提示 #I2801V
    • [新增] ValiationTypes.WordWithNumber 验证 #I2805
    • [新增] 获取客户端和服务端 IP 地址 #I28QV9
  • 突破性变化

    • [升级] .NET 5.0 版本至 .NET 5.0.1 版本 #I28QU
    • [重构] 视图引擎功能,优化不规范命名和新增字符串模板编译 #I28G0S
    • [重构] 数据库实体查找算法,并优化性能 #I28QUQ
    • [优化] 应用启动初始化性能和数据库第一次自动配置 DbSet 性能
  • 问题修复

    • [修复] 多数据库上下文配置定位器后实体无法正确生成 bug #I2888L
    • [修复] 多租户数据库上下文实体生成 bug #I2891G
    • [修复] 对象验证失败提示消息没有应用 JSON 大小写配置 bug #I27UTX
    • [修复] 仓储 InsertUpdate 方法指定 ignoreNullValues 无效 bug #I27UN6
    • [修复] Controller 派生类如果贴了 [Route] 特性后出现在 Swagger 中 bug #I27TN7
    • [修复] SqlScalar 执行 sql 返回 Nullable 类型出现转换失败 bug #I27S2N
    • [修复] [UnitOfWork] 特性异常 bug #I27MLM
    • [修复] sql 静态执行方式和 sql 高级代理无法监听数据库连接状态 bug #I27M4F
    • [修复] 修复更换 Json 序列化库无效 bug,如替换为 Microsoft.AspNetCore.Mvc.NewtonsoftJson #I27M43
    • [修复] Furion Tools 工具生成模型 bug #I27XI5
    • [修复] 软删除没有生效 bug #I2804I
    • [修复] Furion Tools 识别带多个 \\ 的连接字符串识别 bug #I280TS#PR91
    • [修复] Furion Tools 无法取消生成 bug #I2816M
    • [修复] DateTimeOffset 转本地时间差 8 小时 bug #I28BA9
    • [修复] 启用 bundle js&css 压缩后启动异常 bug #I28KR
    • [修复] ValidationTypes.Required 无效 bug #PR98
    • [修复] 规范化结果OnValidateFailed 参数名拼写错误 bug #PR93#PR92
    • [修复] 授权管道验证失败还显示结果 bug #PR89
  • 其他更改

    • [更新] README.md 友情连接地址 #PR88
    • [更新] 模板脚手架源码,添加 EFCore Tools#PR87
    • [更新] README.md Nuget 图标 #PR85
    • [废弃] 将 List<T>DateTable #PR97
  • 文档变化

    • [新增] 视图引擎模板文档 #I27ZVA
    • [新增] EFCore 时态查询文档 #I28AJ, DOC
    • [更新] 仓储文档书写纰漏 bug #PR90
    • [更新] 选项文档错误 bug #PR86
    • [更新] 实体数据监听器 文档书写错误 bug #PR83
    • [更新] 数据库上下文、多数据库、脚手架等文档
  • 问答答疑

    • [建议] 希望 api 返回的值自动将 null 转为 '' 或 [][#I286IJ](https://gitee.com/monksoul/Furion/issues/I286IJ),【已关闭】
    • [建议] 添加网关功能 #I27TP7,【已关闭】
    • [建议] 新增 SqlQuery<T> 获取单条记录方法 #I28M1V,【已关闭】
    • [建议] 希望可以提供集成 Serilog 例子 #I282J4,【已关闭】
    • [疑问] 如何通过特性配置唯一约束 #I2891L,【已关闭】
    • [疑问] 怎么读取 appsettings.json 数组 #I27WU,【已关闭】
    • [疑问] IRepository<TEntity> 出现空异常 #I281IE,【已关闭】
    • [疑问] 规范化接口问题问题 #I28NMZ,【已关闭】
    • [疑问] 统一返回值模型中 OnResponseStatusCodes 未执行 #I28NNL,【已关闭】

v1.2.0(已发布)#

  • 新特性

    • [新增] 雪花算法 #I26OXG, #PR78
    • [新增] [AppDbContext] 配置数据库提供器支持 #I27G3T
    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 定位器仓储 IDbRepository<TDbContextLocator> #I276Q3
    • [新增] 数据库操作 InsertOrUpdate 支持排除空字符串功能 #I272OG
    • [新增] 数据库操作 UpdateIncludeUpdateExclude 匿名对象支持 #I271X0
    • [新增] 数据验证传入空对象跳过验证支持 #I273R4
    • [新增] 应用启动时支持排除特定配置文件自动加载 #I26U0A
    • [新增] 单个实体表名前缀支持 #I26LX0
    • [新增] MySql 数据库自动配置默认版本号 #I26XQ6
    • [优化] 授权处理程序代码
  • 突破性变化

    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 雪花算法 #I26OXG, #PR78
  • 问题修复

    • [修复] 视图引擎加载外部程序集出错 bug
    • [修复] 依赖注入代理接口报空对象异常 bug
    • [修复] EFCore 取消附加实体出错 bug
    • [修复] 数据库仓储在非 Web 请求下出现空异常 bug
    • [修复] 多个授权策略共存问题出现无效 bug
    • [修复] 友好异常 Oop.Oh 不支持普通方法 bug
    • [修复] 获取多租户对象时数据库上下文出现作用域验证失败 bug
    • [修复] 工作单元不支持 Sql代理 拦截 bug #I27GST
  • 其他更改

  • 文档变化


v1.1.0(已发布)#

  • 新特性

    • [新增] Db.GetDbContext() 获取默认数据库上下文方法
    • [新增] HttpContextUtility.GetCurrentHttpContext() 获取全局 HttpContext 上下文
    • [新增] App.GetRequiredService<> 解析服务方法
    • [新增] object.GetService<> 对象拓展方法
    • [新增] 策略授权 PolicyPipeline 基类方法,支持多重判断授权
    • [新增] JWTEncryption.ValidateJwtBearerToken 手动验证静态方法
    • [新增] 全局数据库上下文 InsertOrUpdateIgnoreNullValuesEnabledEntityStateTracked 全局配置
    • [新增] Swagger Jwt授权 全局授权参数 #I26GLR
    • [新增] InsertOrUpdate 支持自定义判断条件功能 #I269Q1
    • [新增] 字符串字段小写命名支持 #I2695D
    • [新增] 字符串文本对比功能 #I268LE
    • [新增] 全局异常特性消息功能 #I2662O
    • [新增] InsertUpdate 数据库忽略空值功能 #I264Q4
  • 突破性变化

    • [调整] Fur 项目名为 Furion
    • [调整] Db.GetRequestDbContext<>() 命名为 Db.GetDbContext<>()
    • [调整] Db.GetDbContext<>() 命名为 Db.GetDuplicateDbContext<>()
    • [重构] App.GetService<> 解析服务的底层逻辑,大大提高了解析服务的性能
    • [重构] 授权核心代码,保持和微软一致的授权规范 #I26DCB
    • [移除] App.GetRequestService<> 方法
    • [移除] ValidateJwtBearer Jwt 授权方法,无需手动判断了
  • 问题修复

    • [修复] Furion 官方脚手架生成后编译异常 bug
    • [修复] Tenant 内置属性不是 virtual 修饰 bug
    • [修复] dockerfile 新命名构建失败 bug
    • [修复] 自定义角色授权和多个授权共存出现 403 bug #I26H1L
    • [修复] httpContext.GetEndpoint() 空异常 bug #PR73
    • [修复] Oops.Oh 空异常和不支持服务服务抛异常 bug #I26EFU#I26GM4
    • [修复] cli.ps 生成文件编码乱码 bug #I26DVT
    • [修复] Swagger 文件上传按钮不显示 #I26B6U
    • [修复] 规范化结果授权状态码序列化大小写不一致问题 #I26B26
    • [修复] 未启用规范化结果时中文乱码 bug #I268T5
    • [修复] MySql 异步异常捕获不到 bug #I265SO
    • [修复] cli.ps1 提示找不到数据库连接字符串 bug #I2647U
  • 其他更改

  • 文档变化

    • [更新] 一分钟入门、安全鉴权、数据库等文档

v1.0.3(已发布)#

  • 新特性

    • [新增] Mvc 模板脚手架:Fur.Template.Mvc
    • [新增] WebApi 模板:Fur.Template.Api
    • [新增] Mvc/WebApi 模板:Fur.Template.App
    • [新增] Razar Pages 模板:Fur.Template.Razor
    • [新增] Blazor 模板:Fur.Template.Blazor
  • 突破性变化

    • [调整] PagedListSystem.Collections.Generic 命名空间下
    • [优化] 解析服务性能问题,底层代码大量优化
  • 问题修复

    • [修复] ApiSears.ControllerEnd不起作用 bug #I25KH6
    • [修复] RemoteRequest 请求完成结果序列化属性大小写问题 #I25I8R
    • [修复] HttpContext.GetEndpoinet() 空异常 bug #PR73
  • 其他更改

  • 文档变化

    • [更新] 入门文档、数据库上下文文档、多数据库操作文档

v1.0.2(已发布)#

  • 新特性

    • [新增] Pomelo.EntityFrameworkCore.MySql 最新 .NET 5 包配置 #I24ZQK
    • [新增] .AddDateTimeJsonConverter(format) 时间格式序列化配置
    • [新增] DateTimeDateTimeOffset 类型序列化格式配置 #I253FI
  • 突破性变化

    • [更新] Mapster 包至 7.0.0
    • [调整] App.Services 名为 App.ServiceProvider
    • [移除] App.ApplicationServicesApp.GetRequestService<>()
    • [移除] 非 Web 主机注入拓展
  • 问题修复

    • [修复] services.AddFriendlyException() 缺少配置注入 bug
    • [修复] 数据库上下文池被释放和高并发下内存溢出 bug #I2524K#I24UMN
    • [修复] Sql代理 返回空数据时异常 bug #I24TCK
    • [修复] 工作单元 [UnitOfWork] 多数据库被释放 bug #I24Q6W
  • 其他更改

    • [调整] EntityBaseEntity 所有属性为 vitural 修饰
    • [优化] Jwt 读取和解析性能
    • [优化] 优化代码支持 C# 9.0 最新语法
    • [优化] MD5 加密性能 #PR71
    • [移除] 无用或未使用代码
  • 文档

    • [更新] 数据库上下文、多数据库、一分钟入门文档

v1.0.0(已发布)#

  • 新特性

    • [新增] 网络请求 RemoteRequest 组件 #I1YYWD
    • [新增] .AddInjectBase() 注入,只包含基础服务注入
    • [新增] 所有服务都支持 IServiceCollectionIMvcBuilder 注入
    • [新增] 抛异常状态码设置功能 StatusCode
    • [新增] Swagger 序列化支持 Pascal 属性命名方式
  • 突破性变化

    • [更新] 所有的包为 .NET 5 正式版
  • 问题修复

    • [修复] SqlProxy 代理异步处理 bug
    • [修复] 数据库类型 DatetimeDateTimeOffset bug
    • [修复] 属性首字母大小写序列化不匹配出现 null bug
    • [修复] 对象序列化中文出现乱码 bug
    • [修复] 默认序列化配置无效 bug
    • [修复] 数据库非依赖注入方式提交无效 bug
    • [修复] 应用程序池提交所有 DbContext 空异常 bug
    • [修复] Saas 多租户 Tenant 类型字符串属性在 MySql 数据库下出现 longtext 类型 bug
    • [修复] Mvc 自动验证字符串空值 bug #I24M2T
    • [修复] 枚举注释被覆盖 bug #I24N6J
    • [修复] 忽略规范化结果无效 bug #I24B8P
    • [修复] Swagger 默认 ContentType 不是 applicaiton/json bug #I24F3U
    • [修复] 内置 System.Text.JsonNewtonsoft.Json 冲突 bug #I24F3U
  • 其他更改

    • [调整] Fur 框架域名为:https://furos.cn
    • [调整] 仓储 FromSqlRawFromSqlInterpolated 接口位置
    • [优化] 数据加解密性能,#PR70
  • 文档

    • [更新] README.md、框架介绍、数据库上下文、配置选项、多租户、跨域文档
Last updated on by Monk
+
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

1.6 更新日志

此章节只记录重大版本更新日志,小迭代版本不做更新。想了解更多更新内容,可查阅 CHANGELOG.md

v1.14(当前版本)#

  • 新特性

    • [新增] EFCore 5.0 的 Oracle 数据库支持 #I37Z8E
    • [新增] 控制是否在开发环境下显示数据库连接信息 #I37YQ2
    • [新增] [NonUnify] 支持在类中贴此特性 #I359Q6
    • [新增] 网络请求 字符串 HttpClient 拦截器 #I35F3E
    • [新增] HttpContextHttpRequest 获取远程地址拓展 #I3688Z
    • [新增] services.AddMvcFilter<> 添加 Mvc 过滤器拓展 #I368BH
  • 突破性变化

    • [升级] 框架依赖的 .NET 5 SDK 至最新版 5.0.3 #I37YQQ
    • [升级] Swashbuckle.AspNetCore 组件包到 6.0.x 版本 #I37EZK
    • [移除] Furion 框架 JWT 拓展类,只在 Furion.Extras.Authentication.JwtBearer 中保留 #I35D59
  • 问题修复

    • [修复] 传入错误 JWT Token 字符串导致自动刷新 Token 出现字符串边界值异常 bug #I34ZE5
    • [修复] 瞬时作用域数据库上下文也会自动加入工作单元导致写日志时连锁异常 bug #I37WTV
  • 其他更改

    • [优化] 获取系统环境参数的性能 #I36SR5
    • [优化] Furion 底层添加 Mvc 过滤器代码 #I36SKA
    • [优化] 添加默认 Json 序列化时间默认时间格式 #I36SL0
    • [升级] 升级 SqlSugar 拓展包到 5.0.2.6 版本 #I36SIG
  • 文档变化

    • [新增] 数据库入门问 #I37Z8S
    • [新增] 更新日志文档 #I36PI0
    • [新增] 请求审计日志、执行 Sql 更新日志文档 #I36PIK
    • [新增] 前端使用 axios 跨域配置文档 #I36PIT
    • [新增] App 静态类获取应用、环境更多信息数据 #I36SOV
    • [新增] 英文版 README.md 介绍 #I37QHP
  • 问答答疑

  • 不做实现

    • [废弃] 多语言资源文件自动创建 #I35AA4
    • [废弃] 建议多语言加上维吾尔语支持 #I37X1L

v1.13.0(已发布)#

  • 新特性

    • [新增] 多语言功能及拓展 #I2DOCL
    • [新增] 事件总线功能及消息中心 #I23BKN
    • [新增] Swagger 分组显示隐藏配置 #I2AHH8
    • [新增] Furion.Extras.Logging.Serilog 拓展插件 #I2AAN8
    • [新增] cli.ps 支持 -Namespace 命名空间指定 #I2A175
    • [新增] Swagger 规范化化文档授权失效后自动取消授权锁 #I2AIWC
    • [新增] Request.Body 支持重复读功能,主要解决微信 SDK 问题 #I2AMG0
    • [新增] 网络请求功能及文档 #I2APGJ
    • [新增] SqlSugar 拓展包支持打印 sqlMiniProfiler#I2ASLS
    • [新增] Furion.Extras.DatabaseAccesssor.Dapper 拓展插件 #I2ASYA
    • [新增] Furion.Extras.DatabaseAccessor.PetaPoco 拓展插件 #I2AUGA
    • [新增] 网络请求字符串拓展方法 #I2CPQ0
    • [新增] SqlSugar 拓展新增 PagedList 拓展 #I2CW99
    • [新增] 远程请求支持参数特性验证 #I2CX5L
    • [新增] App.User 获取当前授权用户信息便捷方法 #I2CZLO
    • [新增] 规范化文档可配置功能,支持 appsettings.json 配置 #I2D1K9
    • [新增] 远程请求拦截器添加方法和方法参数 #I2D2CM
    • [新增] 远程请求出错返回默认值支持 #I2D44M
    • [新增] 远程请求 body 参数序列化支持设置 PropertyNamingPolicy #I2D685
    • [新增] 远程服务接口客户端配置 #I2D7PS
    • [新增] AddInjectUseInject 允许自定义 SecurityDefinitionsSwaggerUI #I2DIMG
    • [新增] [SecurityDefine] 默认构造函数 #I2DNXT
    • [新增] AspectDispatchProxy 动态代理类 #I2DO6I
    • [新增] [QueryParameters] 特性,支持一键将 Action 参数添加 [FromQuery] 特性 #I2G8TF
    • [新增] 动态日志配置及拓展方法 #I2GDGD
    • [新增] WebApi 请求谓词默认规则配置功能 #I2M70X
  • 突破性变化

    • [升级] .NET 5 SDK 到 .NET 5.0.2 版本 #I2D0PZ
    • [调整] 框架内所有拓展类命名空间,全部迁移到 Furion.模块.Extensions#I2AH54
    • [调整] Swagger 记住授权存储方式,替换 Session 存储方式为 LocalStorage 方式 #I2AKUA
    • [调整] Furion 框架包描述文件,减少框架体积 #I2APAU
    • [调整] App.CanBeScanTypesApp.EffectiveTypes #I2B0ZR
    • [调整] App.ServiceProvider 属性并移除 App.GetDuplicateXXX 方法 #I2CYZE
    • [调整] Db.GetDuplicateDbContextDb.GetNewDbContext #I2CZ04
    • [调整] Db.GetSqlDispatchProxyDb.GetSqlProxy #I2DO9T
    • [重构] Aop 服务拦截器,支持异步、同步两种方式 #I2B9HQ
    • [重构] 网络请求所有功能 #I2BMR7
  • 问题修复

    • [修复] Swagger 规范化化结果不一致 bug #I2ACF3
    • [修复] 数据库新增或更新忽略空值操作方法报空异常 #I2AB6C
    • [修复] Startup.cs Aop 全局拦截无效 #I2A7T2
    • [修复] Token 过期后自动刷新 Token 无法获取最新的用户信息 bug #I2AWQI
    • [修复] [ApiDescriptionSettings(Tag="xx")] 导致 swagger.json 报错 bug #I2B47R
    • [修复] Mysql sql 数据库查询结果 tinyint 类型转换出错 bug #I2BEBM
    • [修复] 规范化结果多次包裹类型 bug #I2BHHZ
    • [修复] 动态 Api 基元类型数组问题 #I2BMS5
    • [修复] sql 查询枚举类型转换异常 bug #I2BS2Y
    • [修复] string.SqlQuerizeAsync<T1>() 拓展返回错误 bug #I2BSTS
    • [修复] 动态 Api 子类重写父类方法并取别名后 Swagger 异常 bug #I2C9VP
    • [修复] 网络请求 application/json 序列化大小写问题 #I2CRJC
    • [修复] 多数据库定位器实体嵌套关联 bug #I2CVN0
    • [修复] 跨域响应头设置无效 bug #I2CW5T
    • [修复] 远程网络请求代理打印到 MiniProfiler bug #I2CZBC
    • [修复] 远程请求响应拦截器 bug #I2D4DG
    • [修复] SqlSugar 框架 AsQueryable() 一直追加参数 #I2DH1D
    • [修复] 自动刷新 Token 空异常 bug #I2DO29
    • [修复] 生成 JWT Token 不传过期时间出现验证 401 bug #I2DO8L
    • [修复] AppStartup 排序无效 #I2DVD2
    • [修复] 未启用多语言服务时友好异常和验证出现空异常 #I2ECUJ
    • [修复] 数据校验字母和数字组合无法匹配 bug #I2EF2Q
    • [修复] 数据校验手机或固话无效 bug #I2M5IZ
    • [修复] Dapper 拓展解析 SqlConnection 异常 bug #I2M5P2
    • [修复] 开启多语言后,EF 迁移异常 bug #I2M7DT
    • [修复] IEntityTypeBuilder 不支持多重继承 bug #I2PAOD
    • [修复] JwtHandler 设置自动刷新后,匿名访问无法通过 bug #I2SDOX
    • [修复] Dapper 拓展中 SqlServer 数据库获取连接对象类型 bug #PR159
  • 其他更改

    • [优化] 移除 Sql 查询结果映射检查 [NotMapper] 特性机制 #I34XD0
    • [优化] 依赖注入时排除 IDynamicApiController 接口 #I2ECTG
    • [优化] MD5 加密性能 #PR158
  • 文档变化

    • [重构] 文档首页 #I34XBR
    • [新增] 网络请求文档 #I2APGJ
    • [新增] 多语言文档 #I2DOCL
    • [新增] 文档全文搜索引擎 #I34XAW
    • [新增] 全局静态类类型 #I34XB4
    • [新增] 框架可配置选项文档 #I34XB9
    • [新增] 事件总线文档 #I34XBI
    • [新增] 数据加解密文档 #I34XC0
    • [新增] 贡献指南文档 #I34XC8
    • [新增] HttpContext文件上传下载 博客文章 #I34XCB
    • [其他] 文档小调整,小优化
  • 问答答疑

    • [答疑] 跨域设置无效 #I2ASNJ
    • [答疑] MVC 视图无效,原因是 .cshtml 文件没有设置为 内容 #I2AXUU
    • [答疑] Sql 操作可以实现事务吗?#I2B0NX
    • [答疑] IRepository 操作数据库会打开多次数据库连接 #I2BB7B
    • [答疑] 如何进入自定义 AppAuthorizeHandler 断点 #I2BGXY
    • [答疑] SqlSugar 注入问题 #I2C2AQ
    • [答疑] 建议增加 API 签名验证,时效验证 #I2C6ET
    • [答疑] 多数据库多租户同时使用 Add-Migration 报错 #I2CEHS
    • [答疑] ISqlSugarRepository 没有 Getxxx 方法 #I2CJLZ
    • [答疑] cli.ps1 如何将 sql 里的表导出成 model#I2CSUL
    • [答疑] 手动修改 Swagger 终结点路径无效 #I2D608
    • [答疑] DefaultDbContext 不能识别 #I2DCZX
    • [答疑] 各分层项目 Startup.cs 支持 Configuration #I2DDUP
    • [答疑] Aop 无法拦截,无效 #I2DEY8
    • [答疑] mysql 执行 Add-Migration 报错 #I2DSB8\
    • [答疑] Entity 创建时间和是否删除添加默认值 #I2E04H
    • [答疑] swagger 中多个 servers 设置 #I2E0IF
    • [答疑] 全局筛选器 没有执行 #I2E5R4
    • [答疑] 多数据库定位器疑问 #I2E77T
    • [答疑] cli.ps 逆向工程 Mysql 数据库报错 #I2E7I5
    • [答疑] Swagger 开发环境 applicationsettings.json 中文乱码 #I2EAG1
    • [答疑] 增加指定路径程序集映射 #I2EEO2
    • [答疑] 动态编译 cs 脚本文件 #I2EH66
    • [答疑] 自定义中间件,返回的错误没有规范化结果 #I2NV8S
    • [答疑] Swagger 循环引用设置生成文档层级无效 #I2PLQQ
    • [答疑] 配置文件支持 yaml 文件吗? #I2TJ3N
    • [答疑] 修改数据库未 mysql 执行 Add-Migration 报错 #I2VR64
    • [答疑] 多数据库使用定位器时报错 #I2VR8F
    • [答疑] Migration To Oracle 异常 #I2WBYQ
    • [答疑] 开发时显示 Swagger,上线时关闭 Swagger,这需要怎么配置 #I2WOYV
    • [答疑] 兼容 Mvc 复杂验证没有试验成功 #I2X3GV
    • [答疑] Aop 能不能支持无接口的类 #I2X8AS
    • [答疑] 关于 JWT Token 自动刷新问题 #I2YD4K
    • [答疑] 能否增加一个拓展的 Entity,增加一些拓展的属性 #I2YDKT
    • [答疑] Furion 无法还原包,使用Nuget 下载和通过最新的的脚手架下载都提示这个问题 #I30446
    • [答疑] 复杂校验与特性验证不能并行 #I3046U
  • 不做实现

    • [废弃] 引入 Webhook 机制 #I2A3I0
    • [废弃] 增加 blog 存储服务 #I2AMBP
    • [废弃] Blazor Server 环境下 EF 的 DbContext 多线程问题 #I2AMD2
    • [废弃] 希望实现工作单元操作接口(IUnitOfWork)#I2AOR5
    • [废弃] 建议新增 string.ToPagedListAsync() 操作 #I2BZ3Z
    • [废弃] 建议新增 GraphQLOData 功能 #I2C9EH
    • [废弃] 迫切期望支持 CAP 分布式事务 #I2CBRF
    • [废弃] 如何让某个方法或实体变化后,不被 SavingChangesEvent 等拦截 #I2CEM9
    • [废弃] 建议日志封装增加更多拓展,比如:自定义保存日志文件 #I2CW8V
    • [废弃] 对 SqlSugar 的支持,增加 Nuget 脚手架 #I2D91U
    • [废弃] 使用 Middleware 实现反向代理 #I2DKM1
    • [废弃] 支持配置多个 Aop 功能 #I2E6Z2
    • [废弃] 是否计划开发类似网关的功能 #I2PD1L
    • [废弃] waring CS8002: 引用程序集 Furion 没有强名称 #I2WDN2
    • [废弃] Oracle 数据库驱动集成 Devart.Data.Oracle.Entity.EFCore #I2XJIU

v1.7.0(已发布)#

  • 新特性

    • [新增] Furion.Extras.ObjectMapper.Mapster 拓展包 #I29LSJ
    • [新增] Furion.Extras.Logging.Serilog 拓展包 #I2AAN8
    • [新增] Furion.Extras.Web.HttpContext 拓展包 #I29LSM
    • [新增] 内置 Token 刷新机制支持 #I29K57
    • [新增] 动态数据库上下文,支持运行时执行 OnModelCreating #I28UDT
    • [新增] 支持依赖注入排除指定接口 #I29693
    • [新增] 规范化结果返回时间戳字段 #I29697
    • [新增] 基础 CURD 父类操作例子 #I296SR
    • [新增] sql.Change("定位器完整类型名称") 支持 #I29LAB
    • [新增] UpdateIncludeUpdateExclude 忽略空参数支持 #I29VUG
    • [新增] 数据库上下文内置假删除查询过滤器支持 #I29Y2R
    • [新增] 忽略空值排除默认时间格式 #I29VUV
    • [升级] MiniProfiler 组件 #I297R9
  • 突破性变化

    • [调整] AppAuthorizeHandler 授权管道为异步处理 #I29MD9
    • [调整] Swagger 默认启用 JWT 授权支持 #I29LI4
    • [调整] HttpContextUtilities 名称改为 HttpContextLocal #I29KQE
    • [调整] UnifyResultContext 名称改为 UnifyContext #I29LLZ
    • [调整] 只有执行迁移命令才扫描种子数据 #I29E6P
    • [调整] 规范化结果 Successed 属性名为 Succeeded #I29NMV
    • [移除] Mapster 对象组件,采用提供拓展方式 #I29D2M
    • [移除] CacheManager 拓展类 #I29LU1
    • [重构] SaveChanges 拦截器 #I292LO
  • 问题修复

    • [修复] 未注册的数据库上下文也被引用全局查询拦截器 bug #I29ZXJ
    • [修复] 手动返回 BadObjectResultValidationProblemDetails 结果类型时规范化结果失效 bug #I29ZU9
    • [修复] 动态 WebApi KeepNameKeepVerbSplitCamelCase 无效 bug #I29X90
    • [修复] Sql代理 返回 元组 类型出错 bug #I29SMV
    • [修复] 401,403 状态码规范化返回值属性变大写 bug #I29M8Y
    • [修复] HttpContext 空异常 bug #I29LU4
    • [修复] 接口无返回值没有应用规范化结果 bug #I29GT7
    • [修复] 前端 Less 配置文件导致主机启动失败 bug #I29E7P
    • [修复] 执行 sql 结果转泛型后属性重复赋值 bug #I29BUO
    • [修复] Swagger 关闭 MiniProfiler 之后 组中组 失效 #I29789
    • [修复] 未启用规范化结果时异常返回 System.Object 字符 #I2969A
    • [修复] 正数数据验证 0 也验证通过 bug #I2955T
    • [修复] 非泛型类集成泛型接口依赖注入 bug #I294YT
    • [修复] Swagger 不支持 new 覆盖父类的 bug #I28Z1A
    • [修复] JsonSerializerUtility 没有公开 bug #I28WMI
    • [修复] SqlSugar 拓展查询泛型类型注册异常 bug #I28VMT
    • [修复] Furion Tools 不支持生成不同命名空间的实体 bug #I2A175
    • [修复] 全局拦截器无效 bug #I2A7T2
    • [修复] 新增或更新忽略空值空异常 bug #I2AB6C
  • 其他更改

    • [优化] Token 生成加密算法 #I29KIH
  • 文档变化

    • [新增] 日志文档 #I28Y9D
    • [调整] 数据库上下文、实体拦截器、配置、一分钟入门等等文档
  • 问答答疑

    • [问答] Swagger 如何实现授权访问 #I294F2
    • [问答] 如何实现多个数据库多对多实体配置 #I29G6S
    • [问答] 动态 WebApi 支持文件上传吗 #I29R5E
    • [疑问] 多个数据库上下文无法生成迁移代码 #I2A6II
  • 不做实现

    • [废弃] 实现 BuildChange 传入表名 #I292SN
    • [废弃] 执行数据库操作结果不支持属性忽略大小写赋值 #I29DRQ
    • [废弃] 引入 Webhook 机制 #I2A3I0

v1.4.0(已发布)#

  • 新特性

    • [新增] Furion 支持二级虚拟目录部署功能 #I28B77
    • [新增] Furion.Template.RazorWithWebApi 脚手架 #I28QGI
    • [新增] Furion.Template.BlazorWithWebApi 脚手架 #I27Z3O
    • [新增] EFCore 时态查询拓展 #I28AJ
    • [新增] [AppDbContext(连接字符串,数据库类型)] 配置支持 #I28QTB
    • [新增] DateTimeOffsetDateTime 拓展方法 #I27MQA
    • [新增] ValidationTypes 验证正则表达式智能提示 #I2801V
    • [新增] ValiationTypes.WordWithNumber 验证 #I2805
    • [新增] 获取客户端和服务端 IP 地址 #I28QV9
  • 突破性变化

    • [升级] .NET 5.0 版本至 .NET 5.0.1 版本 #I28QU
    • [重构] 视图引擎功能,优化不规范命名和新增字符串模板编译 #I28G0S
    • [重构] 数据库实体查找算法,并优化性能 #I28QUQ
    • [优化] 应用启动初始化性能和数据库第一次自动配置 DbSet 性能
  • 问题修复

    • [修复] 多数据库上下文配置定位器后实体无法正确生成 bug #I2888L
    • [修复] 多租户数据库上下文实体生成 bug #I2891G
    • [修复] 对象验证失败提示消息没有应用 JSON 大小写配置 bug #I27UTX
    • [修复] 仓储 InsertUpdate 方法指定 ignoreNullValues 无效 bug #I27UN6
    • [修复] Controller 派生类如果贴了 [Route] 特性后出现在 Swagger 中 bug #I27TN7
    • [修复] SqlScalar 执行 sql 返回 Nullable 类型出现转换失败 bug #I27S2N
    • [修复] [UnitOfWork] 特性异常 bug #I27MLM
    • [修复] sql 静态执行方式和 sql 高级代理无法监听数据库连接状态 bug #I27M4F
    • [修复] 修复更换 Json 序列化库无效 bug,如替换为 Microsoft.AspNetCore.Mvc.NewtonsoftJson #I27M43
    • [修复] Furion Tools 工具生成模型 bug #I27XI5
    • [修复] 软删除没有生效 bug #I2804I
    • [修复] Furion Tools 识别带多个 \\ 的连接字符串识别 bug #I280TS#PR91
    • [修复] Furion Tools 无法取消生成 bug #I2816M
    • [修复] DateTimeOffset 转本地时间差 8 小时 bug #I28BA9
    • [修复] 启用 bundle js&css 压缩后启动异常 bug #I28KR
    • [修复] ValidationTypes.Required 无效 bug #PR98
    • [修复] 规范化结果OnValidateFailed 参数名拼写错误 bug #PR93#PR92
    • [修复] 授权管道验证失败还显示结果 bug #PR89
  • 其他更改

    • [更新] README.md 友情连接地址 #PR88
    • [更新] 模板脚手架源码,添加 EFCore Tools#PR87
    • [更新] README.md Nuget 图标 #PR85
    • [废弃] 将 List<T>DateTable #PR97
  • 文档变化

    • [新增] 视图引擎模板文档 #I27ZVA
    • [新增] EFCore 时态查询文档 #I28AJ, DOC
    • [更新] 仓储文档书写纰漏 bug #PR90
    • [更新] 选项文档错误 bug #PR86
    • [更新] 实体数据监听器 文档书写错误 bug #PR83
    • [更新] 数据库上下文、多数据库、脚手架等文档
  • 问答答疑

    • [建议] 希望 api 返回的值自动将 null 转为 '' 或 [][#I286IJ](https://gitee.com/monksoul/Furion/issues/I286IJ),【已关闭】
    • [建议] 添加网关功能 #I27TP7,【已关闭】
    • [建议] 新增 SqlQuery<T> 获取单条记录方法 #I28M1V,【已关闭】
    • [建议] 希望可以提供集成 Serilog 例子 #I282J4,【已关闭】
    • [疑问] 如何通过特性配置唯一约束 #I2891L,【已关闭】
    • [疑问] 怎么读取 appsettings.json 数组 #I27WU,【已关闭】
    • [疑问] IRepository<TEntity> 出现空异常 #I281IE,【已关闭】
    • [疑问] 规范化接口问题问题 #I28NMZ,【已关闭】
    • [疑问] 统一返回值模型中 OnResponseStatusCodes 未执行 #I28NNL,【已关闭】

v1.2.0(已发布)#

  • 新特性

    • [新增] 雪花算法 #I26OXG, #PR78
    • [新增] [AppDbContext] 配置数据库提供器支持 #I27G3T
    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 定位器仓储 IDbRepository<TDbContextLocator> #I276Q3
    • [新增] 数据库操作 InsertOrUpdate 支持排除空字符串功能 #I272OG
    • [新增] 数据库操作 UpdateIncludeUpdateExclude 匿名对象支持 #I271X0
    • [新增] 数据验证传入空对象跳过验证支持 #I273R4
    • [新增] 应用启动时支持排除特定配置文件自动加载 #I26U0A
    • [新增] 单个实体表名前缀支持 #I26LX0
    • [新增] MySql 数据库自动配置默认版本号 #I26XQ6
    • [优化] 授权处理程序代码
  • 突破性变化

    • [新增] 实体表数据更改监听接口 IEntityDataChangedListener #I278DD, #I278LQ
    • [新增] 全局服务接口 AOP 拦截功能 #I278CP
    • [新增] 雪花算法 #I26OXG, #PR78
  • 问题修复

    • [修复] 视图引擎加载外部程序集出错 bug
    • [修复] 依赖注入代理接口报空对象异常 bug
    • [修复] EFCore 取消附加实体出错 bug
    • [修复] 数据库仓储在非 Web 请求下出现空异常 bug
    • [修复] 多个授权策略共存问题出现无效 bug
    • [修复] 友好异常 Oop.Oh 不支持普通方法 bug
    • [修复] 获取多租户对象时数据库上下文出现作用域验证失败 bug
    • [修复] 工作单元不支持 Sql代理 拦截 bug #I27GST
  • 其他更改

  • 文档变化


v1.1.0(已发布)#

  • 新特性

    • [新增] Db.GetDbContext() 获取默认数据库上下文方法
    • [新增] HttpContextUtility.GetCurrentHttpContext() 获取全局 HttpContext 上下文
    • [新增] App.GetRequiredService<> 解析服务方法
    • [新增] object.GetService<> 对象拓展方法
    • [新增] 策略授权 PolicyPipeline 基类方法,支持多重判断授权
    • [新增] JWTEncryption.ValidateJwtBearerToken 手动验证静态方法
    • [新增] 全局数据库上下文 InsertOrUpdateIgnoreNullValuesEnabledEntityStateTracked 全局配置
    • [新增] Swagger Jwt授权 全局授权参数 #I26GLR
    • [新增] InsertOrUpdate 支持自定义判断条件功能 #I269Q1
    • [新增] 字符串字段小写命名支持 #I2695D
    • [新增] 字符串文本对比功能 #I268LE
    • [新增] 全局异常特性消息功能 #I2662O
    • [新增] InsertUpdate 数据库忽略空值功能 #I264Q4
  • 突破性变化

    • [调整] Fur 项目名为 Furion
    • [调整] Db.GetRequestDbContext<>() 命名为 Db.GetDbContext<>()
    • [调整] Db.GetDbContext<>() 命名为 Db.GetDuplicateDbContext<>()
    • [重构] App.GetService<> 解析服务的底层逻辑,大大提高了解析服务的性能
    • [重构] 授权核心代码,保持和微软一致的授权规范 #I26DCB
    • [移除] App.GetRequestService<> 方法
    • [移除] ValidateJwtBearer Jwt 授权方法,无需手动判断了
  • 问题修复

    • [修复] Furion 官方脚手架生成后编译异常 bug
    • [修复] Tenant 内置属性不是 virtual 修饰 bug
    • [修复] dockerfile 新命名构建失败 bug
    • [修复] 自定义角色授权和多个授权共存出现 403 bug #I26H1L
    • [修复] httpContext.GetEndpoint() 空异常 bug #PR73
    • [修复] Oops.Oh 空异常和不支持服务服务抛异常 bug #I26EFU#I26GM4
    • [修复] cli.ps 生成文件编码乱码 bug #I26DVT
    • [修复] Swagger 文件上传按钮不显示 #I26B6U
    • [修复] 规范化结果授权状态码序列化大小写不一致问题 #I26B26
    • [修复] 未启用规范化结果时中文乱码 bug #I268T5
    • [修复] MySql 异步异常捕获不到 bug #I265SO
    • [修复] cli.ps1 提示找不到数据库连接字符串 bug #I2647U
  • 其他更改

  • 文档变化

    • [更新] 一分钟入门、安全鉴权、数据库等文档

v1.0.3(已发布)#

  • 新特性

    • [新增] Mvc 模板脚手架:Fur.Template.Mvc
    • [新增] WebApi 模板:Fur.Template.Api
    • [新增] Mvc/WebApi 模板:Fur.Template.App
    • [新增] Razar Pages 模板:Fur.Template.Razor
    • [新增] Blazor 模板:Fur.Template.Blazor
  • 突破性变化

    • [调整] PagedListSystem.Collections.Generic 命名空间下
    • [优化] 解析服务性能问题,底层代码大量优化
  • 问题修复

    • [修复] ApiSears.ControllerEnd不起作用 bug #I25KH6
    • [修复] RemoteRequest 请求完成结果序列化属性大小写问题 #I25I8R
    • [修复] HttpContext.GetEndpoinet() 空异常 bug #PR73
  • 其他更改

  • 文档变化

    • [更新] 入门文档、数据库上下文文档、多数据库操作文档

v1.0.2(已发布)#

  • 新特性

    • [新增] Pomelo.EntityFrameworkCore.MySql 最新 .NET 5 包配置 #I24ZQK
    • [新增] .AddDateTimeJsonConverter(format) 时间格式序列化配置
    • [新增] DateTimeDateTimeOffset 类型序列化格式配置 #I253FI
  • 突破性变化

    • [更新] Mapster 包至 7.0.0
    • [调整] App.Services 名为 App.ServiceProvider
    • [移除] App.ApplicationServicesApp.GetRequestService<>()
    • [移除] 非 Web 主机注入拓展
  • 问题修复

    • [修复] services.AddFriendlyException() 缺少配置注入 bug
    • [修复] 数据库上下文池被释放和高并发下内存溢出 bug #I2524K#I24UMN
    • [修复] Sql代理 返回空数据时异常 bug #I24TCK
    • [修复] 工作单元 [UnitOfWork] 多数据库被释放 bug #I24Q6W
  • 其他更改

    • [调整] EntityBaseEntity 所有属性为 vitural 修饰
    • [优化] Jwt 读取和解析性能
    • [优化] 优化代码支持 C# 9.0 最新语法
    • [优化] MD5 加密性能 #PR71
    • [移除] 无用或未使用代码
  • 文档

    • [更新] 数据库上下文、多数据库、一分钟入门文档

v1.0.0(已发布)#

  • 新特性

    • [新增] 网络请求 RemoteRequest 组件 #I1YYWD
    • [新增] .AddInjectBase() 注入,只包含基础服务注入
    • [新增] 所有服务都支持 IServiceCollectionIMvcBuilder 注入
    • [新增] 抛异常状态码设置功能 StatusCode
    • [新增] Swagger 序列化支持 Pascal 属性命名方式
  • 突破性变化

    • [更新] 所有的包为 .NET 5 正式版
  • 问题修复

    • [修复] SqlProxy 代理异步处理 bug
    • [修复] 数据库类型 DatetimeDateTimeOffset bug
    • [修复] 属性首字母大小写序列化不匹配出现 null bug
    • [修复] 对象序列化中文出现乱码 bug
    • [修复] 默认序列化配置无效 bug
    • [修复] 数据库非依赖注入方式提交无效 bug
    • [修复] 应用程序池提交所有 DbContext 空异常 bug
    • [修复] Saas 多租户 Tenant 类型字符串属性在 MySql 数据库下出现 longtext 类型 bug
    • [修复] Mvc 自动验证字符串空值 bug #I24M2T
    • [修复] 枚举注释被覆盖 bug #I24N6J
    • [修复] 忽略规范化结果无效 bug #I24B8P
    • [修复] Swagger 默认 ContentType 不是 applicaiton/json bug #I24F3U
    • [修复] 内置 System.Text.JsonNewtonsoft.Json 冲突 bug #I24F3U
  • 其他更改

    • [调整] Fur 框架域名为:https://furos.cn
    • [调整] 仓储 FromSqlRawFromSqlInterpolated 接口位置
    • [优化] 数据加解密性能,#PR70
  • 文档

    • [更新] README.md、框架介绍、数据库上下文、配置选项、多租户、跨域文档
Last updated on by Monk
- + - + \ No newline at end of file diff --git a/docs/docs/view-engine/index.html b/docs/docs/view-engine/index.html index 5516c2cdfac..d16a6c0229b 100644 --- a/docs/docs/view-engine/index.html +++ b/docs/docs/view-engine/index.html @@ -8,7 +8,7 @@ 17. 视图引擎 | Furion - + @@ -26,7 +26,7 @@
var template = _viewEngine.Compile<CustomModel>(content);
var result = template.Run(instance =>
{
instance.A = 10;
instance.B = "Alex";
});

结果:

Hello 10, Alex, -=123=-

17.5 IViewEngine 接口#

IViewEngine 提供了简单方便的 RunCompile 方法,也提供了最原始化的 CompileRun 方法。

通过原始的 CompileRun 方法可以实现很多复杂的逻辑和自定义指令集。

/// <summary>
/// 编译模板
/// </summary>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
IViewEngineTemplate Compile(string content, Action<IViewEngineOptionsBuilder> builderAction = null);
/// <summary>
/// 编译模板
/// </summary>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
Task<IViewEngineTemplate> CompileAsync(string content, Action<IViewEngineOptionsBuilder> builderAction = null);
/// <summary>
/// 编译模板
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
IViewEngineTemplate<T> Compile<T>(string content, Action<IViewEngineOptionsBuilder> builderAction = null)
where T : IViewEngineModel;
/// <summary>
/// 编译模板
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="content"></param>
/// <param name="builderAction"></param>
/// <returns></returns>
Task<IViewEngineTemplate<T>> CompileAsync<T>(string content, Action<IViewEngineOptionsBuilder> builderAction = null)
where T : IViewEngineModel;

17.6 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/docs/virtual-deploy/index.html b/docs/docs/virtual-deploy/index.html index f712596e54e..2861afc4ff1 100644 --- a/docs/docs/virtual-deploy/index.html +++ b/docs/docs/virtual-deploy/index.html @@ -8,7 +8,7 @@ 27.4 二级虚拟目录部署 | Furion - + @@ -21,7 +21,7 @@
⭐️ 如果你喜欢 Furion ,可以在 Gitee 中给个star ⭐️

27.4 二级虚拟目录部署

27.4.1 关于二级虚拟目录#

通常我们的站点都是部署在网站的根目录下的,但是有些时候,我们可能将网站根目录下的目录作为二级站点或子站点,这个时候,就会出现 404 错误了。

这个时候就需要进行一些特殊配置了。

27.4.1.2 配置 Startup.cs#

首先,我们需要配置 Startup.cs 中的 Configure,如:

public void Configure(IApplicationBuilder application, IWebHostEnvironment env)
{
application.Map("/二级目录", app=>
{
// 其他中间件代码全部在这里面写
});
}

27.4.1.3 启用 Swagger 虚拟目录支持#

第二步,在 appsettings.json 配置文件(其他配置文件也可以)中添加以下配置:

{
"SpecificationDocumentSettings": {
"VirtualPath": "/二级目录"
}
}

27.4.2 反馈与建议#

与我们交流

给 Furion 提 Issue

Last updated on by Monk
- + diff --git a/docs/index.html b/docs/index.html index cb19a4c56cf..5d8f7a2c1de 100644 --- a/docs/index.html +++ b/docs/index.html @@ -8,7 +8,7 @@ 让 .NET 开发更简单,更通用,更流行。 Furion | Furion - + @@ -25,7 +25,7 @@
[IfException(1000, "用户ID: {0} 不存在")]
public async Task<UserDto> GetUser([Range(1, int.MaxValue)] int userId)
{
var user = await _userRepository.FindOrDefaultAsync(userId);
_ = user ?? throw Oops.Oh(1000, userId);
return user.Adapt<UserDto>();
}
public async Task<RemoteData> GetRemote(string id)
{
var data = await $"https://www.furion.pro/data?id={id}".GetAsAsync<RemoteData>();
return data;
}
}

完全开源免费

代码托管在开源中国 GITEE

2525
Stars
565
Forks
698,583
Downloads

功能模块

麻雀虽小五脏俱全

大量使用者测评

来听听他们是怎么说的

理想和现实

作者的技术是我接触.NET程序员中最好的一个,代码的质量,文档的质量都是一等一的。

kesshei

强烈支持,因为有你们,.net 会走的更远。

逆天的蝈蝈

非常优秀的开源作品,点赞支持

张芸溪

大概看了一下,觉得项目非常棒。core生态一定能火

赖皮小鳄鱼

作者好棒,支持国内.net!

gudufy

做得非常棒,打算基于你的框架做一个基本的后台管理出来,供大家快速开发中小型项目。

ThinkCoder

文档写的真不错,代码质量也非常高,注释非常完善,赞一个。

liuina

期待文档写完的那一天,绝对惊艳四座。

weiyu.xiao

很不错的项目,对快速搭建健壮的技术架构,帮助业务成功很有帮助。

我们的客户

我们的软件包已在全球多个项目中使用。从小型企业到企业的解决方案及知名企业。公司在简单软件和复杂管理系统的开发方面都信任我们。

立即添加您的公司
- + diff --git a/docs/main.90011ef5.js b/docs/main.90011ef5.js index c084f162150..a476c361eb0 100644 --- a/docs/main.90011ef5.js +++ b/docs/main.90011ef5.js @@ -1,2 +1 @@ -/*! For license information please see main.90011ef5.js.LICENSE.txt */ (window.webpackJsonp=window.webpackJsonp||[]).push([[117],[function(e,t,n){"use strict";e.exports=n(40)},function(e,t,n){e.exports=n(44)()},function(e,t,n){"use strict";n.d(t,"a",(function(){return y})),n.d(t,"b",(function(){return E})),n.d(t,"c",(function(){return k})),n.d(t,"d",(function(){return A})),n.d(t,"e",(function(){return b})),n.d(t,"f",(function(){return L})),n.d(t,"g",(function(){return F})),n.d(t,"h",(function(){return g})),n.d(t,"i",(function(){return T})),n.d(t,"j",(function(){return C})),n.d(t,"k",(function(){return M})),n.d(t,"l",(function(){return U})),n.d(t,"m",(function(){return B})),n.d(t,"n",(function(){return z})),n.d(t,"o",(function(){return D}));var r=n(4),o=n(0),a=n.n(o),i=(n(1),n(6)),l=n(21),s=n(5),c=n(3),u=n(22),d=n.n(u),f=(n(29),n(7)),p=n(34),m=n.n(p),h=function(e){var t=Object(l.a)();return t.displayName=e,t}("Router-History"),g=function(e){var t=Object(l.a)();return t.displayName=e,t}("Router"),b=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen((function(e){n._isMounted?n.setState({location:e}):n._pendingLocation=e}))),n}Object(r.a)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){this._isMounted=!0,this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&this.unlisten()},n.render=function(){return a.a.createElement(g.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},a.a.createElement(h.Provider,{children:this.props.children||null,value:this.props.history}))},t}(a.a.Component);var y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o=0;f--){var p=i[f];"."===p?a(i,f):".."===p?(a(i,f),d++):d&&(a(i,f),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var s=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=l(t),o=l(n);return r!==t||o!==n?e(r,o):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1},c=n(5);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function f(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function p(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function m(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function h(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e)).state=t:(void 0===(a=Object(r.a)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function g(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&s(e.state,t.state)}function b(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=h(e,t,f(),E.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(E.entries[E.index]=o,d({action:r,location:o}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=E.index+e;return t>=0&&t=0||(o[n]=e[n]);return o}n.d(t,"a",(function(){return r}))},function(e,t,n){"use strict";n.d(t,"a",(function(){return l})),n.d(t,"b",(function(){return s}));var r=n(2),o=n(3),a=n(0),i=n.n(a);function l(e,t,n){return void 0===n&&(n=[]),e.some((function(e){var o=e.path?Object(r.j)(t,e):n.length?n[n.length-1].match:r.e.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&l(e.routes,t,n)),o})),n}function s(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?i.a.createElement(r.g,n,e.map((function(e,n){return i.a.createElement(r.d,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render(Object(o.a)({},n,{},t,{route:e})):i.a.createElement(e.component,Object(o.a)({},n,t,{route:e}))}})}))):null}},function(e,t,n){"use strict";n.r(t),t.default={title:"Furion",tagline:"\u8ba9 .NET \u5f00\u53d1\u66f4\u7b80\u5355\uff0c\u66f4\u901a\u7528\uff0c\u66f4\u6d41\u884c\u3002",url:"https://furion.pro",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",favicon:"img/favicon.ico",organizationName:"Baiqian Co.,Ltd",projectName:"Furion",themeConfig:{prism:{additionalLanguages:["powershell","csharp","sql"]},algolia:{apiKey:"97723a21d903df7ca5ea618b160f03c6",indexName:"furion",contextualSearch:!0,appId:"BH4D9OD16A",searchParameters:{}},navbar:{title:"Furion",logo:{alt:"Furion Logo",src:"img/furionlogo.png"},hideOnScroll:!0,items:[{to:"docs",activeBasePath:"docs",label:"\u6587\u6863",position:"left"},{to:"docs/global/app",activeBasePath:"docs/global",label:"\u9759\u6001\u7c7b",position:"left"},{to:"docs/settings/appsettings",activeBasePath:"docs/settings",label:"\u914d\u7f6e",position:"left"},{to:"blog",label:"\u535a\u5ba2",position:"left"},{to:"docs/upgrade",activeBasePath:"docs/upgrade",label:"\u66f4\u65b0\u65e5\u5fd7\u2728",position:"left"},{label:"\u6e90\u7801",position:"right",items:[{label:"Gitee",href:"https://gitee.com/monksoul/Furion"},{label:"GitHub",href:"https://github.com/MonkSoul/Furion"}]},{label:"\u793e\u533a",position:"right",href:"https://www.chinadot.net"},{label:"\u5408\u4f5c",position:"right",to:"docs/cooperate",activeBasePath:"docs/cooperate"},{label:"\u8d5e\u52a9",position:"right",to:"docs/donate",activeBasePath:"docs/donate"}]},footer:{style:"dark",links:[{title:"\u6587\u6863",items:[{label:"\u5165\u95e8",to:"docs/get-start"},{label:"\u6307\u5357",to:"docs"}]},{title:"\u793e\u533a",items:[{label:"\u8ba8\u8bba",href:"https://gitee.com/monksoul/Furion/issues"},{label:"\u770b\u677f",href:"https://gitee.com/monksoul/Furion/board"}]},{title:"\u66f4\u591a",items:[{label:"\u535a\u5ba2",to:"blog"},{label:"\u4ed3\u5e93",href:"https://gitee.com/monksoul/Furion"}]}],copyright:"Copyright \xa9 2020-2021 Furion, Baiqian Co.,Ltd.",logo:{src:"img/chinadotnet.png",href:"https://www.chinadot.net/"}},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!1,switchConfig:{darkIcon:"\ud83c\udf1c",darkIconStyle:{},lightIcon:"\ud83c\udf1e",lightIconStyle:{}}},docs:{versionPersistence:"localStorage"},metadatas:[],hideableSidebar:!1},presets:[["@docusaurus/preset-classic",{docs:{sidebarPath:"C:\\Baiqian\\Workplaces\\Gitee\\Furion\\handbook\\sidebars.js",editUrl:"https://gitee.com/monksoul/Furion/tree/master/handbook/",showLastUpdateTime:!0,showLastUpdateAuthor:!0},blog:{showReadingTime:!0,editUrl:"https://gitee.com/monksoul/Furion/tree/master/handbook/"},theme:{customCss:"C:\\Baiqian\\Workplaces\\Gitee\\Furion\\handbook\\src\\css\\custom.css"}}]],baseUrlIssueBanner:!0,i18n:{defaultLocale:"en",locales:["en"],localeConfigs:{}},onDuplicateRoutes:"warn",customFields:{},plugins:[],themes:[],titleDelimiter:"|",noIndex:!1}},function(e,t,n){"use strict";n.r(t);var r=n(0),o=n(15);t.default=function(){const e=Object(r.useContext)(o.a);if(null===e)throw new Error("Docusaurus context not provided");return e}},function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return f})),n.d(t,"c",(function(){return y})),n.d(t,"e",(function(){return w}));var r=n(2);n.d(t,"d",(function(){return r.a})),n.d(t,"f",(function(){return r.b})),n.d(t,"g",(function(){return r.c})),n.d(t,"h",(function(){return r.d})),n.d(t,"i",(function(){return r.e})),n.d(t,"j",(function(){return r.f})),n.d(t,"k",(function(){return r.g})),n.d(t,"l",(function(){return r.i})),n.d(t,"m",(function(){return r.j})),n.d(t,"n",(function(){return r.k})),n.d(t,"o",(function(){return r.l})),n.d(t,"p",(function(){return r.m})),n.d(t,"q",(function(){return r.n})),n.d(t,"r",(function(){return r.o}));var o=n(4),a=n(0),i=n.n(a),l=n(6),s=(n(1),n(3)),c=n(7),u=n(5),d=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o
'};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){s(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),l=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&p(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=f(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n})?r.call(t,n,t,e):r)||(e.exports=o)},function(e,t,n){"use strict";n.d(t,"b",(function(){return a})),n.d(t,"a",(function(){return i}));var r=n(10),o=n(25);function a(){const{siteConfig:{baseUrl:e="/",url:t}={}}=Object(r.default)();return{withBaseUrl:(n,r)=>function(e,t,n,{forcePrependBaseUrl:r=!1,absolute:a=!1}={}){if(!n)return n;if(n.startsWith("#"))return n;if(Object(o.b)(n))return n;if(r)return t+n;const i=n.startsWith(t)?n:t+n.replace(/^\//,"");return a?e+i:i}(t,e,n,r)}}function i(e,t={}){const{withBaseUrl:n}=a();return n(e,t)}},,,function(e,t,n){"use strict";var r="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};function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function i(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var l=n(0),s=n(1),c=[],u=[];function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then((function(e){return n.loading=!1,n.loaded=e,e})).catch((function(e){throw n.loading=!1,n.error=e,e})),n}function f(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach((function(r){var o=d(e[r]);o.loading?t.loading=!0:(t.loaded[r]=o.loaded,t.error=o.error),n.push(o.promise),o.promise.then((function(e){t.loaded[r]=e})).catch((function(e){t.error=e}))}))}catch(r){t.error=r}return t.promise=Promise.all(n).then((function(e){return t.loading=!1,e})).catch((function(e){throw t.loading=!1,e})),t}function p(e,t){return l.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function m(e,t){var d,f;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var m=Object.assign({loader:null,loading:null,delay:200,timeout:null,render:p,webpack:null,modules:null},t),h=null;function g(){return h||(h=e(m.loader)),h.promise}return c.push(g),"function"==typeof m.webpack&&u.push((function(){if(e=m.webpack,"object"===r(n.m)&&e().every((function(e){return void 0!==e&&void 0!==n.m[e]})))return g();var e})),f=d=function(t){function n(r){o(this,n);var i=a(this,t.call(this,r));return i.retry=function(){i.setState({error:null,loading:!0,timedOut:!1}),h=e(m.loader),i._loadModule()},g(),i.state={error:h.error,pastDelay:!1,timedOut:!1,loading:h.loading,loaded:h.loaded},i}return i(n,t),n.preload=function(){return g()},n.prototype.componentWillMount=function(){this._mounted=!0,this._loadModule()},n.prototype._loadModule=function(){var e=this;if(this.context.loadable&&Array.isArray(m.modules)&&m.modules.forEach((function(t){e.context.loadable.report(t)})),h.loading){"number"==typeof m.delay&&(0===m.delay?this.setState({pastDelay:!0}):this._delay=setTimeout((function(){e.setState({pastDelay:!0})}),m.delay)),"number"==typeof m.timeout&&(this._timeout=setTimeout((function(){e.setState({timedOut:!0})}),m.timeout));var t=function(){e._mounted&&(e.setState({error:h.error,loaded:h.loaded,loading:h.loading}),e._clearTimeouts())};h.promise.then((function(){t()})).catch((function(e){t()}))}},n.prototype.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},n.prototype._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},n.prototype.render=function(){return this.state.loading||this.state.error?l.createElement(m.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?m.render(this.state.loaded,this.props):null},n}(l.Component),d.contextTypes={loadable:s.shape({report:s.func.isRequired})},f}function h(e){return m(d,e)}h.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return m(f,e)};var g=function(e){function t(){return o(this,t),a(this,e.apply(this,arguments))}return i(t,e),t.prototype.getChildContext=function(){return{loadable:{report:this.props.report}}},t.prototype.render=function(){return l.Children.only(this.props.children)},t}(l.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then((function(){if(e.length)return b(e)}))}g.propTypes={report:s.func.isRequired},g.childContextTypes={loadable:s.shape({report:s.func.isRequired}).isRequired},h.Capture=g,h.preloadAll=function(){return new Promise((function(e,t){b(c).then(e,t)}))},h.preloadReady=function(){return new Promise((function(e,t){b(u).then(e,e)}))},e.exports=h},function(e,t,n){"use strict";(function(e){var r=n(0),o=n.n(r),a=n(4),i=n(1),l=n.n(i),s=1073741823,c="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==e?e:{};function u(e){var t=[];return{on:function(e){t.push(e)},off:function(e){t=t.filter((function(t){return t!==e}))},get:function(){return e},set:function(n,r){e=n,t.forEach((function(t){return t(e,r)}))}}}var d=o.a.createContext||function(e,t){var n,o,i,d="__create-react-context-"+((c[i="__global_unique_id__"]=(c[i]||0)+1)+"__"),f=function(e){function n(){var t;return(t=e.apply(this,arguments)||this).emitter=u(t.props.value),t}Object(a.a)(n,e);var r=n.prototype;return r.getChildContext=function(){var e;return(e={})[d]=this.emitter,e},r.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(i=o)?0!==a||1/a==1/i:a!=a&&i!=i)?n=0:(n="function"==typeof t?t(r,o):s,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,i},r.render=function(){return this.props.children},n}(r.Component);f.childContextTypes=((n={})[d]=l.a.object.isRequired,n);var p=function(t){function n(){var e;return(e=t.apply(this,arguments)||this).state={value:e.getValue()},e.onUpdate=function(t,n){0!=((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}Object(a.a)(n,t);var r=n.prototype;return r.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?s:t},r.componentDidMount=function(){this.context[d]&&this.context[d].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?s:e},r.componentWillUnmount=function(){this.context[d]&&this.context[d].off(this.onUpdate)},r.getValue=function(){return this.context[d]?this.context[d].get():e},r.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(r.Component);return p.contextTypes=((o={})[d]=l.a.object,o),{Provider:f,Consumer:p}};t.a=d}).call(this,n(28))},function(e,t,n){var r=n(46);e.exports=p,e.exports.parse=a,e.exports.compile=function(e,t){return l(a(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=f;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=o.exec(e));){var d=n[0],f=n[1],p=n.index;if(l+=e.slice(i,p),i=p+d.length,f)l+=f[1];else{var m=e[i],h=n[2],g=n[3],b=n[4],y=n[5],v=n[6],E=n[7];l&&(r.push(l),l="");var w=null!=h&&null!=m&&m!==h,x="+"===v||"*"===v,T="?"===v||"*"===v,k=n[2]||u,S=b||y;r.push({name:g||a++,prefix:h||"",delimiter:k,optional:T,repeat:x,partial:w,asterisk:!!E,pattern:S?c(S):E?".*":"[^"+s(k)+"]+?"})}}return ie.length)return;if(!(w instanceof s)){if(h&&v!=t.length-1){if(f.lastIndex=E,!(C=f.exec(e)))break;for(var x=C.index+(m?C[1].length:0),T=C.index+C[0].length,k=v,S=E,O=t.length;k=(S+=t[k].length)&&(++v,E=S);if(t[v]instanceof s)continue;A=k-v,w=e.slice(E,S),C.index-=E}else{f.lastIndex=0;var C=f.exec(w),A=1}if(C){m&&(g=C[1]?C[1].length:0),T=(x=C.index+g)+(C=C[0].slice(g)).length;var N=w.slice(0,x),_=w.slice(T),R=[v,A];N&&(++v,E+=N.length,R.push(N));var I=new s(c,p?o.tokenize(C,p):C,b,C,h);if(R.push(I),_&&R.push(_),Array.prototype.splice.apply(t,R),1!=A&&o.matchGrammar(e,t,n,v,E,!0,c),i)break}else if(i)break}}}}},hooks:{add:function(){}},tokenize:function(e,t,n){var r=[e],a=t.rest;if(a){for(var i in a)t[i]=a[i];delete t.rest}return o.matchGrammar(e,r,t,0,0,!1),r}},(a=o.Token=function(e,t,n,r,o){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length,this.greedy=!!o}).stringify=function(e,t,n){if("string"==typeof e)return e;if("Array"===o.util.type(e))return e.map((function(n){return a.stringify(n,t,e)})).join("");var r={type:e.type,content:a.stringify(e.content,t,n),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:n};if(e.alias){var i="Array"===o.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(r.classes,i)}var l=Object.keys(r.attributes).map((function(e){return e+'="'+(r.attributes[e]||"").replace(/"/g,""")+'"'})).join(" ");return"<"+r.tag+' class="'+r.classes.join(" ")+'"'+(l?" "+l:"")+">"+r.content+""},o);i.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},i.languages.markup.tag.inside["attr-value"].inside.entity=i.languages.markup.entity,i.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(i.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:i.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:i.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:r},i.languages.insertBefore("markup","cdata",o)}}),i.languages.xml=i.languages.extend("markup",{}),i.languages.html=i.languages.markup,i.languages.mathml=i.languages.markup,i.languages.svg=i.languages.markup,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:n},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s*(?:\r?\n|\r)(?:[\s\S])*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0},{pattern:/(["'])(?:\\[\s\S]|\$\([^)]+\)|`[^`]+`|(?!\1)[^\\])*\1/,greedy:!0,inside:n}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:n.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}};for(var r=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=n.variable[1].inside,a=0;a=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},i.languages.c=i.languages.extend("clike",{"class-name":{pattern:/(\b(?:enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),i.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete i.languages.c.boolean,i.languages.cpp=i.languages.extend("c",{"class-name":{pattern:/(\b(?:class|enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),i.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+t.source+"|[^\n\r()]*)\\)","i"),inside:{function:/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+t.source+")*?(?=\\s*\\{)"),string:{pattern:t,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:n.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},n.tag))}(i),i.languages.css.selector={pattern:i.languages.css.selector,inside:{"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-:.\w]+/,id:/#[-:.\w]+/,attribute:{pattern:/\[(?:[^[\]"']|("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1)*\]/,greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)[-*\w\xA0-\uFFFF]*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},attribute:{pattern:/^(\s*)[-\w\xA0-\uFFFF]+/,lookbehind:!0},value:[/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,{pattern:/(=\s*)[-\w\xA0-\uFFFF]+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],punctuation:/[()]/}},i.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*/i,lookbehind:!0}}),i.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:/#[\da-f]{3,8}/i,entity:/\\[\da-f]{1,8}/i,unit:{pattern:/(\d)(?:%|[a-z]+)/,lookbehind:!0},number:/-?[\d.]+/}),i.languages.javascript=i.languages.extend("clike",{"class-name":[i.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.])\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,function:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),i.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,i.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:i.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:i.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:i.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:i.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),i.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:i.languages.javascript}},string:/[\s\S]+/}}}),i.languages.markup&&i.languages.markup.tag.addInlined("script","javascript"),i.languages.js=i.languages.javascript,function(e){var t=e.util.clone(e.languages.javascript);e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=/<\/?(?:[\w.:-]+\s*(?:\s+(?:[\w.:-]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s{'">=]+|\{(?:\{(?:\{[^}]*\}|[^{}])*\}|[^{}])+\}))?|\{\.{3}[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\}))*\s*\/?)?>/i,e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/i,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">]+)/i,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.insertBefore("inside","attr-name",{spread:{pattern:/\{\.{3}[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\}/,inside:{punctuation:/\.{3}|[{}.]/,"attr-value":/\w+/}}},e.languages.jsx.tag),e.languages.insertBefore("inside","attr-value",{script:{pattern:/=(\{(?:\{(?:\{[^}]*\}|[^}])*\}|[^}])+\})/i,inside:{"script-punctuation":{pattern:/^=(?={)/,alias:"punctuation"},rest:e.languages.jsx},alias:"language-javascript"}},e.languages.jsx.tag);var n=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(n).join(""):""},r=function(t){for(var o=[],a=0;a0&&o[o.length-1].tagName===n(i.content[0].content[1])&&o.pop():"/>"===i.content[i.content.length-1].content||o.push({tagName:n(i.content[0].content[1]),openedBraces:0}):o.length>0&&"punctuation"===i.type&&"{"===i.content?o[o.length-1].openedBraces++:o.length>0&&o[o.length-1].openedBraces>0&&"punctuation"===i.type&&"}"===i.content?o[o.length-1].openedBraces--:l=!0),(l||"string"==typeof i)&&o.length>0&&0===o[o.length-1].openedBraces){var s=n(i);a0&&("string"==typeof t[a-1]||"plain-text"===t[a-1].type)&&(s=n(t[a-1])+s,t.splice(a-1,1),a--),t[a]=new e.Token("plain-text",s,null,s)}i.content&&"string"!=typeof i.content&&r(i.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||r(e.tokens)}))}(i),function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*@(?:param|arg|arguments)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^\s*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){"string"==typeof t&&(t=[t]),t.forEach((function(t){!function(t,n){var r="doc-comment",o=e.languages[t];if(o){var a=o[r];if(!a){var i={"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,alias:"comment"}};a=(o=e.languages.insertBefore(t,"comment",i))[r]}if(a instanceof RegExp&&(a=o[r]={pattern:a}),Array.isArray(a))for(var l=0,s=a.length;l>>?=?|->|([-+&|])\2|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),e.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":n,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})}(i),function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,l=i.length;-1!==n.code.indexOf(o=t(r,l));)++l;return i[l]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=a.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],f="string"==typeof c?c:c.content,p=t(r,u),m=f.indexOf(p);if(m>-1){++o;var h=f.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),y=[];h&&y.push.apply(y,i([h])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof c?l.splice.apply(l,[s,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(i),function(e){e.languages.php=e.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,boolean:{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),e.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),e.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),e.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,package:{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),e.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var t={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:{rest:e.languages.php}};e.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:t}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:t}}}),delete e.languages.php.string,e.hooks.add("before-tokenize",(function(t){if(/<\?/.test(t.code)){e.languages["markup-templating"].buildPlaceholders(t,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"php")}))}(i),function(e){var t=e.languages.javascript,n=/{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})+}/.source,r="(@(?:param|arg|argument|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/[$\w\xA0-\uFFFF.]+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[[$\w\xA0-\uFFFF.]+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{punctuation:/[.,:?=<>|{}()[\]]/}},{pattern:/(@(?:augments|extends|class|interface|memberof!?|this)\s+)[A-Z]\w*(?:\.[A-Z]\w*)*/,lookbehind:!0,inside:{punctuation:/\./}}],example:{pattern:/(@example\s+)[^@]+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^(\s*(?:\*\s*)?).+$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(i),i.languages.actionscript=i.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|else|extends|finally|for|function|if|implements|import|in|instanceof|interface|internal|is|native|new|null|package|private|protected|public|return|super|switch|this|throw|try|typeof|use|var|void|while|with|dynamic|each|final|get|include|namespace|native|override|set|static)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<>?>?|[!=]=?)=?|[~?@]/}),i.languages.actionscript["class-name"].alias="function",i.languages.markup&&i.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:{rest:i.languages.markup}}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},rest:e.languages.javascript}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(i),function(e){e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:(?:Uint|Int)(?:8|16|32)|Uint8Clamped|Float(?:32|64))?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|(?:Weak)?(?:Set|Map)|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:/(\.\s*)#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*/,lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|location|navigator|performance|(?:local|session)Storage|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],n=0;n))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:type|opaque|declare|Class)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:await|Diff|Exact|Keys|ObjMap|PropertyType|Shape|Record|Supertype|Subtype|Enum)\b(?!\$)/,lookbehind:!0})}(i),i.languages.n4js=i.languages.extend("javascript",{keyword:/\b(?:any|Array|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),i.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),i.languages.n4jsd=i.languages.n4js,i.languages.typescript=i.languages.extend("javascript",{keyword:/\b(?:abstract|as|async|await|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|is|keyof|let|module|namespace|new|null|of|package|private|protected|public|readonly|return|require|set|static|super|switch|this|throw|try|type|typeof|var|void|while|with|yield)\b/,builtin:/\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/}),i.languages.ts=i.languages.typescript,function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var o={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",o),o.tokens=e.tokenize(o.code,o.grammar),e.hooks.run("after-tokenize",o),o.tokens}function c(t){var n={};n["interpolation-punctuation"]=o;var a=e.tokenize(t,n);if(3===a.length){var i=[1,1];i.push.apply(i,s(a[1],e.languages.javascript,"javascript")),a.splice.apply(a,i)}return new e.Token("interpolation",a,r.alias,t)}function u(t,n,r){var o=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),i=0,u={},d=s(o.map((function(e){if("string"==typeof e)return e;for(var n,o=e.content;-1!==t.indexOf(n=l(i++,r)););return u[n]=o,n})).join(""),n,r),f=Object.keys(u);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var o=f[i],a="string"==typeof r?r:r.content,l=a.indexOf(o);if(-1!==l){++i;var s=a.substring(0,l),d=c(u[o]),p=a.substring(l+o.length),m=[];if(s&&m.push(s),m.push(d),p){var h=[p];e(h),m.push.apply(m,h)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var g=r.content;Array.isArray(g)?e(g):e([g])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:md|markdown)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,o=n.length;r/g,t),n&&(e=e+"|"+e.replace(/_/g,"\\*")),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``.+?``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\r?\n|\r)|$)/.source.replace(/__/g,r),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\r?\n|\r)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/(^[ \t]*(?:\r?\n|\r))(?: {4}|\t).+(?:(?:\r?\n|\r)(?: {4}|\t).+)*/m,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\r\n]+`/,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\r?\n|\r))[\s\S]+?(?=(?:\r?\n|\r)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\r?\n|\r)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#+.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/__(?:(?!_)|_(?:(?!_))+_)+__/.source,!0),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/_(?:(?!_)|__(?:(?!_))+__)+_/.source,!0),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+?\2/.source,!1),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)| ?\[(?:(?!\]))+\])/.source,!1),lookbehind:!0,greedy:!0,inside:{variable:{pattern:/(\[)[^\]]+(?=\]$)/,lookbehind:!0},content:{pattern:/(^!?\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},string:{pattern:/"(?:\\.|[^"\\])*"(?=\)$)/}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],o=[];/^\w+$/.test(n)||o.push(/\w+/.exec(n)[0]),"diff"===n&&o.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:o}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(i),i.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/m}},coord:/^@@.*@@$/m,commit_sha1:/^commit \w{40}$/m},i.languages.go=i.languages.extend("clike",{keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,number:/(?:\b0x[a-f\d]+|(?:\b\d+\.?\d*|\B\.\d+)(?:e[-+]?\d+)?)i?/i,string:{pattern:/(["'`])(\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0}}),delete i.languages.go["class-name"],function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/i,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:true|false)\b/,block:{pattern:/^(\s*~?\s*)[#\/]\S+?(?=\s*~?\s*$|\s)/i,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,.\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")}))}(i),i.languages.json={property:{pattern:/"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,greedy:!0},comment:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,number:/-?\d+\.?\d*(e[+-]?\d+)?/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},i.languages.less=i.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-]+?(?:\([^{}]+\)|[^(){};])*?(?=\s*\{)/i,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\([^{}]*\)|[^{};@])*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/i,operator:/[+\-*\/]/}),i.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-]+.*?(?=[(;])/,lookbehind:!0,alias:"function"}}),i.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},builtin:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,symbol:{pattern:/^[^:=\r\n]+(?=\s*:(?!=))/m,inside:{variable:/\$+(?:[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:[/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,{pattern:/(\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},i.languages.objectivec=i.languages.extend("c",{keyword:/\b(?:asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while|in|self|super)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,string:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|@"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete i.languages.objectivec["class-name"],i.languages.ocaml={comment:/\(\*[\s\S]*?\*\)/,string:[{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},{pattern:/(['`])(?:\\(?:\d+|x[\da-f]+|.)|(?!\1)[^\\\r\n])\1/i,greedy:!0}],number:/\b(?:0x[\da-f][\da-f_]+|(?:0[bo])?\d[\d_]*\.?[\d_]*(?:e[+-]?[\d_]+)?)/i,type:{pattern:/\B['`]\w*/,alias:"variable"},directive:{pattern:/\B#\w+/,alias:"function"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|object|of|open|prefix|private|rec|then|sig|struct|to|try|type|val|value|virtual|where|while|with)\b/,boolean:/\b(?:false|true)\b/,operator:/:=|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lxor|lsl|lsr|mod|nor|or)\b/,punctuation:/[(){}\[\]|_.,:;]/},i.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/i,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},i.languages.python["string-interpolation"].inside.interpolation.inside.rest=i.languages.python,i.languages.py=i.languages.python,i.languages.reason=i.languages.extend("clike",{comment:{pattern:/(^|[^\\])\/\*[\s\S]*?\*\//,lookbehind:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:mod|land|lor|lxor|lsl|lsr|asr)\b/}),i.languages.insertBefore("reason","class-name",{character:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,alias:"string"},constructor:{pattern:/\b[A-Z]\w*\b(?!\s*\.)/,alias:"variable"},label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete i.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t]+.+)*/m,lookbehind:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,inside:{atrule:/(?:@[\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/,{pattern:/(\s+)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s]+.*)/m,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/([ \t]*)\S(?:,?[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,?[^,\r\n]+)*)*/,lookbehind:!0}})}(i),i.languages.scss=i.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-]+(?:\([^()]+\)|[^(])*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()]|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}]+[:{][^}]+))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[\w-]|\$[-\w]+|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),i.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|for|each|while|import|extend|debug|warn|mixin|include|function|return|content)/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),i.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),i.languages.insertBefore("scss","function",{placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),i.languages.scss.atrule.inside.rest=i.languages.scss,i.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURNS?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+\.?\d*|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|IN|LIKE|NOT|OR|IS|DIV|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t={url:/url\((["']?).*?\1\)/i,string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:if|else|for|return|unless)(?=\s+|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,number:/\b\d+(?:\.\d+)?%?/,boolean:/\b(?:true|false)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.+|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],punctuation:/[{}()\[\];:,]/};t.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^{|}$/,alias:"punctuation"},rest:t}},t.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:t}},e.languages.stylus={comment:{pattern:/(^|[^\\])(\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},"atrule-declaration":{pattern:/(^\s*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:t}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:(?:\{[^}]*\}|.+)|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:t}},statement:{pattern:/(^[ \t]*)(?:if|else|for|return|unless)[ \t]+.+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:t}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)[^{\r\n]*(?:;|[^{\r\n,](?=$)(?!(\r?\n|\r)(?:\{|\2[ \t]+)))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:t.interpolation}},rest:t}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\))?|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\))?|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t]+)))/m,lookbehind:!0,inside:{interpolation:t.interpolation,punctuation:/[{},]/}},func:t.func,string:t.string,interpolation:t.interpolation,punctuation:/[{}()\[\];:.]/}}(i);var l=i.util.clone(i.languages.typescript);i.languages.tsx=i.languages.extend("jsx",l),i.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^_`|~]+/i,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/},i.languages.yaml={scalar:{pattern:/([\-:]\s*(?:![^\s]+)?[ \t]*[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)[^\r\n]+(?:\2[^\r\n]+)*)/,lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:/(\s*(?:^|[:\-,[{\r\n?])[ \t]*(?:![^\s]+)?[ \t]*)[^\r\n{[\]},#\s]+?(?=\s*:\s)/,lookbehind:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?)?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?)(?=[ \t]*(?:$|,|]|}))/m,lookbehind:!0,alias:"number"},boolean:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:true|false)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},null:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)(?:null|~)[ \t]*(?=$|,|]|})/im,lookbehind:!0,alias:"important"},string:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)("|')(?:(?!\2)[^\\\r\n]|\\.)*\2(?=[ \t]*(?:$|,|]|}|\s*#))/m,lookbehind:!0,greedy:!0},number:{pattern:/([:\-,[{]\s*(?:![^\s]+)?[ \t]*)[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+\.?\d*|\.?\d+)(?:e[+-]?\d+)?|\.inf|\.nan)[ \t]*(?=$|,|]|})/im,lookbehind:!0},tag:/![^\s]+/,important:/[&*][\w]+/,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},i.languages.yml=i.languages.yaml,t.a=i},function(e,t,n){"use strict";var r=n(0),o=n.n(r),a=n(35);t.a=function(e){return o.a.createElement(a.a,Object.assign({},e))}},function(e,t,n){"use strict";function r(e){return!0===/^(\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return o}))},function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(41)},function(e,t,n){"use strict";var r=n(8);t.a=r.b},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";e.exports=n(47)},function(e){e.exports=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"introduce","docs":[{"id":"appstartup","path":"/docs/appstartup","sidebar":"docs"},{"id":"auth-control","path":"/docs/auth-control","sidebar":"docs"},{"id":"author","path":"/docs/author","sidebar":"docs"},{"id":"benchmark","path":"/docs/benchmark","sidebar":"docs"},{"id":"cache","path":"/docs/cache","sidebar":"docs"},{"id":"configuration","path":"/docs/configuration","sidebar":"docs"},{"id":"contribute","path":"/docs/contribute","sidebar":"docs"},{"id":"cooperate","path":"/docs/cooperate","sidebar":"docs"},{"id":"cors","path":"/docs/cors","sidebar":"docs"},{"id":"dapper","path":"/docs/dapper","sidebar":"docs"},{"id":"data-validation","path":"/docs/data-validation","sidebar":"docs"},{"id":"dbcontext","path":"/docs/dbcontext","sidebar":"docs"},{"id":"dbcontext-add","path":"/docs/dbcontext-add","sidebar":"docs"},{"id":"dbcontext-add-or-update","path":"/docs/dbcontext-add-or-update","sidebar":"docs"},{"id":"dbcontext-audit","path":"/docs/dbcontext-audit","sidebar":"docs"},{"id":"dbcontext-batch","path":"/docs/dbcontext-batch","sidebar":"docs"},{"id":"dbcontext-code-first","path":"/docs/dbcontext-code-first","sidebar":"docs"},{"id":"dbcontext-db-first","path":"/docs/dbcontext-db-first","sidebar":"docs"},{"id":"dbcontext-delete","path":"/docs/dbcontext-delete","sidebar":"docs"},{"id":"dbcontext-entitytrigger","path":"/docs/dbcontext-entitytrigger","sidebar":"docs"},{"id":"dbcontext-filter","path":"/docs/dbcontext-filter","sidebar":"docs"},{"id":"dbcontext-function","path":"/docs/dbcontext-function","sidebar":"docs"},{"id":"dbcontext-hight-query","path":"/docs/dbcontext-hight-query","sidebar":"docs"},{"id":"dbcontext-Interceptor","path":"/docs/dbcontext-Interceptor","sidebar":"docs"},{"id":"dbcontext-locator","path":"/docs/dbcontext-locator","sidebar":"docs"},{"id":"dbcontext-multi-database","path":"/docs/dbcontext-multi-database","sidebar":"docs"},{"id":"dbcontext-proc","path":"/docs/dbcontext-proc","sidebar":"docs"},{"id":"dbcontext-query","path":"/docs/dbcontext-query","sidebar":"docs"},{"id":"dbcontext-read-write","path":"/docs/dbcontext-read-write","sidebar":"docs"},{"id":"dbcontext-repository","path":"/docs/dbcontext-repository","sidebar":"docs"},{"id":"dbcontext-seed-data","path":"/docs/dbcontext-seed-data","sidebar":"docs"},{"id":"dbcontext-sql","path":"/docs/dbcontext-sql","sidebar":"docs"},{"id":"dbcontext-sql-proxy","path":"/docs/dbcontext-sql-proxy","sidebar":"docs"},{"id":"dbcontext-sql-template","path":"/docs/dbcontext-sql-template","sidebar":"docs"},{"id":"dbcontext-start","path":"/docs/dbcontext-start","sidebar":"docs"},{"id":"dbcontext-update","path":"/docs/dbcontext-update","sidebar":"docs"},{"id":"dbcontext-view","path":"/docs/dbcontext-view","sidebar":"docs"},{"id":"dependency-injection","path":"/docs/dependency-injection","sidebar":"docs"},{"id":"deploy-docker","path":"/docs/deploy-docker","sidebar":"docs"},{"id":"deploy-iis","path":"/docs/deploy-iis","sidebar":"docs"},{"id":"deploy-nginx","path":"/docs/deploy-nginx","sidebar":"docs"},{"id":"devops","path":"/docs/devops","sidebar":"docs"},{"id":"donate","path":"/docs/donate","sidebar":"docs"},{"id":"dynamic-api-controller","path":"/docs/dynamic-api-controller","sidebar":"docs"},{"id":"encryption","path":"/docs/encryption","sidebar":"docs"},{"id":"entity","path":"/docs/entity","sidebar":"docs"},{"id":"event-bus","path":"/docs/event-bus","sidebar":"docs"},{"id":"friendly-exception","path":"/docs/friendly-exception","sidebar":"docs"},{"id":"get-start","path":"/docs/get-start","sidebar":"docs"},{"id":"global/app","path":"/docs/global/app","sidebar":"global"},{"id":"global/datavalidator","path":"/docs/global/datavalidator","sidebar":"global"},{"id":"global/db","path":"/docs/global/db","sidebar":"global"},{"id":"global/jsonserializer","path":"/docs/global/jsonserializer","sidebar":"global"},{"id":"global/l","path":"/docs/global/l","sidebar":"global"},{"id":"global/linqexpression","path":"/docs/global/linqexpression","sidebar":"global"},{"id":"global/messagecenter","path":"/docs/global/messagecenter","sidebar":"global"},{"id":"global/oops","path":"/docs/global/oops","sidebar":"global"},{"id":"global/shttp","path":"/docs/global/shttp","sidebar":"global"},{"id":"grpc","path":"/docs/grpc","sidebar":"docs"},{"id":"http","path":"/docs/http","sidebar":"docs"},{"id":"introduce","path":"/docs/","sidebar":"docs"},{"id":"job","path":"/docs/job","sidebar":"docs"},{"id":"local-language","path":"/docs/local-language","sidebar":"docs"},{"id":"logging","path":"/docs/logging","sidebar":"docs"},{"id":"object-mapper","path":"/docs/object-mapper","sidebar":"docs"},{"id":"options","path":"/docs/options","sidebar":"docs"},{"id":"performance","path":"/docs/performance","sidebar":"docs"},{"id":"process-service","path":"/docs/process-service","sidebar":"docs"},{"id":"reference","path":"/docs/reference","sidebar":"docs"},{"id":"saas","path":"/docs/saas","sidebar":"docs"},{"id":"settings/appsettings","path":"/docs/settings/appsettings","sidebar":"settings"},{"id":"settings/corsaccessorsettings","path":"/docs/settings/corsaccessorsettings","sidebar":"settings"},{"id":"settings/dependencyinjectionsettings","path":"/docs/settings/dependencyinjectionsettings","sidebar":"settings"},{"id":"settings/dynamicapicontrollersettings","path":"/docs/settings/dynamicapicontrollersettings","sidebar":"settings"},{"id":"settings/friendlyexceptionsettings","path":"/docs/settings/friendlyexceptionsettings","sidebar":"settings"},{"id":"settings/localizationsettings","path":"/docs/settings/localizationsettings","sidebar":"settings"},{"id":"settings/specificationdocumentsettings","path":"/docs/settings/specificationdocumentsettings","sidebar":"settings"},{"id":"settings/validationTypemessagesettings","path":"/docs/settings/validationTypemessagesettings","sidebar":"settings"},{"id":"signalr","path":"/docs/signalr","sidebar":"docs"},{"id":"source","path":"/docs/source","sidebar":"docs"},{"id":"specification-document","path":"/docs/specification-document","sidebar":"docs"},{"id":"split-db","path":"/docs/split-db","sidebar":"docs"},{"id":"sqlsugar","path":"/docs/sqlsugar","sidebar":"docs"},{"id":"template","path":"/docs/template","sidebar":"docs"},{"id":"tran","path":"/docs/tran","sidebar":"docs"},{"id":"unittest","path":"/docs/unittest","sidebar":"docs"},{"id":"upgrade","path":"/docs/upgrade","sidebar":"docs"},{"id":"view-engine","path":"/docs/view-engine","sidebar":"docs"},{"id":"virtual-deploy","path":"/docs/virtual-deploy","sidebar":"docs"}]}]}}}')},function(e){e.exports=JSON.parse('{"defaultLocale":"en","locales":["en"],"localeConfigs":{"en":{"label":"en"}},"currentLocale":"en"}')},function(e){e.exports=JSON.parse("{}")},function(e){e.exports=JSON.parse('{"docusaurusVersion":"2.0.0-alpha.70","siteVersion":"1.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.0.0-alpha.70"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.0.0-alpha.70"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.0.0-alpha.70"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.0.0-alpha.70"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.0.0-alpha.70"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"2.0.0-alpha.70"}}}')},function(e,t,n){"use strict";var r=n(29),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||o}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=p(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),h=s(n),g=0;g=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n},G=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},V=function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return!1===t?String(e):String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},K=function(e){var t=J(e,E.TITLE),n=J(e,j);if(n&&t)return n.replace(/%s/g,(function(){return Array.isArray(t)?t.join(""):t}));var r=J(e,P);return t||r||void 0},Y=function(e){return J(e,D)||function(){}},Q=function(e,t){return t.filter((function(t){return void 0!==t[e]})).map((function(t){return t[e]})).reduce((function(e,t){return W({},e,t)}),{})},X=function(e,t){return t.filter((function(e){return void 0!==e[E.BASE]})).map((function(e){return e[E.BASE]})).reverse().reduce((function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o=0;n--){var r=e[n];if(r.hasOwnProperty(t))return r[t]}return null},ee=(r=Date.now(),function(e){var t=Date.now();t-r>16?(r=t,e(t)):setTimeout((function(){ee(e)}),0)}),te=function(e){return clearTimeout(e)},ne="undefined"!=typeof window?window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||ee:e.requestAnimationFrame||ee,re="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||te:e.cancelAnimationFrame||te,oe=function(e){return console&&"function"==typeof console.warn&&console.warn(e)},ae=null,ie=function(e,t){var n=e.baseTag,r=e.bodyAttributes,o=e.htmlAttributes,a=e.linkTags,i=e.metaTags,l=e.noscriptTags,s=e.onChangeClientState,c=e.scriptTags,u=e.styleTags,d=e.title,f=e.titleAttributes;ce(E.BODY,r),ce(E.HTML,o),se(d,f);var p={baseTag:ue(E.BASE,n),linkTags:ue(E.LINK,a),metaTags:ue(E.META,i),noscriptTags:ue(E.NOSCRIPT,l),scriptTags:ue(E.SCRIPT,c),styleTags:ue(E.STYLE,u)},m={},h={};Object.keys(p).forEach((function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(m[e]=n),r.length&&(h[e]=p[e].oldTags)})),t&&t(),s(e,m,h)},le=function(e){return Array.isArray(e)?e.join(""):e},se=function(e,t){void 0!==e&&document.title!==e&&(document.title=le(e)),ce(E.TITLE,t)},ce=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute(B),o=r?r.split(","):[],a=[].concat(o),i=Object.keys(t),l=0;l=0;d--)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute(B):n.getAttribute(B)!==i.join(",")&&n.setAttribute(B,i.join(","))}},ue=function(e,t){var n=document.head||document.querySelector(E.HEAD),r=n.querySelectorAll(e+"["+"data-react-helmet]"),o=Array.prototype.slice.call(r),a=[],i=void 0;return t&&t.length&&t.forEach((function(t){var n=document.createElement(e);for(var r in t)if(t.hasOwnProperty(r))if(r===S)n.innerHTML=t.innerHTML;else if(r===x)n.styleSheet?n.styleSheet.cssText=t.cssText:n.appendChild(document.createTextNode(t.cssText));else{var l=void 0===t[r]?"":t[r];n.setAttribute(r,l)}n.setAttribute(B,"true"),o.some((function(e,t){return i=t,n.isEqualNode(e)}))?o.splice(i,1):a.push(n)})),o.forEach((function(e){return e.parentNode.removeChild(e)})),a.forEach((function(e){return n.appendChild(e)})),{oldTags:o,newTags:a}},de=function(e){return Object.keys(e).reduce((function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r}),"")},fe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce((function(t,n){return t[I[n]||n]=e[n],t}),t)},pe=function(e,t,n){switch(e){case E.TITLE:return{toComponent:function(){return e=t.title,n=t.titleAttributes,(r={key:e})[B]=!0,o=fe(n,r),[m.a.createElement(E.TITLE,o,e)];var e,n,r,o},toString:function(){return function(e,t,n,r){var o=de(n),a=le(t);return o?"<"+e+' data-react-helmet="true" '+o+">"+V(a,r)+"":"<"+e+' data-react-helmet="true">'+V(a,r)+""}(e,t.title,t.titleAttributes,n)}};case b:case y:return{toComponent:function(){return fe(t)},toString:function(){return de(t)}};default:return{toComponent:function(){return function(e,t){return t.map((function(t,n){var r,o=((r={key:n})[B]=!0,r);return Object.keys(t).forEach((function(e){var n=I[e]||e;if(n===S||n===x){var r=t.innerHTML||t.cssText;o.dangerouslySetInnerHTML={__html:r}}else o[n]=t[e]})),m.a.createElement(e,o)}))}(e,t)},toString:function(){return function(e,t,n){return t.reduce((function(t,r){var o=Object.keys(r).filter((function(e){return!(e===S||e===x)})).reduce((function(e,t){var o=void 0===r[t]?t:t+'="'+V(r[t],n)+'"';return e?e+" "+o:o}),""),a=r.innerHTML||r.cssText||"",i=-1===U.indexOf(e);return t+"<"+e+' data-react-helmet="true" '+o+(i?"/>":">"+a+"")}),"")}(e,t,n)}}}},me=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.linkTags,i=e.metaTags,l=e.noscriptTags,s=e.scriptTags,c=e.styleTags,u=e.title,d=void 0===u?"":u,f=e.titleAttributes;return{base:pe(E.BASE,t,r),bodyAttributes:pe(b,n,r),htmlAttributes:pe(y,o,r),link:pe(E.LINK,a,r),meta:pe(E.META,i,r),noscript:pe(E.NOSCRIPT,l,r),script:pe(E.SCRIPT,s,r),style:pe(E.STYLE,c,r),title:pe(E.TITLE,{title:d,titleAttributes:f},r)}},he=u()((function(e){return{baseTag:X([T,R],e),bodyAttributes:Q(b,e),defer:J(e,L),encode:J(e,F),htmlAttributes:Q(y,e),linkTags:Z(E.LINK,[N,T],e),metaTags:Z(E.META,[C,w,k,A,O],e),noscriptTags:Z(E.NOSCRIPT,[S],e),onChangeClientState:Y(e),scriptTags:Z(E.SCRIPT,[_,S],e),styleTags:Z(E.STYLE,[x],e),title:K(e),titleAttributes:Q(v,e)}}),(function(e){ae&&re(ae),e.defer?ae=ne((function(){ie(e,(function(){ae=null}))})):(ie(e),ae=null)}),me)((function(){return null})),ge=(o=he,i=a=function(e){function t(){return $(this,t),G(this,e.apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),t.prototype.shouldComponentUpdate=function(e){return!f()(this.props,e)},t.prototype.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case E.SCRIPT:case E.NOSCRIPT:return{innerHTML:t};case E.STYLE:return{cssText:t}}throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},t.prototype.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren,o=e.newChildProps,a=e.nestedChildren;return W({},r,((t={})[n.type]=[].concat(r[n.type]||[],[W({},o,this.mapNestedChildrenToProps(n,a))]),t))},t.prototype.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,i=e.nestedChildren;switch(r.type){case E.TITLE:return W({},o,((t={})[r.type]=i,t.titleAttributes=W({},a),t));case E.BODY:return W({},o,{bodyAttributes:W({},a)});case E.HTML:return W({},o,{htmlAttributes:W({},a)})}return W({},o,((n={})[r.type]=W({},a),n))},t.prototype.mapArrayTypeChildrenToProps=function(e,t){var n=W({},t);return Object.keys(e).forEach((function(t){var r;n=W({},n,((r={})[t]=e[t],r))})),n},t.prototype.warnOnInvalidChildren=function(e,t){return!0},t.prototype.mapChildrenToProps=function(e,t){var n=this,r={};return m.a.Children.forEach(e,(function(e){if(e&&e.props){var o=e.props,a=o.children,i=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce((function(t,n){return t[M[n]||n]=e[n],t}),t)}(q(o,["children"]));switch(n.warnOnInvalidChildren(e,a),e.type){case E.LINK:case E.META:case E.NOSCRIPT:case E.SCRIPT:case E.STYLE:r=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:r,newChildProps:i,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:i,nestedChildren:a})}}})),t=this.mapArrayTypeChildrenToProps(r,t)},t.prototype.render=function(){var e=this.props,t=e.children,n=q(e,["children"]),r=W({},n);return t&&(r=this.mapChildrenToProps(t,r)),m.a.createElement(o,r)},H(t,null,[{key:"canUseDOM",set:function(e){o.canUseDOM=e}}]),t}(m.a.Component),a.propTypes={base:s.a.object,bodyAttributes:s.a.object,children:s.a.oneOfType([s.a.arrayOf(s.a.node),s.a.node]),defaultTitle:s.a.string,defer:s.a.bool,encodeSpecialCharacters:s.a.bool,htmlAttributes:s.a.object,link:s.a.arrayOf(s.a.object),meta:s.a.arrayOf(s.a.object),noscript:s.a.arrayOf(s.a.object),onChangeClientState:s.a.func,script:s.a.arrayOf(s.a.object),style:s.a.arrayOf(s.a.object),title:s.a.string,titleAttributes:s.a.object,titleTemplate:s.a.string},a.defaultProps={defer:!0,encodeSpecialCharacters:!0},a.peek=o.peek,a.rewind=function(){var e=o.rewind();return e||(e=me({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),e},i);ge.renderStatic=ge.rewind}).call(this,n(28))},function(e,t,n){"use strict";var r,o=n(0),a=(r=o)&&"object"==typeof r&&"default"in r?r.default:r;function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var l=!("undefined"==typeof window||!window.document||!window.document.createElement);e.exports=function(e,t,n){if("function"!=typeof e)throw new Error("Expected reducePropsToState to be a function.");if("function"!=typeof t)throw new Error("Expected handleStateChangeOnClient to be a function.");if(void 0!==n&&"function"!=typeof n)throw new Error("Expected mapStateOnServer to either be undefined or a function.");return function(r){if("function"!=typeof r)throw new Error("Expected WrappedComponent to be a React component.");var s,c=[];function u(){s=e(c.map((function(e){return e.props}))),d.canUseDOM?t(s):n&&(s=n(s))}var d=function(e){var t,n;function o(){return e.apply(this,arguments)||this}n=e,(t=o).prototype=Object.create(n.prototype),t.prototype.constructor=t,t.__proto__=n,o.peek=function(){return s},o.rewind=function(){if(o.canUseDOM)throw new Error("You may only call rewind() on the server. Call peek() to read the current state.");var e=s;return s=void 0,c=[],e};var i=o.prototype;return i.UNSAFE_componentWillMount=function(){c.push(this),u()},i.componentDidUpdate=function(){u()},i.componentWillUnmount=function(){var e=c.indexOf(this);c.splice(e,1),u()},i.render=function(){return a.createElement(r,this.props)},o}(o.PureComponent);return i(d,"displayName","SideEffect("+function(e){return e.displayName||e.name||"Component"}(r)+")"),i(d,"canUseDOM",l),d}}},function(e,t){var n="undefined"!=typeof Element,r="function"==typeof Map,o="function"==typeof Set,a="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function i(e,t){if(e===t)return!0;if(e&&t&&"object"==typeof e&&"object"==typeof t){if(e.constructor!==t.constructor)return!1;var l,s,c,u;if(Array.isArray(e)){if((l=e.length)!=t.length)return!1;for(s=l;0!=s--;)if(!i(e[s],t[s]))return!1;return!0}if(r&&e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!t.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!i(s.value[1],t.get(s.value[0])))return!1;return!0}if(o&&e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!t.has(s.value[0]))return!1;return!0}if(a&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if((l=e.length)!=t.length)return!1;for(s=l;0!=s--;)if(e[s]!==t[s])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===t.toString();if((l=(c=Object.keys(e)).length)!==Object.keys(t).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(t,c[s]))return!1;if(n&&e instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==c[s]&&"__v"!==c[s]&&"__o"!==c[s]||!e.$$typeof)&&!i(e[c[s]],t[c[s]]))return!1;return!0}return e!=e&&t!=t}e.exports=function(e,t){try{return i(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},,function(e,t,n){e.exports=n(57)},function(e,t,n){"use strict";var r=n(13),o="function"==typeof Symbol&&Symbol.for,a=o?Symbol.for("react.element"):60103,i=o?Symbol.for("react.portal"):60106,l=o?Symbol.for("react.fragment"):60107,s=o?Symbol.for("react.strict_mode"):60108,c=o?Symbol.for("react.profiler"):60114,u=o?Symbol.for("react.provider"):60109,d=o?Symbol.for("react.context"):60110,f=o?Symbol.for("react.forward_ref"):60112,p=o?Symbol.for("react.suspense"):60113,m=o?Symbol.for("react.memo"):60115,h=o?Symbol.for("react.lazy"):60116,g="function"==typeof Symbol&&Symbol.iterator;function b(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n_.length&&_.push(e)}function P(e,t,n,r){var o=typeof e;"undefined"!==o&&"boolean"!==o||(e=null);var l=!1;if(null===e)l=!0;else switch(o){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case a:case i:l=!0}}if(l)return n(r,e,""===t?"."+F(e,0):t),1;if(l=0,t=""===t?".":t+":",Array.isArray(e))for(var s=0;s