diff --git a/.gitignore b/.gitignore index 9d3c3957aa..742c5b4584 100644 --- a/.gitignore +++ b/.gitignore @@ -267,7 +267,7 @@ framework/test/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.Demo/Logs/*.* modules/blog/app/Volo.BlogTestApp/Logs/*.* modules/blogging/app/Volo.BloggingTestApp/Logs/*.* modules/blogging/app/Volo.BloggingTestApp/wwwroot/files/*.* -modules/docs/app/Volo.DocsTestApp/Logs/*.* +modules/docs/app/VoloDocs.Web/Logs/*.* samples/BookStore/src/Acme.BookStore.Web/Logs/*.* templates/module/app/MyCompanyName.MyProjectName.DemoApp/Logs/*.* templates/mvc/src/MyCompanyName.MyProjectName.Web/Logs/*.* @@ -294,3 +294,4 @@ samples/MicroserviceDemo/gateways/BackendAdminAppGateway.Host/Logs/logs.txt samples/MicroserviceDemo/applications/PublicWebSite.Host/Logs/logs.txt samples/MicroserviceDemo/gateways/PublicWebSiteGateway.Host/Logs/logs.txt samples/MicroserviceDemo/microservices/BloggingService.Host/Logs/logs.txt +modules/docs/app/Volo.DocsTestApp/Logs/logs.txt diff --git a/abp_io/Volo.AbpWebSite.sln b/abp_io/Volo.AbpWebSite.sln index 0621f570a1..cc597fb6ae 100644 --- a/abp_io/Volo.AbpWebSite.sln +++ b/abp_io/Volo.AbpWebSite.sln @@ -11,7 +11,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.AbpWebSite.Application EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.AbpWebSite.EntityFrameworkCore", "src\Volo.AbpWebSite.EntityFrameworkCore\Volo.AbpWebSite.EntityFrameworkCore.csproj", "{028C05DB-61BF-41EF-B9AD-614A43CD0A7F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Utils.SolutionTemplating", "src\Volo.Utils.SolutionTemplating\Volo.Utils.SolutionTemplating.csproj", "{742FCDDD-537C-42CC-AF16-A92C094D4B1D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Utils.SolutionTemplating", "src\Volo.Utils.SolutionTemplating\Volo.Utils.SolutionTemplating.csproj", "{742FCDDD-537C-42CC-AF16-A92C094D4B1D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/abp_io/src/Volo.AbpWebSite.Web/Pages/Index.cshtml b/abp_io/src/Volo.AbpWebSite.Web/Pages/Index.cshtml index 010209c690..8b04426273 100644 --- a/abp_io/src/Volo.AbpWebSite.Web/Pages/Index.cshtml +++ b/abp_io/src/Volo.AbpWebSite.Web/Pages/Index.cshtml @@ -1,5 +1,4 @@ @page -@using Volo.AbpWebSite @model Volo.AbpWebSite.Pages.IndexModel @{ Layout = "~/Pages/Shared/HomePageLayout.cshtml"; diff --git a/abp_io/src/Volo.AbpWebSite.Web/Volo.AbpWebSite.Web.csproj b/abp_io/src/Volo.AbpWebSite.Web/Volo.AbpWebSite.Web.csproj index b434646d99..9496a6db71 100644 --- a/abp_io/src/Volo.AbpWebSite.Web/Volo.AbpWebSite.Web.csproj +++ b/abp_io/src/Volo.AbpWebSite.Web/Volo.AbpWebSite.Web.csproj @@ -54,6 +54,7 @@ + diff --git a/abp_io/src/Volo.AbpWebSite.Web/compilerconfig.json b/abp_io/src/Volo.AbpWebSite.Web/compilerconfig.json index 1e74c37e28..87e801ce53 100644 --- a/abp_io/src/Volo.AbpWebSite.Web/compilerconfig.json +++ b/abp_io/src/Volo.AbpWebSite.Web/compilerconfig.json @@ -2,5 +2,9 @@ { "outputFile": "wwwroot/scss/vs.css", "inputFile": "wwwroot/scss/vs.scss" + }, + { + "outputFile": "Pages/Applications.css", + "inputFile": "Pages/Applications.scss" } ] \ No newline at end of file diff --git a/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.css b/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.css index ad4f5adca0..2ab1da238e 100644 --- a/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.css +++ b/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.css @@ -694,3 +694,6 @@ span.code-arrow { body { background-size: cover; } + +.applications-container .card-body p { + min-height: 7em; } diff --git a/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.min.css b/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.min.css index 524731f0ff..b9a963774e 100644 --- a/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.min.css +++ b/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.min.css @@ -1 +1 @@ -body{position:relative;font-family:'PT Sans',sans-serif;background:url(../assets/tools/bg.jpg) center center no-repeat;background-attachment:fixed;}h1,h2,h3,h4,h5,h6{font-family:'PT Sans Caption',sans-serif;}h1{font-size:2.25em;margin:1.5rem 0 .75rem;}h2{font-size:1.75em;margin:1.5rem 0 .75rem;}h3{font-size:1.5em;margin:1.5rem 0 .75rem;}h4{font-size:1.25em;margin:1.5rem 0 .75rem;}h5{font-size:1em;margin:1.5rem 0 .75rem;}h6{font-size:1em;margin:1.5rem 0 .75rem;}img{max-width:100%;}.navbar{padding:1.75rem 2rem;}.nav-link{padding-left:1rem !important;padding-right:1rem !important;}.navbar-dark .navbar-nav .nav-link{color:#fff;}.text-success{color:#e90052 !important;}a.text-success:hover,a.text-success:focus{color:#e90052 !important;}.bg-success,.btn-success,.badge-success{background-color:#e90052 !important;border-color:#e90052 !important;}.bg-success{background-color:rgba(233,0,82,.8) !important;}.bg-blue,.btn-blue,.badge-blue{background-color:#03abed !important;border-color:#03abed !important;color:#fff;}.bg-blue:hover,.btn-blue:hover,.badge-blue:hover{background-color:#0095d0 !important;border-color:#0095d0 !important;color:#fff !important;}.btn:focus,.btn:active,.btn:visited,a:focus,a:active,a:visited{outline:none !important;box-shadow:none;}.text-primary{color:#38003c !important;}.bg-primary,.btn-primary,.badge-primary{background-color:#38003c !important;border-color:#38003c !important;}.bg-primary{background-color:rgba(56,0,60,.9) !important;}.btn-outline-primary{color:#38003c !important;border-color:#38003c !important;}.btn-outline-primary:hover{background-color:#38003c !important;color:#fff !important;}.dropdown-menu{padding:1rem 0;border-radius:.15rem;border:none;box-shadow:5px 5px 40px rgba(0,0,0,.3);}.dropdown-menu .dropdown-item{padding:.75rem 1.5rem;}#index-video{position:fixed;right:0;bottom:0;min-width:100%;min-height:100%;z-index:-1;}.bg-gradient-horizontal{background:#fff;}@media(min-width:480px){.bg-gradient-horizontal{background:#fff;background:-moz-linear-gradient(left,#fff 50%,#f2f2f2 50%);background:-webkit-linear-gradient(left,#fff 50%,#f2f2f2 50%);background:linear-gradient(to right,#fff 50%,#f2f2f2 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#f2f2f2',GradientType=1);}}.bg-transparency{background:rgba(255,255,255,.9);}.bg-light{background:#eee;}.for-mobile{display:none;}.for-desktop{display:inline-block;}.breadcrumb{background:none;font-size:.85em;border-radius:0;border-bottom:1px solid #f5f5f5;margin:0 -15px;padding:.5rem 0;text-align:center;display:block;}.breadcrumb .breadcrumb-item+.breadcrumb-item{padding-left:.2rem;}.breadcrumb .breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.4rem;color:#eee;content:"|";}.breadcrumb .breadcrumb-item{color:#eee;display:inline-block;}.breadcrumb .breadcrumb-item a{color:#aaa;}.close{font-weight:300;}hr{margin-top:2rem;margin-bottom:2.5rem;border-top:1px solid rgba(0,0,0,.05);}span.with-br-name{font-size:.75em;}span.br-name{display:block;font-size:1.25em;}span.br-name-1{display:block;font-size:1em;}.btn-fifty{display:flex;}.btn-fifty .btn{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%;}.p-responsive{padding:120px 0;}.global-header{display:none;}.global-header .navbar{background:rgba(255,255,255,.2);}.global-header .navbar .products-link{border:1px solid rgba(255,255,255,.75);border-radius:.2rem;margin:0 10px;padding-top:.36rem;padding-bottom:.36rem;}.global-header .navbar .search-item{position:relative;}.global-header .navbar .search-item input.form-control{background:none;border:1px solid rgba(255,255,255,.25);border-radius:.2rem;color:#fff;padding-left:2.5rem;min-width:280px;}.global-header .navbar .search-item input.form-control::-webkit-input-placeholder{color:rgba(255,255,255,.25) !important;}.global-header .navbar .search-item input.form-control:-moz-placeholder{color:rgba(255,255,255,.25) !important;}.global-header .navbar .search-item input.form-control::-moz-placeholder{color:rgba(255,255,255,.25) !important;}.global-header .navbar .search-item input.form-control:-ms-input-placeholder{color:rgba(255,255,255,.25) !important;}.global-header .navbar .search-item .btn-search{position:absolute;top:-2px;left:-1px;background:none;}header .btn{background:#fff;}header .btn.btn-login,header .btn.btn-logout{border:2px solid #fff;color:#fff;background:transparent;margin-right:6px;}header .btn.btn-login:hover,header .btn.btn-logout:hover{background:#fff;color:#e90052;}.product-header{font-size:1.1rem;}.product-header .navbar-brand{font-size:1.75rem;}.home-logo{width:120px;}.jumbotron-logo{width:240px;margin-bottom:40px;}.forkme{position:fixed;bottom:0;right:0;}.footer-logo{width:140px;}.jumbotron{background:#006bf0;background:-moz-linear-gradient(left,#006bf0 0%,#40ffb0 100%);background:-webkit-linear-gradient(left,#006bf0 0%,#40ffb0 100%);background:linear-gradient(to right,rgba(56,0,60,.9) 0%,rgba(185,0,74,.78) 100%);margin-top:-120px;border-radius:0;margin-bottom:0;height:90vh;}.jumbotron.jumbocover{padding:120px 0 20px;height:auto;}.jumbotron>.row{height:calc(90vh - 120px);}.jumbotron .abp-version{position:absolute;font-size:11px;right:1px;top:-2px;padding:1px 4px 0;display:inline-block;color:#fff;background:rgba(233,3,82,.7);border-radius:3px;opacity:.8;}.jumbotron .desc-span{font-size:1.4em;font-style:italic;opacity:.7;}.section-with-logos img{margin:25px;max-height:50px;transition:.4s;opacity:.6;-webkit-filter:grayscale(60%);filter:grayscale(60%);}.section-with-logos img:hover{opacity:1;-webkit-filter:grayscale(0%);filter:grayscale(0%);}img.subsection-icon{width:64px;height:64px;}.toggle-row{display:none;}.btn-toggle .lessText{display:none;}.btn-toggle .moreText{display:block;}.btn-toggle.less .lessText{display:block;}.btn-toggle.less .moreText{display:none;}.abp-browser{margin:3rem 0 1rem;text-align:left;border-radius:6px;overflow:hidden;}.abp-browser .browser-container{border:1px solid #eee;}.abp-browser .browser-row{padding:4px 10px;background:#e5e5e5;}.abp-browser .browser-row:after{content:"";display:table;clear:both;}.abp-browser .browser-dot{margin-top:2px;margin-right:2px;height:12px;width:12px;background-color:#bbb;border-radius:50%;display:inline-block;}.abp-browser .abp-browser input[type=text]{width:100%;border-radius:3px;border:none;background-color:#fff;margin-top:-8px;height:25px;color:#666;padding:5px;}.abp-browser .browser-bar{width:17px;height:3px;background-color:#aaa;margin:3px 0;display:block;}.abp-browser .browser-content{padding:2rem;background:#f5f5f5;}.abp-browser .bg-primary,.abp-browser .btn-primary,.abp-browser .badge-primary{background-color:#007bff !important;border-color:#007bff !important;}.abp-browser .btn-outline-primary{color:#007bff !important;border-color:#007bff !important;}.abp-browser .btn-outline-primary:hover{background-color:#007bff !important;color:#fff !important;}span.code-arrow{padding:52px 0 18px;display:block;font-size:40px;}.docs-page{background:#f5f7f9;}.docs-page .docs-sidebar{background:#f5f7f9;padding-right:1.5rem;position:relative;width:270px;}.docs-page .docs-sidebar .docs-sidebar-wrapper{width:270px;top:0;position:fixed;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{height:calc(100vh - 190px);overflow:hidden;overflow-y:auto;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-search{position:relative;padding:0 0 1.25rem 1.5rem;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-search input.form-control{background:none;border-radius:.2rem;padding-left:2.5rem;width:100%;background:#eeeff2;border:0;font-size:.85em;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-search .btn-search{position:absolute;top:-5px;left:22px;background:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul{font-size:.913em;list-style:none;padding:0 0 0 20px;margin:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li{margin-left:0;padding-left:24px;display:block;width:100%;position:relative;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li label{margin:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li label.tree-toggle{transition:.3s;display:inline-block;width:18px;height:18px;text-align:center;padding:0;line-height:normal;border-radius:50%;margin-right:4px;position:absolute;left:0;top:8px;cursor:pointer;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li label.tree-toggle img{width:14px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li label.tree-toggle:not(.last-link).opened{transform:rotate(180deg);}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#101010;font-weight:700;padding:7px 0;display:block;border-bottom:1px solid #eeeff3;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li label.tree-toggle{top:6px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li a{font-weight:400;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul li a{font-weight:300;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#38003c;font-weight:bold;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:2rem;font-weight:700;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand .docs-logo{width:130px;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand strong{font-weight:300;font-size:1.2rem;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:.85em;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc strong{display:block;}.docs-page .docs-content .docs-text-field{padding:3rem;}.docs-page .docs-page-index{position:relative;}.docs-page .docs-page-index .docs-inner-anchors{position:fixed;top:0;max-width:270px;padding:10px;font-size:.9em;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills{font-size:.95em;margin-left:18px;border-left:1px solid #e5e5e5;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link{padding:.2rem 0 .2rem 1rem;color:#aaa;line-height:1.1;position:relative;border-left:3px solid transparent;border-radius:0;margin-left:-2px;margin-top:2px;margin-bottom:2px;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link.active{background:none;color:#38003b;border-color:#38003b;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-link.active{color:#38003b;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-pills .nav-link.active{color:#38003b;}.docs-page .docs-page-index .docs-inner-anchors>.navbar{margin-left:-18px;}.docs-page .docs-page-index .docs-inner-anchors .docs-anchors-wrapper{max-width:300px;float:left;}.docs-page .docs-page-index .docs-inner-anchors .inner-title{padding-left:18px;}.docs-page .docs-page-index .scroll-top-btn{display:none;font-size:.85em;color:#aaa;text-decoration:underline;padding-left:18px;}.docs-page .docs-page-index .scroll-top-btn.showup{display:block;}@media(min-width:1200px){.container{max-width:1180px;}}@media(min-width:1366px){.container{max-width:1340px;}}@media(min-width:1440px){.container{max-width:1400px;}}@media(max-width:767px){.docs-page{background:#f5f7f9;}.docs-page>.container-fluid{display:block;}.docs-page>.container-fluid>.row{display:block;}.docs-page .docs-sidebar{position:fixed;max-width:100%;width:100%;display:block;padding:0 !important;top:0;left:0;z-index:100;right:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper{max-width:100%;width:100%;top:0;position:relative;margin:0 !important;height:72px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{padding:.5rem 1.5rem 2rem 1.5rem;height:calc(100vh - 72px);overflow:hidden;overflow-y:auto;position:fixed;top:72px;font-size:17px;left:0;width:100%;z-index:100;background:#f5f7f9;display:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-search{position:relative;padding:0 0 1rem !important;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-search .btn-search{top:-14px;left:-2px;}.docs-page .docs-sidebar .docs-top .navbar-logo{padding:0;padding-top:.3rem;display:block;text-align:center;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:2rem;font-weight:700;display:block;margin-right:0;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand .docs-logo{width:110px;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:1em;display:none;}.docs-page .docs-sidebar .docs-top .open-dmenu{position:absolute;top:10px;left:20px;}.docs-page .docs-content{padding-top:72px;max-width:100%;display:block !important;}.docs-page .docs-content .docs-text-field{padding:1rem 1.5rem;}.docs-page .docs-page-index{display:none;}}@media(max-width:992px){body{font-size:14px;}.for-mobile{display:inline-block;}.for-desktop{display:none;}.close-mmenu,.close-dmenu{position:absolute;top:-78px;left:25px;color:#fff;font-size:68px;background:#fff;opacity:0;}.navbar{padding:.5rem 1.75rem;}.navbar .navbar-collapse{background:#38003d;position:fixed;top:86px;left:0;width:100%;height:100vh;height:calc(100vh - 86px);z-index:100 !important;}.navbar .navbar-collapse .navbar-nav{height:100vh;padding:20px 30px;overflow:auto;}.navbar .navbar-collapse .navbar-nav .nav-link{padding:1.2rem !important;}.navbar .navbar-toggler{padding:.5rem .75rem;font-size:1.5rem;line-height:1;background-color:transparent;border:0;border-radius:.25rem;color:#fff !important;margin-left:-1rem;}.jumbotron .btn,footer .btn{display:block;margin-bottom:10px;}.multi-tenancy{text-align:center !important;}.section-with-logos img{margin:15px;opacity:1;-webkit-filter:grayscale(0%);filter:grayscale(0%);}.jumbotron{padding-top:160px;margin-top:-160px;border-radius:0;padding-bottom:40px;margin-bottom:0;font-size:.85em;padding-left:45px;padding-right:45px;}span.code-arrow{padding:0 0 0;display:block;transform:rotate(90deg);font-size:2em;}.mb-5,.my-5{margin-bottom:2rem !important;}.jumbotron{height:calc(100vh + 120px);}.jumbotron.jumbocover{height:auto;padding:160px 0 20px;}.jumbotron hr{display:none;}.jumbotron .btn{margin-bottom:0 !important;}.jumbotron .jumbotron-logo{margin-bottom:0;width:180px;height:62px;margin-top:-30px;}.jumbotron .jlogo-wrapper{height:62px;}}.vs-blog{margin-top:-88px !important;}.abp-account-container{max-width:400px;margin:0 auto;margin-top:-88px !important;}body{background-size:cover;} \ No newline at end of file +body{position:relative;font-family:'PT Sans',sans-serif;background:url(../assets/tools/bg.jpg) center center no-repeat;background-attachment:fixed;}h1,h2,h3,h4,h5,h6{font-family:'PT Sans Caption',sans-serif;}h1{font-size:2.25em;margin:1.5rem 0 .75rem;}h2{font-size:1.75em;margin:1.5rem 0 .75rem;}h3{font-size:1.5em;margin:1.5rem 0 .75rem;}h4{font-size:1.25em;margin:1.5rem 0 .75rem;}h5{font-size:1em;margin:1.5rem 0 .75rem;}h6{font-size:1em;margin:1.5rem 0 .75rem;}img{max-width:100%;}.navbar{padding:1.75rem 2rem;}.nav-link{padding-left:1rem !important;padding-right:1rem !important;}.navbar-dark .navbar-nav .nav-link{color:#fff;}.text-success{color:#e90052 !important;}a.text-success:hover,a.text-success:focus{color:#e90052 !important;}.bg-success,.btn-success,.badge-success{background-color:#e90052 !important;border-color:#e90052 !important;}.bg-success{background-color:rgba(233,0,82,.8) !important;}.bg-blue,.btn-blue,.badge-blue{background-color:#03abed !important;border-color:#03abed !important;color:#fff;}.bg-blue:hover,.btn-blue:hover,.badge-blue:hover{background-color:#0095d0 !important;border-color:#0095d0 !important;color:#fff !important;}.btn:focus,.btn:active,.btn:visited,a:focus,a:active,a:visited{outline:none !important;box-shadow:none;}.text-primary{color:#38003c !important;}.bg-primary,.btn-primary,.badge-primary{background-color:#38003c !important;border-color:#38003c !important;}.bg-primary{background-color:rgba(56,0,60,.9) !important;}.btn-outline-primary{color:#38003c !important;border-color:#38003c !important;}.btn-outline-primary:hover{background-color:#38003c !important;color:#fff !important;}.dropdown-menu{padding:1rem 0;border-radius:.15rem;border:none;box-shadow:5px 5px 40px rgba(0,0,0,.3);}.dropdown-menu .dropdown-item{padding:.75rem 1.5rem;}#index-video{position:fixed;right:0;bottom:0;min-width:100%;min-height:100%;z-index:-1;}.bg-gradient-horizontal{background:#fff;}@media(min-width:480px){.bg-gradient-horizontal{background:#fff;background:-moz-linear-gradient(left,#fff 50%,#f2f2f2 50%);background:-webkit-linear-gradient(left,#fff 50%,#f2f2f2 50%);background:linear-gradient(to right,#fff 50%,#f2f2f2 50%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='#f2f2f2',GradientType=1);}}.bg-transparency{background:rgba(255,255,255,.9);}.bg-light{background:#eee;}.for-mobile{display:none;}.for-desktop{display:inline-block;}.breadcrumb{background:none;font-size:.85em;border-radius:0;border-bottom:1px solid #f5f5f5;margin:0 -15px;padding:.5rem 0;text-align:center;display:block;}.breadcrumb .breadcrumb-item+.breadcrumb-item{padding-left:.2rem;}.breadcrumb .breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.4rem;color:#eee;content:"|";}.breadcrumb .breadcrumb-item{color:#eee;display:inline-block;}.breadcrumb .breadcrumb-item a{color:#aaa;}.close{font-weight:300;}hr{margin-top:2rem;margin-bottom:2.5rem;border-top:1px solid rgba(0,0,0,.05);}span.with-br-name{font-size:.75em;}span.br-name{display:block;font-size:1.25em;}span.br-name-1{display:block;font-size:1em;}.btn-fifty{display:flex;}.btn-fifty .btn{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%;}.p-responsive{padding:120px 0;}.global-header{display:none;}.global-header .navbar{background:rgba(255,255,255,.2);}.global-header .navbar .products-link{border:1px solid rgba(255,255,255,.75);border-radius:.2rem;margin:0 10px;padding-top:.36rem;padding-bottom:.36rem;}.global-header .navbar .search-item{position:relative;}.global-header .navbar .search-item input.form-control{background:none;border:1px solid rgba(255,255,255,.25);border-radius:.2rem;color:#fff;padding-left:2.5rem;min-width:280px;}.global-header .navbar .search-item input.form-control::-webkit-input-placeholder{color:rgba(255,255,255,.25) !important;}.global-header .navbar .search-item input.form-control:-moz-placeholder{color:rgba(255,255,255,.25) !important;}.global-header .navbar .search-item input.form-control::-moz-placeholder{color:rgba(255,255,255,.25) !important;}.global-header .navbar .search-item input.form-control:-ms-input-placeholder{color:rgba(255,255,255,.25) !important;}.global-header .navbar .search-item .btn-search{position:absolute;top:-2px;left:-1px;background:none;}header .btn{background:#fff;}header .btn.btn-login,header .btn.btn-logout{border:2px solid #fff;color:#fff;background:transparent;margin-right:6px;}header .btn.btn-login:hover,header .btn.btn-logout:hover{background:#fff;color:#e90052;}.product-header{font-size:1.1rem;}.product-header .navbar-brand{font-size:1.75rem;}.home-logo{width:120px;}.jumbotron-logo{width:240px;margin-bottom:40px;}.forkme{position:fixed;bottom:0;right:0;}.footer-logo{width:140px;}.jumbotron{background:#006bf0;background:-moz-linear-gradient(left,#006bf0 0%,#40ffb0 100%);background:-webkit-linear-gradient(left,#006bf0 0%,#40ffb0 100%);background:linear-gradient(to right,rgba(56,0,60,.9) 0%,rgba(185,0,74,.78) 100%);margin-top:-120px;border-radius:0;margin-bottom:0;height:90vh;}.jumbotron.jumbocover{padding:120px 0 20px;height:auto;}.jumbotron>.row{height:calc(90vh - 120px);}.jumbotron .abp-version{position:absolute;font-size:11px;right:1px;top:-2px;padding:1px 4px 0;display:inline-block;color:#fff;background:rgba(233,3,82,.7);border-radius:3px;opacity:.8;}.jumbotron .desc-span{font-size:1.4em;font-style:italic;opacity:.7;}.section-with-logos img{margin:25px;max-height:50px;transition:.4s;opacity:.6;-webkit-filter:grayscale(60%);filter:grayscale(60%);}.section-with-logos img:hover{opacity:1;-webkit-filter:grayscale(0%);filter:grayscale(0%);}img.subsection-icon{width:64px;height:64px;}.toggle-row{display:none;}.btn-toggle .lessText{display:none;}.btn-toggle .moreText{display:block;}.btn-toggle.less .lessText{display:block;}.btn-toggle.less .moreText{display:none;}.abp-browser{margin:3rem 0 1rem;text-align:left;border-radius:6px;overflow:hidden;}.abp-browser .browser-container{border:1px solid #eee;}.abp-browser .browser-row{padding:4px 10px;background:#e5e5e5;}.abp-browser .browser-row:after{content:"";display:table;clear:both;}.abp-browser .browser-dot{margin-top:2px;margin-right:2px;height:12px;width:12px;background-color:#bbb;border-radius:50%;display:inline-block;}.abp-browser .abp-browser input[type=text]{width:100%;border-radius:3px;border:none;background-color:#fff;margin-top:-8px;height:25px;color:#666;padding:5px;}.abp-browser .browser-bar{width:17px;height:3px;background-color:#aaa;margin:3px 0;display:block;}.abp-browser .browser-content{padding:2rem;background:#f5f5f5;}.abp-browser .bg-primary,.abp-browser .btn-primary,.abp-browser .badge-primary{background-color:#007bff !important;border-color:#007bff !important;}.abp-browser .btn-outline-primary{color:#007bff !important;border-color:#007bff !important;}.abp-browser .btn-outline-primary:hover{background-color:#007bff !important;color:#fff !important;}span.code-arrow{padding:52px 0 18px;display:block;font-size:40px;}.docs-page{background:#f5f7f9;}.docs-page .docs-sidebar{background:#f5f7f9;padding-right:1.5rem;position:relative;width:270px;}.docs-page .docs-sidebar .docs-sidebar-wrapper{width:270px;top:0;position:fixed;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{height:calc(100vh - 190px);overflow:hidden;overflow-y:auto;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-search{position:relative;padding:0 0 1.25rem 1.5rem;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-search input.form-control{background:none;border-radius:.2rem;padding-left:2.5rem;width:100%;background:#eeeff2;border:0;font-size:.85em;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-search .btn-search{position:absolute;top:-5px;left:22px;background:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul{font-size:.913em;list-style:none;padding:0 0 0 20px;margin:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li{margin-left:0;padding-left:24px;display:block;width:100%;position:relative;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li label{margin:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li label.tree-toggle{transition:.3s;display:inline-block;width:18px;height:18px;text-align:center;padding:0;line-height:normal;border-radius:50%;margin-right:4px;position:absolute;left:0;top:8px;cursor:pointer;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li label.tree-toggle img{width:14px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li label.tree-toggle:not(.last-link).opened{transform:rotate(180deg);}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#101010;font-weight:700;padding:7px 0;display:block;border-bottom:1px solid #eeeff3;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li label.tree-toggle{top:6px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li a{font-weight:400;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul li a{font-weight:300;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#38003c;font-weight:bold;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:2rem;font-weight:700;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand .docs-logo{width:130px;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand strong{font-weight:300;font-size:1.2rem;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:.85em;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc strong{display:block;}.docs-page .docs-content .docs-text-field{padding:3rem;}.docs-page .docs-page-index{position:relative;}.docs-page .docs-page-index .docs-inner-anchors{position:fixed;top:0;max-width:270px;padding:10px;font-size:.9em;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills{font-size:.95em;margin-left:18px;border-left:1px solid #e5e5e5;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link{padding:.2rem 0 .2rem 1rem;color:#aaa;line-height:1.1;position:relative;border-left:3px solid transparent;border-radius:0;margin-left:-2px;margin-top:2px;margin-bottom:2px;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link.active{background:none;color:#38003b;border-color:#38003b;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-link.active{color:#38003b;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-pills .nav-link.active{color:#38003b;}.docs-page .docs-page-index .docs-inner-anchors>.navbar{margin-left:-18px;}.docs-page .docs-page-index .docs-inner-anchors .docs-anchors-wrapper{max-width:300px;float:left;}.docs-page .docs-page-index .docs-inner-anchors .inner-title{padding-left:18px;}.docs-page .docs-page-index .scroll-top-btn{display:none;font-size:.85em;color:#aaa;text-decoration:underline;padding-left:18px;}.docs-page .docs-page-index .scroll-top-btn.showup{display:block;}@media(min-width:1200px){.container{max-width:1180px;}}@media(min-width:1366px){.container{max-width:1340px;}}@media(min-width:1440px){.container{max-width:1400px;}}@media(max-width:767px){.docs-page{background:#f5f7f9;}.docs-page>.container-fluid{display:block;}.docs-page>.container-fluid>.row{display:block;}.docs-page .docs-sidebar{position:fixed;max-width:100%;width:100%;display:block;padding:0 !important;top:0;left:0;z-index:100;right:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper{max-width:100%;width:100%;top:0;position:relative;margin:0 !important;height:72px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{padding:.5rem 1.5rem 2rem 1.5rem;height:calc(100vh - 72px);overflow:hidden;overflow-y:auto;position:fixed;top:72px;font-size:17px;left:0;width:100%;z-index:100;background:#f5f7f9;display:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-search{position:relative;padding:0 0 1rem !important;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-search .btn-search{top:-14px;left:-2px;}.docs-page .docs-sidebar .docs-top .navbar-logo{padding:0;padding-top:.3rem;display:block;text-align:center;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:2rem;font-weight:700;display:block;margin-right:0;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand .docs-logo{width:110px;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:1em;display:none;}.docs-page .docs-sidebar .docs-top .open-dmenu{position:absolute;top:10px;left:20px;}.docs-page .docs-content{padding-top:72px;max-width:100%;display:block !important;}.docs-page .docs-content .docs-text-field{padding:1rem 1.5rem;}.docs-page .docs-page-index{display:none;}}@media(max-width:992px){body{font-size:14px;}.for-mobile{display:inline-block;}.for-desktop{display:none;}.close-mmenu,.close-dmenu{position:absolute;top:-78px;left:25px;color:#fff;font-size:68px;background:#fff;opacity:0;}.navbar{padding:.5rem 1.75rem;}.navbar .navbar-collapse{background:#38003d;position:fixed;top:86px;left:0;width:100%;height:100vh;height:calc(100vh - 86px);z-index:100 !important;}.navbar .navbar-collapse .navbar-nav{height:100vh;padding:20px 30px;overflow:auto;}.navbar .navbar-collapse .navbar-nav .nav-link{padding:1.2rem !important;}.navbar .navbar-toggler{padding:.5rem .75rem;font-size:1.5rem;line-height:1;background-color:transparent;border:0;border-radius:.25rem;color:#fff !important;margin-left:-1rem;}.jumbotron .btn,footer .btn{display:block;margin-bottom:10px;}.multi-tenancy{text-align:center !important;}.section-with-logos img{margin:15px;opacity:1;-webkit-filter:grayscale(0%);filter:grayscale(0%);}.jumbotron{padding-top:160px;margin-top:-160px;border-radius:0;padding-bottom:40px;margin-bottom:0;font-size:.85em;padding-left:45px;padding-right:45px;}span.code-arrow{padding:0 0 0;display:block;transform:rotate(90deg);font-size:2em;}.mb-5,.my-5{margin-bottom:2rem !important;}.jumbotron{height:calc(100vh + 120px);}.jumbotron.jumbocover{height:auto;padding:160px 0 20px;}.jumbotron hr{display:none;}.jumbotron .btn{margin-bottom:0 !important;}.jumbotron .jumbotron-logo{margin-bottom:0;width:180px;height:62px;margin-top:-30px;}.jumbotron .jlogo-wrapper{height:62px;}}.vs-blog{margin-top:-88px !important;}.abp-account-container{max-width:400px;margin:0 auto;margin-top:-88px !important;}body{background-size:cover;}.applications-container .card-body p{min-height:7em;} \ No newline at end of file diff --git a/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.scss b/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.scss index 4d9cb4a995..6ff04112b4 100644 --- a/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.scss +++ b/abp_io/src/Volo.AbpWebSite.Web/wwwroot/scss/vs.scss @@ -19,4 +19,12 @@ body { background-size: cover; -} \ No newline at end of file +} + +.applications-container { + .card-body { + p { + min-height: 7em; + } + } +} diff --git a/common.props b/common.props index 0e6a922473..3c6c9bda58 100644 --- a/common.props +++ b/common.props @@ -1,7 +1,7 @@ latest - 0.15.0 + 0.17.0 $(NoWarn);CS1591 https://abp.io/assets/abp_nupkg.png https://abp.io diff --git a/docs/en/Apps/VoloDocs.md b/docs/en/Apps/VoloDocs.md new file mode 100644 index 0000000000..dbbd3712d2 --- /dev/null +++ b/docs/en/Apps/VoloDocs.md @@ -0,0 +1,177 @@ +# VoloDocs + +## What is VoloDocs? + +VoloDocs is a cross-platform web application that allows you to easily create beautiful documentation and build developer communities. It simplifies software documentation with the help of GitHub integration. You use the power of GitHub for versioning, hosting of your docs. You let your users to edit a document. + +## Main Features + +- Serves documents from your GitHub repository. +- Supports Markdown / HTML document formatting. +- Supports versioning (integrated to GitHub releases). +- Supports multiple projects. +- Allows users to edit a document on GitHub. +- Cross-platform; deployable to Windows / Linux / macOS. + +## GitHub Repository + +It's free & open-source. You can browse VoloDocs source-code and contribute on GitHub: + +https://github.com/abpframework/abp/tree/master/modules/docs + +## Download + +You can download the VoloDocs release from the following links: + +http://apps.abp.io/VoloDocs/VoloDocs.win-x64.zip - **Windows 64 bit** + +http://apps.abp.io/VoloDocs/VoloDocs.win-x86.zip - **Windows 32 bit** + +http://apps.abp.io/VoloDocs/VoloDocs.osx-x64.zip - **MacOS** + +http://apps.abp.io/VoloDocs/VoloDocs.linux-x64.zip - **Linux** + +Notice that, all installations are self-contained deployments. It means all the required third-party dependencies along with the version of .NET Core is included. So you don't need to install any .NET Core SDK / Runtime. + +## Folder Structure + +When you extract the `VoloDocs.*.zip` file, you will see a `Web` folder and a `Migrator` folder. The `Web` folder contains the website files and `Migrator` contains the application to build your database. Before publishing your website, you need to create a new database or update your existing database to the latest. If this is the first time you install VoloDocs, `Migrator` will create a new database for you, otherwise it updates to the latest version. The only setting you need to configure, is the `ConnectionString` which is located in the `appsettings.json` file. See the next section to learn how to configure your VoloDocs application. + +## Steps by Step Deployment + +- ### Database Migration + + To update your existing database or create your initial database, go to `Migrator` folder in your VoloDocs directory. + + Open `appsettings.json` in your text editor and set your database connection string. If you don't know how to write the connection string for your database system, you can check out https://www.connectionstrings.com/. + + After you set your connection string, run `Migrate.bat` for Windows platform and `VoloDocs.Migrator` for other operating systems. That's it now configure your website. + +- ### Configuring Website + + Go to `Web` folder in your VoloDocs directory. Open `appsettings.json` in your text editor. Set your connection string (same as in the `Migrator`'s `appsettings.json`). Set `title` of your website. This will be written on the left-upper corner of your website. That's it! Now you can publish your website. + + If you want to run + +- ### Deploying Website + + In the previous step, you created or updated your database. Ensure that your database exists on the specified connection string. + + - #### Deploying to IIS + + - Move `Web` folder to your `wwwroot ` folder. + - Rename `Web` folder to `VoloDocs` (Now you have `C:\inetpub\wwwroot\VoloDocs`).![Add IIS Website](../images/volodocs-iis-add-website.png) + - The `VoloDocs` application pool is being created automatically. Open **Application Pools** and double click `VoloDocs` application pool and set + - **.NET CLR version**: `No Managed Code` + - **Managed pipeline mode**: `Integrated` + + ![Add IIS Website](../images/volodocs-iis-application-pool.png) + + + + - If you get the below error, it means don't have the hosting bundle installed on the server. See [this document](https://docs.microsoft.com/aspnet/core/host-and-deploy/iis/#install-the-net-core-hosting-bundle) to learn how to install it or [download Hosting Bundle](https://www.microsoft.com/net/permalink/dotnetcore-current-windows-runtime-bundle-installer) and run on your server. + + ``` + Handler "aspNetCore" has a bad module "AspNetCoreModuleV2" in its module list using IIS + ``` + + - Further information about hosting VoloDocs check out [Microsoft's official document for hosting ASP.NET Core application on IIS](https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/iis). + + - #### Deploying to Azure + + Microsoft has a good document on how to deploy your ASP.NET Core web app to Azure App Service. We recommend you to read this document https://docs.microsoft.com/en-us/azure/app-service/app-service-web-get-started-dotnet. + + - #### Running the Application From Command Line + + Alternatively you can run the application from command line, navigate to `VoloDocs\Web` folder and run `VoloDocs.Web.exe` for Windows or `VoloDocs.Web` for MacOS / Linux. + +- ### First Run + + To start the website, navigate to your address (as configured in the previous section). + + When you first open the website, you need to create a project. + + #### Creating a Project + + Go to the following address to create project + + - `http:///Account/Login?returnUrl=/Docs/Admin/Projects` + + ##### Default credentials + + To login the admin side, use the following credentials: + + * **Username**: `admin` + + * **Password**: `1q2w3E*` + + ##### An example project definition + + Here's a sample project information that uses GitHub source. + + We will configure the VoloDocs to show ABP Framework's documentation that's stored in GitHub. + + Here's the link to ABP Framework GitHub docs folder: + + https://github.com/abpframework/abp/tree/master/docs/en + + + + * **Name**: `ABP Framework` + + * **Short name**: `abp` + + * **Format**: `markdown` + + * **Default document name**: `Index` + + * **Navigation document name**: `docs-nav.json` ([see the sample navigation](https://github.com/abpframework/abp/blob/master/docs/en/docs-nav.json)) + + * **Minimum version**: *leave empty* *(hides the previous versions)* + + * **Main web site URL**: `/` + + * **Latest version branch name**: leave empty () + + * **GitHub root URL**: `https://github.com/abpframework/abp/tree/{version}/docs/en/` + + * **GitHub access token**: [see how to retrieve GitHub access token](#retrieving-github-access-token) + + * **GitHub user agent**: [see how to learn your GitHub username](#learn-your-github-username) + + ![Creating a new project](../images/docs-create-project.jpg) + + ##### Retrieving GitHub Access Token + + To create a personal access token in GitHub, you need to visit the **Settings** of the user account and under **Developer settings** you will find **Personal access tokens**. Select **Generate new token**, enter in a name as the Token description and enable the repo checkbox. Alternatively, to enter generate new token, browse to https://github.com/settings/tokens/new. + + ###### Generate Token for Public Repositories + + To access public repositories, check `public_repo` under the `repo` section. This will enable VoloDocs to access your public GitHub repositories. Click `Generate Token` button on the bottom of the page. + + ![Retrieve GitHub Access Token for Public Repo](../images/github-access-token-public-repo.jpg) + + ###### Generate Token for Private Repositories + + To access public repositories, check all items under the `repo` section. This will enable VoloDocs to access your private GitHub repositories. Click `Generate Token` button on the bottom of the page. + + ![Retrieve GitHub Access Token for Private Repo](../images/github-access-token-private-repo.jpg) + + ###### Learn Your GitHub Username + + To learn your GitHub username, click on your profile picture on the top-right corner of the GitHub page. You will see your username right after the text "Signed in as ..." + + ![Your GitHub Username](../images/github-myusername.jpg) + + + +After you save the project, go to root website address and you will see your documentation. + +`http:///documents` + +### Any Issues? + +If you encounter any problem or issues about installation, usage or report a bug, follow the link: + +https://github.com/abpframework/abp/issues/new + diff --git a/docs/en/AspNetCore/Auto-API-Controllers.md b/docs/en/AspNetCore/Auto-API-Controllers.md index 48567b6919..db7fb63642 100644 --- a/docs/en/AspNetCore/Auto-API-Controllers.md +++ b/docs/en/AspNetCore/Auto-API-Controllers.md @@ -80,7 +80,7 @@ Then the route for getting a book will be '**/api/volosoft/book-store/book/{id}* * Removing '**Async**' postfix. If the method name is 'GetPhonesAsync' then it becomes 'GetPhones'. * Removing **HTTP method prefix**. 'GetList', 'GetAll', 'Get', 'Put', 'Update', 'Delete', 'Remove', 'Create', 'Add', 'Insert', 'Post' and 'Patch' prefixes are removed based on the selected HTTP method. So, 'GetPhones' becomes 'Phones' since 'Get' prefix is a duplicate for a GET request. * Converting the result to **camelCase**. - * If the resulting action name is **empty** then it's not added to the route. If it's not empty, it's added to the route (like '/phones'). For 'GetAllAsync' method name it will be empty, for 'GetPhonesAsync' method name is will be 'phones'. + * If the resulting action name is **empty** then it's not added to the route. If it's not empty, it's added to the route (like '/phones'). For 'GetAllAsync' method name it will be empty, for 'GetPhonesAsync' method name it will be 'phones'. * Normalization can be customized by setting the `UrlActionNameNormalizer` option. It's an action delegate that is called for every method. * If there is another parameter with 'Id' postfix, then it's also added to the route as the final route segment (like '/phoneId'). @@ -135,4 +135,4 @@ public class PersonAppService : ApplicationService } ```` -Disabled `IsMetadataEnabled` which hides this service from API explorer and it will not be discoverable. However, it still can be usable for the clients know the exact API path/route. \ No newline at end of file +Disabled `IsMetadataEnabled` which hides this service from API explorer and it will not be discoverable. However, it still can be usable for the clients know the exact API path/route. diff --git a/docs/en/AspNetCore/Bundling-Minification.md b/docs/en/AspNetCore/Bundling-Minification.md index 7170690ef3..220562935d 100644 --- a/docs/en/AspNetCore/Bundling-Minification.md +++ b/docs/en/AspNetCore/Bundling-Minification.md @@ -194,7 +194,7 @@ services.Configure(options => options .ScriptBundles .Configure("MyGlobalBundle", bundle => { - bundle.AddContributors(typeof(MyExtensionStyleBundleContributor)); + bundle.AddContributors(typeof(MyExtensionGlobalStyleContributor)); }); }); ```` @@ -279,9 +279,9 @@ public class MyExtensionStyleBundleContributor : BundleContributor Using the built-in contributors for standard packages; -* Prevents you typing **invalid the resource paths**. +* Prevents you typing **the invalid resource paths**. * Prevents changing your contributor if the resource **path changes** (the dependant contributor will handle it). -* Prevents multiple modules adding the **duplicate the files**. +* Prevents multiple modules adding the **duplicate files**. * Manages **dependencies recursively** (adds dependencies of dependencies, if necessary). #### Volo.Abp.AspNetCore.Mvc.UI.Packages Package diff --git a/docs/en/Best-Practices/Application-Services.md b/docs/en/Best-Practices/Application-Services.md index 7624464e17..0979304931 100644 --- a/docs/en/Best-Practices/Application-Services.md +++ b/docs/en/Best-Practices/Application-Services.md @@ -203,12 +203,13 @@ This method votes a question and returns the current score of the question. #### Manipulating / Deleting Entities * **Do** always get all the related entities from repositories to perform the operations on them. +* **Do** call repository's Update/UpdateAsync method after updating an entity. Because, not all database APIs support change tracking & auto update. #### Using Other Application Services * **Do not** use other application services of the same module/application. Instead; * Use domain layer to perform the required task. - * Extract a new class and share between the application services to accomplish the code reuse when necessary. + * Extract a new class and share between the application services to accomplish the code reuse when necessary. But be careful to don't couple two use cases. They may seem similar at the beginning, but may evolve to different directions by time. So, use code sharing carefully. * **Can** use application services of others only if; * They are parts of another module / microservice. * The current module has only reference to the application contracts of the used module. diff --git a/docs/en/Modules/Docs.md b/docs/en/Modules/Docs.md index 1aa81621f5..ac85978740 100644 --- a/docs/en/Modules/Docs.md +++ b/docs/en/Modules/Docs.md @@ -472,4 +472,9 @@ The upper sample `JSON` file renders the below navigation menu as `HTML`. -Finally a new Docs Module is added to your project which is feeded with GitHub. \ No newline at end of file +Finally a new Docs Module is added to your project which is feeded with GitHub. + +## Next + +Docs Module is also available as a standalone application. Check out [VoloDocs](../Apps/VoloDocs). + diff --git a/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md b/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md index 337f021587..a841b6ad65 100644 --- a/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md +++ b/docs/en/Tutorials/AspNetCore-Mvc/Part-I.md @@ -84,11 +84,23 @@ EF Core requires you to relate entities with your DbContext. The easiest way to ````C# public class BookStoreDbContext : AbpDbContext { - public DbSet Book { get; set; } + public DbSet Books { get; set; } ... } ```` +#### Configure Your Book Entity + +Open BookStoreDbContextModelCreatingExtensions.cs file from the `Acme.BookStore.EntityFrameworkCore` project, add following code to the end of ConfigureBookStore method to configure Book entity: + +````C# + builder.Entity(b => + { + b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); + b.ConfigureExtraProperties(); + }); +```` + #### Add New Migration & Update the Database The Startup template uses [EF Core Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/) to create and maintain the database schema. Open the **Package Manager Console (PMC)** (under the *Tools/Nuget Package Manager* menu), select the `Acme.BookStore.EntityFrameworkCore.DbMigrations` as the **default project** and execute the following command: diff --git a/docs/en/images/docs-create-project.jpg b/docs/en/images/docs-create-project.jpg new file mode 100644 index 0000000000..742f5e307f Binary files /dev/null and b/docs/en/images/docs-create-project.jpg differ diff --git a/docs/en/images/github-access-token-private-repo.jpg b/docs/en/images/github-access-token-private-repo.jpg new file mode 100644 index 0000000000..5bc53cc63d Binary files /dev/null and b/docs/en/images/github-access-token-private-repo.jpg differ diff --git a/docs/en/images/github-access-token-public-repo.jpg b/docs/en/images/github-access-token-public-repo.jpg new file mode 100644 index 0000000000..b909c2cfe5 Binary files /dev/null and b/docs/en/images/github-access-token-public-repo.jpg differ diff --git a/docs/en/images/github-myusername.jpg b/docs/en/images/github-myusername.jpg new file mode 100644 index 0000000000..4ac57eeed4 Binary files /dev/null and b/docs/en/images/github-myusername.jpg differ diff --git a/docs/en/images/volodocs-iis-add-website.png b/docs/en/images/volodocs-iis-add-website.png new file mode 100644 index 0000000000..878b3e8f0c Binary files /dev/null and b/docs/en/images/volodocs-iis-add-website.png differ diff --git a/docs/en/images/volodocs-iis-application-pool.png b/docs/en/images/volodocs-iis-application-pool.png new file mode 100644 index 0000000000..cc5186f50b Binary files /dev/null and b/docs/en/images/volodocs-iis-application-pool.png differ diff --git a/docs/zh-Hans/AspNetCore/Bundling-Minification.md b/docs/zh-Hans/AspNetCore/Bundling-Minification.md index 7454bd3c17..b7c8c0a1b1 100644 --- a/docs/zh-Hans/AspNetCore/Bundling-Minification.md +++ b/docs/zh-Hans/AspNetCore/Bundling-Minification.md @@ -196,7 +196,7 @@ services.Configure(options => options .ScriptBundles .Configure("MyGlobalBundle", bundle => { - bundle.AddContributors(typeof(MyExtensionStyleBundleContributor)); + bundle.AddContributors(typeof(MyExtensionGlobalStyleContributor)); }); }); ```` @@ -214,7 +214,7 @@ services.Configure(options => `abp-style`和`abp-script`标签可以使用`type`属性(而不是`src`属性), 如本示例所示. 添加bundle贡献者时, 其依赖关系也会自动添加到bundle中. -#### Contributor Dependencies +#### 贡献者依赖关系 bundle贡献者可以与其他贡献者具有一个或多个依赖关系. 例如: @@ -227,9 +227,39 @@ public class MyExtensionStyleBundleContributor : BundleContributor } ```` -添加bundle贡献者时,其依赖关系将 **自动并递归** 添加. **依赖顺序** 通过阻止 **重复** 添加的依赖关系. 即使它们处于分离的束中,也会阻止重复. ABP在页面中组织所有bundle并消除重复. +添加bundle贡献者时,其依赖关系将 **自动并递归** 添加. **依赖顺序** 通过阻止 **重复** 添加的依赖关系. 即使它们处于分离的bundle中,也会阻止重复. ABP在页面中组织所有bundle并消除重复. -创建贡献者和定义依赖关系是一种跨不同模块组织包创建的方法. +创建贡献者和定义依赖关系是一种跨不同模块组织bundle创建的方法. + + +#### 贡献者扩展 + +在某些高级应用场景中, 当用到一个bundle贡献者时,你可能想做一些额外的配置. 贡献者扩展可以和被扩展的贡献者无缝衔接. + +下面的示例为 prism.js 脚本库添加一些样式: + +````csharp +public class MyPrismjsStyleExtension : BundleContributor +{ + public override void ConfigureBundle(BundleConfigurationContext context) + { + context.Files.AddIfNotContains("/libs/prismjs/plugins/toolbar/prism-toolbar.css"); + } +} +```` + +然后你可以配置 `BundleContributorOptions` 去扩展已存在的 `PrismjsStyleBundleContributor`. + +````csharp +Configure(options => +{ + options + .Extensions() + .Add(); +}); +```` + +任何时候当 `PrismjsStyleBundleContributor` 被添加到bundle中时, `MyPrismjsStyleExtension` 也会被自动添加. #### 访问 IServiceProvider @@ -239,7 +269,7 @@ public class MyExtensionStyleBundleContributor : BundleContributor 将特定的NPM包资源(js,css文件)添加到包中对于该包非常简单. 例如, 你总是为bootstrap NPM包添加`bootstrap.css`文件. -所有[标准NPM包](Client-Side-Package-Management.md)都有内置的贡献者. 例如,如果你的贡献者依赖于引导程序,你可以声明它,而不是自己添加bootstrap.css. +所有[标准NPM包](Client-Side-Package-Management.md)都有内置的贡献者. 例如,如果你的贡献者依赖于bootstrap,你可以声明它,而不是自己添加bootstrap.css. ````C# [DependsOn(typeof(BootstrapStyleContributor))] //Define the bootstrap style dependency @@ -261,7 +291,7 @@ public class MyExtensionStyleBundleContributor : BundleContributor > 默认情况下已在启动模板安装此软件包. 大多数情况下,你不需要手动安装它. 标准包贡献者在`Volo.Abp.AspNetCore.Mvc.UI.Packages` NuGet包中定义. -安装到你的项目中: +将它安装到你的项目中: ```` install-package Volo.Abp.AspNetCore.Mvc.UI.Packages @@ -283,9 +313,9 @@ namespace MyCompany.MyProject } ```` -#### Bundle Inheritance +#### Bundle 继承 -在某些特定情况下, 可能需要从其他bundle创建一个 **新** bundle **继承**, 从bundle继承(递归)继承该bundle的所有文件/贡献者. 然后派生的bundle可以添加或修改文件/贡献者**而无需修改**原始包. +在某些特定情况下, 可能需要从其他bundle创建一个 **新** bundle **继承**, 从bundle继承(递归)会继承该bundle的所有文件/贡献者. 然后派生的bundle可以添加或修改文件/贡献者**而无需修改**原始bundle. 例如: ````c# diff --git a/docs/zh-Hans/Best-Practices/Application-Services.md b/docs/zh-Hans/Best-Practices/Application-Services.md index 8e9c85d63a..342d7cc3bb 100644 --- a/docs/zh-Hans/Best-Practices/Application-Services.md +++ b/docs/zh-Hans/Best-Practices/Application-Services.md @@ -202,12 +202,13 @@ Task VoteAsync(Guid id, VoteType type); #### 操作/删除 实体 * **推荐** 总是从数据库中获取所有的相关实体以对他们执行操作. +* **推荐** 更新实体后调用存储的Update/UpdateAsync方法.因为并非所有数据库API都支持更改跟踪和自动更新. #### 使用其他应用服务 * **不推荐** 使用相同 **模块/应用程序** 的其他应用服务. 相反; * 使用领域层执行所需的任务. - * 提取新类并在应用程序服务之间共享, 在必要时代码重用. + * 提取新类并在应用程序服务之间共享, 在必要时代码重用. 但要小心不要结合两个用例. 它们在开始时可能看起来相似, 但可能会随时间演变为不同的方向. 请谨慎使用代码共享. * **可以** 在以下情况下使用其他应用服务; * 它们是另一个模块/微服务的一部分. * 当前模块仅引用已使用模块的application contracts. \ No newline at end of file diff --git a/docs/zh-Hans/Exception-Handling.md b/docs/zh-Hans/Exception-Handling.md index ac68058883..ecb4acf5e7 100644 --- a/docs/zh-Hans/Exception-Handling.md +++ b/docs/zh-Hans/Exception-Handling.md @@ -11,15 +11,15 @@ ABP提供了用于处理Web应用程序异常的标准模型. 当满足下面**任意一个条件**时,`AbpExceptionFilter` 会处理此异常: -* 当**controller action**方法返回类型是**object**(不是view)并有异常抛出时. -* 当是一个请求为AJAX(Http请求头中`X-Requested-With`为`XMLHttpRequest`)时. +* 当**controller action**方法返回类型是**object result**(而不是view result)并有异常抛出时. +* 当一个请求为AJAX(Http请求头中`X-Requested-With`为`XMLHttpRequest`)时. * 当客户端接受的返回类型为`application/json`(Http请求头中`accept` 为`application/json`)时. 如果异常被处理过,则会自动**记录日志**并将格式化的**JSON消息**返回给客户端. -#### 异常消息格式 +#### 错误消息格式 -每个异常消息都是`RemoteServiceErrorResponse` 类的实例.下面是一个只有 **Message** 属性的错误JSON: +每个错误消息都是`RemoteServiceErrorResponse` 类的实例.最简单的错误JSON只有一个 **Message** 属性,如下所示: ````json { @@ -29,11 +29,11 @@ ABP提供了用于处理Web应用程序异常的标准模型. } ```` -当异常发生时,会自动填充到这些**可选字段**. +其它**可选字段**可以根据已发生的异常来填充. ##### 错误代码 -错误的 **Code** 是字符串类型,并要求唯一的可选属性.如果抛出的异常包含 **Code** 属性,那么应该实现`IHasErrorCode` 接口,来填充这个字段.示例JSON如下: +错误 **代码(code)** 是异常信息中一个有唯一值并可选的字符串值.抛出的异常应实现`IHasErrorCode` 接口来填充该字段.示例JSON如下: ````json { @@ -44,11 +44,11 @@ ABP提供了用于处理Web应用程序异常的标准模型. } ```` -错误 **Code** 同样可用于异常的本地化及自定义HTTP状态代码(请参阅下面的相关部分). +错误代码同样可用于异常信息的本地化及自定义HTTP状态代码(请参阅下面的相关部分). ##### 错误详细信息 -错误的 **Details** 是可选属性.抛出的异常应该实现`IHasErrorDetails` 接口来填充这个字段.示例JSON如下: +错误的 **详细信息(Details)** 是可选属性.抛出的异常应实现`IHasErrorDetails` 接口来填充该字段.示例JSON如下: ```json { @@ -62,7 +62,7 @@ ABP提供了用于处理Web应用程序异常的标准模型. ##### 验证错误 -当抛出的异常继承至`IHasValidationErrors` 接口时,返回错误对象会包含一个可选属性**validationErrors** .示例JSON如下: +当抛出的异常实现`IHasValidationErrors` 接口时,**validationErrors**是一个可被填充的标准字段.示例JSON如下: ````json { @@ -85,7 +85,7 @@ ABP提供了用于处理Web应用程序异常的标准模型. #### 日志 -自动记录捕获异常的日志. +被捕获的异常会被自动记录到日志中. ##### 日志级别 @@ -102,7 +102,7 @@ public class MyException : Exception, IHasLogLevel ##### 异常自定义日志 -某些异常类型可能需要记录额外日志信息.可以通过实现`IExceptionWithSelfLogging` 来记录指定日志,例如: +某些异常类型可能需要记录额外日志信息.可以通过实现`IExceptionWithSelfLogging` 接口来记录指定日志,例如: ````C# public class MyException : Exception, IExceptionWithSelfLogging @@ -114,7 +114,7 @@ public class MyException : Exception, IExceptionWithSelfLogging } ```` -> 扩展方法`ILogger.LogException` 用来记录日志. 在需要时可以使用相同的扩展方法. +> 扩展方法`ILogger.LogException` 用来记录异常日志. 在需要时可以使用相同的扩展方法. ### 业务异常 @@ -140,9 +140,9 @@ throw new BusinessException(QaErrorCodes.CanNotVoteYourOwnAnswer); Volo.Qa:010002 ```` -`Volo.Qa`在这是作为`code-namespace`. `code-namespace` 同样可以在异常 **本地化** 中使用. +`Volo.Qa`在这是作为`code-namespace`. `code-namespace` 同样可以在 **本地化** 异常信息时使用. -* 你可以直接抛出一个 `BusinessException` 异常或者自定义的异常. +* 你可以直接抛出一个 `BusinessException` 异常,或者需要时可以从该类派生你自己的Exception类型. * 对于`BusinessException` 类型,其所有属性都是可选的.但是通常会设置`ErrorCode`或`Message`属性. ### 异常本地化 @@ -153,7 +153,7 @@ Volo.Qa:010002 如果异常实现了 `IUserFriendlyException` 接口,那么ABP不会修改 `Message`和`Details`属性,而直接将它发送给客户端. -`UserFriendlyException` 类默认实现了 `IUserFriendlyException` 接口,示例如下: +`UserFriendlyException` 类是内建的 `IUserFriendlyException` 接口的实现,示例如下: ````C# throw new UserFriendlyException( @@ -167,7 +167,7 @@ throw new UserFriendlyException( throw new UserFriendlyException(_stringLocalizer["UserNameShouldBeUniqueMessage"]); ```` -再在本地化资源的语言中添加对应的定义.例如: +再在本地化资源中为每种语言添加对应的定义.例如: ````json { @@ -178,7 +178,7 @@ throw new UserFriendlyException(_stringLocalizer["UserNameShouldBeUniqueMessage" } ```` -**string localizer** 是支持格式化参数.例如 +**string localizer** 支持参数化信息.例如 ````C# throw new UserFriendlyException(_stringLocalizer["UserNameShouldBeUniqueMessage", "john"]); @@ -192,12 +192,12 @@ throw new UserFriendlyException(_stringLocalizer["UserNameShouldBeUniqueMessage" * `IUserFriendlyException`接口派生自`IBusinessException`,而 `UserFriendlyException `类派生自`BusinessException`类. -#### 错误代码 +#### 使用错误代码 `UserFriendlyException`很好用,但是在一些高级用法里面,它存在以下问题: * 在抛出异常的地方必须注入**string localizer** 来实现本地化 . -* 但是,在某些情况下,**可能注入不了string localizer**(比如,静态方法或实体中) +* 但是,在某些情况下,**可能注入不了string localizer**(比如,在静态上下文或实体方法中) 那么这时就可以通过使用 **错误代码** 的方式来处理本地化,而不是在抛出异常的时候. @@ -210,7 +210,7 @@ services.Configure(options => }); ```` -再使用本地化资源,来本地化`Volo.Qa`命名空间下的所有异常. 本地化资源中应包含对应错误代码的文本. 例如: +然后`Volo.Qa`命名空间下的所有异常都将被对应的本地化资源进行本地化处理. 本地化资源中应包含对应错误代码的文本. 例如: ````json { @@ -227,12 +227,12 @@ services.Configure(options => throw new BusinessException(QaDomainErrorCodes.CanNotVoteYourOwnAnswer); ```` -* 所有实现`IHasErrorCode` 接口的异常都具有相同的行为.因此,对错误代码的本地化,并不是`BusinessException`类所特有的. -* 错误消息的本地化文本的并不是必须. 如果未定义,ABP会将默认的错误消息发送给客户端. 而并不是发送异常的`Message`属性. 如果你想要发送异常的`Message`,使用`UserFriendlyException`(或使用实现`IUserFriendlyException`接口的异常类型) +* 抛出所有实现`IHasErrorCode` 接口的异常都具有相同的行为.因此,对错误代码的本地化,并不是`BusinessException`类所特有的. +* 为错误消息定义本地化文本并不是必须的. 如果未定义,ABP会将默认的错误消息发送给客户端. 而不使用异常的`Message`属性. 如果你想要发送异常的`Message`,使用`UserFriendlyException`(或使用实现`IUserFriendlyException`接口的异常类型) ##### 使用消息的格式化参数 -如果错误消息包含格式化参数时,则可以使用异常的`Data`属性进行设置.例如: +如果有参数化的错误消息,则可以使用异常的`Data`属性进行设置.例如: ````C# throw new BusinessException("App:010046") @@ -263,9 +263,9 @@ throw new BusinessException("App:010046") } ```` -* `WithData` 支持链式调用 (如`.WithData(...).WithData(...)`). +* `WithData` 支持有多个参数的链式调用 (如`.WithData(...).WithData(...)`). -### HTTP状态代码 映射 +### HTTP状态代码映射 ABP尝试按照以下规则,自动映射常见的异常类型的HTTP状态代码: @@ -297,6 +297,6 @@ services.Configure(options => - 当用户没有权限执行操作时,会抛出 `AbpAuthorizationException` 异常. 有关更多信息,请参阅授权文档(TODO:link). - 如果当前请求的输入无效,则抛出`AbpValidationException 异常`. 有关更多信息,请参阅授权文档(TODO:link). -- 如果请求的实体不存在,则抛出`EntityNotFoundException` 异常. 此异常由 [repositories](Repositories.md) 抛出. +- 如果请求的实体不存在,则抛出`EntityNotFoundException` 异常. 此异常大多数由 [repositories](Repositories.md) 抛出. -你同样可以在代码中抛出这些类型的异常(虽然只在很少时候) +你同样可以在代码中抛出这些类型的异常(虽然很少需要这样做) diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md index 19d278e563..d3e8af3523 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md @@ -24,7 +24,7 @@ ### 创建Book实体 -在 **领域层** 定义[实体](../../Entities.md)(`Acme.BookStore.Domain` 中).这个项目最主要的实体就是`Book`: +在 **领域层** 定义[实体](../../Entities.md)(`Acme.BookStore.Domain` 项目中).这个项目最主要的实体就是`Book`: ````C# using System; @@ -50,14 +50,14 @@ namespace Acme.BookStore } ```` -* ABP有两个基本的实体基类: `AggregateRoot` 和 `Entity`.**Aggregate Root**是 **领域驱动设计(DDD)** 中的概念.查看[实体](../../Entities.md)的更多信息和最佳实践. -* `Book`实体继承了`AuditedAggregateRoot`,`AuditedAggregateRoot`类在`AggregateRoot`类的基础上添加了(`CreationTime`, `CreatorId`, `LastModificationTime`... 等.)审计属性. -* `Book`实体的主键类型是`Guid`类型. +* ABP有两个基本的实体基类: `AggregateRoot` 和 `Entity`.**Aggregate Root**是 **领域驱动设计(DDD)** 的概念之一.更多信息和最佳实践请查看[实体文档](../../Entities.md). +* `Book`实体继承了`AuditedAggregateRoot`,`AuditedAggregateRoot`类在`AggregateRoot`类的基础上添加了一些审计属性(`CreationTime`, `CreatorId`, `LastModificationTime`... 等.). +* `Guid`是`Book`实体的主键类型. * 使用 **数据注解** 为EF Core添加映射.或者你也可以使用 EF Core 自带的[fluent mapping API](https://docs.microsoft.com/en-us/ef/core/modeling). #### BookType枚举 -下面是所有要用到的`BookType`枚举: +上面所用到的`BookType`枚举定义如下: ````C# namespace Acme.BookStore @@ -79,19 +79,31 @@ namespace Acme.BookStore #### 将Book实体添加到DbContext中 -EF Core需要你将实体和DbContext建立关联.最简单的做法是在`Acme.BookStore.EntityFrameworkCore`项目的`BookStoreDbContext`类中添加`DbSet`属性.如: +EF Core需要你将实体和DbContext建立关联.最简单的做法是在`Acme.BookStore.EntityFrameworkCore`项目的`BookStoreDbContext`类中添加`DbSet`属性.如下所示: ````C# public class BookStoreDbContext : AbpDbContext { - public DbSet Book { get; set; } + public DbSet Books { get; set; } ... } ```` +#### 配置你的Book实体 + +从`Acme.BookStore.EntityFrameworkCore` 项目中打开 BookStoreDbContextModelCreatingExtensions.cs 文件, 在 ConfigureBookStore 方法最后添加如下代码来配置Book实体: + +````C# + builder.Entity(b => + { + b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); + b.ConfigureExtraProperties(); + }); +```` + #### 添加新的Migration并更新数据库 -这个启动模板使用了[EF Core Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/)来创建并维护数据库结构.打开 **Package Manager Console (PMC)** (工具/Nuget包管理器菜单),选择 `Acme.BookStore.EntityFrameworkCore.DbMigrations`作为默认的项目然后执行下面的命令: +这个启动模板使用了[EF Core Code First Migrations](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/)来创建并维护数据库结构.打开 **程序包管理器控制台(Package Manager Console) (PMC)** (工具/Nuget包管理器菜单),选择 `Acme.BookStore.EntityFrameworkCore.DbMigrations`作为默认的项目然后执行下面的命令: ![bookstore-pmc-add-book-migration](images/bookstore-pmc-add-book-migration-v2.png) @@ -136,10 +148,10 @@ namespace Acme.BookStore } ```` -* **DTO**类被用来在 **基础设施层** 和 **应用层** **传递数据**.查看[DTO文档](../../Data-Transfer-Objects.md)查看更多信息. -* 为了在页面上展示书籍信息,`BookDto`被用来将书籍数据传递到基础设施层. +* **DTO**类被用来在 **表示层** 和 **应用层** **传递数据**.查看[DTO文档](../../Data-Transfer-Objects.md)查看更多信息. +* 为了在页面上展示书籍信息,`BookDto`被用来将书籍数据传递到表示层. * `BookDto`继承自 `AuditedEntityDto`.跟上面定义的`Book`类一样具有一些审计属性. -* `[AutoMapFrom(typeof(Book))]`用来创建从`Book`类到`BookDto`的映射.使用这种方法.你可以将`Book`对象自动转换成`BookDto`对象(而不是手动复制所有的属性). +* `[AutoMapFrom(typeof(Book))]`用来创建从`Book`类到`BookDto`的AutoMapper映射.使用这种方法.你可以将`Book`对象自动转换成`BookDto`对象(而不是手动复制所有的属性). #### CreateUpdateBookDto @@ -171,7 +183,7 @@ namespace Acme.BookStore } ```` -* 这个DTO类在创建和更新书籍的时候被使用,用来从页面获取图书信息. +* 这个DTO类被用于在创建或更新书籍的时候从用户界面获取图书信息. * 类中的属性定义了数据注解(如`[Required]`)用来定义有效性验证.ABP会自动校验DTO的数据有效性. #### IBookAppService @@ -191,14 +203,14 @@ namespace Acme.BookStore Guid, //Book实体的主键 PagedAndSortedResultRequestDto, //获取书籍的时候用于分页和排序 CreateUpdateBookDto, //用于创建书籍 - CreateUpdateBookDto> //用户更新书籍 + CreateUpdateBookDto> //用于更新书籍 { } } ```` -* 为应用服务定义接口不是必须的,不过,我们推荐这么做. +* 为应用服务定义接口不是必须的,不过,这是推荐的最佳实践. * `IAsyncCrudAppService`中定义了基础的 **CRUD**方法:`GetAsync`, `GetListAsync`, `CreateAsync`, `UpdateAsync` 和 `DeleteAsync`.不需要扩展它.取而代之,你可以继承空的`IApplicationService`接口定义你自己的方法. * `IAsyncCrudAppService`有一些变体,你可以为每一个方法使用单个或者多个的DTO.(译者注:意思是类似EntityDto和UpdateEntityDto可以用同一个,也可以分别单独指定 ) @@ -231,14 +243,14 @@ namespace Acme.BookStore ```` * `BookAppService`继承了`AsyncCrudAppService<...>`.`AsyncCrudAppService<...>`实现了上面定义的CRUD方法. -* `BookAppService`注入了`IRepository`,`IRepository`是默认为`Book`创建的仓储.ABP会自动为每一个聚合根(或实体)创建仓储.参考[仓储](../../Repositories.md). -* `BookAppService`使用了 `IObjectMapper` 将`Book`转换成`BookDto`,将`CreateUpdateBookDto`转换成`Book`.启动模板中使用了[AutoMapper](http://automapper.org/)作为映射工具.你可以像上面那样使用`AutoMapFrom` 和 `AutoMapTo`定义映射.查看[AutoMapper继承](../../AutoMapper-Integration.md)获取更多信息. +* `BookAppService`注入了`IRepository`,`IRepository`是默认为`Book`创建的仓储.ABP会自动为每一个聚合根(或实体)创建仓储.参考[仓储文档](../../Repositories.md). +* `BookAppService`使用了 `IObjectMapper` 将`Book`转换成`BookDto`,将`CreateUpdateBookDto`转换成`Book`.启动模板中使用了[AutoMapper](http://automapper.org/)作为对象映射提供程序.你可以像上面那样使用`AutoMapFrom` 和 `AutoMapTo`定义映射.查看[AutoMapper集成文档](../../AutoMapper-Integration.md)获取更多信息. ### 自动生成API Controllers 你通常需要创建 **Controllers** 将应用服务暴露为 **HTTP API**.这样浏览器或第三方客户端可以通过AJAX的方式访问它们. -ABP可以 **自动地** (../../AspNetCore/Auto-API-Controllers.md)将应用服务转换成MVC API Controllers. +ABP可以通过约定[**自动**](../../AspNetCore/Auto-API-Controllers.md)将应用服务转换成MVC API Controllers. #### Swagger UI @@ -250,13 +262,13 @@ ABP可以 **自动地** (../../AspNetCore/Auto-API-Controllers.md)将应用服 ### 动态JavaScript代理 -通过AJAX的方式调用HTTP API接口是很常见的,你可以使用`$.ajax`或这其他的工具来调用接口.当然,ABP中提供了更好的方式. +在Javascript端通过AJAX的方式调用HTTP API接口是很常见的,你可以使用`$.ajax`或这其他的工具来调用接口.当然,ABP中提供了更好的方式. ABP **自动** 为所有的API接口创建了JavaScript **代理**.因此,你可以像调用 **JavaScript function**一样调用任何接口. #### 在浏览器的开发者控制台中测试接口 -你可以使用你最爱的浏览器的 **开发者控制台** 中轻松测试JavaScript代理.运行程序,并打开浏览器的 **开发者工具**(快捷键:F12),切换到 **Console**,输入下面的代码并回车: +你可以使用你钟爱的浏览器的 **开发者控制台** 中轻松测试JavaScript代理.运行程序,并打开浏览器的 **开发者工具**(快捷键:F12),切换到 **Console** 标签,输入下面的代码并回车: ````js acme.bookStore.book.getList({}).done(function (result) { console.log(result); }); @@ -265,14 +277,14 @@ acme.bookStore.book.getList({}).done(function (result) { console.log(result); }) * `acme.bookStore`是`BookAppService`的命名空间,转换成了[驼峰命名](https://en.wikipedia.org/wiki/Camel_case). * `book`是`BookAppService`转换后的名字(去除了AppService后缀并转成了驼峰命名). * `getList`是定义在`AsyncCrudAppService`基类中的`GetListAsync`方法转换后的名字(去除了Async后缀并转成了驼峰命名). -* `{}`参数用来传递一个空的对象给`GetListAsync`方法.GetListAsync期望的参数是`PagedAndSortedResultRequestDto`类型,`PagedAndSortedResultRequestDto`类型中定义了分页和排序. +* `{}`参数用来传递一个空的对象给`GetListAsync`方法.GetListAsync期望的参数是`PagedAndSortedResultRequestDto`类型的对象,`PagedAndSortedResultRequestDto`类型中定义了分页和排序选项. * `getList`方法返回了一个`promise`.因此,你可以传递一个回调函数到`done`(或者`then`)方法中来获取服务返回的结果. 运行这段代码会产生下面的输出: ![bookstore-test-js-proxy-getlist](images/bookstore-test-js-proxy-getlist.png) -你可以看到服务器返回的 **book list**.你还可以切换到开发者工具的 **network** 查看客户端和服务器的连接: +你可以看到服务器返回的 **book list**.你还可以切换到开发者工具的 **network** 查看客户端到服务器端的通讯信息: ![bookstore-test-js-proxy-getlist-network](images/bookstore-test-js-proxy-getlist-network.png) @@ -292,10 +304,10 @@ successfully created the book with id: f3f03580-c1aa-d6a9-072d-39e75c69f5c7 ### 创建书籍页面 -现在我们来创建一些可见的可用的东西,我们使用[Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start)代替经典的MVC.微软也推荐使用Razor Pages UI +现在我们来创建一些可见和可用的东西,取代经典的MVC,我们使用微软推荐的[Razor Pages UI](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start). -在 `Acme.BookStore.Web`项目的`Pages`文件夹下创建一个新的文件夹叫`Books`并添加一个名叫`Index.cshtml`的Razor Page. +在 `Acme.BookStore.Web`项目的`Pages`文件夹下创建一个新的文件夹叫`Books`并添加一个名为`Index.cshtml`的Razor Page. ![bookstore-add-index-page](images/bookstore-add-index-page.png) @@ -310,7 +322,7 @@ successfully created the book with id: f3f03580-c1aa-d6a9-072d-39e75c69f5c7

Books

```` -* 改变Razor View Page Model默认的继承,使页面的 **inherits** 来自`BookStorePageBase`类(代替`PageModel`).`BookStorePageBase`类来自启动模板并提供了一些公开的属性/方法,这些属性/方法可以被所有的页面使用. +* 修改Razor View Page Model的默认继承,使页面 **继承** 自`BookStorePageBase`类(代替`PageModel`).`BookStorePageBase`类来自于启动模板,它提供了一些公开的可以被所有的页面使用的属性/方法. #### 将Books页面添加到主菜单 @@ -349,11 +361,11 @@ context.Menu.AddItem( ![bookstore-menu-items](images/bookstore-menu-items.png) -点击菜单就会调转到新增书籍的页面. +点击Books菜单项就会跳转到新增的书籍页面. #### 书籍列表 -我们会在页面上使用JQuery插件[Datatables.net](https://datatables.net/)来展示列表.Datatables可以完全通过AJAX工作,所以它很快而且有良好的用户体验.启动模板中已经配置好了Datatables,因此你可以在你的页面中直接使用,不需要引用样式和脚本文件. +我们会在页面上使用JQuery插件[Datatables.net](https://datatables.net/)来展示列表.Datatables可以完全通过AJAX工作,所以它很快而且有良好的用户体验.启动模板中已经配置好了Datatables插件,因此你可以在你的页面中直接使用,不需要引用样式和脚本文件. ##### 修改Index.cshtml @@ -388,7 +400,7 @@ context.Menu.AddItem( ```` -* `abp-script` [tag helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro)可以将添加外部的 **scripts**添加到页面中.它比标准的`script`标签多了很多额外的功能.它可以处理 **最小化**和 **版本**.查看[bundling & minification 文档](../../AspNetCore/Bundling-Minification.md)获取更多信息. +* `abp-script` [tag helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro)用于将外部的 **脚本** 添加到页面中.它比标准的`script`标签多了很多额外的功能.它可以处理 **最小化**和 **版本**.查看[捆绑 & 压缩文档](../../AspNetCore/Bundling-Minification.md)获取更多信息. * `abp-card` 和 `abp-table` 是为Twitter Bootstrap的[card component](http://getbootstrap.com/docs/4.1/components/card/)封装的 **tag helpers**.ABP中有很多tag helpers,可以很方便的使用大多数[bootstrap](https://getbootstrap.com/)组件.你也可以使用原生的HTML标签代替tag helpers.使用tag helper可以通过智能提示和编译时类型检查减少HTML代码并防止错误.查看[tag helpers 文档](../../AspNetCore/Tag-Helpers.md). * 你可以像上面本地化菜单一样 **本地化** 列名. diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md index a7334030a6..9e54ac7a2f 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md @@ -53,9 +53,9 @@ namespace Acme.BookStore.Pages.Books } ```` -* 这个类继承了 `BookStorePageModelBase` 而非默认的 `PageModel`. `BookStorePageModelBase` 继承了 `PageModel` 并且添加了一些Razor页面模型通用的属性和方法. -* 该类在 `Book` 属性上标记的 `[BindProperty]` 特性绑定了post请求提交上来的数据. -* 该类通过构造函数注入了 `IBookAppService` 应用服务,并且在 `OnPostAsync` 方法中调用了服务的 `CreateAsync` 方法. +* 该类派生于 `BookStorePageModelBase` 而非默认的 `PageModel`. `BookStorePageModelBase` 继承了 `PageModel` 并且添加了一些可以被你的page model类使用的通用属性和方法. +* `Book` 属性上的 `[BindProperty]` 特性将post请求提交上来的数据绑定到该属性上. +* 该类通过构造函数注入了 `IBookAppService` 应用服务,并且在 `OnPostAsync` 处理程序中调用了服务的 `CreateAsync` 方法. ##### CreateModal.cshtml @@ -82,7 +82,7 @@ namespace Acme.BookStore.Pages.Books * 这个 modal 使用 `abp-dynamic-form` Tag Helper 根据 `CreateBookViewModel` 类自动构建了表单. * `abp-model` 指定了 `Book` 属性为模型对象. - * `data-ajaxForm` 设置了表单通过AJAX提交. + * `data-ajaxForm` 设置了表单通过AJAX提交,而不是经典的页面回发. * `abp-form-content` tag helper 作为表单控件渲染位置的占位符 (这是可选的,只有你在 `abp-dynamic-form` 中像本示例这样添加了其他内容才需要). #### 添加 "New book" 按钮 @@ -211,7 +211,7 @@ namespace Acme.BookStore } ```` -* 仅仅是添加 `[AutoMapFrom(typeof(BookDto))]` 特性就可以创建上述映射关系. +* 仅添加 `[AutoMapFrom(typeof(BookDto))]` 特性就可以创建上述映射关系. #### EditModal.cshtml @@ -238,9 +238,9 @@ namespace Acme.BookStore ```` -除了以下几点,这个页面内容和 `CreateModal.cshtml` 非常相似: +这个页面内容和 `CreateModal.cshtml` 非常相似,除了以下几点: -* 此页面包含了一个 `abp-input` 以保存所编辑book实体的 `Id` 属性. +* 此页面包含了一个 `abp-input` 以保存所编辑book实体的 `Id` 属性值. * 此页面指定的post地址是 `Books/EditModal` ,并用文本 *Update* 作为 modal 标题. #### 为表格添加 "操作(Actions)" 下拉菜单 @@ -325,8 +325,8 @@ $(function () { ```` * 通过 `abp.localization.getResource('BookStore')` 可以在客户端使用服务器端定义的相同的本地化语言文本. -* 定义 `editModal` 为 `ModalManager` 来打开编辑用的 modal 对话框. -* 在 `columnDefs` 起始处新增一列作为 "Actions" 下拉按钮. +* 添加了一个名为 `editModal` 的新的 `ModalManager` 来打开编辑用的 modal 对话框. +* 在 `columnDefs` 起始处新增一列用于显示 "Actions" 下拉按钮. * "Edit" 操作只是简单调用 `editModal.open` 来打开编辑对话框. 现在,你可以运行程序,通过编辑操作来更新任一个book实体. @@ -354,7 +354,7 @@ $(function () { * `confirmMessage` 用来在实际执行 `action` 之前向用户进行确认. * 通过javascript代理方法 `acme.bookStore.book.delete` 执行一个AJAX请求来删除一个book实体. -* `abp.notify.info` 用来提示用户操作成功. +* `abp.notify.info` 用来在执行删除操作后显示一个toastr通知信息. 最终的 `index.js` 文件内容如下所示: diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md index 0514c8fc1a..80c28acc91 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md @@ -58,7 +58,7 @@ namespace Acme.BookStore } ```` -* 这里直接使用了identity模块实现的 `IIdentityDataSeeder` 接口,创建了一个admin角色和admin用户.你同样可以在你的测试代码中直接使用这些代码. +* 这里直接使用了identity模块实现的 `IIdentityDataSeeder` 接口,创建了一个admin角色和admin用户.你可以在测试代码中使用它们. * 你可以在 `BuildInternalAsync` 方法中添加你自己的测试数据. 按下方所示修改 `BookStoreTestDataBuilder` 类: diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 6c6608315e..10be5a757d 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -1,7 +1,7 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2036 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.156 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}" EndProject @@ -215,6 +215,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Features", "src\Vo EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.Features.Tests", "test\Volo.Abp.Features.Tests\Volo.Abp.Features.Tests.csproj", "{575BEFA1-19C2-49B1-8D31-B5D4472328DE}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp", "src\Volo.Abp\Volo.Abp.csproj", "{6C161F55-54B6-42A5-B177-3B0ED50323C1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Authentication.JwtBearer", "src\Volo.Abp.AspNetCore.Authentication.JwtBearer\Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj", "{46C6336C-A1D8-4858-98CE-6F4C698C5A77}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Cli", "src\Volo.Abp.Cli\Volo.Abp.Cli.csproj", "{69168816-4394-4DDA-BB6B-C21983D37F0B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.FluentValidation", "src\Volo.Abp.FluentValidation\Volo.Abp.FluentValidation.csproj", "{43D5FE61-ECBF-4B16-AD95-0043E18EB93A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.FluentValidation.Tests", "test\Volo.Abp.FluentValidation.Tests\Volo.Abp.FluentValidation.Tests.csproj", "{E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -637,6 +647,26 @@ Global {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Debug|Any CPU.Build.0 = Debug|Any CPU {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Release|Any CPU.Build.0 = Release|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Release|Any CPU.Build.0 = Release|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Release|Any CPU.Build.0 = Release|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Release|Any CPU.Build.0 = Release|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Release|Any CPU.Build.0 = Release|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -746,6 +776,11 @@ Global {88F6D091-CA16-4B71-9499-8D5B8FA2E712} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {575BEFA1-19C2-49B1-8D31-B5D4472328DE} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {6C161F55-54B6-42A5-B177-3B0ED50323C1} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {46C6336C-A1D8-4858-98CE-6F4C698C5A77} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {69168816-4394-4DDA-BB6B-C21983D37F0B} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Microsoft/AspNetCore/Builder/JwtTokenMiddleware.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Microsoft/AspNetCore/Builder/JwtTokenMiddleware.cs new file mode 100644 index 0000000000..4ff54f39bf --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Microsoft/AspNetCore/Builder/JwtTokenMiddleware.cs @@ -0,0 +1,25 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.JwtBearer; + +namespace Microsoft.AspNetCore.Builder +{ + public static class ApplicationBuilderAbpJwtTokenMiddlewareExtension + { + public static IApplicationBuilder UseJwtTokenMiddleware(this IApplicationBuilder app, string schema = JwtBearerDefaults.AuthenticationScheme) + { + return app.Use(async (ctx, next) => + { + if (ctx.User.Identity?.IsAuthenticated != true) + { + var result = await ctx.AuthenticateAsync(schema); + if (result.Succeeded && result.Principal != null) + { + ctx.User = result.Principal; + } + } + + await next(); + }); + } + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj new file mode 100644 index 0000000000..7d8a961507 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj @@ -0,0 +1,24 @@ + + + + + + netstandard2.0 + Volo.Abp.AspNetCore.Authentication.JwtBearer + Volo.Abp.AspNetCore.Authentication.JwtBearer + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + + + + + diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs new file mode 100644 index 0000000000..8698e2283d --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer/Volo/Abp/AspNetCore/Authentication/JwtBearer/AbpAspNetCoreAuthenticationJwtBearerModule.cs @@ -0,0 +1,11 @@ +using Volo.Abp.Modularity; +using Volo.Abp.Security; + +namespace Volo.Abp.AspNetCore.Authentication.JwtBearer +{ + [DependsOn(typeof(AbpSecurityModule))] + public class AbpAspNetCoreAuthenticationJwtBearerModule : AbpModule + { + + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj index 722b6033ed..54c93df3ec 100644 --- a/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj +++ b/framework/src/Volo.Abp.AspNetCore.Authentication.OAuth/Volo.Abp.AspNetCore.Authentication.OAuth.csproj @@ -1,4 +1,4 @@ - + @@ -14,7 +14,6 @@
- diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs index 566cbcffbc..53c56295ce 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/AbpTagHelperService.cs @@ -17,13 +17,11 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers where TTagHelper : TagHelper { protected const string FormGroupContents = "FormGroupContents"; - protected const string NavItemContents = "FormGroupContents"; protected const string TabItems = "TabItems"; protected const string AccordionItems = "AccordionItems"; protected const string BreadcrumbItemsContent = "BreadcrumbItemsContent"; protected const string CarouselItemsContent = "CarouselItemsContent"; protected const string TabItemsDataTogglePlaceHolder = "{_data_toggle_Placeholder_}"; - protected const string TabItemsVerticalPillPlaceHolder = "{_vertical_pill_Placeholder_}"; protected const string TabItemNamePlaceHolder = "{_Tab_Tag_Name_Placeholder_}"; protected const string AbpFormContentPlaceHolder = "{_AbpFormContentPlaceHolder_}"; protected const string AbpTabItemActivePlaceholder = "{_Tab_Active_Placeholder_}"; @@ -31,9 +29,6 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers protected const string AbpTabItemShowActivePlaceholder = "{_Tab_Show_Active_Placeholder_}"; protected const string AbpBreadcrumbItemActivePlaceholder = "{_Breadcrumb_Active_Placeholder_}"; protected const string AbpCarouselItemActivePlaceholder = "{_CarouselItem_Active_Placeholder_}"; - protected const string AbpNavItemActivePlaceholder = "{_NavItem_Active_Placeholder_}"; - protected const string AbpNavItemResponsiveFlexPlaceholder = "{_NavItem_Responsive_Flex_Placeholder_}"; - protected const string AbpNavItemResponsiveAlignPlaceholder = "{_NavItem_Responsive_Align_Placeholder_}"; protected const string AbpTabItemSelectedPlaceholder = "{_Tab_Selected_Placeholder_}"; protected const string AbpAccordionParentIdPlaceholder = "{_Parent_Accordion_Id_}"; diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs index 5a095d561c..cd3294d66f 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bootstrap/TagHelpers/Form/AbpSelectTagHelperService.cs @@ -124,8 +124,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form return GetLabelAsHtmlUsingTagHelper(context, output) + GetRequiredSymbol(context, output); } - - + protected virtual string GetRequiredSymbol(TagHelperContext context, TagHelperOutput output) { if (!TagHelper.DisplayRequiredSymbol) diff --git a/framework/src/Volo.Abp.Cli/Program.cs b/framework/src/Volo.Abp.Cli/Program.cs new file mode 100644 index 0000000000..5e9dcd4006 --- /dev/null +++ b/framework/src/Volo.Abp.Cli/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace Volo.Abp.Cli +{ + public class Program + { + private static void Main(string[] args) + { + Console.WriteLine("Welcome to ABP CLI..! This tool is in development. There is no functionality yet. So, bye bye... ;)"); + } + } +} diff --git a/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj new file mode 100644 index 0000000000..29b80cb98a --- /dev/null +++ b/framework/src/Volo.Abp.Cli/Volo.Abp.Cli.csproj @@ -0,0 +1,12 @@ + + + + + + Exe + netcoreapp2.2 + true + abp + + + diff --git a/framework/src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.csproj b/framework/src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.csproj new file mode 100644 index 0000000000..12084177a9 --- /dev/null +++ b/framework/src/Volo.Abp.FluentValidation/Volo.Abp.FluentValidation.csproj @@ -0,0 +1,24 @@ + + + + + + netstandard2.0 + Volo.Abp.FluentValidation + Volo.Abp.FluentValidation + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + + + + + + diff --git a/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/AbpFluentValidationConventionalRegistrar.cs b/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/AbpFluentValidationConventionalRegistrar.cs new file mode 100644 index 0000000000..9641b438b0 --- /dev/null +++ b/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/AbpFluentValidationConventionalRegistrar.cs @@ -0,0 +1,46 @@ +using System; +using FluentValidation; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.FluentValidation +{ + public class AbpFluentValidationConventionalRegistrar : DefaultConventionalRegistrar + { + public override void AddType(IServiceCollection services, Type type) + { + if (!typeof(IValidator).IsAssignableFrom(type)) + { + return; + } + + var validatingType = GetFirstGenericArgumentOrNull(type, 1); + if (validatingType == null) + { + return; + } + + services.AddTransient( + typeof(IValidator<>).MakeGenericType(validatingType), + type + ); + } + + private static Type GetFirstGenericArgumentOrNull(Type type, int depth) + { + const int maxFindDepth = 8; + + if (depth >= maxFindDepth) + { + return null; + } + + if (type.IsGenericType && type.GetGenericArguments().Length >= 1) + { + return type.GetGenericArguments()[0]; + } + + return GetFirstGenericArgumentOrNull(type.BaseType, depth + 1); + } + } +} diff --git a/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/AbpFluentValidationModule.cs b/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/AbpFluentValidationModule.cs new file mode 100644 index 0000000000..bbd5d2c888 --- /dev/null +++ b/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/AbpFluentValidationModule.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; +using Volo.Abp.Validation; + +namespace Volo.Abp.FluentValidation +{ + [DependsOn( + typeof(AbpValidationModule) + )] + public class AbpFluentValidationModule : AbpModule + { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddConventionalRegistrar(new AbpFluentValidationConventionalRegistrar()); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.MethodValidationContributors.Add(); + }); + } + } +} diff --git a/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/FluentMethodInvocationValidator.cs b/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/FluentMethodInvocationValidator.cs new file mode 100644 index 0000000000..0868093181 --- /dev/null +++ b/framework/src/Volo.Abp.FluentValidation/Volo/Abp/FluentValidation/FluentMethodInvocationValidator.cs @@ -0,0 +1,55 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using FluentValidation; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Validation; + +namespace Volo.Abp.FluentValidation +{ + public class FluentMethodInvocationValidator : IMethodInvocationValidator, ITransientDependency + { + private readonly IServiceProvider _serviceProvider; + + public FluentMethodInvocationValidator( + IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public void Validate(MethodInvocationValidationContext context) + { + var validationResult = new AbpValidationResult(); + + foreach (var parameterValue in context.ParameterValues) + { + var serviceType = typeof(IValidator<>).MakeGenericType(parameterValue.GetType()); + var validator = _serviceProvider.GetService(serviceType) as IValidator; + if (validator == null) + { + continue; + } + + var result = validator.Validate(parameterValue); + if (!result.IsValid) + { + validationResult.Errors.AddRange( + result.Errors.Select( + error => + new ValidationResult(error.ErrorMessage) + ) + ); + } + } + + if (validationResult.Errors.Any()) + { + //TODO: How to localize messages? + throw new AbpValidationException( + "Method arguments are not valid! See ValidationErrors for details.", + context.Errors + ); + } + } + } +} diff --git a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs index 936bcd5fd3..1a79d4308a 100644 --- a/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs +++ b/framework/src/Volo.Abp.Http.Client/Volo/Abp/Http/Client/DynamicProxying/DynamicHttpProxyInterceptor.cs @@ -225,7 +225,11 @@ namespace Volo.Abp.Http.Client.DynamicProxying } //TODO: Is that the way we want? Couldn't send the culture (not ui culture) - requestMessage.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(CultureInfo.CurrentUICulture.Name)); + var currentCulture = CultureInfo.CurrentUICulture.Name ?? CultureInfo.CurrentCulture.Name; + if (!currentCulture.IsNullOrEmpty()) + { + requestMessage.Headers.AcceptLanguage.Add(new StringWithQualityHeaderValue(currentCulture)); + } } private string GetConfiguredApiVersion() diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json index 54c573857a..67d6fa7d3c 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/pt-BR.json @@ -45,6 +45,7 @@ "PagerShowMenuEntries": "Mostrando _MENU_ registros", "DatatableActionDropdownDefaultText": "Ações", "ChangePassword": "Alterar Senha", - "PersonalInfo": "Perfil" + "PersonalInfo": "Perfil", + "AreYouSureYouWantToCancelEditingWarningMessage": "Você tem alterações não salvas." } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json index f1814efdb3..8747d1dc8d 100644 --- a/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json +++ b/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/zh-Hans.json @@ -45,6 +45,7 @@ "PagerShowMenuEntries": "显示 _MENU_ 实体", "DatatableActionDropdownDefaultText": "操作", "ChangePassword": "修改密码", - "PersonalInfo": "个人信息" + "PersonalInfo": "个人信息", + "AreYouSureYouWantToCancelEditingWarningMessage": "你有未保存的更改." } } diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationModule.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationModule.cs index 03efe9d66a..f47594a88a 100644 --- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationModule.cs +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationModule.cs @@ -9,5 +9,13 @@ namespace Volo.Abp.Validation { context.Services.OnRegistred(ValidationInterceptorRegistrar.RegisterIfNeeded); } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.MethodValidationContributors.Add(); + }); + } } } diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IValidationConfiguration.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationOptions.cs similarity index 57% rename from framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IValidationConfiguration.cs rename to framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationOptions.cs index 7040be55bc..c88449da1a 100644 --- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IValidationConfiguration.cs +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/AbpValidationOptions.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Volo.Abp.Collections; namespace Volo.Abp.Validation { @@ -7,9 +8,12 @@ namespace Volo.Abp.Validation { public List IgnoredTypes { get; } + public ITypeList MethodValidationContributors { get; set; } + public AbpValidationOptions() { IgnoredTypes = new List(); + MethodValidationContributors = new TypeList(); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IMethodInvocationValidator.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IMethodInvocationValidator.cs index 218ad9313d..fd413bc498 100644 --- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IMethodInvocationValidator.cs +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/IMethodInvocationValidator.cs @@ -1,7 +1,7 @@ -namespace Volo.Abp.Validation +namespace Volo.Abp.Validation { public interface IMethodInvocationValidator { void Validate(MethodInvocationValidationContext context); } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/ValidationInterceptor.cs b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/ValidationInterceptor.cs index 86d58e89a3..3b5d519c0c 100644 --- a/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/ValidationInterceptor.cs +++ b/framework/src/Volo.Abp.Validation/Volo/Abp/Validation/ValidationInterceptor.cs @@ -1,4 +1,7 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.Aspects; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; @@ -7,11 +10,13 @@ namespace Volo.Abp.Validation { public class ValidationInterceptor : AbpInterceptor, ITransientDependency { - private readonly IMethodInvocationValidator _validator; + private readonly AbpValidationOptions _abpValidationOptions; + private readonly IServiceProvider _serviceProvider; - public ValidationInterceptor(IMethodInvocationValidator validator) + public ValidationInterceptor(IServiceProvider serviceProvider, IOptions abpValidationOptions) { - _validator = validator; + _serviceProvider = serviceProvider; + _abpValidationOptions = abpValidationOptions.Value; } public override void Intercept(IAbpMethodInvocation invocation) @@ -42,13 +47,18 @@ namespace Volo.Abp.Validation protected virtual void Validate(IAbpMethodInvocation invocation) { - _validator.Validate( - new MethodInvocationValidationContext( - invocation.TargetObject, - invocation.Method, - invocation.Arguments - ) - ); + foreach (var validationContributor in _abpValidationOptions.MethodValidationContributors) + { + var validator = (IMethodInvocationValidator) _serviceProvider.GetRequiredService(validationContributor); + + validator.Validate( + new MethodInvocationValidationContext( + invocation.TargetObject, + invocation.Method, + invocation.Arguments + ) + ); + } } } } diff --git a/framework/src/Volo.Abp/README.md b/framework/src/Volo.Abp/README.md new file mode 100644 index 0000000000..3dee8799a1 --- /dev/null +++ b/framework/src/Volo.Abp/README.md @@ -0,0 +1,3 @@ +# Volo.Abp + +This package is a name holder. It just references to the `Volo.Abp.Core` package. \ No newline at end of file diff --git a/framework/src/Volo.Abp/Volo.Abp.csproj b/framework/src/Volo.Abp/Volo.Abp.csproj new file mode 100644 index 0000000000..b3cf4f5752 --- /dev/null +++ b/framework/src/Volo.Abp/Volo.Abp.csproj @@ -0,0 +1,19 @@ + + + + + + netstandard2.0 + Volo.Abp + Volo.Abp + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + + + + + + \ No newline at end of file diff --git a/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj b/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj new file mode 100644 index 0000000000..ab2f82eefa --- /dev/null +++ b/framework/test/Volo.Abp.FluentValidation.Tests/Volo.Abp.FluentValidation.Tests.csproj @@ -0,0 +1,21 @@ + + + + netcoreapp2.2 + Volo.Abp.FluentValidation.Tests + Volo.Abp.FluentValidation.Tests + true + false + false + false + + + + + + + + + + + diff --git a/framework/test/Volo.Abp.FluentValidation.Tests/Volo/Abp/FluentValidation/ApplicationService_FluentValidation_Tests.cs b/framework/test/Volo.Abp.FluentValidation.Tests/Volo/Abp/FluentValidation/ApplicationService_FluentValidation_Tests.cs new file mode 100644 index 0000000000..467a45a999 --- /dev/null +++ b/framework/test/Volo.Abp.FluentValidation.Tests/Volo/Abp/FluentValidation/ApplicationService_FluentValidation_Tests.cs @@ -0,0 +1,206 @@ +using System.Threading.Tasks; +using FluentValidation; +using Microsoft.Extensions.DependencyInjection; +using Shouldly; +using Volo.Abp.Autofac; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Modularity; +using Volo.Abp.Validation; +using Xunit; + +namespace Volo.Abp.FluentValidation +{ + public class ApplicationService_FluentValidation_Tests : AbpIntegratedTest + { + private readonly IMyAppService _myAppService; + + public ApplicationService_FluentValidation_Tests() + { + _myAppService = ServiceProvider.GetRequiredService(); + } + + protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options) + { + options.UseAutofac(); + } + + [Fact] + public async Task Should_Work_Proper_With_Right_Inputs() + { + // MyStringValue should be aaa, MyStringValue2 should be bbb. MyStringValue3 should be ccc + var output = _myAppService.MyMethod(new MyMethodInput + { + MyStringValue = "aaa", + MyMethodInput2 = new MyMethodInput2 + { + MyStringValue2 = "bbb" + }, + MyMethodInput3 = new MyMethodInput3 + { + MyStringValue3 = "ccc" + } + }); + output.ShouldBe("aaabbbccc"); + + var asyncOutput = await _myAppService.MyMethodAsync(new MyMethodInput + { + MyStringValue = "aaa", + MyMethodInput2 = new MyMethodInput2 + { + MyStringValue2 = "bbb" + }, + MyMethodInput3 = new MyMethodInput3 + { + MyStringValue3 = "ccc" + } + }); + + asyncOutput.ShouldBe("aaabbbccc"); + } + + [Fact] + public async Task Should_Not_Work_With_Wrong_Inputs() + { + // MyStringValue should be aaa, MyStringValue2 should be bbb. MyStringValue3 should be ccc + + Assert.Throws(() => _myAppService.MyMethod(new MyMethodInput + { + MyStringValue = "a", + MyMethodInput2 = new MyMethodInput2 + { + MyStringValue2 = "b" + }, + MyMethodInput3 = new MyMethodInput3 + { + MyStringValue3 = "c" + } + })); + + await Assert.ThrowsAsync(async () => await _myAppService.MyMethodAsync( + new MyMethodInput + { + MyStringValue = "a", + MyMethodInput2 = new MyMethodInput2 + { + MyStringValue2 = "b" + }, + MyMethodInput3 = new MyMethodInput3 + { + MyStringValue3 = "c" + } + })); + } + + [Fact] + public void NotValidateMyMethod_Test() + { + var output = _myAppService.NotValidateMyMethod(new MyMethodInput4 + { + MyStringValue4 = "444" + }); + + output.ShouldBe("444"); + } + + + [DependsOn(typeof(AbpAutofacModule))] + [DependsOn(typeof(AbpFluentValidationModule))] + public class TestModule : AbpModule + { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + context.Services.OnRegistred(onServiceRegistredContext => + { + if (typeof(IMyAppService).IsAssignableFrom(onServiceRegistredContext.ImplementationType)) + { + onServiceRegistredContext.Interceptors.TryAdd(); + } + }); + } + + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddType(); + } + } + + public interface IMyAppService + { + string MyMethod(MyMethodInput input); + + Task MyMethodAsync(MyMethodInput input); + + string NotValidateMyMethod(MyMethodInput4 input); + } + + public class MyAppService : IMyAppService, ITransientDependency + { + public string MyMethod(MyMethodInput input) + { + return input.MyStringValue + input.MyMethodInput2.MyStringValue2 + input.MyMethodInput3.MyStringValue3; + } + + public Task MyMethodAsync(MyMethodInput input) + { + return Task.FromResult(input.MyStringValue + input.MyMethodInput2.MyStringValue2 + + input.MyMethodInput3.MyStringValue3); + } + + public string NotValidateMyMethod(MyMethodInput4 input) + { + return input.MyStringValue4; + } + } + + public class MyMethodInput + { + public string MyStringValue { get; set; } + + public MyMethodInput2 MyMethodInput2 { get; set; } + + public MyMethodInput3 MyMethodInput3 { get; set; } + } + + public class MyMethodInput2 + { + public string MyStringValue2 { get; set; } + } + + public class MyMethodInput3 + { + + public string MyStringValue3 { get; set; } + } + + public class MyMethodInput4 + { + public string MyStringValue4 { get; set; } + } + + public class MyMethodInputValidator : AbstractValidator + { + public MyMethodInputValidator() + { + RuleFor(x => x.MyStringValue).Equal("aaa"); + RuleFor(x => x.MyMethodInput2.MyStringValue2).Equal("bbb"); + RuleFor(customer => customer.MyMethodInput3).SetValidator(new MyMethodInput3Validator()); + } + } + + public class MethodInputBaseValidator : AbstractValidator + { + public MethodInputBaseValidator() + { + RuleFor(x => x.MyStringValue3).NotNull(); + } + } + + public class MyMethodInput3Validator : MethodInputBaseValidator + { + public MyMethodInput3Validator() + { + RuleFor(x => x.MyStringValue3).Equal("ccc"); + } + } + } +} \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.cshtml b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.cshtml index c9b8f8e549..c2aebc7192 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.cshtml +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.cshtml @@ -23,35 +23,6 @@ }
- @*
-
-
-
-

- @Model.Blog.Name - - @if (string.IsNullOrWhiteSpace(Model.TagName)) - { - @L["BLOG"] - } - else - { - @Html.Raw("#")@Model.TagName - } - -

-
-
-
- @if (await Authorization.IsGrantedAsync(BloggingPermissions.Posts.Create)) - { - @L["CreateANewPost"] - | - } -
-
-
-
*@
@@ -76,7 +47,7 @@ @post.Title

- @Html.Raw(GetShortContent(post.Content))) + @Html.Raw(GetShortContent(post.Content))

@L["ContinueReading"] diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.css b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.css new file mode 100644 index 0000000000..8b6fe32434 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.css @@ -0,0 +1,4 @@ +.vs-blog .hero-section .hero-article-img { + min-height: 480px; + background: center center no-repeat; + background-size: cover; } diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.min.css b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.min.css new file mode 100644 index 0000000000..9305116183 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.min.css @@ -0,0 +1 @@ +.vs-blog .hero-section .hero-article-img{min-height:480px;background:center center no-repeat;background-size:cover;} \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.scss b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.scss new file mode 100644 index 0000000000..d887474302 --- /dev/null +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Posts/Index.scss @@ -0,0 +1,10 @@ +.vs-blog { + .hero-section { + .hero-article-img { + min-height: 480px; + background: center center no-repeat; + background-size: cover; + } + + } +} diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.css b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.css index cb11960907..918d409539 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.css +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.css @@ -43,7 +43,7 @@ display: inline-block; border-radius: 50%; } .hero-section .hero-articles .img-container { - background: black; } + min-height: 320px; } .hero-section .hero-articles .img-container img { filter: grayscale(10%); } .hero-section .hero-articles .img-container::after { @@ -54,7 +54,7 @@ bottom: 0px; width: 100%; top: 1% !important; - background: linear-gradient(to bottom, transparent 0, rgba(0, 0, 0, 0.91) 89%, rgba(0, 0, 0, 0.93) 93%) !important; + background: linear-gradient(to bottom, transparent 0, rgba(0, 0, 0, 0.75) 89%, rgba(0, 0, 0, 0.78) 93%) !important; transition: .2s all ease-in-out; opacity: .9; } .hero-section .hero-articles:hover .img-container::after { @@ -136,5 +136,5 @@ .img-container { position: relative; overflow: hidden; - border-radius: 4px; } - + border-radius: 4px; + background: gainsboro; } diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.min.css b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.min.css index b01dc9344d..8a2ea9b03a 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.min.css +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.min.css @@ -1 +1 @@ -.hero-section{padding:0;}.hero-section .hero-articles{position:relative;overflow:hidden;}.hero-section .hero-articles .hero-content{position:absolute;left:12%;right:12%;bottom:80px;z-index:4;text-align:center;}.hero-section .hero-articles .hero-content h2{margin-top:0;font-size:2.5em;font-weight:bold;}.hero-section .hero-articles .hero-content a{color:#fff;text-shadow:0 0 20px rgba(0,0,0,.5);}.hero-section .hero-articles .hero-content p{color:#fff;}.hero-section .hero-articles .tags .tag{background:rgba(208,208,208,.3);color:#fff !important;}.hero-section .hero-articles .tags .tag:hover{background:#fff;color:#000 !important;}.hero-section .hero-articles .article-owner{text-align:center;position:relative;z-index:12;}.hero-section .hero-articles .article-owner .article-infos{color:#000;}.hero-section .hero-articles .article-owner .article-infos a{color:#000;}.hero-section .hero-articles .article-owner .article-infos .seperator{margin:0 4px;color:rgba(255,255,255,.2);}.hero-section .hero-articles .article-owner .article-infos img.article-avatar{width:64px;margin:-25px 10px 0 0;border:3px solid #fff;display:inline-block;border-radius:50%;}.hero-section .hero-articles .img-container{background:#000;}.hero-section .hero-articles .img-container img{filter:grayscale(10%);}.hero-section .hero-articles .img-container::after{content:"";display:block;position:absolute;z-index:1;bottom:0;width:100%;top:1% !important;background:linear-gradient(to bottom,transparent 0,rgba(0,0,0,.91) 89%,rgba(0,0,0,.93) 93%) !important;transition:.2s all ease-in-out;opacity:.9;}.hero-section .hero-articles:hover .img-container::after{opacity:1;}.article-owner .article-infos{color:#000;}.article-owner .article-infos a{color:rgba(0,0,0,.6);}.article-owner .article-infos .seperator{margin:0 4px;color:rgba(0,0,0,.2);}.article-owner .article-infos img.article-avatar{width:30px;margin:-1px 4px 0 0;display:inline-block;border-radius:50%;}.card-articles .card-content{padding:10px 0 10px;}.card-articles .card-content h3{margin:10px 0;}.card-articles .card-content h3 a{font-weight:700;}.card-articles .article-owner{text-align:left;}.card-articles .article-owner .article-infos{color:#000;}.card-articles .article-owner .article-infos a{color:rgba(0,0,0,.6);}.card-articles .article-owner .article-infos .seperator{margin:0 4px;color:rgba(0,0,0,.2);}.card-articles .article-owner .article-infos img.article-avatar{width:30px;margin:-1px 4px 0 0;display:inline-block;border-radius:50%;}.article-owner{font-size:.85em;}.user-link-icons{position:absolute;right:18px;top:15px;z-index:3;}.user-link-icons a{display:inline-block;color:#eee;margin-left:12px;font-size:1.25em;}.user-link-icons a:hover{color:#fff;}.tags .tag{display:inline-block;padding:2px 8px;background:rgba(208,208,208,.3);border-radius:30px;margin:0 1px 3px 0;color:#b1b1b1 !important;font-size:.7em;line-height:1.6em;text-transform:uppercase;}.tags .tag:hover{background:#000;color:#fff !important;}.popular-tags a{display:block;font-size:.9em;}.popular-tags a span{float:right;opacity:.3;font-size:.9em;}.img-container{position:relative;overflow:hidden;border-radius:4px;} \ No newline at end of file +.hero-section{padding:0;}.hero-section .hero-articles{position:relative;overflow:hidden;}.hero-section .hero-articles .hero-content{position:absolute;left:12%;right:12%;bottom:80px;z-index:4;text-align:center;}.hero-section .hero-articles .hero-content h2{margin-top:0;font-size:2.5em;font-weight:bold;}.hero-section .hero-articles .hero-content a{color:#fff;text-shadow:0 0 20px rgba(0,0,0,.5);}.hero-section .hero-articles .hero-content p{color:#fff;}.hero-section .hero-articles .tags .tag{background:rgba(208,208,208,.3);color:#fff !important;}.hero-section .hero-articles .tags .tag:hover{background:#fff;color:#000 !important;}.hero-section .hero-articles .article-owner{text-align:center;position:relative;z-index:12;}.hero-section .hero-articles .article-owner .article-infos{color:#000;}.hero-section .hero-articles .article-owner .article-infos a{color:#000;}.hero-section .hero-articles .article-owner .article-infos .seperator{margin:0 4px;color:rgba(255,255,255,.2);}.hero-section .hero-articles .article-owner .article-infos img.article-avatar{width:64px;margin:-25px 10px 0 0;border:3px solid #fff;display:inline-block;border-radius:50%;}.hero-section .hero-articles .img-container{min-height:320px;}.hero-section .hero-articles .img-container img{filter:grayscale(10%);}.hero-section .hero-articles .img-container::after{content:"";display:block;position:absolute;z-index:1;bottom:0;width:100%;top:1% !important;background:linear-gradient(to bottom,transparent 0,rgba(0,0,0,.75) 89%,rgba(0,0,0,.78) 93%) !important;transition:.2s all ease-in-out;opacity:.9;}.hero-section .hero-articles:hover .img-container::after{opacity:1;}.article-owner .article-infos{color:#000;}.article-owner .article-infos a{color:rgba(0,0,0,.6);}.article-owner .article-infos .seperator{margin:0 4px;color:rgba(0,0,0,.2);}.article-owner .article-infos img.article-avatar{width:30px;margin:-1px 4px 0 0;display:inline-block;border-radius:50%;}.card-articles .card-content{padding:10px 0 10px;}.card-articles .card-content h3{margin:10px 0;}.card-articles .card-content h3 a{font-weight:700;}.card-articles .article-owner{text-align:left;}.card-articles .article-owner .article-infos{color:#000;}.card-articles .article-owner .article-infos a{color:rgba(0,0,0,.6);}.card-articles .article-owner .article-infos .seperator{margin:0 4px;color:rgba(0,0,0,.2);}.card-articles .article-owner .article-infos img.article-avatar{width:30px;margin:-1px 4px 0 0;display:inline-block;border-radius:50%;}.article-owner{font-size:.85em;}.user-link-icons{position:absolute;right:18px;top:15px;z-index:3;}.user-link-icons a{display:inline-block;color:#eee;margin-left:12px;font-size:1.25em;}.user-link-icons a:hover{color:#fff;}.tags .tag{display:inline-block;padding:2px 8px;background:rgba(208,208,208,.3);border-radius:30px;margin:0 1px 3px 0;color:#b1b1b1 !important;font-size:.7em;line-height:1.6em;text-transform:uppercase;}.tags .tag:hover{background:#000;color:#fff !important;}.popular-tags a{display:block;font-size:.9em;}.popular-tags a span{float:right;opacity:.3;font-size:.9em;}.img-container{position:relative;overflow:hidden;border-radius:4px;background:#dcdcdc;} \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.scss b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.scss index 42f1adb3bb..70c2ee94f6 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.scss +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/_home.scss @@ -1,66 +1,80 @@ -.hero-section { - padding: 0; - .hero-articles { - position: relative; - overflow: hidden; - .hero-content { +.hero-section { + padding: 0; + + .hero-articles { + position: relative; + overflow: hidden; + + .hero-content { position: absolute; left: 12%; right: 12%; bottom: 80px; - z-index: 4; + z-index: 4; text-align: center; + h2 { margin-top: 0; font-size: 2.5em; font-weight: bold; } - a { + + a { color: white; text-shadow: 0px 0px 20px rgba(0, 0, 0, 0.5); } - p { + + p { color: white; - } + } } - .tags { - .tag { - background: rgba(208, 208, 208, 0.3); - color: #fff !important; - &:hover { - background: white; + + .tags { + .tag { + background: rgba(208, 208, 208, 0.3); + color: #fff !important; + + &:hover { + background: white; color: black !important; } } } - - .article-owner { - text-align: center; - position: relative; + + .article-owner { + text-align: center; + position: relative; z-index: 12; + .article-infos { - color: black; + color: black; + a { - color: black; + color: black; } + .seperator { margin: 0 4px; color: rgba(255, 255, 255, 0.2); } - img.article-avatar { + + img.article-avatar { width: 64px; - margin: -25px 10px 0px 0; + margin: -25px 10px 0px 0; border: 3px solid #fff; display: inline-block; - border-radius: 50%; + border-radius: 50%; } } - } - .img-container { - background: black; + } + + .img-container { + min-height: 320px; + img { - filter: grayscale(10%); - } + filter: grayscale(10%); + } + &::after { content: ""; display: block; @@ -69,19 +83,20 @@ bottom: 0px; width: 100%; top: 1% !important; - background: linear-gradient(to bottom,rgba(0, 0, 0, 0) 0,rgba(0, 0, 0, 0.91) 89%,rgba(0, 0, 0, 0.93) 93%) !important; + background: linear-gradient(to bottom, transparent 0, rgba(0, 0, 0, 0.75) 89%, rgba(0, 0, 0, 0.78) 93%) !important; transition: .2s all ease-in-out; opacity: .9; } - } - &:hover { + } + + &:hover { .img-container { - &::after { + &::after { opacity: 1; } } - } - } + } + } } .article-owner { @@ -189,8 +204,9 @@ .img-container { - position: relative; + position: relative; overflow: hidden; - border-radius: 4px; + border-radius: 4px; + background: gainsboro; } \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/blog.css b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/blog.css index b832f53a9a..84e4ab27cc 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/blog.css +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/blog.css @@ -132,7 +132,7 @@ display: inline-block; border-radius: 50%; } div.vs-blog .hero-section .hero-articles .img-container { - background: black; } + min-height: 320px; } div.vs-blog .hero-section .hero-articles .img-container img { filter: grayscale(10%); } div.vs-blog .hero-section .hero-articles .img-container::after { @@ -143,7 +143,7 @@ bottom: 0px; width: 100%; top: 1% !important; - background: linear-gradient(to bottom, transparent 0, rgba(0, 0, 0, 0.91) 89%, rgba(0, 0, 0, 0.93) 93%) !important; + background: linear-gradient(to bottom, transparent 0, rgba(0, 0, 0, 0.75) 89%, rgba(0, 0, 0, 0.78) 93%) !important; transition: .2s all ease-in-out; opacity: .9; } div.vs-blog .hero-section .hero-articles:hover .img-container::after { @@ -217,7 +217,8 @@ div.vs-blog .img-container { position: relative; overflow: hidden; - border-radius: 4px; } + border-radius: 4px; + background: gainsboro; } div.vs-blog .post-detail h1 { padding: 0px 0; line-height: 1.25em; @@ -309,4 +310,3 @@ div.vs-blog .box-articles .img-container img.portrait { width: 100%; height: auto; } } - diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/blog.min.css b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/blog.min.css index 2440d385e7..57895315af 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/blog.min.css +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blog/Shared/Styles/blog.min.css @@ -1 +1 @@ -div.vs-blog{position:relative;background:#fff;padding:0 30px;font-family:'Open Sans',Helvetica,Arial,sans-serif;font-size:14px;margin:0 auto;max-width:1080px;}div.vs-blog a,div.vs-blog a:hover{text-decoration:none;color:#000;}div.vs-blog p{color:#444;}div.vs-blog p a{text-decoration:underline;}div.vs-blog h1,div.vs-blog h2,div.vs-blog h3,div.vs-blog h4,div.vs-blog h5,div.vs-blog h6,div.vs-blog .tab-title{font-family:Helvetica,Arial,sans-serif;font-weight:700;}div.vs-blog h1{font-size:2.25em;margin:1.5rem 0 .75rem;}div.vs-blog h2,div.vs-blog .tab-title{font-size:1.75em;margin:1.5rem 0 .75rem;}div.vs-blog h3{font-size:1.5em;margin:1.5rem 0 .75rem;}div.vs-blog h4{font-size:1.25em;margin:1.5rem 0 .75rem;}div.vs-blog h5{font-size:1em;}div.vs-blog h6{font-size:1em;}div.vs-blog .lead{font-size:1.1rem;font-weight:300;}div.vs-blog img{max-width:100%;}div.vs-blog input,div.vs-blog select,div.vs-blog textarea,div.vs-blog .form-control,div.vs-blog .btn{border-radius:0;}div.vs-blog .navbar-toggler{background:#0ff;}div.vs-blog .no-border{border:0;}div.vs-blog .btn-rounded{border-radius:30px;}div.vs-blog .list-group .list-group-item{position:relative;display:block;padding:0 0 20px 0;background:none;border-radius:0;border:0;}div.vs-blog .list-group .list-group-item:hover{background:none;}div.vs-blog .list-group .list-group-item+.list-group-item{border-top:1px solid #f5f5f5;padding:20px 0;}div.vs-blog .list-group .list-group-item h3{margin-top:0;}div.vs-blog .list-group.small-list .list-group-item{padding:10px 0;}div.vs-blog .list-group.small-list .list-group-item+.list-group-item{padding:10px 0;}div.vs-blog .font-75{font-size:.75em;}div.vs-blog .font-85{font-size:.85em;}div.vs-blog .font-92{font-size:.92em;}div.vs-blog .font-100{font-size:1em;}div.vs-blog .font-125{font-size:1.25em;}div.vs-blog .vs-blog-title{padding-bottom:15px;margin-bottom:25px;border-bottom:1px solid #ddd;}div.vs-blog .vs-blog-title h1,div.vs-blog .vs-blog-title h2,div.vs-blog .vs-blog-title h3,div.vs-blog .vs-blog-title h4,div.vs-blog .vs-blog-title h5,div.vs-blog .vs-blog-title h6{margin:0;padding:0;}div.vs-blog .vs-footer{padding-top:15px;margin-top:25px;border-top:1px solid #ddd;}div.vs-blog .vs-seperator{padding:0 4px;opacity:.3;}div.vs-blog .hero-section{padding:0;}div.vs-blog .hero-section .hero-articles{position:relative;overflow:hidden;}div.vs-blog .hero-section .hero-articles .hero-content{position:absolute;left:12%;right:12%;bottom:80px;z-index:4;text-align:center;}div.vs-blog .hero-section .hero-articles .hero-content h2{margin-top:0;font-size:2.5em;font-weight:bold;}div.vs-blog .hero-section .hero-articles .hero-content a{color:#fff;text-shadow:0 0 20px rgba(0,0,0,.5);}div.vs-blog .hero-section .hero-articles .hero-content p{color:#fff;}div.vs-blog .hero-section .hero-articles .tags .tag{background:rgba(208,208,208,.3);color:#fff !important;}div.vs-blog .hero-section .hero-articles .tags .tag:hover{background:#fff;color:#000 !important;}div.vs-blog .hero-section .hero-articles .article-owner{text-align:center;position:relative;z-index:12;}div.vs-blog .hero-section .hero-articles .article-owner .article-infos{color:#000;}div.vs-blog .hero-section .hero-articles .article-owner .article-infos a{color:#000;}div.vs-blog .hero-section .hero-articles .article-owner .article-infos .seperator{margin:0 4px;color:rgba(255,255,255,.2);}div.vs-blog .hero-section .hero-articles .article-owner .article-infos img.article-avatar{width:64px;margin:-25px 10px 0 0;border:3px solid #fff;display:inline-block;border-radius:50%;}div.vs-blog .hero-section .hero-articles .img-container{background:#000;}div.vs-blog .hero-section .hero-articles .img-container img{filter:grayscale(10%);}div.vs-blog .hero-section .hero-articles .img-container::after{content:"";display:block;position:absolute;z-index:1;bottom:0;width:100%;top:1% !important;background:linear-gradient(to bottom,transparent 0,rgba(0,0,0,.91) 89%,rgba(0,0,0,.93) 93%) !important;transition:.2s all ease-in-out;opacity:.9;}div.vs-blog .hero-section .hero-articles:hover .img-container::after{opacity:1;}div.vs-blog .article-owner .article-infos{color:#000;}div.vs-blog .article-owner .article-infos a{color:rgba(0,0,0,.6);}div.vs-blog .article-owner .article-infos .seperator{margin:0 4px;color:rgba(0,0,0,.2);}div.vs-blog .article-owner .article-infos img.article-avatar{width:30px;margin:-1px 4px 0 0;display:inline-block;border-radius:50%;}div.vs-blog .card-articles .card-content{padding:10px 0 10px;}div.vs-blog .card-articles .card-content h3{margin:10px 0;}div.vs-blog .card-articles .card-content h3 a{font-weight:700;}div.vs-blog .card-articles .article-owner{text-align:left;}div.vs-blog .card-articles .article-owner .article-infos{color:#000;}div.vs-blog .card-articles .article-owner .article-infos a{color:rgba(0,0,0,.6);}div.vs-blog .card-articles .article-owner .article-infos .seperator{margin:0 4px;color:rgba(0,0,0,.2);}div.vs-blog .card-articles .article-owner .article-infos img.article-avatar{width:30px;margin:-1px 4px 0 0;display:inline-block;border-radius:50%;}div.vs-blog .article-owner{font-size:.85em;}div.vs-blog .user-link-icons{position:absolute;right:18px;top:15px;z-index:3;}div.vs-blog .user-link-icons a{display:inline-block;color:#eee;margin-left:12px;font-size:1.25em;}div.vs-blog .user-link-icons a:hover{color:#fff;}div.vs-blog .tags .tag{display:inline-block;padding:2px 8px;background:rgba(208,208,208,.3);border-radius:30px;margin:0 1px 3px 0;color:#b1b1b1 !important;font-size:.7em;line-height:1.6em;text-transform:uppercase;}div.vs-blog .tags .tag:hover{background:#000;color:#fff !important;}div.vs-blog .popular-tags a{display:block;font-size:.9em;}div.vs-blog .popular-tags a span{float:right;opacity:.3;font-size:.9em;}div.vs-blog .img-container{position:relative;overflow:hidden;border-radius:4px;}div.vs-blog .post-detail h1{padding:0 0;line-height:1.25em;font-size:3.5em;}div.vs-blog .post-detail .article-owner{text-align:center;position:relative;z-index:12;}div.vs-blog .post-detail .article-owner .article-infos{color:#000;}div.vs-blog .post-detail .article-owner .article-infos a{color:#000;color:rgba(0,0,0,.8);}div.vs-blog .post-detail .article-owner .article-infos .seperator{margin:0 4px;color:rgba(0,0,0,.2);}div.vs-blog .post-detail .article-owner .article-infos img.article-avatar{width:64px;margin:-20px 10px 0 0;display:inline-block;border-radius:50%;border:3px solid #fff;}div.vs-blog .post-detail .post-content{font-size:1.125em;}div.vs-blog .post-detail .post-content .post-img-container{margin:50px -80px 20px;overflow:hidden;border-radius:4px;}div.vs-blog .post-detail .post-content .lead{font-size:1.125em;color:#111;}div.vs-blog .comment-avatar{max-width:64px;}div.vs-blog .answer-avatar{max-width:48px;}div.vs-blog .media{font-size:.95em;}div.vs-blog .media .media{font-size:.95em;}div.vs-blog .comment-area .comment-owner{margin-bottom:2px;}div.vs-blog .comment-area .comment-owner span{font-weight:300;color:#999;font-size:.8em;}div.vs-blog .comment-area>.media{padding:30px 0;border-bottom:1px solid #f1f1f1;}div.vs-blog .comment-area>.media .media{padding:20px 0;}div.vs-blog .comment-area .comment-buttons{padding:4px 8px;}div.vs-blog .comment-area .comment-buttons .seperator{color:#ddd;margin:0 8px;}div.vs-blog .comment-area .comment-buttons .count{color:#fff;background:#ddd;margin-left:5px;padding:1px 3px;font-size:10px;border-radius:3px;}div.vs-blog .comment-area .comment-buttons .count.count-up{background:#999;}div.vs-blog .comment-area .comment-buttons a{opacity:.5;}div.vs-blog .comment-area .comment-buttons a:hover{opacity:.75;}div.vs-blog .comment-area p{margin-bottom:6px;}div.vs-blog .comment-area .comment-avatar{width:64px;}div.vs-blog .comment-area .answer-avatar{width:48px;}@media(min-width:767px){div.vs-blog .box-articles .img-container{position:relative;overflow:hidden;}div.vs-blog .box-articles .img-container img{position:absolute;left:50%;top:50%;height:100%;width:auto;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-width:initial;}div.vs-blog .box-articles .img-container img.portrait{width:100%;height:auto;}} \ No newline at end of file +div.vs-blog{position:relative;background:#fff;padding:0 30px;font-family:'Open Sans',Helvetica,Arial,sans-serif;font-size:14px;margin:0 auto;max-width:1080px;}div.vs-blog a,div.vs-blog a:hover{text-decoration:none;color:#000;}div.vs-blog p{color:#444;}div.vs-blog p a{text-decoration:underline;}div.vs-blog h1,div.vs-blog h2,div.vs-blog h3,div.vs-blog h4,div.vs-blog h5,div.vs-blog h6,div.vs-blog .tab-title{font-family:Helvetica,Arial,sans-serif;font-weight:700;}div.vs-blog h1{font-size:2.25em;margin:1.5rem 0 .75rem;}div.vs-blog h2,div.vs-blog .tab-title{font-size:1.75em;margin:1.5rem 0 .75rem;}div.vs-blog h3{font-size:1.5em;margin:1.5rem 0 .75rem;}div.vs-blog h4{font-size:1.25em;margin:1.5rem 0 .75rem;}div.vs-blog h5{font-size:1em;}div.vs-blog h6{font-size:1em;}div.vs-blog .lead{font-size:1.1rem;font-weight:300;}div.vs-blog img{max-width:100%;}div.vs-blog input,div.vs-blog select,div.vs-blog textarea,div.vs-blog .form-control,div.vs-blog .btn{border-radius:0;}div.vs-blog .navbar-toggler{background:#0ff;}div.vs-blog .no-border{border:0;}div.vs-blog .btn-rounded{border-radius:30px;}div.vs-blog .list-group .list-group-item{position:relative;display:block;padding:0 0 20px 0;background:none;border-radius:0;border:0;}div.vs-blog .list-group .list-group-item:hover{background:none;}div.vs-blog .list-group .list-group-item+.list-group-item{border-top:1px solid #f5f5f5;padding:20px 0;}div.vs-blog .list-group .list-group-item h3{margin-top:0;}div.vs-blog .list-group.small-list .list-group-item{padding:10px 0;}div.vs-blog .list-group.small-list .list-group-item+.list-group-item{padding:10px 0;}div.vs-blog .font-75{font-size:.75em;}div.vs-blog .font-85{font-size:.85em;}div.vs-blog .font-92{font-size:.92em;}div.vs-blog .font-100{font-size:1em;}div.vs-blog .font-125{font-size:1.25em;}div.vs-blog .vs-blog-title{padding-bottom:15px;margin-bottom:25px;border-bottom:1px solid #ddd;}div.vs-blog .vs-blog-title h1,div.vs-blog .vs-blog-title h2,div.vs-blog .vs-blog-title h3,div.vs-blog .vs-blog-title h4,div.vs-blog .vs-blog-title h5,div.vs-blog .vs-blog-title h6{margin:0;padding:0;}div.vs-blog .vs-footer{padding-top:15px;margin-top:25px;border-top:1px solid #ddd;}div.vs-blog .vs-seperator{padding:0 4px;opacity:.3;}div.vs-blog .hero-section{padding:0;}div.vs-blog .hero-section .hero-articles{position:relative;overflow:hidden;}div.vs-blog .hero-section .hero-articles .hero-content{position:absolute;left:12%;right:12%;bottom:80px;z-index:4;text-align:center;}div.vs-blog .hero-section .hero-articles .hero-content h2{margin-top:0;font-size:2.5em;font-weight:bold;}div.vs-blog .hero-section .hero-articles .hero-content a{color:#fff;text-shadow:0 0 20px rgba(0,0,0,.5);}div.vs-blog .hero-section .hero-articles .hero-content p{color:#fff;}div.vs-blog .hero-section .hero-articles .tags .tag{background:rgba(208,208,208,.3);color:#fff !important;}div.vs-blog .hero-section .hero-articles .tags .tag:hover{background:#fff;color:#000 !important;}div.vs-blog .hero-section .hero-articles .article-owner{text-align:center;position:relative;z-index:12;}div.vs-blog .hero-section .hero-articles .article-owner .article-infos{color:#000;}div.vs-blog .hero-section .hero-articles .article-owner .article-infos a{color:#000;}div.vs-blog .hero-section .hero-articles .article-owner .article-infos .seperator{margin:0 4px;color:rgba(255,255,255,.2);}div.vs-blog .hero-section .hero-articles .article-owner .article-infos img.article-avatar{width:64px;margin:-25px 10px 0 0;border:3px solid #fff;display:inline-block;border-radius:50%;}div.vs-blog .hero-section .hero-articles .img-container{min-height:320px;}div.vs-blog .hero-section .hero-articles .img-container img{filter:grayscale(10%);}div.vs-blog .hero-section .hero-articles .img-container::after{content:"";display:block;position:absolute;z-index:1;bottom:0;width:100%;top:1% !important;background:linear-gradient(to bottom,transparent 0,rgba(0,0,0,.75) 89%,rgba(0,0,0,.78) 93%) !important;transition:.2s all ease-in-out;opacity:.9;}div.vs-blog .hero-section .hero-articles:hover .img-container::after{opacity:1;}div.vs-blog .article-owner .article-infos{color:#000;}div.vs-blog .article-owner .article-infos a{color:rgba(0,0,0,.6);}div.vs-blog .article-owner .article-infos .seperator{margin:0 4px;color:rgba(0,0,0,.2);}div.vs-blog .article-owner .article-infos img.article-avatar{width:30px;margin:-1px 4px 0 0;display:inline-block;border-radius:50%;}div.vs-blog .card-articles .card-content{padding:10px 0 10px;}div.vs-blog .card-articles .card-content h3{margin:10px 0;}div.vs-blog .card-articles .card-content h3 a{font-weight:700;}div.vs-blog .card-articles .article-owner{text-align:left;}div.vs-blog .card-articles .article-owner .article-infos{color:#000;}div.vs-blog .card-articles .article-owner .article-infos a{color:rgba(0,0,0,.6);}div.vs-blog .card-articles .article-owner .article-infos .seperator{margin:0 4px;color:rgba(0,0,0,.2);}div.vs-blog .card-articles .article-owner .article-infos img.article-avatar{width:30px;margin:-1px 4px 0 0;display:inline-block;border-radius:50%;}div.vs-blog .article-owner{font-size:.85em;}div.vs-blog .user-link-icons{position:absolute;right:18px;top:15px;z-index:3;}div.vs-blog .user-link-icons a{display:inline-block;color:#eee;margin-left:12px;font-size:1.25em;}div.vs-blog .user-link-icons a:hover{color:#fff;}div.vs-blog .tags .tag{display:inline-block;padding:2px 8px;background:rgba(208,208,208,.3);border-radius:30px;margin:0 1px 3px 0;color:#b1b1b1 !important;font-size:.7em;line-height:1.6em;text-transform:uppercase;}div.vs-blog .tags .tag:hover{background:#000;color:#fff !important;}div.vs-blog .popular-tags a{display:block;font-size:.9em;}div.vs-blog .popular-tags a span{float:right;opacity:.3;font-size:.9em;}div.vs-blog .img-container{position:relative;overflow:hidden;border-radius:4px;background:#dcdcdc;}div.vs-blog .post-detail h1{padding:0 0;line-height:1.25em;font-size:3.5em;}div.vs-blog .post-detail .article-owner{text-align:center;position:relative;z-index:12;}div.vs-blog .post-detail .article-owner .article-infos{color:#000;}div.vs-blog .post-detail .article-owner .article-infos a{color:#000;color:rgba(0,0,0,.8);}div.vs-blog .post-detail .article-owner .article-infos .seperator{margin:0 4px;color:rgba(0,0,0,.2);}div.vs-blog .post-detail .article-owner .article-infos img.article-avatar{width:64px;margin:-20px 10px 0 0;display:inline-block;border-radius:50%;border:3px solid #fff;}div.vs-blog .post-detail .post-content{font-size:1.125em;}div.vs-blog .post-detail .post-content .post-img-container{margin:50px -80px 20px;overflow:hidden;border-radius:4px;}div.vs-blog .post-detail .post-content .lead{font-size:1.125em;color:#111;}div.vs-blog .comment-avatar{max-width:64px;}div.vs-blog .answer-avatar{max-width:48px;}div.vs-blog .media{font-size:.95em;}div.vs-blog .media .media{font-size:.95em;}div.vs-blog .comment-area .comment-owner{margin-bottom:2px;}div.vs-blog .comment-area .comment-owner span{font-weight:300;color:#999;font-size:.8em;}div.vs-blog .comment-area>.media{padding:30px 0;border-bottom:1px solid #f1f1f1;}div.vs-blog .comment-area>.media .media{padding:20px 0;}div.vs-blog .comment-area .comment-buttons{padding:4px 8px;}div.vs-blog .comment-area .comment-buttons .seperator{color:#ddd;margin:0 8px;}div.vs-blog .comment-area .comment-buttons .count{color:#fff;background:#ddd;margin-left:5px;padding:1px 3px;font-size:10px;border-radius:3px;}div.vs-blog .comment-area .comment-buttons .count.count-up{background:#999;}div.vs-blog .comment-area .comment-buttons a{opacity:.5;}div.vs-blog .comment-area .comment-buttons a:hover{opacity:.75;}div.vs-blog .comment-area p{margin-bottom:6px;}div.vs-blog .comment-area .comment-avatar{width:64px;}div.vs-blog .comment-area .answer-avatar{width:48px;}@media(min-width:767px){div.vs-blog .box-articles .img-container{position:relative;overflow:hidden;}div.vs-blog .box-articles .img-container img{position:absolute;left:50%;top:50%;height:100%;width:auto;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-width:initial;}div.vs-blog .box-articles .img-container img.portrait{width:100%;height:auto;}} \ No newline at end of file diff --git a/modules/blogging/src/Volo.Blogging.Web/compilerconfig.json b/modules/blogging/src/Volo.Blogging.Web/compilerconfig.json index bda7a0c0bd..d458e90385 100644 --- a/modules/blogging/src/Volo.Blogging.Web/compilerconfig.json +++ b/modules/blogging/src/Volo.Blogging.Web/compilerconfig.json @@ -6,5 +6,9 @@ { "outputFile": "Pages/Blog/Shared/Styles/_home.css", "inputFile": "Pages/Blog/Shared/Styles/_home.scss" + }, + { + "outputFile": "Pages/Blog/Posts/Index.css", + "inputFile": "Pages/Blog/Posts/Index.scss" } ] \ No newline at end of file diff --git a/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo/Abp/Blogging/Posts/Post_Tests.cs b/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo/Abp/Blogging/Posts/Post_Tests.cs index 91aede46a7..2fb96d6b2c 100644 --- a/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo/Abp/Blogging/Posts/Post_Tests.cs +++ b/modules/blogging/test/Volo.Blogging.Domain.Tests/Volo/Abp/Blogging/Posts/Post_Tests.cs @@ -13,7 +13,7 @@ namespace Volo.Blogging [Fact] public void IncreaseReadCount() { - var post = new Post(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "abp", "⊙o⊙", "abp.io"); + var post = new Post(Guid.NewGuid(), Guid.NewGuid(), "abp", "⊙o⊙", "abp.io"); post.IncreaseReadCount(); post.ReadCount.ShouldBe(1); } @@ -23,7 +23,7 @@ namespace Volo.Blogging [InlineData("bbb")] public void SetTitle(string title) { - var post = new Post(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "abp", "⊙o⊙", "abp.io"); + var post = new Post(Guid.NewGuid(), Guid.NewGuid(), "abp", "⊙o⊙", "abp.io"); post.SetTitle(title); post.Title.ShouldBe(title); } @@ -33,7 +33,7 @@ namespace Volo.Blogging [InlineData("bbb")] public void SetUrl(string url) { - var post = new Post(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "abp", "⊙o⊙", "abp.io"); + var post = new Post(Guid.NewGuid(), Guid.NewGuid(), "abp", "⊙o⊙", "abp.io"); post.SetUrl(url); post.Url.ShouldBe(url); } @@ -41,7 +41,7 @@ namespace Volo.Blogging [Fact] public void AddTag() { - var post = new Post(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "abp", "⊙o⊙", "abp.io"); + var post = new Post(Guid.NewGuid(), Guid.NewGuid(), "abp", "⊙o⊙", "abp.io"); var tagId = Guid.NewGuid(); post.AddTag(tagId); post.Tags.ShouldContain(x => x.TagId == tagId); @@ -51,7 +51,7 @@ namespace Volo.Blogging [Fact] public void RemoveTag() { - var post = new Post(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid(), "abp", "⊙o⊙", "abp.io"); + var post = new Post(Guid.NewGuid(), Guid.NewGuid(), "abp", "⊙o⊙", "abp.io"); var tagId = Guid.NewGuid(); post.AddTag(tagId); diff --git a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj index 089a2ca3ab..0a4fdebc1b 100644 --- a/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj +++ b/modules/client-simulation/demo/Volo.ClientSimulation.Demo/Volo.ClientSimulation.Demo.csproj @@ -1,5 +1,7 @@  + + netcoreapp2.2 diff --git a/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj b/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj index 92fdeb6d4c..2664bf2f49 100644 --- a/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj +++ b/modules/client-simulation/src/Volo.ClientSimulation.Web/Volo.ClientSimulation.Web.csproj @@ -1,11 +1,15 @@  + + - netcoreapp2.2 - $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; - true + netstandard2.0 + Volo.ClientSimulation.Web + Volo.ClientSimulation.Web Library + true Volo.ClientSimulation + 2.8 diff --git a/modules/client-simulation/src/Volo.ClientSimulation/Volo.ClientSimulation.csproj b/modules/client-simulation/src/Volo.ClientSimulation/Volo.ClientSimulation.csproj index 2917b65816..eb0a9f9ae2 100644 --- a/modules/client-simulation/src/Volo.ClientSimulation/Volo.ClientSimulation.csproj +++ b/modules/client-simulation/src/Volo.ClientSimulation/Volo.ClientSimulation.csproj @@ -1,8 +1,12 @@  + + - netcoreapp2.2 - + netstandard2.0 + Volo.ClientSimulation + Volo.ClientSimulation + diff --git a/modules/docs/README.md b/modules/docs/README.md index 993e009110..ee4e33a785 100644 --- a/modules/docs/README.md +++ b/modules/docs/README.md @@ -1,4 +1,4 @@ -# docs module +# Docs Module This module is used to create technical documentation web sites. [abp.io](https://abp.io) web site uses this module for its documentation. ### Screenshot @@ -7,7 +7,7 @@ This module is used to create technical documentation web sites. [abp.io](https: ### Main Features -* Can read documents from a Github repository. +* Retrieves documents from a Github repository. * Supports Markdown document formatting. * Supports versioning (integrated to Github releases). -* Support multiple projects. \ No newline at end of file +* Supports multiple projects. diff --git a/modules/docs/Volo.Docs.sln b/modules/docs/Volo.Docs.sln index 0c3b43a821..4eaa1cd14a 100644 --- a/modules/docs/Volo.Docs.sln +++ b/modules/docs/Volo.Docs.sln @@ -23,10 +23,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Docs.Web", "src\Volo.D EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "app", "app", "{555508AD-F593-43E3-9354-9FA51512F181}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.DocsTestApp", "app\Volo.DocsTestApp\Volo.DocsTestApp.csproj", "{30BC20A3-85CE-4907-8FD0-54153C3F190C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.DocsTestApp.EntityFrameworkCore", "app\Volo.DocsTestApp.EntityFrameworkCore\Volo.DocsTestApp.EntityFrameworkCore.csproj", "{A5F88BCB-6B22-4E2D-AE89-AEF1E3DC727A}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "domain", "domain", "{A982A58E-1E92-4764-9F56-39E7AABB8556}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "admin-app", "admin-app", "{BCA19441-17E9-43E6-AED1-15344D18F967}" @@ -55,6 +51,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Docs.TestBase", "test\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Docs.Admin.Application.Tests", "test\Volo.Docs.Admin.Application.Tests\Volo.Docs.Admin.Application.Tests.csproj", "{E9CF69BC-EEA6-4621-BE0E-64EE37C89807}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VoloDocs.EntityFrameworkCore", "app\VoloDocs.EntityFrameworkCore\VoloDocs.EntityFrameworkCore.csproj", "{1B459653-8DAC-41CD-A08E-28D6E74265D3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VoloDocs.Web", "app\VoloDocs.Web\VoloDocs.Web.csproj", "{057EA924-4524-4452-840C-5E3D509F2ED3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VoloDocs.Migrator", "app\VoloDocs.Migrator\VoloDocs.Migrator.csproj", "{8A5E5001-C017-44A8-ADDA-DC66C102556E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -93,14 +95,6 @@ Global {871FB966-C89F-4AF5-BB1D-172625AA571C}.Debug|Any CPU.Build.0 = Debug|Any CPU {871FB966-C89F-4AF5-BB1D-172625AA571C}.Release|Any CPU.ActiveCfg = Release|Any CPU {871FB966-C89F-4AF5-BB1D-172625AA571C}.Release|Any CPU.Build.0 = Release|Any CPU - {30BC20A3-85CE-4907-8FD0-54153C3F190C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {30BC20A3-85CE-4907-8FD0-54153C3F190C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {30BC20A3-85CE-4907-8FD0-54153C3F190C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {30BC20A3-85CE-4907-8FD0-54153C3F190C}.Release|Any CPU.Build.0 = Release|Any CPU - {A5F88BCB-6B22-4E2D-AE89-AEF1E3DC727A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A5F88BCB-6B22-4E2D-AE89-AEF1E3DC727A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A5F88BCB-6B22-4E2D-AE89-AEF1E3DC727A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A5F88BCB-6B22-4E2D-AE89-AEF1E3DC727A}.Release|Any CPU.Build.0 = Release|Any CPU {37D483C8-400B-4127-A6D0-2EE4E80CB696}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {37D483C8-400B-4127-A6D0-2EE4E80CB696}.Debug|Any CPU.Build.0 = Debug|Any CPU {37D483C8-400B-4127-A6D0-2EE4E80CB696}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -141,6 +135,18 @@ Global {E9CF69BC-EEA6-4621-BE0E-64EE37C89807}.Debug|Any CPU.Build.0 = Debug|Any CPU {E9CF69BC-EEA6-4621-BE0E-64EE37C89807}.Release|Any CPU.ActiveCfg = Release|Any CPU {E9CF69BC-EEA6-4621-BE0E-64EE37C89807}.Release|Any CPU.Build.0 = Release|Any CPU + {1B459653-8DAC-41CD-A08E-28D6E74265D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1B459653-8DAC-41CD-A08E-28D6E74265D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1B459653-8DAC-41CD-A08E-28D6E74265D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1B459653-8DAC-41CD-A08E-28D6E74265D3}.Release|Any CPU.Build.0 = Release|Any CPU + {057EA924-4524-4452-840C-5E3D509F2ED3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {057EA924-4524-4452-840C-5E3D509F2ED3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {057EA924-4524-4452-840C-5E3D509F2ED3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {057EA924-4524-4452-840C-5E3D509F2ED3}.Release|Any CPU.Build.0 = Release|Any CPU + {8A5E5001-C017-44A8-ADDA-DC66C102556E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A5E5001-C017-44A8-ADDA-DC66C102556E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A5E5001-C017-44A8-ADDA-DC66C102556E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A5E5001-C017-44A8-ADDA-DC66C102556E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -154,8 +160,6 @@ Global {30808C64-F590-47F7-AF8A-256F6B6E186B} = {8B0CDFC9-E313-4323-9390-59CFFAAC60B5} {BF3FDDFF-BED8-422C-82E9-07F181A2D47F} = {8B0CDFC9-E313-4323-9390-59CFFAAC60B5} {871FB966-C89F-4AF5-BB1D-172625AA571C} = {8B0CDFC9-E313-4323-9390-59CFFAAC60B5} - {30BC20A3-85CE-4907-8FD0-54153C3F190C} = {555508AD-F593-43E3-9354-9FA51512F181} - {A5F88BCB-6B22-4E2D-AE89-AEF1E3DC727A} = {555508AD-F593-43E3-9354-9FA51512F181} {A982A58E-1E92-4764-9F56-39E7AABB8556} = {42416152-5BAB-4706-93A6-57A19E71FE14} {BCA19441-17E9-43E6-AED1-15344D18F967} = {42416152-5BAB-4706-93A6-57A19E71FE14} {8B0CDFC9-E313-4323-9390-59CFFAAC60B5} = {42416152-5BAB-4706-93A6-57A19E71FE14} @@ -169,6 +173,9 @@ Global {89F895EA-C4A0-4D91-9181-016F78459776} = {59D430A9-AC61-4457-8338-5DA0705ABB5D} {C8BF652A-6DDF-4E5C-8CBA-BA5AFC50BFE2} = {59D430A9-AC61-4457-8338-5DA0705ABB5D} {E9CF69BC-EEA6-4621-BE0E-64EE37C89807} = {59D430A9-AC61-4457-8338-5DA0705ABB5D} + {1B459653-8DAC-41CD-A08E-28D6E74265D3} = {555508AD-F593-43E3-9354-9FA51512F181} + {057EA924-4524-4452-840C-5E3D509F2ED3} = {555508AD-F593-43E3-9354-9FA51512F181} + {8A5E5001-C017-44A8-ADDA-DC66C102556E} = {555508AD-F593-43E3-9354-9FA51512F181} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {13691265-2547-4FFF-B757-E8FACB05679D} diff --git a/modules/docs/app/Volo.DocsTestApp/Pages/Index.cshtml b/modules/docs/app/Volo.DocsTestApp/Pages/Index.cshtml deleted file mode 100644 index ca46c1b442..0000000000 --- a/modules/docs/app/Volo.DocsTestApp/Pages/Index.cshtml +++ /dev/null @@ -1,4 +0,0 @@ -@page -@model Volo.DocsTestApp.Pages.IndexModel -

Welcome to the Docs Demo!

-Go to documents... \ No newline at end of file diff --git a/modules/docs/app/Volo.DocsTestApp/Pages/Index.cshtml.cs b/modules/docs/app/Volo.DocsTestApp/Pages/Index.cshtml.cs deleted file mode 100644 index c1600215d5..0000000000 --- a/modules/docs/app/Volo.DocsTestApp/Pages/Index.cshtml.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.RazorPages; - -namespace Volo.DocsTestApp.Pages -{ - public class IndexModel : PageModel - { - public void OnGet() - { - } - } -} \ No newline at end of file diff --git a/modules/docs/app/Volo.DocsTestApp/appsettings.json b/modules/docs/app/Volo.DocsTestApp/appsettings.json deleted file mode 100644 index 50d08262f8..0000000000 --- a/modules/docs/app/Volo.DocsTestApp/appsettings.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "ConnectionStrings": { - "SqlServer": "Server=localhost;Database=DocsTestApp;Trusted_Connection=True;MultipleActiveResultSets=true", - "MongoDb": "mongodb://localhost:27017|DocsTestApp" - } -} \ No newline at end of file diff --git a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.Designer.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.Designer.cs similarity index 99% rename from modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.Designer.cs rename to modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.Designer.cs index cfa52c4ddc..ab8c782832 100644 --- a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.Designer.cs +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.Designer.cs @@ -5,11 +5,11 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Volo.DocsTestApp.EntityFrameworkCore; +using VoloDocs.EntityFrameworkCore; -namespace Volo.DocsTestApp.EntityFrameworkCore.Migrations +namespace VoloDocs.EntityFrameworkCore.Migrations { - [DbContext(typeof(DocsTestAppDbContext))] + [DbContext(typeof(VoloDocsDbContext))] [Migration("20181225134002_Initial20181225")] partial class Initial20181225 { diff --git a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.cs similarity index 99% rename from modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.cs rename to modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.cs index 5675fc708e..abae1bbc04 100644 --- a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.cs +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/20181225134002_Initial20181225.cs @@ -1,7 +1,7 @@ using System; using Microsoft.EntityFrameworkCore.Migrations; -namespace Volo.DocsTestApp.EntityFrameworkCore.Migrations +namespace VoloDocs.EntityFrameworkCore.Migrations { public partial class Initial20181225 : Migration { diff --git a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/DocsTestAppDbContextModelSnapshot.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs similarity index 98% rename from modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/DocsTestAppDbContextModelSnapshot.cs rename to modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs index 0037d0cf90..0a93515c64 100644 --- a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Migrations/DocsTestAppDbContextModelSnapshot.cs +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/Migrations/VoloDocsDbContextModelSnapshot.cs @@ -4,12 +4,12 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Volo.DocsTestApp.EntityFrameworkCore; +using VoloDocs.EntityFrameworkCore; -namespace Volo.DocsTestApp.EntityFrameworkCore.Migrations +namespace VoloDocs.EntityFrameworkCore.Migrations { - [DbContext(typeof(DocsTestAppDbContext))] - partial class DocsTestAppDbContextModelSnapshot : ModelSnapshot + [DbContext(typeof(VoloDocsDbContext))] + partial class VoloDocsDbContextModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) { diff --git a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Volo.DocsTestApp.EntityFrameworkCore.csproj b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj similarity index 97% rename from modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Volo.DocsTestApp.EntityFrameworkCore.csproj rename to modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj index 02d4be4be8..b70794e39b 100644 --- a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/Volo.DocsTestApp.EntityFrameworkCore.csproj +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocs.EntityFrameworkCore.csproj @@ -2,6 +2,7 @@ netstandard2.0 + diff --git a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/DocsTestAppDbContext.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocsDbContext.cs similarity index 76% rename from modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/DocsTestAppDbContext.cs rename to modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocsDbContext.cs index 78843aed64..fb6aca4e19 100644 --- a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/DocsTestAppDbContext.cs +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocsDbContext.cs @@ -5,11 +5,11 @@ using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Docs.EntityFrameworkCore; -namespace Volo.DocsTestApp.EntityFrameworkCore +namespace VoloDocs.EntityFrameworkCore { - public class DocsTestAppDbContext : AbpDbContext + public class VoloDocsDbContext : AbpDbContext { - public DocsTestAppDbContext(DbContextOptions options) + public VoloDocsDbContext(DbContextOptions options) : base(options) { diff --git a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/DocsTestAppDbContextFactory.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocsDbContextFactory.cs similarity index 53% rename from modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/DocsTestAppDbContextFactory.cs rename to modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocsDbContextFactory.cs index c69e934b64..4daa15555b 100644 --- a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/DocsTestAppDbContextFactory.cs +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocsDbContextFactory.cs @@ -3,24 +3,24 @@ using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; -namespace Volo.DocsTestApp.EntityFrameworkCore +namespace VoloDocs.EntityFrameworkCore { - public class DocsTestAppDbContextFactory : IDesignTimeDbContextFactory + public class VoloDocsDbContextFactory : IDesignTimeDbContextFactory { - public DocsTestAppDbContext CreateDbContext(string[] args) + public VoloDocsDbContext CreateDbContext(string[] args) { var configuration = BuildConfiguration(); - var builder = new DbContextOptionsBuilder() - .UseSqlServer(configuration.GetConnectionString("SqlServer")); + var builder = new DbContextOptionsBuilder() + .UseSqlServer(configuration["ConnectionString"]); - return new DocsTestAppDbContext(builder.Options); + return new VoloDocsDbContext(builder.Options); } private static IConfigurationRoot BuildConfiguration() { var builder = new ConfigurationBuilder() - .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../Volo.DocsTestApp/")) + .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../VoloDocs/")) .AddJsonFile("appsettings.json", optional: false); return builder.Build(); diff --git a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/DocsTestAppEntityFrameworkCoreModule.cs b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocsEntityFrameworkCoreModule.cs similarity index 84% rename from modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/DocsTestAppEntityFrameworkCoreModule.cs rename to modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocsEntityFrameworkCoreModule.cs index f380f6b9d5..44acea9a58 100644 --- a/modules/docs/app/Volo.DocsTestApp.EntityFrameworkCore/DocsTestAppEntityFrameworkCoreModule.cs +++ b/modules/docs/app/VoloDocs.EntityFrameworkCore/VoloDocsEntityFrameworkCoreModule.cs @@ -5,7 +5,7 @@ using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Docs.EntityFrameworkCore; -namespace Volo.DocsTestApp.EntityFrameworkCore +namespace VoloDocs.EntityFrameworkCore { [DependsOn( typeof(DocsEntityFrameworkCoreModule), @@ -13,7 +13,7 @@ namespace Volo.DocsTestApp.EntityFrameworkCore typeof(AbpPermissionManagementEntityFrameworkCoreModule), typeof(AbpSettingManagementEntityFrameworkCoreModule), typeof(AbpEntityFrameworkCoreSqlServerModule))] - public class DocsTestAppEntityFrameworkCoreModule : AbpModule + public class VoloDocsEntityFrameworkCoreModule : AbpModule { } diff --git a/modules/docs/app/VoloDocs.Migrator/AppExtensions.cs b/modules/docs/app/VoloDocs.Migrator/AppExtensions.cs new file mode 100644 index 0000000000..1e99538582 --- /dev/null +++ b/modules/docs/app/VoloDocs.Migrator/AppExtensions.cs @@ -0,0 +1,13 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp; + +namespace VoloDocs.Migrator +{ + public static class AppExtensions + { + public static T Resolve(this IAbpApplicationWithInternalServiceProvider app) + { + return (T)app.ServiceProvider.GetRequiredService(); + } + } +} \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Migrator/Migrate.bat b/modules/docs/app/VoloDocs.Migrator/Migrate.bat new file mode 100644 index 0000000000..0a99a0e804 --- /dev/null +++ b/modules/docs/app/VoloDocs.Migrator/Migrate.bat @@ -0,0 +1 @@ +@dotnet VoloDocs.Migrator.dll \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Migrator/Program.cs b/modules/docs/app/VoloDocs.Migrator/Program.cs new file mode 100644 index 0000000000..68bcb09455 --- /dev/null +++ b/modules/docs/app/VoloDocs.Migrator/Program.cs @@ -0,0 +1,94 @@ +using System; +using System.IO; +using System.Linq; +using Microsoft.EntityFrameworkCore; +using Volo.Abp; +using VoloDocs.EntityFrameworkCore; + +namespace VoloDocs.Migrator +{ + class Program + { + private const string ScriptFile = "Script.txt"; + + static void Main(string[] args) + { + Console.WriteLine("Initializing VoloDocs Migrator ... "); + + using (var app = AbpApplicationFactory.Create()) + { + app.Initialize(); + + using (var dbContext = app.Resolve()) + { + var connectionString = dbContext.Database.GetDbConnection().ConnectionString; + + Console.Clear(); + + if (args != null && args.Contains("-script")) + { + GenerateMigrationScript(dbContext); + return; + } + + RunMigrations(connectionString, dbContext); + } + + Console.WriteLine("\n\nPress ENTER to exit..."); + Console.ReadLine(); + } + } + + private static void RunMigrations(string connectionString, VoloDocsDbContext dbContext) + { + Console.Write("\nThis program updates an existing database or creates a new one if not exists.\n" + + "The following connection string will be used:\n\n" + + connectionString + "\n\n" + + "Are you sure you want to run the migration? (y/n) "); + + if (Console.ReadKey().Key == ConsoleKey.Y) + { + Console.WriteLine("\n\nMigrating database..."); + + try + { + dbContext.Database.Migrate(); + + Console.WriteLine("Migration completed."); + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + + while (ex.InnerException != null) + { + ex = ex.InnerException; + Console.WriteLine(ex.Message); + } + + Console.Write("\nThere was problem while applying migrations. " + + "Do you want to create the migration script? (y/n) "); + + if (Console.ReadKey().Key == ConsoleKey.Y) + { + GenerateMigrationScript(dbContext); + } + } + } + } + + private static void GenerateMigrationScript(VoloDocsDbContext dbContext) + { + if (File.Exists(ScriptFile)) + { + File.Delete(ScriptFile); + } + + Console.Write("\nGenerating migration scripts..."); + + File.WriteAllText(ScriptFile, dbContext.Database.GenerateCreateScript()); + + Console.Write("\nMigration script has been created to Script.txt file"); + } + } +} \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Migrator/VoloDocs.Migrator.csproj b/modules/docs/app/VoloDocs.Migrator/VoloDocs.Migrator.csproj new file mode 100644 index 0000000000..2d828d6735 --- /dev/null +++ b/modules/docs/app/VoloDocs.Migrator/VoloDocs.Migrator.csproj @@ -0,0 +1,27 @@ + + + + Exe + netcoreapp2.2 + win-x64;linux-x64;osx-x64 + + + + + + + + + + PreserveNewest + PreserveNewest + + + + + + PreserveNewest + + + + diff --git a/modules/docs/app/VoloDocs.Migrator/VoloDocsMigratorModule.cs b/modules/docs/app/VoloDocs.Migrator/VoloDocsMigratorModule.cs new file mode 100644 index 0000000000..07aece7a5e --- /dev/null +++ b/modules/docs/app/VoloDocs.Migrator/VoloDocsMigratorModule.cs @@ -0,0 +1,29 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Data; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Modularity; +using VoloDocs.EntityFrameworkCore; + +namespace VoloDocs.Migrator +{ + [DependsOn(typeof(VoloDocsEntityFrameworkCoreModule))] + public class VoloDocsMigratorModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + + context.Services.AddAbpDbContext(); + + Configure(options => + { + options.ConnectionStrings.Default = configuration["ConnectionString"]; + }); + + Configure(options => + { + options.UseSqlServer(); + }); + } + } +} \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Migrator/appsettings.json b/modules/docs/app/VoloDocs.Migrator/appsettings.json new file mode 100644 index 0000000000..c9934c1e75 --- /dev/null +++ b/modules/docs/app/VoloDocs.Migrator/appsettings.json @@ -0,0 +1,3 @@ +{ + "ConnectionString": "Server=localhost;Database=VoloDocs;Trusted_Connection=True;MultipleActiveResultSets=true" +} \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/Branding/VoloDocsBrandingProvider.cs b/modules/docs/app/VoloDocs.Web/Branding/VoloDocsBrandingProvider.cs new file mode 100644 index 0000000000..88eff01063 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/Branding/VoloDocsBrandingProvider.cs @@ -0,0 +1,29 @@ +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Components; +using Volo.Abp.Configuration; +using Volo.Abp.DependencyInjection; + +namespace VoloDocs.Web.Branding +{ + [Dependency(ReplaceServices = true)] + public class VoloDocsBrandingProvider : DefaultBrandingProvider + { + public VoloDocsBrandingProvider(IConfigurationAccessor configurationAccessor) + { + var configuration = configurationAccessor.Configuration; + + if (configuration["Title"] != null) + { + AppName = configuration["Title"]; + } + + if (configuration["LogoUrl"] != null) + { + LogoUrl = configuration["LogoUrl"]; + } + } + + public override string AppName { get; } + + public override string LogoUrl { get; } + } +} diff --git a/modules/docs/app/Volo.DocsTestApp/Controllers/HomeController.cs b/modules/docs/app/VoloDocs.Web/Controllers/HomeController.cs similarity index 79% rename from modules/docs/app/Volo.DocsTestApp/Controllers/HomeController.cs rename to modules/docs/app/VoloDocs.Web/Controllers/HomeController.cs index 0750e72b20..5594306229 100644 --- a/modules/docs/app/Volo.DocsTestApp/Controllers/HomeController.cs +++ b/modules/docs/app/VoloDocs.Web/Controllers/HomeController.cs @@ -1,6 +1,6 @@ using Volo.Abp.AspNetCore.Mvc; -namespace Volo.DocsTestApp.Controllers +namespace VoloDocs.Web.Controllers { public class HomeController : AbpController { diff --git a/modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/en.json b/modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/en.json new file mode 100644 index 0000000000..cd8eb98149 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/en.json @@ -0,0 +1,9 @@ +{ + "culture": "en", + "texts": { + "WelcomeVoloDocs": "Welcome to the VoloDocs!", + "NoProjectWarning": "There`s no defined project yet!", + "CreateYourFirstProject": "Click here to start your first project", + "NoProject": "No project!" + } +} \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/tr.json b/modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/tr.json new file mode 100644 index 0000000000..8f49c6e952 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/Localization/Resources/VoloDocs/Web/tr.json @@ -0,0 +1,9 @@ +{ + "culture": "tr", + "texts": { + "WelcomeVoloDocs": "VoloDocs Hoşgeldiniz!", + "NoProjectWarning": "Henüz bir proje yok!", + "CreateYourFirstProject": "İlk projenizi oluşturmak için tıklayın", + "NoProject": "Proje yok!" + } +} \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/Pages/Error.cshtml b/modules/docs/app/VoloDocs.Web/Pages/Error.cshtml new file mode 100644 index 0000000000..1cfff62e21 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/Pages/Error.cshtml @@ -0,0 +1,14 @@ +@page +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Docs.Localization +@model VoloDocs.Web.Pages.ErrorModel +@inject IHtmlLocalizer L +@{ +
+
+            @Model.ErrorMessage
+        
+ + @L["BackToWebsite"] +
+} diff --git a/modules/docs/app/Volo.DocsTestApp/Controllers/ErrorController.cs b/modules/docs/app/VoloDocs.Web/Pages/Error.cshtml.cs similarity index 61% rename from modules/docs/app/Volo.DocsTestApp/Controllers/ErrorController.cs rename to modules/docs/app/VoloDocs.Web/Pages/Error.cshtml.cs index 943a3a85f2..5e5c4f639b 100644 --- a/modules/docs/app/Volo.DocsTestApp/Controllers/ErrorController.cs +++ b/modules/docs/app/VoloDocs.Web/Pages/Error.cshtml.cs @@ -1,43 +1,52 @@ -using System; +using System; using System.Collections.Generic; using System.Net; using Microsoft.AspNetCore.Diagnostics; using Microsoft.AspNetCore.Mvc; -using Serilog; -using Volo.Abp.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; -namespace Volo.DocsTestApp.Controllers +namespace VoloDocs.Web.Pages { - public class ErrorController : AbpController + public class ErrorModel : AbpPageModel { - [Route("error/{statusCode}")] - [HttpGet] - public IActionResult Index(int statusCode = 0) + public string ErrorMessage { get; set; } + + public ActionResult OnGet(string statusCode) { - var statusFeature = HttpContext.Features.Get(); - if (statusFeature != null) + try { - Log.Warning("Handled {0} error for URL: {1}", statusCode, statusFeature.OriginalPath); - } + if (!int.TryParse(statusCode, out var errorStatusCode)) + { + errorStatusCode = (int)HttpStatusCode.BadRequest; + } + + var statusFeature = HttpContext.Features.Get(); + if (statusFeature != null) + { + Logger.LogWarning("Handled {0} error for URL: {1}", statusCode, statusFeature.OriginalPath); + } + + var isValidStatusCode = Enum.IsDefined(typeof(HttpStatusCode), errorStatusCode); + if (!isValidStatusCode) + { + errorStatusCode = (int)HttpStatusCode.BadRequest; + } - var isValidStatusCode = Enum.IsDefined(typeof(HttpStatusCode), statusCode); - if (!isValidStatusCode) + ErrorMessage = _errorMessages.ContainsKey(errorStatusCode) + ? _errorMessages[errorStatusCode] + : "Looks like something went wrong!"; + + } + catch (Exception e) { - statusCode = (int)HttpStatusCode.BadRequest; + Logger.LogError("Error on error page: " + e); } - return new ContentResult - { - ContentType = System.Net.Mime.MediaTypeNames.Text.Html, - StatusCode = statusCode, - Content = string.Format(HtmlBody, _errorMessages.ContainsKey(statusCode) - ? _errorMessages[statusCode] - : "Looks like something went wrong!") - }; + return Page(); } - private const string HtmlBody = ""; - + #region Error Messages /*For more ASCII arts http://patorjk.com/software/taag/#p=display&h=0&f=Big&t=400*/ private readonly Dictionary _errorMessages = new Dictionary { @@ -84,7 +93,7 @@ This is a forbidden area!" | | | |_| | | | |_| \___/ |_| -We can't find the page you're looking for..." +Hmm, we couldn't find the page you're looking for..." }, { 500, @@ -123,5 +132,6 @@ Ooops! Our server is experiencing a mild case of the hiccups." Looks like we're having some server issues." } }; + #endregion } -} +} \ No newline at end of file diff --git a/modules/docs/app/VoloDocs.Web/Pages/Index.cshtml b/modules/docs/app/VoloDocs.Web/Pages/Index.cshtml new file mode 100644 index 0000000000..6f6c083531 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/Pages/Index.cshtml @@ -0,0 +1,56 @@ +@page + +@using System.Linq +@using Microsoft.AspNetCore.Mvc.Localization +@using Volo.Docs +@using Volo.Docs.Localization +@using Volo.Docs.Pages.Documents + +@model VoloDocs.Web.Pages.IndexModel +@inject IHtmlLocalizer L + +@section styles { + + + + +} + +
+ +

+ @L["WelcomeVoloDocs"] +

+ + @if (!Model.Projects.Any()) + { +
+ +
+ } + else if (Model.Projects.Count > 1) + { +

@L["Projects"]

+

+

+

+ } + +
diff --git a/modules/docs/app/VoloDocs.Web/Pages/Index.cshtml.cs b/modules/docs/app/VoloDocs.Web/Pages/Index.cshtml.cs new file mode 100644 index 0000000000..8b6ffd2cdf --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/Pages/Index.cshtml.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Volo.Docs; +using Volo.Docs.Projects; + +namespace VoloDocs.Web.Pages +{ + public class IndexModel : PageModel + { + public IReadOnlyList Projects { get; set; } + + private readonly IProjectAppService _projectAppService; + + public IndexModel(IProjectAppService projectAppService) + { + _projectAppService = projectAppService; + } + + public async Task OnGet() + { + Projects = (await _projectAppService.GetListAsync()).Items; + + if (Projects.Count == 1) + { + return RedirectToPage("./Documents/Project/Index", new + { + projectName = Projects[0].ShortName, + version = DocsAppConsts.Latest, + documentName = Projects[0].DefaultDocumentName + }); + } + + return Page(); + } + } +} \ No newline at end of file diff --git a/modules/docs/app/Volo.DocsTestApp/Pages/_ViewImports.cshtml b/modules/docs/app/VoloDocs.Web/Pages/_ViewImports.cshtml similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/Pages/_ViewImports.cshtml rename to modules/docs/app/VoloDocs.Web/Pages/_ViewImports.cshtml diff --git a/modules/docs/app/Volo.DocsTestApp/Program.cs b/modules/docs/app/VoloDocs.Web/Program.cs similarity index 97% rename from modules/docs/app/Volo.DocsTestApp/Program.cs rename to modules/docs/app/VoloDocs.Web/Program.cs index 470b5e6a98..90c41c061d 100644 --- a/modules/docs/app/Volo.DocsTestApp/Program.cs +++ b/modules/docs/app/VoloDocs.Web/Program.cs @@ -4,7 +4,7 @@ using Microsoft.AspNetCore.Hosting; using Serilog; using Serilog.Events; -namespace Volo.DocsTestApp +namespace VoloDocs.Web { public class Program { diff --git a/modules/docs/app/Volo.DocsTestApp/Properties/launchSettings.json b/modules/docs/app/VoloDocs.Web/Properties/launchSettings.json similarity index 95% rename from modules/docs/app/Volo.DocsTestApp/Properties/launchSettings.json rename to modules/docs/app/VoloDocs.Web/Properties/launchSettings.json index 993312907b..f548eac112 100644 --- a/modules/docs/app/Volo.DocsTestApp/Properties/launchSettings.json +++ b/modules/docs/app/VoloDocs.Web/Properties/launchSettings.json @@ -15,7 +15,7 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, - "Volo.DocsTestApp": { + "VoloDocs": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { diff --git a/modules/docs/app/Volo.DocsTestApp/Startup.cs b/modules/docs/app/VoloDocs.Web/Startup.cs similarity index 87% rename from modules/docs/app/Volo.DocsTestApp/Startup.cs rename to modules/docs/app/VoloDocs.Web/Startup.cs index e6708d26e8..a05cf9e2c0 100644 --- a/modules/docs/app/Volo.DocsTestApp/Startup.cs +++ b/modules/docs/app/VoloDocs.Web/Startup.cs @@ -5,13 +5,13 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Volo.Abp; -namespace Volo.DocsTestApp +namespace VoloDocs.Web { public class Startup { public IServiceProvider ConfigureServices(IServiceCollection services) { - services.AddApplication(options => + services.AddApplication(options => { options.UseAutofac(); }); diff --git a/modules/docs/app/VoloDocs.Web/Utils/GlobalExceptionHandlerMiddleware.cs b/modules/docs/app/VoloDocs.Web/Utils/GlobalExceptionHandlerMiddleware.cs new file mode 100644 index 0000000000..da303643d4 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/Utils/GlobalExceptionHandlerMiddleware.cs @@ -0,0 +1,45 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using Volo.Abp.AspNetCore.Uow; +using Volo.Abp.Domain.Entities; +using Volo.Docs; + +namespace VoloDocs.Web.Utils +{ + public class GlobalExceptionHandlerMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _logger; + + public GlobalExceptionHandlerMiddleware(RequestDelegate next, ILogger logger) + { + _logger = logger; + _next = next; + } + + public async Task Invoke(HttpContext httpContext) + { + try + { + await _next(httpContext); + } + catch (Exception ex) + { + _logger.LogError("Handled a global exception: " + ex.Message, ex); + + if (ex.Message.StartsWith("404 error") || + ex is EntityNotFoundException || + ex is DocumentNotFoundException) + { + httpContext.Response.Redirect("/error/404"); + } + else + { + httpContext.Response.Redirect("/error/500"); + } + } + } + } +} \ No newline at end of file diff --git a/modules/docs/app/Volo.DocsTestApp/Volo.DocsTestApp.csproj b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj similarity index 71% rename from modules/docs/app/Volo.DocsTestApp/Volo.DocsTestApp.csproj rename to modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj index b24f84e537..7870968c45 100644 --- a/modules/docs/app/Volo.DocsTestApp/Volo.DocsTestApp.csproj +++ b/modules/docs/app/VoloDocs.Web/VoloDocs.Web.csproj @@ -2,11 +2,15 @@ netcoreapp2.2 + true + true + false + win-x64;osx-x64;linux-x64 - - + + @@ -23,12 +27,20 @@ - + - + + + + + + + + +
diff --git a/modules/docs/app/Volo.DocsTestApp/DocsTestAppModule.cs b/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs similarity index 74% rename from modules/docs/app/Volo.DocsTestApp/DocsTestAppModule.cs rename to modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs index 275eb0f713..9520a0e9df 100644 --- a/modules/docs/app/Volo.DocsTestApp/DocsTestAppModule.cs +++ b/modules/docs/app/VoloDocs.Web/VoloDocsWebModule.cs @@ -1,16 +1,12 @@ -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; +using System.IO; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Localization; -using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; using Swashbuckle.AspNetCore.Swagger; using Volo.Abp; using Volo.Abp.Account.Web; +using Volo.Abp.AspNetCore.Mvc.Localization; using Volo.Abp.AspNetCore.Mvc.UI; using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; @@ -21,6 +17,8 @@ using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Identity; using Volo.Abp.Identity.Web; +using Volo.Abp.Localization; +using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement; using Volo.Abp.PermissionManagement.Identity; @@ -29,16 +27,18 @@ using Volo.Abp.UI; using Volo.Abp.VirtualFileSystem; using Volo.Docs; using Volo.Docs.Admin; -using Volo.DocsTestApp.EntityFrameworkCore; +using Volo.Docs.Localization; +using VoloDocs.EntityFrameworkCore; +using VoloDocs.Web.Utils; -namespace Volo.DocsTestApp +namespace VoloDocs.Web { [DependsOn( typeof(DocsWebModule), typeof(DocsAdminWebModule), typeof(DocsApplicationModule), typeof(DocsAdminApplicationModule), - typeof(DocsTestAppEntityFrameworkCoreModule), + typeof(VoloDocsEntityFrameworkCoreModule), typeof(AbpAutofacModule), typeof(AbpAccountWebModule), typeof(AbpIdentityWebModule), @@ -47,8 +47,16 @@ namespace Volo.DocsTestApp typeof(AbpPermissionManagementApplicationModule), typeof(AbpAspNetCoreMvcUiBasicThemeModule) )] - public class DocsTestAppModule : AbpModule + public class VoloDocsWebModule : AbpModule { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + PreConfigure(options => + { + options.AddAssemblyResource(typeof(DocsResource), typeof(VoloDocsWebModule).Assembly); + }); + } + public override void ConfigureServices(ServiceConfigurationContext context) { var hostingEnvironment = context.Services.GetHostingEnvironment(); @@ -56,8 +64,7 @@ namespace Volo.DocsTestApp Configure(options => { - const string connStringName = "SqlServer"; - options.ConnectionStrings.Default = configuration.GetConnectionString(connStringName); + options.ConnectionStrings.Default = configuration["ConnectionString"]; }); Configure(options => @@ -83,30 +90,49 @@ namespace Volo.DocsTestApp context.Services.AddSwaggerGen( options => { - options.SwaggerDoc("v1", new Info { Title = "Docs API", Version = "v1" }); + options.SwaggerDoc("v1", new Info + { + Title = "Docs API", + Version = "v1" + }); options.DocInclusionPredicate((docName, description) => true); options.CustomSchemaIds(type => type.FullName); }); - var cultures = new List { new CultureInfo("en"), new CultureInfo("tr") }; - Configure(options => + + Configure(options => + { + options.FileSets.AddEmbedded("VoloDocs.Web"); + }); + + Configure(options => { - options.DefaultRequestCulture = new RequestCulture("en"); - options.SupportedCultures = cultures; - options.SupportedUICultures = cultures; + options + .Languages + .Add(new LanguageInfo("en", "en", "English")); + + options.Resources + .Get() + .AddBaseTypes(typeof(AbpValidationResource)) + .AddBaseTypes(typeof(AbpUiModule)) + .AddVirtualJson("/Localization/Resources/VoloDocs/Web"); }); Configure(options => { options.DefaultThemeName = BasicTheme.Name; }); + + Configure(options => + { + options.Conventions.AddPageRoute("/Error", "error/{statusCode}"); + }); } public override void OnApplicationInitialization(ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); - - app.UseDeveloperExceptionPage(); + var env = context.GetEnvironment(); app.UseVirtualFiles(); @@ -118,9 +144,10 @@ namespace Volo.DocsTestApp app.UseAuthentication(); - app.UseRequestLocalization(app.ApplicationServices.GetRequiredService>().Value); - + app.UseAbpRequestLocalization(); + app.UseStatusCodePagesWithReExecute("/error/{0}"); + //app.UseMiddleware(); app.UseMvc(routes => { diff --git a/modules/docs/app/Volo.DocsTestApp/abp.resourcemapping.js b/modules/docs/app/VoloDocs.Web/abp.resourcemapping.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/abp.resourcemapping.js rename to modules/docs/app/VoloDocs.Web/abp.resourcemapping.js diff --git a/modules/docs/app/VoloDocs.Web/appsettings.json b/modules/docs/app/VoloDocs.Web/appsettings.json new file mode 100644 index 0000000000..2b71262885 --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/appsettings.json @@ -0,0 +1,5 @@ +{ + "ConnectionString": "Server=localhost;Database=VoloDocs;Trusted_Connection=True;MultipleActiveResultSets=true", + "Title": "VoloDocs", + "LogoUrl": "/assets/images/Logo.png" +} \ No newline at end of file diff --git a/modules/docs/app/Volo.DocsTestApp/gulpfile.js b/modules/docs/app/VoloDocs.Web/gulpfile.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/gulpfile.js rename to modules/docs/app/VoloDocs.Web/gulpfile.js diff --git a/modules/docs/app/Volo.DocsTestApp/package-lock.json b/modules/docs/app/VoloDocs.Web/package-lock.json similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/package-lock.json rename to modules/docs/app/VoloDocs.Web/package-lock.json diff --git a/modules/docs/app/Volo.DocsTestApp/package.json b/modules/docs/app/VoloDocs.Web/package.json similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/package.json rename to modules/docs/app/VoloDocs.Web/package.json diff --git a/modules/docs/app/VoloDocs.Web/publish.bat b/modules/docs/app/VoloDocs.Web/publish.bat new file mode 100644 index 0000000000..62f1f02d1f --- /dev/null +++ b/modules/docs/app/VoloDocs.Web/publish.bat @@ -0,0 +1,19 @@ +@echo off + +dotnet clean +dotnet restore +dotnet build + +DEL /F/Q/S "C:\Publishes\VoloDocs" > NUL && RMDIR /Q/S "C:\Publishes\VoloDocs" + +dotnet publish -c Release -r win-x64 --self-contained true -o "C:\Publishes\VoloDocs\win-x64\Web" +dotnet publish -c Release -r win-x86 --self-contained true -o "C:\Publishes\VoloDocs\win-x86\Web" +dotnet publish -c Release -r osx-x64 --self-contained true -o "C:\Publishes\VoloDocs\osx-x64\Web" +dotnet publish -c Release -r linux-x64 --self-contained true -o "C:\Publishes\VoloDocs\linux-x64\Web" + +cd..\VoloDocs.Migrator + +dotnet publish -c Release -r win-x64 --self-contained true -o "C:\Publishes\VoloDocs\win-x64\Migrator" +dotnet publish -c Release -r win-x86 --self-contained true -o "C:\Publishes\VoloDocs\win-x86\Migrator" +dotnet publish -c Release -r osx-x64 --self-contained true -o "C:\Publishes\VoloDocs\osx-x64\Migrator" +dotnet publish -c Release -r linux-x64 --self-contained true -o "C:\Publishes\VoloDocs\linux-x64\Migrator" diff --git a/modules/docs/app/VoloDocs.Web/wwwroot/assets/images/Logo.png b/modules/docs/app/VoloDocs.Web/wwwroot/assets/images/Logo.png new file mode 100644 index 0000000000..30a85a0ca0 Binary files /dev/null and b/modules/docs/app/VoloDocs.Web/wwwroot/assets/images/Logo.png differ diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/abp/core/abp.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/abp/core/abp.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/abp/core/abp.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/abp/core/abp.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/abp/jquery/abp.jquery.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/abp/jquery/abp.jquery.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/abp/jquery/abp.jquery.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/abp/jquery/abp.jquery.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/anchor-js/anchor.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/anchor-js/anchor.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/anchor-js/anchor.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/anchor-js/anchor.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap/css/bootstrap.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/bootstrap/css/bootstrap.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap/css/bootstrap.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/bootstrap/css/bootstrap.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap/js/bootstrap.bundle.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/bootstrap/js/bootstrap.bundle.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/bootstrap/js/bootstrap.bundle.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/bootstrap/js/bootstrap.bundle.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/clipboard/clipboard.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/clipboard/clipboard.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/clipboard/clipboard.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/clipboard/clipboard.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/clipboard/clipboard.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/clipboard/clipboard.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/clipboard/clipboard.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/clipboard/clipboard.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/datatables.net-bs4/css/dataTables.bootstrap4.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/datatables.net-bs4/css/dataTables.bootstrap4.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/datatables.net-bs4/css/dataTables.bootstrap4.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/datatables.net-bs4/css/dataTables.bootstrap4.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/datatables.net-bs4/js/dataTables.bootstrap4.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/datatables.net-bs4/js/dataTables.bootstrap4.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/datatables.net-bs4/js/dataTables.bootstrap4.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/datatables.net-bs4/js/dataTables.bootstrap4.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/datatables.net/js/jquery.dataTables.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/datatables.net/js/jquery.dataTables.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/datatables.net/js/jquery.dataTables.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/datatables.net/js/jquery.dataTables.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/css/font-awesome.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/css/font-awesome.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/css/font-awesome.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/css/font-awesome.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/FontAwesome.otf b/modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/FontAwesome.otf similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/FontAwesome.otf rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/FontAwesome.otf diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.eot b/modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.eot similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.eot rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.eot diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.svg b/modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.svg similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.svg rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.svg diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.ttf b/modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.ttf similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.ttf rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.ttf diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.woff b/modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.woff similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.woff rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.woff diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.woff2 b/modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.woff2 similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.woff2 rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/font-awesome/fonts/fontawesome-webfont.woff2 diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-form/jquery.form.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-form/jquery.form.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-form/jquery.form.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-form/jquery.form.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/jquery.validate.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/jquery.validate.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/jquery.validate.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/jquery.validate.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ar.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ar.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ar.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ar.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_az.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_az.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_az.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_az.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_bg.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_bg.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_bg.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_bg.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_bn_BD.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_bn_BD.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_bn_BD.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_bn_BD.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ca.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ca.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ca.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ca.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_cs.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_cs.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_cs.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_cs.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_da.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_da.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_da.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_da.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_de.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_de.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_de.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_de.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_el.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_el.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_el.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_el.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_es.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_es.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_es.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_es.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_es_AR.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_es_AR.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_es_AR.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_es_AR.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_es_PE.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_es_PE.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_es_PE.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_es_PE.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_et.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_et.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_et.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_et.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_eu.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_eu.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_eu.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_eu.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_fa.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_fa.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_fa.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_fa.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_fi.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_fi.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_fi.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_fi.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_fr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_fr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_fr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_fr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ge.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ge.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ge.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ge.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_gl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_gl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_gl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_gl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_he.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_he.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_he.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_he.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_hr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_hr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_hr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_hr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_hu.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_hu.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_hu.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_hu.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_hy_AM.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_hy_AM.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_hy_AM.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_hy_AM.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_id.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_id.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_id.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_id.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_is.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_is.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_is.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_is.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_it.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_it.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_it.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_it.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ja.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ja.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ja.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ja.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ka.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ka.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ka.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ka.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_kk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_kk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_kk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_kk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ko.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ko.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ko.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ko.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_lt.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_lt.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_lt.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_lt.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_lv.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_lv.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_lv.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_lv.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_mk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_mk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_mk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_mk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_my.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_my.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_my.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_my.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_nl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_nl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_nl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_nl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_no.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_no.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_no.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_no.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_pl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_pl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_pl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_pl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_pt_BR.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_pt_BR.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_pt_BR.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_pt_BR.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_pt_PT.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_pt_PT.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_pt_PT.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_pt_PT.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ro.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ro.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ro.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ro.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ru.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ru.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ru.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ru.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sd.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sd.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sd.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sd.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_si.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_si.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_si.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_si.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sr_lat.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sr_lat.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sr_lat.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sr_lat.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sv.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sv.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_sv.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_sv.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_th.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_th.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_th.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_th.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_tj.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_tj.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_tj.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_tj.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_tr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_tr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_tr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_tr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_uk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_uk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_uk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_uk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ur.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ur.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_ur.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_ur.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_vi.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_vi.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_vi.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_vi.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_zh.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_zh.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_zh.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_zh.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_zh_TW.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_zh_TW.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/messages_zh_TW.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/messages_zh_TW.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/methods_de.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/methods_de.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/methods_de.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/methods_de.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/methods_es_CL.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/methods_es_CL.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/methods_es_CL.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/methods_es_CL.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/methods_fi.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/methods_fi.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/methods_fi.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/methods_fi.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/methods_nl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/methods_nl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/methods_nl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/methods_nl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/methods_pt.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/methods_pt.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery-validation/localization/methods_pt.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery-validation/localization/methods_pt.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery/jquery.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery/jquery.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/jquery/jquery.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/jquery/jquery.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/lodash/lodash.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/lodash/lodash.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/lodash/lodash.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/lodash/lodash.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.concat.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/jquery.mCustomScrollbar.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/mCSB_buttons.png b/modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/mCSB_buttons.png similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/mCSB_buttons.png rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/mCSB_buttons.png diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/package.json b/modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/package.json similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/package.json rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/package.json diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/readme.md b/modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/readme.md similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/malihu-custom-scrollbar-plugin/readme.md rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/malihu-custom-scrollbar-plugin/readme.md diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/popper.js/popper.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/popper.js/popper.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/popper.js/popper.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/popper.js/popper.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/CHANGELOG.md b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/CHANGELOG.md similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/CHANGELOG.md rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/CHANGELOG.md diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/README.md b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/README.md similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/README.md rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/README.md diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components.json b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.json similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components.json rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components.json diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/index.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/index.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/index.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/index.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-abap.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-abap.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-abap.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-abap.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-abap.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-actionscript.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-actionscript.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-actionscript.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-actionscript.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-actionscript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-actionscript.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-actionscript.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-actionscript.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ada.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ada.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ada.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ada.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ada.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-apacheconf.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apacheconf.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-apacheconf.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apacheconf.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-apacheconf.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apacheconf.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-apacheconf.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apacheconf.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-apl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-apl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-apl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apl.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-apl.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-apl.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-applescript.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-applescript.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-applescript.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-applescript.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-applescript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-applescript.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-applescript.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-applescript.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-arduino.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arduino.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-arduino.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arduino.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-arduino.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arduino.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-arduino.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arduino.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-arff.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arff.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-arff.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arff.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-arff.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arff.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-arff.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-arff.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-asciidoc.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-asciidoc.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-asciidoc.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-asciidoc.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asciidoc.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-asm6502.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asm6502.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-asm6502.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asm6502.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-asm6502.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asm6502.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-asm6502.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-asm6502.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-aspnet.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-aspnet.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-aspnet.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-aspnet.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-aspnet.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-aspnet.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-aspnet.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-aspnet.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-autohotkey.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-autohotkey.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-autohotkey.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-autohotkey.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autohotkey.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-autoit.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autoit.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-autoit.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autoit.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-autoit.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autoit.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-autoit.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-autoit.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bash.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bash.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bash.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bash.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bash.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bash.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bash.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bash.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-basic.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-basic.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-basic.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-basic.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-basic.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-basic.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-basic.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-basic.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-batch.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-batch.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-batch.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-batch.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-batch.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bison.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bison.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bison.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bison.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bison.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bison.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bison.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bison.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-brainfuck.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-brainfuck.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-brainfuck.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-brainfuck.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-brainfuck.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-brainfuck.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-brainfuck.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-brainfuck.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bro.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bro.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bro.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bro.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bro.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bro.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-bro.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-bro.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-c.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-c.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-c.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-c.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-c.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-c.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-c.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-c.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-clike.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-clike.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-clike.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-clike.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-clike.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-clike.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-clike.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-clike.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-clojure.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-clojure.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-clojure.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-clojure.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-clojure.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-clojure.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-clojure.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-clojure.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-coffeescript.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coffeescript.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-coffeescript.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coffeescript.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-coffeescript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coffeescript.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-coffeescript.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-coffeescript.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-core.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-core.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-core.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-core.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-core.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-cpp.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-cpp.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-cpp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-cpp.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-cpp.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-crystal.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-crystal.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-crystal.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-crystal.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-crystal.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-crystal.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-crystal.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-crystal.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-csharp.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-csharp.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-csharp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-csharp.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csharp.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-csp.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csp.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-csp.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csp.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-csp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csp.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-csp.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-csp.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-css-extras.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-css-extras.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-css-extras.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-css-extras.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-css-extras.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-css-extras.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-css-extras.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-css-extras.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-css.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-css.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-css.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-css.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-css.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-css.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-css.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-css.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-d.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-d.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-d.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-d.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-d.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-d.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-d.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-d.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-dart.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dart.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-dart.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dart.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-dart.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dart.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-dart.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-dart.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-diff.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-diff.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-diff.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-diff.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-diff.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-django.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-django.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-django.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-django.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-django.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-docker.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-docker.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-docker.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-docker.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-docker.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-eiffel.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-eiffel.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-eiffel.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-eiffel.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-eiffel.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-eiffel.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-eiffel.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-eiffel.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-elixir.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-elixir.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-elixir.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-elixir.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elixir.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-elm.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elm.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-elm.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elm.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-elm.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elm.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-elm.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-elm.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-erb.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-erb.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-erb.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-erb.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erb.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-erlang.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-erlang.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-erlang.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-erlang.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-erlang.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-flow.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-flow.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-flow.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-flow.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-flow.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-flow.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-flow.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-flow.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-fortran.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-fortran.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-fortran.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-fortran.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-fortran.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-fortran.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-fortran.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-fortran.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-fsharp.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-fsharp.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-fsharp.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-fsharp.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-fsharp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-fsharp.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-fsharp.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-fsharp.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-gedcom.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-gedcom.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-gedcom.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-gedcom.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gedcom.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-gherkin.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-gherkin.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-gherkin.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-gherkin.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-gherkin.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-git.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-git.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-git.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-git.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-git.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-git.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-git.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-git.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-glsl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-glsl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-glsl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-glsl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-glsl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-glsl.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-glsl.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-glsl.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-go.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-go.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-go.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-go.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-go.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-go.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-go.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-go.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-graphql.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-graphql.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-graphql.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-graphql.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-graphql.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-groovy.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-groovy.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-groovy.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-groovy.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-groovy.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haml.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haml.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haml.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haml.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-handlebars.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-handlebars.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-handlebars.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-handlebars.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-handlebars.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-handlebars.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-handlebars.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-handlebars.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haskell.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haskell.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haskell.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haskell.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haskell.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haskell.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haskell.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haskell.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haxe.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haxe.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haxe.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haxe.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haxe.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haxe.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-haxe.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-haxe.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-hpkp.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-hpkp.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-hpkp.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-hpkp.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-hpkp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-hpkp.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-hpkp.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-hpkp.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-hsts.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-hsts.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-hsts.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-hsts.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-hsts.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-hsts.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-hsts.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-hsts.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-http.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-http.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-http.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-http.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-http.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ichigojam.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ichigojam.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ichigojam.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ichigojam.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ichigojam.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ichigojam.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ichigojam.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ichigojam.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-icon.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icon.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-icon.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icon.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-icon.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icon.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-icon.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-icon.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-inform7.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-inform7.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-inform7.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-inform7.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-inform7.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-inform7.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-inform7.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-inform7.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ini.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ini.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ini.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ini.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ini.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ini.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ini.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ini.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-io.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-io.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-io.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-io.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-io.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-io.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-io.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-io.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-j.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-j.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-j.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-j.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-j.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-j.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-j.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-j.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-java.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-java.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-java.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-java.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-java.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-javascript.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javascript.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-javascript.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javascript.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-javascript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javascript.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-javascript.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-javascript.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-jolie.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jolie.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-jolie.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jolie.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-jolie.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jolie.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-jolie.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jolie.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-json.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-json.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-json.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-json.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-json.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-json.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-json.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-json.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-jsx.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-jsx.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-jsx.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-jsx.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-jsx.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-julia.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-julia.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-julia.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-julia.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-julia.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-julia.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-julia.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-julia.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-keyman.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-keyman.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-keyman.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-keyman.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-keyman.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-kotlin.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-kotlin.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-kotlin.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-kotlin.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-kotlin.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-kotlin.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-kotlin.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-kotlin.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-latex.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latex.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-latex.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latex.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-latex.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latex.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-latex.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-latex.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-less.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-less.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-less.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-less.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-less.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-less.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-less.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-less.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-liquid.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-liquid.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-liquid.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-liquid.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-liquid.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lisp.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lisp.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lisp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lisp.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lisp.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-livescript.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-livescript.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-livescript.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-livescript.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-livescript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-livescript.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-livescript.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-livescript.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lolcode.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lolcode.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lolcode.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lolcode.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lolcode.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lolcode.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lolcode.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lolcode.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lua.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lua.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lua.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lua.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lua.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lua.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-lua.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-lua.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-makefile.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-makefile.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-makefile.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-makefile.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-makefile.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-makefile.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-makefile.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-makefile.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markdown.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markdown.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markdown.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markdown.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markdown.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markup-templating.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markup-templating.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markup-templating.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markup-templating.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup-templating.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markup.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markup.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markup.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-markup.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-markup.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-matlab.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-matlab.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-matlab.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-matlab.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-matlab.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-matlab.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-matlab.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-matlab.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-mel.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-mel.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-mel.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-mel.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mel.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-mizar.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mizar.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-mizar.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mizar.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-mizar.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mizar.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-mizar.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-mizar.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-monkey.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-monkey.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-monkey.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-monkey.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-monkey.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-monkey.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-monkey.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-monkey.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-n4js.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-n4js.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-n4js.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-n4js.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-n4js.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-n4js.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-n4js.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-n4js.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nasm.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nasm.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nasm.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nasm.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nasm.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nasm.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nasm.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nasm.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nginx.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nginx.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nginx.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nginx.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nginx.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nginx.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nginx.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nginx.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nim.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nim.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nim.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nim.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nim.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nim.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nim.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nim.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nix.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nix.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nix.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nix.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nix.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nix.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nix.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nix.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nsis.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nsis.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nsis.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nsis.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nsis.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nsis.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-nsis.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-nsis.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-objectivec.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-objectivec.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-objectivec.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-objectivec.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-objectivec.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-objectivec.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-objectivec.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-objectivec.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ocaml.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ocaml.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ocaml.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ocaml.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ocaml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ocaml.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ocaml.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ocaml.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-opencl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-opencl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-opencl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-opencl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-opencl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-opencl.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-opencl.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-opencl.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-oz.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-oz.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-oz.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-oz.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-oz.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-oz.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-oz.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-oz.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-parigp.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-parigp.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-parigp.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-parigp.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parigp.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-parser.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parser.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-parser.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parser.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-parser.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parser.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-parser.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-parser.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pascal.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascal.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pascal.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascal.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pascal.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascal.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pascal.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pascal.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-perl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-perl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-perl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-perl.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-perl.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-php-extras.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php-extras.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-php-extras.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php-extras.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-php-extras.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php-extras.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-php-extras.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php-extras.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-php.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-php.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-php.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-php.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-php.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-plsql.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plsql.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-plsql.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plsql.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-plsql.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plsql.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-plsql.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-plsql.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-powershell.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-powershell.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-powershell.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-powershell.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-powershell.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-processing.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-processing.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-processing.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-processing.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-processing.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-processing.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-processing.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-processing.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-prolog.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-prolog.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-prolog.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-prolog.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-prolog.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-prolog.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-prolog.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-prolog.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-properties.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-properties.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-properties.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-properties.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-properties.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-protobuf.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-protobuf.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-protobuf.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-protobuf.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-protobuf.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-protobuf.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-protobuf.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-protobuf.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pug.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pug.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pug.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pug.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pug.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-puppet.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-puppet.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-puppet.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-puppet.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-puppet.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-puppet.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-puppet.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-puppet.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pure.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pure.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pure.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-pure.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-pure.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-python.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-python.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-python.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-python.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-python.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-python.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-python.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-python.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-q.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-q.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-q.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-q.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-q.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-q.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-q.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-q.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-qore.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qore.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-qore.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qore.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-qore.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qore.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-qore.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-qore.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-r.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-r.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-r.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-r.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-r.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-r.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-r.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-r.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-reason.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-reason.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-reason.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-reason.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-reason.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-reason.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-reason.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-reason.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-renpy.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-renpy.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-renpy.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-renpy.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-renpy.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-renpy.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-renpy.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-renpy.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rest.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rest.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rest.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rest.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rest.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rest.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rest.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rest.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rip.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rip.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rip.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rip.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rip.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rip.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rip.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rip.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-roboconf.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-roboconf.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-roboconf.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-roboconf.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-roboconf.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-roboconf.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-roboconf.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-roboconf.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ruby.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ruby.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ruby.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ruby.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ruby.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ruby.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-ruby.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-ruby.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rust.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rust.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rust.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-rust.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-rust.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sas.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sas.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sas.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sas.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sas.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sass.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sass.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sass.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sass.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sass.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sass.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sass.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sass.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scala.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scala.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scala.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scala.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scala.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scala.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scala.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scala.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scheme.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scheme.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scheme.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scheme.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scheme.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scss.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scss.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scss.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scss.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scss.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scss.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-scss.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-scss.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-smalltalk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smalltalk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-smalltalk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smalltalk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-smalltalk.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smalltalk.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-smalltalk.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smalltalk.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-smarty.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-smarty.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-smarty.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-smarty.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-smarty.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-soy.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-soy.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-soy.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-soy.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-soy.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sql.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sql.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sql.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sql.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sql.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sql.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-sql.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-sql.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-stylus.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stylus.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-stylus.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stylus.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-stylus.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stylus.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-stylus.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-stylus.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-swift.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-swift.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-swift.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-swift.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-swift.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tap.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tap.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tap.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tap.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tap.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tap.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tap.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tap.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tcl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tcl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tcl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tcl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tcl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tcl.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tcl.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tcl.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-textile.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-textile.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-textile.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-textile.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-textile.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tsx.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tsx.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tsx.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tsx.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tsx.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tsx.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tsx.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tsx.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tt2.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tt2.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tt2.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-tt2.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-tt2.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-twig.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-twig.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-twig.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-twig.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-twig.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-typescript.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-typescript.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-typescript.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-typescript.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-typescript.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-typescript.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-typescript.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-typescript.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vbnet.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vbnet.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vbnet.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vbnet.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vbnet.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vbnet.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vbnet.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vbnet.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-velocity.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-velocity.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-velocity.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-velocity.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-velocity.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-velocity.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-velocity.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-velocity.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-verilog.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-verilog.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-verilog.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-verilog.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-verilog.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-verilog.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-verilog.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-verilog.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vhdl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vhdl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vhdl.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vhdl.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vhdl.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vim.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vim.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vim.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vim.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vim.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vim.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-vim.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-vim.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-visual-basic.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-visual-basic.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-visual-basic.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-visual-basic.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-visual-basic.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-visual-basic.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-visual-basic.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-visual-basic.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-wasm.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wasm.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-wasm.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wasm.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-wasm.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wasm.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-wasm.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wasm.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-wiki.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wiki.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-wiki.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wiki.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-wiki.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wiki.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-wiki.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-wiki.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xeora.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xeora.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xeora.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xeora.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xeora.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xeora.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xeora.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xeora.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xojo.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xojo.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xojo.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xojo.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xojo.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xojo.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xojo.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xojo.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xquery.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xquery.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xquery.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-xquery.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-xquery.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-yaml.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-yaml.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-yaml.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/components/prism-yaml.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/components/prism-yaml.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/package.json b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/package.json similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/package.json rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/package.json diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autolinker/prism-autolinker.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/autoloader/prism-autoloader.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/command-line/prism-command-line.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/custom-class/prism-custom-class.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/custom-class/prism-custom-class.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/custom-class/prism-custom-class.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/custom-class/prism-custom-class.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/custom-class/prism-custom-class.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/custom-class/prism-custom-class.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/custom-class/prism-custom-class.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/custom-class/prism-custom-class.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/data-uri-highlight/prism-data-uri-highlight.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/file-highlight/prism-file-highlight.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/highlight-keywords/prism-highlight-keywords.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/highlight-keywords/prism-highlight-keywords.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/highlight-keywords/prism-highlight-keywords.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/highlight-keywords/prism-highlight-keywords.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/highlight-keywords/prism-highlight-keywords.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/highlight-keywords/prism-highlight-keywords.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/highlight-keywords/prism-highlight-keywords.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/highlight-keywords/prism-highlight-keywords.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/jsonp-highlight/prism-jsonp-highlight.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/keep-markup/prism-keep-markup.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-highlight/prism-line-highlight.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/line-numbers/prism-line-numbers.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/normalize-whitespace/prism-normalize-whitespace.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/previewers/prism-previewers.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/remove-initial-line-feed/prism-remove-initial-line-feed.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-invisibles/prism-show-invisibles.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/show-language/prism-show-language.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-language/prism-show-language.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/show-language/prism-show-language.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-language/prism-show-language.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/show-language/prism-show-language.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-language/prism-show-language.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/show-language/prism-show-language.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/show-language/prism-show-language.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/toolbar/prism-toolbar.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/unescaped-markup/prism-unescaped-markup.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/plugins/wpd/prism-wpd.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/prism.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/prism.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/prism.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-coy.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-coy.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-coy.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-coy.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-dark.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-dark.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-dark.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-dark.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-funky.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-funky.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-funky.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-funky.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-okaidia.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-okaidia.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-okaidia.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-okaidia.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-solarizedlight.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-solarizedlight.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-solarizedlight.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-solarizedlight.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-tomorrow.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-tomorrow.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-tomorrow.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-tomorrow.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-twilight.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-twilight.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism-twilight.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism-twilight.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/prismjs/themes/prism.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/prismjs/themes/prism.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/css/select2.min.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/css/select2.min.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/css/select2.min.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/css/select2.min.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/af.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/af.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/af.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/af.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ar.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ar.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ar.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ar.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/az.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/az.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/az.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/az.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/bg.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/bg.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/bg.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/bg.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/bs.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/bs.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/bs.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/bs.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ca.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ca.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ca.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ca.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/cs.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/cs.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/cs.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/cs.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/da.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/da.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/da.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/da.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/de.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/de.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/de.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/de.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/dsb.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/dsb.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/dsb.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/dsb.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/el.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/el.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/el.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/el.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/en.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/en.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/en.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/en.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/es.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/es.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/es.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/es.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/et.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/et.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/et.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/et.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/eu.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/eu.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/eu.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/eu.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/fa.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/fa.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/fa.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/fa.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/fi.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/fi.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/fi.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/fi.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/fr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/fr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/fr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/fr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/gl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/gl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/gl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/gl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/he.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/he.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/he.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/he.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/hi.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/hi.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/hi.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/hi.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/hr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/hr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/hr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/hr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/hsb.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/hsb.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/hsb.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/hsb.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/hu.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/hu.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/hu.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/hu.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/hy.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/hy.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/hy.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/hy.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/id.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/id.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/id.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/id.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/is.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/is.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/is.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/is.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/it.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/it.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/it.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/it.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ja.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ja.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ja.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ja.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/km.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/km.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/km.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/km.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ko.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ko.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ko.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ko.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/lt.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/lt.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/lt.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/lt.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/lv.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/lv.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/lv.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/lv.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/mk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/mk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/mk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/mk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ms.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ms.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ms.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ms.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/nb.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/nb.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/nb.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/nb.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/nl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/nl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/nl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/nl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/pl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/pl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/pl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/pl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ps.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ps.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ps.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ps.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/pt-BR.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/pt-BR.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/pt-BR.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/pt-BR.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/pt.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/pt.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/pt.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/pt.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ro.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ro.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ro.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ro.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ru.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ru.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/ru.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/ru.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/sk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/sk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/sk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/sk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/sl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/sl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/sl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/sl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/sr-Cyrl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/sr-Cyrl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/sr-Cyrl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/sr-Cyrl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/sr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/sr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/sr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/sr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/sv.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/sv.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/sv.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/sv.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/th.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/th.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/th.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/th.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/tr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/tr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/tr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/tr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/uk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/uk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/uk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/uk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/vi.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/vi.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/vi.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/vi.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/zh-CN.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/zh-CN.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/zh-CN.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/zh-CN.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/zh-TW.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/zh-TW.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/i18n/zh-TW.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/i18n/zh-TW.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/select2.full.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/select2.full.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/select2.full.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/select2.full.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/select2.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/select2.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/select2/js/select2.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/select2/js/select2.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/sweetalert/sweetalert.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/sweetalert/sweetalert.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/sweetalert/sweetalert.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/sweetalert/sweetalert.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/jquery.timeago.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/jquery.timeago.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/jquery.timeago.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/jquery.timeago.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/README.md b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/README.md similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/README.md rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/README.md diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.af.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.af.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.af.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.af.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.am.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.am.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.am.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.am.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ar.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ar.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ar.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ar.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.az-short.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.az-short.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.az-short.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.az-short.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.az.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.az.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.az.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.az.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.bg.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.bg.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.bg.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.bg.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.bs.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.bs.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.bs.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.bs.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ca.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ca.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ca.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ca.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.cs.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.cs.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.cs.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.cs.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.cy.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.cy.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.cy.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.cy.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.da.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.da.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.da.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.da.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.de-short.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.de-short.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.de-short.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.de-short.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.de.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.de.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.de.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.de.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.dv.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.dv.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.dv.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.dv.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.el.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.el.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.el.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.el.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.en-short.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.en-short.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.en-short.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.en-short.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.en.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.en.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.en.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.en.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.es-short.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.es-short.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.es-short.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.es-short.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.es.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.es.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.es.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.es.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.et.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.et.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.et.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.et.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.eu.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.eu.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.eu.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.eu.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.fa-short.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.fa-short.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.fa-short.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.fa-short.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.fa.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.fa.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.fa.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.fa.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.fi.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.fi.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.fi.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.fi.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.fr-short.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.fr-short.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.fr-short.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.fr-short.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.fr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.fr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.fr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.fr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.gl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.gl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.gl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.gl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.he.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.he.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.he.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.he.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.hr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.hr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.hr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.hr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.hu.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.hu.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.hu.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.hu.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.hy.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.hy.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.hy.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.hy.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.id.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.id.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.id.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.id.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.is.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.is.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.is.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.is.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.it-short.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.it-short.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.it-short.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.it-short.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.it.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.it.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.it.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.it.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ja.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ja.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ja.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ja.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.jv.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.jv.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.jv.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.jv.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ko.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ko.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ko.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ko.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ky.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ky.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ky.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ky.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.lt.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.lt.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.lt.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.lt.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.lv.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.lv.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.lv.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.lv.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.mk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.mk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.mk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.mk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.nl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.nl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.nl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.nl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.no.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.no.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.no.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.no.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.pl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.pl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.pl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.pl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.pt-br-short.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.pt-br-short.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.pt-br-short.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.pt-br-short.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.pt-br.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.pt-br.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.pt-br.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.pt-br.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.pt-short.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.pt-short.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.pt-short.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.pt-short.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.pt.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.pt.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.pt.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.pt.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ro.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ro.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ro.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ro.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.rs.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.rs.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.rs.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.rs.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ru.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ru.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ru.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ru.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.rw.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.rw.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.rw.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.rw.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.si.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.si.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.si.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.si.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.sk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.sk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.sk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.sk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.sl.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.sl.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.sl.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.sl.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.sq.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.sq.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.sq.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.sq.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.sr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.sr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.sr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.sr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.sv.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.sv.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.sv.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.sv.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.th.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.th.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.th.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.th.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.tr-short.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.tr-short.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.tr-short.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.tr-short.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.tr.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.tr.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.tr.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.tr.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.uk.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.uk.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.uk.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.uk.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ur.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ur.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.ur.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.ur.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.uz.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.uz.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.uz.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.uz.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.vi.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.vi.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.vi.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.vi.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.zh-CN.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.zh-CN.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.zh-CN.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.zh-CN.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.zh-TW.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.zh-TW.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/timeago/locales/jquery.timeago.zh-TW.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/timeago/locales/jquery.timeago.zh-TW.js diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/toastr/toastr.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/toastr/toastr.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/toastr/toastr.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/toastr/toastr.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/toastr/toastr.js.map b/modules/docs/app/VoloDocs.Web/wwwroot/libs/toastr/toastr.js.map similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/toastr/toastr.js.map rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/toastr/toastr.js.map diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/toastr/toastr.min.css b/modules/docs/app/VoloDocs.Web/wwwroot/libs/toastr/toastr.min.css similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/toastr/toastr.min.css rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/toastr/toastr.min.css diff --git a/modules/docs/app/Volo.DocsTestApp/wwwroot/libs/toastr/toastr.min.js b/modules/docs/app/VoloDocs.Web/wwwroot/libs/toastr/toastr.min.js similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/wwwroot/libs/toastr/toastr.min.js rename to modules/docs/app/VoloDocs.Web/wwwroot/libs/toastr/toastr.min.js diff --git a/modules/docs/app/Volo.DocsTestApp/yarn.lock b/modules/docs/app/VoloDocs.Web/yarn.lock similarity index 100% rename from modules/docs/app/Volo.DocsTestApp/yarn.lock rename to modules/docs/app/VoloDocs.Web/yarn.lock diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/DocsAdminPermissions.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/DocsAdminPermissions.cs index 7865c14aa3..565b70c7f5 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/DocsAdminPermissions.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/DocsAdminPermissions.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace Volo.Docs.Admin +namespace Volo.Docs.Admin { public class DocsAdminPermissions { diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Localization/Resources/Docs/Web/en.json b/modules/docs/src/Volo.Docs.Admin.Web/Localization/Resources/Docs/Web/en.json index 5796867c4a..8f8fdc0191 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Localization/Resources/Docs/Web/en.json +++ b/modules/docs/src/Volo.Docs.Admin.Web/Localization/Resources/Docs/Web/en.json @@ -18,9 +18,9 @@ "DisplayName:DefaultDocumentName": "Default document name", "DisplayName:NavigationDocumentName": "Navigation document name", "DisplayName:MinimumVersion": "Minimum version", - "DisplayName:MainWebsiteUrl": "Main web site url", + "DisplayName:MainWebsiteUrl": "Main web site URL", "DisplayName:LatestVersionBranchName": "Latest version branch name", - "DisplayName:GitHubRootUrl": "GitHub root url", + "DisplayName:GitHubRootUrl": "GitHub root URL", "DisplayName:GitHubAccessToken": "GitHub access token" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Localization/Resources/Docs/Web/tr.json b/modules/docs/src/Volo.Docs.Admin.Web/Localization/Resources/Docs/Web/tr.json index 504710eaaf..7418e5493e 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Localization/Resources/Docs/Web/tr.json +++ b/modules/docs/src/Volo.Docs.Admin.Web/Localization/Resources/Docs/Web/tr.json @@ -18,9 +18,9 @@ "DisplayName:DefaultDocumentName": "Varsayılan döküman adı", "DisplayName:NavigationDocumentName": "Navigasyon dökümanı adı", "DisplayName:MinimumVersion": "Minimum versiyon", - "DisplayName:MainWebsiteUrl": "Ana web site url'i", + "DisplayName:MainWebsiteUrl": "Ana web site URL", "DisplayName:LatestVersionBranchName": "Son versiyon Branch adı", - "DisplayName:GitHubRootUrl": "GitHub kök url'i", - "DisplayName:GitHubAccessToken": "GitHub erişim jetonu" + "DisplayName:GitHubRootUrl": "GitHub kök adresi", + "DisplayName:GitHubAccessToken": "GitHub erişim token" } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml index 3d730caec4..a72506d978 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml @@ -34,7 +34,7 @@ - Github + GitHub } diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml.cs b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml.cs index 66a7008a1f..0ee140360e 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml.cs +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml.cs @@ -1,7 +1,9 @@ +using Microsoft.AspNetCore.Authorization; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; namespace Volo.Docs.Admin.Pages.Docs.Admin.Projects { + [Authorize(DocsAdminPermissions.Projects.Default)] public class IndexModel : AbpPageModel { public void OnGet() diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml index 00e5bcf069..1c5976e760 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Index.cshtml @@ -1,5 +1,4 @@ @page -@using Castle.Core.Internal @using Microsoft.AspNetCore.Mvc.Localization @using Volo.Docs @using Volo.Docs.Localization @@ -11,18 +10,17 @@ @section styles { - }
- @if (Model.Projects.IsNullOrEmpty()) + @if (Model.Projects == null || !Model.Projects.Any()) { } - @if (Model.Projects.Count > 0) + else {

@L["Projects"]

diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.css index 0e9f1cdb01..ac21149c59 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.css +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.css @@ -72,7 +72,7 @@ font-weight: 700; padding: 7px 0; display: block; - border-bottom: 1px solid #eeeff3; } + border-bottom: 0; } .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover { color: #000; } .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a.last-link { @@ -82,7 +82,7 @@ color: #999; padding: 7px 0; display: block; - border-bottom: 1px solid #eeeff3; } + border-bottom: 0; } .docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon { font-size: .85em; transition: .3s; @@ -321,7 +321,7 @@ color: #aaa; } .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a { color: #aaa; - border-bottom: 1px solid #333; } + border-bottom: 0; } .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover { color: #fff; } .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon { @@ -349,7 +349,7 @@ color: #555; padding: 7px 0; display: block; - border-bottom: 1px solid #333; } + border-bottom: 0; } .docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree > a { color: #fff; transition: .4s; } diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.min.css b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.min.css index 833d37db6d..30820acc67 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.min.css +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.min.css @@ -1 +1 @@ -body{position:relative;}.docs-page{background:#f5f7f9;}.docs-page .anchorjs-link{transition:all .25s linear;}.docs-page *:hover>.anchorjs-link{margin-left:-1.125em !important;transition:color .25s linear;color:#808080;}.docs-page .anchorjs-link:hover{color:#007bff;text-decoration:none;}.docs-page .docs-sidebar{background:#f5f7f9;padding-right:1rem;position:relative;top:0;left:0;position:fixed;}.docs-page .docs-sidebar .docs-sidebar-wrapper{width:270px;float:right;}.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control{background:none;background:#fff;border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:visited{box-shadow:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version{position:relative;padding:0 1rem;margin:.45rem 0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select{border-radius:8px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select .input-group-text{border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control{line-height:1;border-top-left-radius:0;border-bottom-left-radius:0;padding:.3em .5em .5em;border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:visited,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control:visited{box-shadow:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter{padding:0 1rem;margin:.5rem 0;font-size:.9em;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa{color:#ddd;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{height:100vh;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list>ul{display:block;height:calc(100vh - 220px);overflow-y:auto;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul{font-size:.935em;list-style:none;padding:0 1rem;margin:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li{margin-left:0;padding-left:24px;display:block;width:100%;position:relative;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#999;font-weight:700;padding:7px 0;display:block;border-bottom:1px solid #eeeff3;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover{color:#000;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a.last-link{top:11px;color:#aaa;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle{color:#999;padding:7px 0;display:block;border-bottom:1px solid #eeeff3;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon{font-size:.85em;transition:.3s;width:18px;height:18px;text-align:center;padding:0;line-height:1;border-radius:50%;margin-right:4px;position:absolute;left:2px;top:11px;color:#aaa;cursor:default;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-long-arrow-right.no-link{color:#555;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-chevron-right{cursor:pointer;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li a{font-weight:400;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul li a{font-weight:300;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#000;transition:.4s;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>span .fa{transform:rotate(90deg);color:#007bff;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree.last-link>span .fa{transform:rotate(0deg);}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:1.5rem;color:#000;font-weight:700;padding:20px 0 10px;line-height:1;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand strong{font-weight:300;text-transform:uppercase;font-size:.9rem;opacity:.6;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site{color:#000;opacity:.15;transition:.4s;font-size:.75rem;font-weight:300;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site:hover{text-decoration:none;opacity:.5;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:.85em;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc strong{display:block;}.docs-page .docs-content{overflow-x:scroll;}.docs-page .docs-content .contributors{position:absolute;top:15px;right:5px;}.docs-page .docs-content .contributors .contributors-avatar{border-radius:21px;width:21px;height:21px;}.docs-page .docs-content .contributors a{padding:0;width:21px;height:21px;display:inline-block;margin:0 0 0 2px;}.docs-page .docs-content .contributors a:hover{text-decoration:none;}.docs-page .docs-content .docs-link-btns{border-bottom:1px solid #f4f5f7;background:#fdfdfd;padding:10px 20px;margin:0 -15px;text-align:right;font-size:.8em;min-height:40px;}.docs-page .docs-content .docs-link-btns a{color:#999;}.docs-page .docs-content .docs-link-btns a:hover{color:#444;text-decoration:none;}.docs-page .docs-content .docs-link-btns .twitter{color:#00acee;}.docs-page .docs-content .docs-link-btns .linkedin{color:#0077b5;}.docs-page .docs-content .docs-link-btns .email{color:#5a5a5a;}.docs-page .docs-content .docs-link-btns .share-button{margin-left:10px;}.docs-page .docs-content .docs-text-field{padding:2rem;}.docs-page .docs-content article.docs-body h1{padding-top:1rem;font-size:2.25rem;padding-bottom:10px;}.docs-page .docs-content article.docs-body h2{padding-top:2rem;padding-bottom:10px;font-size:2rem;}.docs-page .docs-content article.docs-body h3,.docs-page .docs-content article.docs-body h4,.docs-page .docs-content article.docs-body h5,.docs-page .docs-content article.docs-body h6{padding-top:20px;padding-bottom:5px;font-size:1.5rem;}.docs-page .docs-content article.docs-body h1,.docs-page .docs-content article.docs-body h2,.docs-page .docs-content article.docs-body h3,.docs-page .docs-content article.docs-body h4,.docs-page .docs-content article.docs-body h5,.docs-page .docs-content article.docs-body h6{position:relative;}.docs-page .docs-content article.docs-body h1 .anchor,.docs-page .docs-content article.docs-body h2 .anchor,.docs-page .docs-content article.docs-body h3 .anchor,.docs-page .docs-content article.docs-body h4 .anchor,.docs-page .docs-content article.docs-body h5 .anchor,.docs-page .docs-content article.docs-body h6 .anchor{position:absolute;right:-26px;font-size:18px;bottom:5px;color:#999;opacity:0;transition:.5s;}.docs-page .docs-content article.docs-body h1:hover .anchor,.docs-page .docs-content article.docs-body h2:hover .anchor,.docs-page .docs-content article.docs-body h3:hover .anchor,.docs-page .docs-content article.docs-body h4:hover .anchor,.docs-page .docs-content article.docs-body h5:hover .anchor,.docs-page .docs-content article.docs-body h6:hover .anchor{opacity:1;}.docs-page .docs-content article.docs-body img{max-width:100%;border:1px solid #f4f5f7;margin:15px 0 25px;box-shadow:0 0 45px #f8f9fa;border-radius:6px;}.docs-page .docs-content article.docs-body table{display:block;overflow:auto;width:100%;}.docs-page .docs-content article.docs-body table thead tr{border-bottom:2px inset;}.docs-page .docs-content article.docs-body table th{font-weight:600;}.docs-page .docs-content article.docs-body table td,.docs-page .docs-content article.docs-body table th{border:1px solid #dfe2e5;padding:6px 13px;}.docs-page .docs-content article.docs-body table tr{background-color:#fff;border-top:1px solid #c6cbd1;}.docs-page .docs-content article.docs-body table tr:nth-child(2n){background-color:#f6f8fa;}.docs-page .docs-content article.docs-body table img{background-color:initial;}.docs-page .docs-page-index{min-height:100vh;}.docs-page .docs-page-index #scroll-index{max-height:100vh;}.docs-page .docs-page-index .docs-inner-anchors{position:fixed;top:0;padding:10px;font-size:.9em;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills{font-size:.92em;margin-left:15px;border-left:1px solid #eee;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link{padding:3px 14px 4px;color:#aaa;line-height:1.2;position:relative;border-left:1px solid #eee;border-radius:0;margin-left:-1px;margin-top:1px;margin-bottom:1px;transition:.2s;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link.active{border-left:2px solid #007bff;background:none;color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-link.active{color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-pills .nav-link.active{color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .index-scroll{margin-left:-30px;}.docs-page .docs-page-index .docs-inner-anchors .docs-anchors-wrapper{max-width:300px;float:left;}.docs-page .docs-page-index .scroll-top-btn{display:none;font-size:.85em;color:#aaa;text-decoration:none;padding-left:18px;}.docs-page .docs-page-index .scroll-top-btn.showup{display:block;}@media(min-width:1100px){.container{max-width:1080px;}.docs-page .docs-sidebar.dark-sidebar{background:#191919;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control,.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control{background:#333;border-color:#333;color:#999;font-size:.9em;min-height:40px;padding-left:8px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control{background:#333;border-color:#333;color:#999;font-size:.9em;min-height:40px;padding-left:12px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control::placeholder{color:#999;opacity:.5;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select label{background:#444;border-color:#444;color:#ddd;width:36px;text-align:center;padding-left:0;padding-right:0;display:inline-block;line-height:26px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .form-control{background:#333;color:#999;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter select{border:0;border-radius:6px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa{color:#aaa;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#aaa;border-bottom:1px solid #333;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon{font-size:.85em;transition:.3s;width:18px;height:18px;text-align:center;padding:0;line-height:1;border-radius:50%;margin-right:4px;position:absolute;left:2px;top:11px;color:#aaa;cursor:default;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-long-arrow-right.no-link{color:#555;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-chevron-right{cursor:pointer;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon.last-link{top:11px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle{color:#555;padding:7px 0;display:block;border-bottom:1px solid #333;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#fff;transition:.4s;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a span .fa{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a span:not(.last-link) .fa{transform:rotate(90deg);color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-brand{color:#fff;text-transform:uppercase;white-space:unset;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .go-back-site{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-logo-desc{color:#ddd;}}@media(min-width:1366px){.container{max-width:1340px;}}@media(min-width:1440px){.container{max-width:1400px;}}@media(max-width:767px){.docs-page .docs-content article.docs-body h1{padding-top:1.5rem;}.docs-page{background:#f5f7f9;}.docs-page>.container-fluid{display:block;}.docs-page>.container-fluid>.row{display:block;}.docs-page .docs-sidebar{position:fixed;max-width:100%;width:100%;display:block;padding:0 !important;top:0;left:0;z-index:100;right:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper{max-width:100%;width:100%;top:0;position:relative;margin:0 !important;height:72px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{padding:.5rem 1.5rem 2rem 1.5rem;position:fixed;top:70px;font-size:17px;left:0;width:100%;z-index:100;background:#f5f7f9;display:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-filter{padding:0 0 1rem !important;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version label{width:36px;text-align:center;padding-left:0;padding-right:0;display:inline-block;line-height:26px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version input.form-control{padding-left:12px !important;}.docs-page .docs-sidebar .docs-top .navbar-logo{padding:0;padding-top:.3rem;display:block;text-align:center;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:1.5rem;font-weight:700;display:block;margin-right:0;padding:7px 0 10px;text-transform:uppercase;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand .docs-logo{width:110px;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site{display:none;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:1em;display:none;}.docs-page .docs-sidebar .docs-top .open-dmenu{position:absolute;top:10px;left:20px;}.docs-page .docs-content{padding-top:72px;max-width:100%;display:block !important;}.docs-page .docs-content .docs-text-field{padding:1rem 1.5rem;}.docs-page .docs-page-index{display:none;}}.for-mobile{display:none;}.for-desktop{display:inline-block;}pre[class*="language-"]{padding:1.4em 2em !important;margin:15px 0 25px !important;border-radius:6px;}code{padding:.2em .4em;margin:0;font-size:82%;background-color:#f0f1f3;border-radius:3px;color:#28a745;}pre code{padding:0;}pre .token.keyword{color:#569cd6;}pre .token.atrule,pre .token.attr-value,pre .token.function,pre .token.class-name{color:#d69d85;}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#191919 !important;}div.code-toolbar>.toolbar span{cursor:default;}div.code-toolbar>.toolbar a{cursor:copy;}@media(max-width:767px){body{font-size:14px;}.for-mobile{display:inline-block;}.for-desktop{display:none;}.close-mmenu,.close-dmenu{position:absolute;top:-78px;left:25px;color:#fff;font-size:68px;background:#fff;opacity:0;}.navbar{padding:.5rem 1.75rem;}.navbar .navbar-collapse{background:#38003d;position:fixed;top:86px;left:0;width:100%;height:100vh;height:calc(100vh - 86px);z-index:100 !important;}.navbar .navbar-collapse .navbar-nav{height:100vh;padding:20px 30px;overflow:auto;}.navbar .navbar-collapse .navbar-nav .nav-link{padding:1.2rem !important;}.navbar .navbar-toggler{padding:.5rem .75rem;font-size:1.5rem;line-height:1;background-color:transparent;border:0;border-radius:.25rem;color:#fff !important;margin-left:-1rem;}.section-with-logos img{margin:15px;opacity:1;-webkit-filter:grayscale(0%);filter:grayscale(0%);}span.code-arrow{padding:0 0 0;display:block;transform:rotate(90deg);font-size:2em;}.mb-5,.my-5{margin-bottom:2rem !important;}}@media screen and (max-width:767px){.navbar-logo .navbar-brand{display:inline-block;margin:0 auto !important;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}} \ No newline at end of file +body{position:relative;}.docs-page{background:#f5f7f9;}.docs-page .anchorjs-link{transition:all .25s linear;}.docs-page *:hover>.anchorjs-link{margin-left:-1.125em !important;transition:color .25s linear;color:#808080;}.docs-page .anchorjs-link:hover{color:#007bff;text-decoration:none;}.docs-page .docs-sidebar{background:#f5f7f9;padding-right:1rem;position:relative;top:0;left:0;position:fixed;}.docs-page .docs-sidebar .docs-sidebar-wrapper{width:270px;float:right;}.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control{background:none;background:#fff;border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper input.form-control:visited{box-shadow:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version{position:relative;padding:0 1rem;margin:.45rem 0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select{border-radius:8px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select .input-group-text{border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control{line-height:1;border-top-left-radius:0;border-bottom-left-radius:0;padding:.3em .5em .5em;border:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control:visited,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control:focus,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control:active,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control:hover,.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control:visited{box-shadow:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter{padding:0 1rem;margin:.5rem 0;font-size:.9em;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa{color:#ddd;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{height:100vh;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list>ul{display:block;height:calc(100vh - 220px);overflow-y:auto;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul{font-size:.935em;list-style:none;padding:0 1rem;margin:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li{margin-left:0;padding-left:24px;display:block;width:100%;position:relative;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#999;font-weight:700;padding:7px 0;display:block;border-bottom:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover{color:#000;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a.last-link{top:11px;color:#aaa;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle{color:#999;padding:7px 0;display:block;border-bottom:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon{font-size:.85em;transition:.3s;width:18px;height:18px;text-align:center;padding:0;line-height:1;border-radius:50%;margin-right:4px;position:absolute;left:2px;top:11px;color:#aaa;cursor:default;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-long-arrow-right.no-link{color:#555;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li .plus-icon .fa-chevron-right{cursor:pointer;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li a{font-weight:400;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul{padding:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li ul li ul li a{font-weight:300;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#000;transition:.4s;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>span .fa{transform:rotate(90deg);color:#007bff;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree.last-link>span .fa{transform:rotate(0deg);}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:1.5rem;color:#000;font-weight:700;padding:20px 0 10px;line-height:1;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand strong{font-weight:300;text-transform:uppercase;font-size:.9rem;opacity:.6;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site{color:#000;opacity:.15;transition:.4s;font-size:.75rem;font-weight:300;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site:hover{text-decoration:none;opacity:.5;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:.85em;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc strong{display:block;}.docs-page .docs-content{overflow-x:scroll;}.docs-page .docs-content .contributors{position:absolute;top:15px;right:5px;}.docs-page .docs-content .contributors .contributors-avatar{border-radius:21px;width:21px;height:21px;}.docs-page .docs-content .contributors a{padding:0;width:21px;height:21px;display:inline-block;margin:0 0 0 2px;}.docs-page .docs-content .contributors a:hover{text-decoration:none;}.docs-page .docs-content .docs-link-btns{border-bottom:1px solid #f4f5f7;background:#fdfdfd;padding:10px 20px;margin:0 -15px;text-align:right;font-size:.8em;min-height:40px;}.docs-page .docs-content .docs-link-btns a{color:#999;}.docs-page .docs-content .docs-link-btns a:hover{color:#444;text-decoration:none;}.docs-page .docs-content .docs-link-btns .twitter{color:#00acee;}.docs-page .docs-content .docs-link-btns .linkedin{color:#0077b5;}.docs-page .docs-content .docs-link-btns .email{color:#5a5a5a;}.docs-page .docs-content .docs-link-btns .share-button{margin-left:10px;}.docs-page .docs-content .docs-text-field{padding:2rem;}.docs-page .docs-content article.docs-body h1{padding-top:1rem;font-size:2.25rem;padding-bottom:10px;}.docs-page .docs-content article.docs-body h2{padding-top:2rem;padding-bottom:10px;font-size:2rem;}.docs-page .docs-content article.docs-body h3,.docs-page .docs-content article.docs-body h4,.docs-page .docs-content article.docs-body h5,.docs-page .docs-content article.docs-body h6{padding-top:20px;padding-bottom:5px;font-size:1.5rem;}.docs-page .docs-content article.docs-body h1,.docs-page .docs-content article.docs-body h2,.docs-page .docs-content article.docs-body h3,.docs-page .docs-content article.docs-body h4,.docs-page .docs-content article.docs-body h5,.docs-page .docs-content article.docs-body h6{position:relative;}.docs-page .docs-content article.docs-body h1 .anchor,.docs-page .docs-content article.docs-body h2 .anchor,.docs-page .docs-content article.docs-body h3 .anchor,.docs-page .docs-content article.docs-body h4 .anchor,.docs-page .docs-content article.docs-body h5 .anchor,.docs-page .docs-content article.docs-body h6 .anchor{position:absolute;right:-26px;font-size:18px;bottom:5px;color:#999;opacity:0;transition:.5s;}.docs-page .docs-content article.docs-body h1:hover .anchor,.docs-page .docs-content article.docs-body h2:hover .anchor,.docs-page .docs-content article.docs-body h3:hover .anchor,.docs-page .docs-content article.docs-body h4:hover .anchor,.docs-page .docs-content article.docs-body h5:hover .anchor,.docs-page .docs-content article.docs-body h6:hover .anchor{opacity:1;}.docs-page .docs-content article.docs-body img{max-width:100%;border:1px solid #f4f5f7;margin:15px 0 25px;box-shadow:0 0 45px #f8f9fa;border-radius:6px;}.docs-page .docs-content article.docs-body table{display:block;overflow:auto;width:100%;}.docs-page .docs-content article.docs-body table thead tr{border-bottom:2px inset;}.docs-page .docs-content article.docs-body table th{font-weight:600;}.docs-page .docs-content article.docs-body table td,.docs-page .docs-content article.docs-body table th{border:1px solid #dfe2e5;padding:6px 13px;}.docs-page .docs-content article.docs-body table tr{background-color:#fff;border-top:1px solid #c6cbd1;}.docs-page .docs-content article.docs-body table tr:nth-child(2n){background-color:#f6f8fa;}.docs-page .docs-content article.docs-body table img{background-color:initial;}.docs-page .docs-page-index{min-height:100vh;}.docs-page .docs-page-index #scroll-index{max-height:100vh;}.docs-page .docs-page-index .docs-inner-anchors{position:fixed;top:0;padding:10px;font-size:.9em;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills{font-size:.92em;margin-left:15px;border-left:1px solid #eee;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link{padding:3px 14px 4px;color:#aaa;line-height:1.2;position:relative;border-left:1px solid #eee;border-radius:0;margin-left:-1px;margin-top:1px;margin-bottom:1px;transition:.2s;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-link.active{border-left:2px solid #007bff;background:none;color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-link.active{color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .navbar .nav-pills .nav-pills .nav-pills .nav-link.active{color:#007bff;}.docs-page .docs-page-index .docs-inner-anchors .index-scroll{margin-left:-30px;}.docs-page .docs-page-index .docs-inner-anchors .docs-anchors-wrapper{max-width:300px;float:left;}.docs-page .docs-page-index .scroll-top-btn{display:none;font-size:.85em;color:#aaa;text-decoration:none;padding-left:18px;}.docs-page .docs-page-index .scroll-top-btn.showup{display:block;}@media(min-width:1100px){.container{max-width:1080px;}.docs-page .docs-sidebar.dark-sidebar{background:#191919;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select select.form-control,.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control{background:#333;border-color:#333;color:#999;font-size:.9em;min-height:40px;padding-left:8px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control{background:#333;border-color:#333;color:#999;font-size:.9em;min-height:40px;padding-left:12px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select input.form-control::placeholder{color:#999;opacity:.5;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-version .version-select label{background:#444;border-color:#444;color:#ddd;width:36px;text-align:center;padding-left:0;padding-right:0;display:inline-block;line-height:26px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .form-control{background:#333;color:#999;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter select{border:0;border-radius:6px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-filter .filter-icon i.fa{color:#aaa;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a{color:#aaa;border-bottom:0;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a:hover{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon{font-size:.85em;transition:.3s;width:18px;height:18px;text-align:center;padding:0;line-height:1;border-radius:50%;margin-right:4px;position:absolute;left:2px;top:11px;color:#aaa;cursor:default;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-long-arrow-right.no-link{color:#555;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon .fa-chevron-right{cursor:pointer;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li a .plus-icon.last-link{top:11px;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li span.tree-toggle{color:#555;padding:7px 0;display:block;border-bottom:0;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a{color:#fff;transition:.4s;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a span .fa{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-sidebar-wrapper .docs-tree-list ul li.selected-tree>a span:not(.last-link) .fa{transform:rotate(90deg);color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-brand{color:#fff;text-transform:uppercase;white-space:unset;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .go-back-site{color:#fff;}.docs-page .docs-sidebar.dark-sidebar .docs-top .navbar-logo .navbar-logo-desc{color:#ddd;}}@media(min-width:1366px){.container{max-width:1340px;}}@media(min-width:1440px){.container{max-width:1400px;}}@media(max-width:767px){.docs-page .docs-content article.docs-body h1{padding-top:1.5rem;}.docs-page{background:#f5f7f9;}.docs-page>.container-fluid{display:block;}.docs-page>.container-fluid>.row{display:block;}.docs-page .docs-sidebar{position:fixed;max-width:100%;width:100%;display:block;padding:0 !important;top:0;left:0;z-index:100;right:0;}.docs-page .docs-sidebar .docs-sidebar-wrapper{max-width:100%;width:100%;top:0;position:relative;margin:0 !important;height:72px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list{padding:.5rem 1.5rem 2rem 1.5rem;position:fixed;top:70px;font-size:17px;left:0;width:100%;z-index:100;background:#f5f7f9;display:none;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-tree-list .docs-filter{padding:0 0 1rem !important;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version label{width:36px;text-align:center;padding-left:0;padding-right:0;display:inline-block;line-height:26px;}.docs-page .docs-sidebar .docs-sidebar-wrapper .docs-version input.form-control{padding-left:12px !important;}.docs-page .docs-sidebar .docs-top .navbar-logo{padding:0;padding-top:.3rem;display:block;text-align:center;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand{font-size:1.5rem;font-weight:700;display:block;margin-right:0;padding:7px 0 10px;text-transform:uppercase;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-brand .docs-logo{width:110px;}.docs-page .docs-sidebar .docs-top .navbar-logo .go-back-site{display:none;}.docs-page .docs-sidebar .docs-top .navbar-logo .navbar-logo-desc{font-size:1em;display:none;}.docs-page .docs-sidebar .docs-top .open-dmenu{position:absolute;top:10px;left:20px;}.docs-page .docs-content{padding-top:72px;max-width:100%;display:block !important;}.docs-page .docs-content .docs-text-field{padding:1rem 1.5rem;}.docs-page .docs-page-index{display:none;}}.for-mobile{display:none;}.for-desktop{display:inline-block;}pre[class*="language-"]{padding:1.4em 2em !important;margin:15px 0 25px !important;border-radius:6px;}code{padding:.2em .4em;margin:0;font-size:82%;background-color:#f0f1f3;border-radius:3px;color:#28a745;}pre code{padding:0;}pre .token.keyword{color:#569cd6;}pre .token.atrule,pre .token.attr-value,pre .token.function,pre .token.class-name{color:#d69d85;}:not(pre)>code[class*="language-"],pre[class*="language-"]{background:#191919 !important;}div.code-toolbar>.toolbar span{cursor:default;}div.code-toolbar>.toolbar a{cursor:copy;}@media(max-width:767px){body{font-size:14px;}.for-mobile{display:inline-block;}.for-desktop{display:none;}.close-mmenu,.close-dmenu{position:absolute;top:-78px;left:25px;color:#fff;font-size:68px;background:#fff;opacity:0;}.navbar{padding:.5rem 1.75rem;}.navbar .navbar-collapse{background:#38003d;position:fixed;top:86px;left:0;width:100%;height:100vh;height:calc(100vh - 86px);z-index:100 !important;}.navbar .navbar-collapse .navbar-nav{height:100vh;padding:20px 30px;overflow:auto;}.navbar .navbar-collapse .navbar-nav .nav-link{padding:1.2rem !important;}.navbar .navbar-toggler{padding:.5rem .75rem;font-size:1.5rem;line-height:1;background-color:transparent;border:0;border-radius:.25rem;color:#fff !important;margin-left:-1rem;}.section-with-logos img{margin:15px;opacity:1;-webkit-filter:grayscale(0%);filter:grayscale(0%);}span.code-arrow{padding:0 0 0;display:block;transform:rotate(90deg);font-size:2em;}.mb-5,.my-5{margin-bottom:2rem !important;}}@media screen and (max-width:767px){.navbar-logo .navbar-brand{display:inline-block;margin:0 auto !important;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.scss b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.scss index 728c5ad94a..22edcbb149 100644 --- a/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.scss +++ b/modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.scss @@ -113,7 +113,7 @@ body { font-weight: 700; padding: 7px 0; display: block; - border-bottom: 1px solid #eeeff3; + border-bottom: 0; &:hover { color: #000; @@ -129,7 +129,7 @@ body { color: #999; padding: 7px 0; display: block; - border-bottom: 1px solid #eeeff3; + border-bottom: 0; } .plus-icon { @@ -555,7 +555,7 @@ body { a { color: #aaa; - border-bottom: 1px solid #333; + border-bottom: 0; &:hover { color: #fff; @@ -598,7 +598,7 @@ body { color: #555; padding: 7px 0; display: block; - border-bottom: 1px solid #333; + border-bottom: 0; } diff --git a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj b/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj index 56ff4979d2..390476a38f 100644 --- a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj +++ b/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo.Docs.Admin.Application.Tests.csproj @@ -11,7 +11,6 @@ - diff --git a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsApplicationTestBase.cs b/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsAdminApplicationTestBase.cs similarity index 57% rename from modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsApplicationTestBase.cs rename to modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsAdminApplicationTestBase.cs index 9f2dfa06b8..c11233849a 100644 --- a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsApplicationTestBase.cs +++ b/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsAdminApplicationTestBase.cs @@ -4,9 +4,4 @@ { } - - public class DocsApplicationTestBase : DocsTestBase - { - - } } diff --git a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsApplicationTestModule.cs b/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsAdminApplicationTestModule.cs similarity index 60% rename from modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsApplicationTestModule.cs rename to modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsAdminApplicationTestModule.cs index 32c49787b3..e85bac8ce3 100644 --- a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsApplicationTestModule.cs +++ b/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/DocsAdminApplicationTestModule.cs @@ -3,15 +3,6 @@ using Volo.Docs.Admin; namespace Volo.Docs { - [DependsOn( - typeof(DocsApplicationModule), - typeof(DocsDomainTestModule) - )] - public class DocsApplicationTestModule : AbpModule - { - - } - [DependsOn( typeof(DocsAdminApplicationModule), typeof(DocsDomainTestModule) diff --git a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/ApplicationService_Tests.cs b/modules/docs/test/Volo.Docs.Application.Tests/Volo/Docs/ApplicationService_Tests.cs similarity index 81% rename from modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/ApplicationService_Tests.cs rename to modules/docs/test/Volo.Docs.Application.Tests/Volo/Docs/ApplicationService_Tests.cs index 02bcc4e0db..bff7f09e1f 100644 --- a/modules/docs/test/Volo.Docs.Admin.Application.Tests/Volo/Docs/ApplicationService_Tests.cs +++ b/modules/docs/test/Volo.Docs.Application.Tests/Volo/Docs/ApplicationService_Tests.cs @@ -36,7 +36,10 @@ namespace Volo.Docs [Fact] public async Task GetVersionsAsync() { - // TODO: Need to mock WebClient and Octokit components + var versions = await _projectAppService.GetVersionsAsync("ABP"); + versions.ShouldNotBeNull(); + versions.Items.Count.ShouldBe(1); + versions.Items.ShouldContain(x => x.Name == "0.15.0" && x.DisplayName == "0.15.0"); } } } diff --git a/modules/docs/test/Volo.Docs.Application.Tests/Volo/Docs/DocsApplicationTestBase.cs b/modules/docs/test/Volo.Docs.Application.Tests/Volo/Docs/DocsApplicationTestBase.cs new file mode 100644 index 0000000000..f0fb94d40b --- /dev/null +++ b/modules/docs/test/Volo.Docs.Application.Tests/Volo/Docs/DocsApplicationTestBase.cs @@ -0,0 +1,7 @@ +namespace Volo.Docs +{ + public class DocsApplicationTestBase : DocsTestBase + { + + } +} diff --git a/modules/docs/test/Volo.Docs.Domain.Tests/Volo/Docs/DocsDomainTestBase.cs b/modules/docs/test/Volo.Docs.Domain.Tests/Volo/Docs/DocsDomainTestBase.cs index 7de6bb3182..b46e054370 100644 --- a/modules/docs/test/Volo.Docs.Domain.Tests/Volo/Docs/DocsDomainTestBase.cs +++ b/modules/docs/test/Volo.Docs.Domain.Tests/Volo/Docs/DocsDomainTestBase.cs @@ -1,43 +1,7 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; -using NSubstitute; -using Octokit; -using Volo.Docs.GitHub.Documents; - -namespace Volo.Docs +namespace Volo.Docs { public abstract class DocsDomainTestBase : DocsTestBase { - protected override void AfterAddApplication(IServiceCollection services) - { - var repositoryManager = Substitute.For(); - repositoryManager.GetFileRawStringContentAsync(Arg.Any(), Arg.Any(), Arg.Any()) - .Returns("stringContent"); - repositoryManager.GetFileRawByteArrayContentAsync(Arg.Any(), Arg.Any(), Arg.Any()) - .Returns(new byte[] { 0x01, 0x02, 0x03 }); - repositoryManager.GetReleasesAsync(Arg.Any(), Arg.Any(), Arg.Any()) - .Returns(new List - { - new Release("https://api.github.com/repos/abpframework/abp/releases/16293679", - "https://github.com/abpframework/abp/releases/tag/0.15.0", - "https://api.github.com/repos/abpframework/abp/releases/16293679/assets", - "https://uploads.github.com/repos/abpframework/abp/releases/16293679/assets{?name,label}", - 16293679, - "0.15.0", - "master", - "0.15.0", - "0.15.0 already release", - false, - false, - DateTimeOffset.Parse("2019-03-22T18:43:58Z"), - DateTimeOffset.Parse("2019-03-22T19:44:25Z"), - null, - "https://api.github.com/repos/abpframework/abp/tarball/0.15.0", - "https://api.github.com/repos/abpframework/abp/zipball/0.15.0", - null) - }); - services.AddSingleton(repositoryManager); - } + } } diff --git a/modules/docs/test/Volo.Docs.TestBase/Volo/Docs/DocsTestBase.cs b/modules/docs/test/Volo.Docs.TestBase/Volo/Docs/DocsTestBase.cs index 2ceb4b8f95..e8b7fa0126 100644 --- a/modules/docs/test/Volo.Docs.TestBase/Volo/Docs/DocsTestBase.cs +++ b/modules/docs/test/Volo.Docs.TestBase/Volo/Docs/DocsTestBase.cs @@ -1,5 +1,11 @@ -using Volo.Abp; +using System; +using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; +using Octokit; +using Volo.Abp; using Volo.Abp.Modularity; +using Volo.Docs.GitHub.Documents; namespace Volo.Docs { @@ -10,5 +16,36 @@ namespace Volo.Docs { options.UseAutofac(); } + + protected override void AfterAddApplication(IServiceCollection services) + { + var repositoryManager = Substitute.For(); + repositoryManager.GetFileRawStringContentAsync(Arg.Any(), Arg.Any(), Arg.Any()) + .Returns("stringContent"); + repositoryManager.GetFileRawByteArrayContentAsync(Arg.Any(), Arg.Any(), Arg.Any()) + .Returns(new byte[] { 0x01, 0x02, 0x03 }); + repositoryManager.GetReleasesAsync(Arg.Any(), Arg.Any(), Arg.Any()) + .Returns(new List + { + new Release("https://api.github.com/repos/abpframework/abp/releases/16293679", + "https://github.com/abpframework/abp/releases/tag/0.15.0", + "https://api.github.com/repos/abpframework/abp/releases/16293679/assets", + "https://uploads.github.com/repos/abpframework/abp/releases/16293679/assets{?name,label}", + 16293679, + "0.15.0", + "master", + "0.15.0", + "0.15.0 already release", + false, + false, + DateTimeOffset.Parse("2019-03-22T18:43:58Z"), + DateTimeOffset.Parse("2019-03-22T19:44:25Z"), + null, + "https://api.github.com/repos/abpframework/abp/tarball/0.15.0", + "https://api.github.com/repos/abpframework/abp/zipball/0.15.0", + null) + }); + services.AddSingleton(repositoryManager); + } } } diff --git a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs index e9646d38cf..bac63a0c11 100644 --- a/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs +++ b/modules/identity/src/Volo.Abp.Identity.Domain/Volo/Abp/Identity/IdentityUserStore.cs @@ -981,7 +981,7 @@ namespace Volo.Abp.Identity /// The value of the token. /// The used to propagate notifications that the operation should be canceled. /// The that represents the asynchronous operation. - public virtual async Task SetTokenAsync([NotNull] IdentityUser user, string loginProvider, string name, string value, CancellationToken cancellationToken) + public virtual async Task SetTokenAsync([NotNull] IdentityUser user, string loginProvider, string name, string value, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -1000,7 +1000,7 @@ namespace Volo.Abp.Identity /// The name of the token. /// The used to propagate notifications that the operation should be canceled. /// The that represents the asynchronous operation. - public async Task RemoveTokenAsync(IdentityUser user, string loginProvider, string name, CancellationToken cancellationToken) + public async Task RemoveTokenAsync(IdentityUser user, string loginProvider, string name, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -1019,7 +1019,7 @@ namespace Volo.Abp.Identity /// The name of the token. /// The used to propagate notifications that the operation should be canceled. /// The that represents the asynchronous operation. - public async Task GetTokenAsync(IdentityUser user, string loginProvider, string name, CancellationToken cancellationToken) + public async Task GetTokenAsync(IdentityUser user, string loginProvider, string name, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -1030,12 +1030,12 @@ namespace Volo.Abp.Identity return user.FindToken(loginProvider, name)?.Value; } - public Task SetAuthenticatorKeyAsync(IdentityUser user, string key, CancellationToken cancellationToken) + public Task SetAuthenticatorKeyAsync(IdentityUser user, string key, CancellationToken cancellationToken = default) { return SetTokenAsync(user, InternalLoginProvider, AuthenticatorKeyTokenName, key, cancellationToken); } - public Task GetAuthenticatorKeyAsync(IdentityUser user, CancellationToken cancellationToken) + public Task GetAuthenticatorKeyAsync(IdentityUser user, CancellationToken cancellationToken = default) { return GetTokenAsync(user, InternalLoginProvider, AuthenticatorKeyTokenName, cancellationToken); } @@ -1046,7 +1046,7 @@ namespace Volo.Abp.Identity /// The user who owns the recovery code. /// The used to propagate notifications that the operation should be canceled. /// The number of valid recovery codes for the user.. - public virtual async Task CountCodesAsync(IdentityUser user, CancellationToken cancellationToken) + public virtual async Task CountCodesAsync(IdentityUser user, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); @@ -1068,7 +1068,7 @@ namespace Volo.Abp.Identity /// The new recovery codes for the user. /// The used to propagate notifications that the operation should be canceled. /// The new recovery codes for the user. - public virtual Task ReplaceCodesAsync(IdentityUser user, IEnumerable recoveryCodes, CancellationToken cancellationToken) + public virtual Task ReplaceCodesAsync(IdentityUser user, IEnumerable recoveryCodes, CancellationToken cancellationToken = default) { var mergedCodes = string.Join(";", recoveryCodes); return SetTokenAsync(user, InternalLoginProvider, RecoveryCodeTokenName, mergedCodes, cancellationToken); @@ -1082,7 +1082,7 @@ namespace Volo.Abp.Identity /// The recovery code to use. /// The used to propagate notifications that the operation should be canceled. /// True if the recovery code was found for the user. - public virtual async Task RedeemCodeAsync(IdentityUser user, string code, CancellationToken cancellationToken) + public virtual async Task RedeemCodeAsync(IdentityUser user, string code, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/Index.cshtml b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/Index.cshtml index 1979c87bb2..d2758f05d4 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/Index.cshtml +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Roles/Index.cshtml @@ -12,6 +12,11 @@ PageLayout.Content.BreadCrumb.Add(L["Menu:IdentityManagement"].Value); PageLayout.Content.MenuItemName = IdentityMenuNames.Roles; } +@section styles { + + + +} @section scripts { diff --git a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml index bcef02cc72..23f7747ac8 100644 --- a/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml +++ b/modules/identity/src/Volo.Abp.Identity.Web/Pages/Identity/Users/Index.cshtml @@ -15,6 +15,11 @@ PageLayout.Content.BreadCrumb.Add(L["Menu:IdentityManagement"].Value); PageLayout.Content.MenuItemName = IdentityMenuNames.Users; } +@section styles { + + + +} @section scripts { diff --git a/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserLookupAppService_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserLookupAppService_Tests.cs new file mode 100644 index 0000000000..7358238294 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserLookupAppService_Tests.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Shouldly; +using Xunit; + +namespace Volo.Abp.Identity +{ + public class IdentityUserLookupAppService_Tests : AbpIdentityApplicationTestBase + { + private readonly IIdentityUserLookupAppService _identityUserLookupAppService; + private readonly IIdentityUserRepository _identityUserRepository; + private readonly ILookupNormalizer _lookupNormalizer; + + public IdentityUserLookupAppService_Tests() + { + _identityUserLookupAppService = GetRequiredService(); + _identityUserRepository = GetRequiredService(); + _lookupNormalizer = GetRequiredService(); + } + + [Fact] + public async Task FindByIdAsync() + { + var user = await _identityUserRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserLookupAppService.FindByIdAsync(user.Id)).UserName.ShouldBe(user.UserName); + } + + [Fact] + public async Task FindById_NotExist_Should_Return_Null() + { + var user = await _identityUserLookupAppService.FindByIdAsync(Guid.NewGuid()); + user.ShouldBeNull(); + } + + [Fact] + public async Task FindByUserNameAsync() + { + var user = await _identityUserRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserLookupAppService.FindByUserNameAsync(user.UserName)).UserName.ShouldBe(user.UserName); + } + + [Fact] + public async Task FindByUserName_NotExist_Should_Return_Null() + { + var user = await _identityUserLookupAppService.FindByUserNameAsync(Guid.NewGuid().ToString()); + user.ShouldBeNull(); + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdenityClaimTypeManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdenityClaimTypeManager_Tests.cs new file mode 100644 index 0000000000..c27967e704 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdenityClaimTypeManager_Tests.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.Identity +{ + public class IdenityClaimTypeManager_Tests : AbpIdentityDomainTestBase + { + private readonly IIdentityClaimTypeRepository _identityClaimTypeRepository; + private readonly IdenityClaimTypeManager _claimTypeManager; + private readonly IdentityTestData _testData; + + public IdenityClaimTypeManager_Tests() + { + _identityClaimTypeRepository = GetRequiredService(); + _claimTypeManager = GetRequiredService(); + _testData = GetRequiredService(); + } + + [Fact] + public async Task CreateAsync() + { + var claimType = await _claimTypeManager.CreateAsync(new IdentityClaimType(Guid.NewGuid(), "Phone", false, + false, null, + null, null, IdentityClaimValueType.String)); + + claimType.ShouldNotBeNull(); + claimType.Name.ShouldBe("Phone"); + } + + [Fact] + public async Task Create_Name_Exist_Should_Exception() + { + await Assert.ThrowsAnyAsync(async () => await _claimTypeManager.CreateAsync( + new IdentityClaimType( + Guid.NewGuid(), "Age"))); + } + + [Fact] + public async Task UpdateAsync() + { + var ageClaim = _identityClaimTypeRepository.Find(_testData.AgeClaimId); + ageClaim.ShouldNotBeNull(); + ageClaim.Description = "this is age"; + + var updatedAgeClaimType = await _claimTypeManager.UpdateAsync(ageClaim); + updatedAgeClaimType.ShouldNotBeNull(); + updatedAgeClaimType.Description.ShouldBe("this is age"); + } + + + [Fact] + public async Task Update_Name_Exist_Should_Exception() + { + await Assert.ThrowsAnyAsync(async () => await _claimTypeManager.UpdateAsync( + new IdentityClaimType( + Guid.NewGuid(), "Age"))); + } + + + [Fact] + public async Task Static_IdentityClaimType_Cant_Not_Update() + { + var phoneClaim = new IdentityClaimType(Guid.NewGuid(), "Phone", true, true); + _identityClaimTypeRepository.Insert(phoneClaim); + + await Assert.ThrowsAnyAsync(async () => await _claimTypeManager.UpdateAsync(phoneClaim)); + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleManager_Tests.cs new file mode 100644 index 0000000000..9cdafa10bb --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleManager_Tests.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Shouldly; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Identity +{ + public class IdentityRoleManager_Tests : AbpIdentityDomainTestBase + { + private readonly IdentityRoleManager _identityRoleManager; + private readonly IIdentityRoleRepository _identityRoleRepository; + private readonly ILookupNormalizer _lookupNormalizer; + private readonly IdentityTestData _testData; + + public IdentityRoleManager_Tests() + { + _identityRoleManager = GetRequiredService(); + _identityRoleRepository = GetRequiredService(); + _lookupNormalizer = GetRequiredService(); + _testData = GetRequiredService(); + } + + + [Fact] + public async Task GetByIdAsync() + { + var role = await _identityRoleManager.FindByIdAsync(_testData.RoleModeratorId.ToString()); + + role.ShouldNotBeNull(); + role.Name.ShouldBe("moderator"); + } + + [Fact] + public async Task SetRoleNameAsync() + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + (await _identityRoleManager.SetRoleNameAsync(role, "teacher")).Succeeded.ShouldBeTrue(); + + role.Name.ShouldBe("teacher"); + } + + [Fact] + public async Task DeleteAsync() + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + await _identityRoleManager.DeleteAsync(role); + + (await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator"))).ShouldBeNull(); + } + + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleStore_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleStore_Tests.cs new file mode 100644 index 0000000000..d2f674411b --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityRoleStore_Tests.cs @@ -0,0 +1,186 @@ +using System; +using System.Collections.Generic; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Shouldly; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Identity +{ + public class IdentityRoleStore_Tests : AbpIdentityDomainTestBase + { + private readonly IdentityRoleStore _identityRoleStore; + private readonly ILookupNormalizer _lookupNormalizer; + private readonly IIdentityRoleRepository _identityRoleRepository; + private readonly IdentityTestData _testData; + private readonly IUnitOfWorkManager _unitOfWorkManager; + + public IdentityRoleStore_Tests() + { + _identityRoleStore = GetRequiredService(); + _lookupNormalizer = GetRequiredService(); + _identityRoleRepository = GetRequiredService(); + _testData = GetRequiredService(); + _unitOfWorkManager = GetRequiredService(); + } + + [Fact] + public async Task CreateAsync() + { + var roleId = Guid.NewGuid(); + var role = new IdentityRole(roleId, "teacher"); + (await _identityRoleStore.CreateAsync(role)).Succeeded.ShouldBeTrue(); + + var teacher = await _identityRoleStore.FindByIdAsync(roleId.ToString()); + + teacher.ShouldNotBeNull(); + teacher.Name.ShouldBe("teacher"); + } + + [Fact] + public async Task UpdateAsync() + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + role.IsDefault = true; + await _identityRoleStore.UpdateAsync(role); + + role.IsDefault.ShouldBeTrue(); + } + + + [Fact] + public async Task DeleteAsync() + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + await _identityRoleStore.DeleteAsync(role); + + (await _identityRoleStore.FindByIdAsync(_testData.RoleModeratorId.ToString())).ShouldBeNull(); + } + + [Fact] + public async Task GetRoleIdAsync() + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + (await _identityRoleStore.GetRoleIdAsync(role)).ShouldBe(_testData.RoleModeratorId.ToString()); + } + + [Fact] + public async Task GetRoleNameAsync() + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + (await _identityRoleStore.GetRoleNameAsync(role)).ShouldBe(role.Name); + } + + + [Fact] + public async Task SetRoleNameAsync() + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + await _identityRoleStore.SetRoleNameAsync(role, "teacher"); + + role.Name.ShouldBe("teacher"); + } + + [Fact] + public async Task FindByIdAsync() + { + var role = await _identityRoleStore.FindByIdAsync(_testData.RoleModeratorId.ToString()); + + role.ShouldNotBeNull(); + role.Name.ShouldBe("moderator"); + } + + [Fact] + public async Task FindByNameAsync() + { + var role = await _identityRoleStore.FindByNameAsync(_lookupNormalizer.Normalize("moderator")); + + role.ShouldNotBeNull(); + role.Name.ShouldBe("moderator"); + } + + [Fact] + public async Task GetNormalizedRoleNameAsync() + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + (await _identityRoleStore.GetNormalizedRoleNameAsync(role)).ShouldBe(role.NormalizedName); + } + + [Fact] + public async Task SetNormalizedRoleNameAsync() + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + await _identityRoleStore.SetNormalizedRoleNameAsync(role, _lookupNormalizer.Normalize("teacher")); + + role.NormalizedName.ShouldBe(_lookupNormalizer.Normalize("teacher")); + } + + [Fact] + public async Task GetClaimsAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + var claims = await _identityRoleStore.GetClaimsAsync(role); + + claims.ShouldNotBeEmpty(); + claims.ShouldContain(x => x.Type == "test-claim" && x.Value == "test-value"); + + await uow.CompleteAsync(); + } + } + + + [Fact] + public async Task AddClaimAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + await _identityRoleStore.AddClaimAsync(role, new Claim("my-claim", "my-value")); + + role.Claims.ShouldContain(x => x.ClaimType == "my-claim" && x.ClaimValue == "my-value"); + + await uow.CompleteAsync(); + } + } + + + [Fact] + public async Task RemoveClaimAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var role = await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("moderator")); + role.ShouldNotBeNull(); + + await _identityRoleStore.RemoveClaimAsync(role, new Claim("test-claim", "test-value")); + + role.Claims.ShouldNotContain(x => x.ClaimType == "test-claim" && x.ClaimValue == "test-value"); + + await uow.CompleteAsync(); + } + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs new file mode 100644 index 0000000000..3755342375 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserManager_Tests.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Shouldly; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Identity +{ + public class IdentityUserManager_Tests : AbpIdentityDomainTestBase + { + private readonly IdentityUserManager _identityUserManager; + private readonly IIdentityUserRepository _identityUserRepository; + private readonly IIdentityRoleRepository _identityRoleRepository; + private readonly ILookupNormalizer _lookupNormalizer; + private readonly IUnitOfWorkManager _unitOfWorkManager; + private readonly IdentityTestData _testData; + + public IdentityUserManager_Tests() + { + _identityUserManager = GetRequiredService(); + _identityUserRepository = GetRequiredService(); + _identityRoleRepository = GetRequiredService(); + _lookupNormalizer = GetRequiredService(); + _testData = GetRequiredService(); + _unitOfWorkManager = GetRequiredService(); + } + + [Fact] + public async Task GetByIdAsync() + { + var user = await _identityUserManager.GetByIdAsync(_testData.UserJohnId); + + user.ShouldNotBeNull(); + user.UserName.ShouldBe("john.nash"); + } + + [Fact] + public async Task SetRolesAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _identityUserRepository.FindByNormalizedUserNameAsync( + _lookupNormalizer.Normalize("david")); + user.ShouldNotBeNull(); + + var identityResult = await _identityUserManager.SetRolesAsync(user, new List() + { + "moderator", + }); + + identityResult.Succeeded.ShouldBeTrue(); + user.Roles.ShouldContain(x => x.RoleId == _testData.RoleModeratorId); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task SetRoles_Should_Remove_Other_Roles() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var roleSupporter = + await _identityRoleRepository.FindByNormalizedNameAsync(_lookupNormalizer.Normalize("supporter")); + roleSupporter.ShouldNotBeNull(); + + var user = await _identityUserRepository.FindByNormalizedUserNameAsync( + _lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + var identityResult = await _identityUserManager.SetRolesAsync(user, new List() + { + "admin", + }); + + identityResult.Succeeded.ShouldBeTrue(); + user.Roles.ShouldNotContain(x => x.RoleId == _testData.RoleModeratorId); + user.Roles.ShouldNotContain(x => x.RoleId == roleSupporter.Id); + + await uow.CompleteAsync(); + } + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserStore_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserStore_Tests.cs new file mode 100644 index 0000000000..0e4c1e8bc6 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/IdentityUserStore_Tests.cs @@ -0,0 +1,777 @@ +using System; +using System.Collections.Generic; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Identity; +using Shouldly; +using Volo.Abp.Guids; +using Volo.Abp.Uow; +using Xunit; + +namespace Volo.Abp.Identity +{ + public class IdentityUserStore_Tests : AbpIdentityDomainTestBase + { + private readonly IdentityUserStore _identityUserStore; + private readonly ILookupNormalizer _lookupNormalizer; + private readonly IIdentityUserRepository _userRepository; + private readonly IdentityTestData _testData; + private readonly IUnitOfWorkManager _unitOfWorkManager; + + public IdentityUserStore_Tests() + { + _identityUserStore = GetRequiredService(); + _lookupNormalizer = GetRequiredService(); + _userRepository = GetRequiredService(); + _testData = GetRequiredService(); + _unitOfWorkManager = GetRequiredService(); + } + + [Fact] + public async Task GetUserIdAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetUserIdAsync(user)).ShouldBe(user.Id.ToString()); + } + + + [Fact] + public async Task GetUserNameAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetUserNameAsync(user)).ShouldBe(user.UserName); + } + + [Fact] + public async Task SetUserNameAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.SetUserNameAsync(user, "bob.lee"); + user.UserName.ShouldBe("bob.lee"); + //user.NormalizedUserName.ShouldBe(_lookupNormalizer.Normalize("bob.lee")); + } + + + [Fact] + public async Task GetNormalizedUserNameAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetNormalizedUserNameAsync(user)).ShouldBe(user.NormalizedUserName); + } + + [Fact] + public async Task SetNormalizedUserNameAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.SetNormalizedUserNameAsync(user, _lookupNormalizer.Normalize("bob.lee")); + + user.NormalizedUserName.ShouldBe(_lookupNormalizer.Normalize("bob.lee")); + } + + [Fact] + public async Task CreateAsync() + { + var userId = Guid.NewGuid(); + var user = new IdentityUser(userId, "bob.lee", "bob.lee@abp.io"); + + await _identityUserStore.CreateAsync(user); + + var bobLee = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("bob.lee")); + bobLee.ShouldNotBeNull(); + bobLee.UserName.ShouldBe("bob.lee"); + bobLee.Email.ShouldBe("bob.lee@abp.io"); + } + + [Fact] + public async Task UpdateAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + user.Name = "lee"; + (await _identityUserStore.UpdateAsync(user)).Succeeded.ShouldBeTrue(); + + (await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"))).Name + .ShouldBe("lee"); + } + + [Fact] + public async Task Update_Concurrency() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.UpdateAsync(user)).Succeeded.ShouldBeTrue(); + + user.ConcurrencyStamp = Guid.NewGuid().ToString(); + var identityResult = await _identityUserStore.UpdateAsync(user); + + identityResult.Succeeded.ShouldBeFalse(); + identityResult.Errors.ShouldContain(x => + x.Code == nameof(IdentityErrorDescriber.ConcurrencyFailure)); + + // && x.Description == Resources.PasswordMismatch); + } + + + [Fact] + public async Task DeleteAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.DeleteAsync(user)).Succeeded.ShouldBeTrue(); + + (await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash"))).ShouldBeNull(); + } + + + [Fact] + public async Task FindByIdAsync() + { + var user = await _identityUserStore.FindByIdAsync(_testData.UserJohnId.ToString()); + + user.ShouldNotBeNull(); + user.UserName.ShouldBe("john.nash"); + } + + + [Fact] + public async Task FindByNameAsync() + { + var user = await _identityUserStore.FindByNameAsync(_lookupNormalizer.Normalize("john.nash")); + + user.ShouldNotBeNull(); + user.UserName.ShouldBe("john.nash"); + } + + + [Fact] + public async Task SetPasswordHashAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + user.PasswordHash.ShouldBeNull(); + + await _identityUserStore.SetPasswordHashAsync(user, "P@ssw0rd"); + user.PasswordHash.ShouldBe("P@ssw0rd"); + } + + + [Fact] + public async Task GetPasswordHashAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + await _identityUserStore.SetPasswordHashAsync(user, "P@ssw0rd"); + + (await _identityUserStore.GetPasswordHashAsync(user)).ShouldBe("P@ssw0rd"); + } + + + [Fact] + public async Task HasPasswordAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + (await _identityUserStore.HasPasswordAsync(user)).ShouldBeFalse(); + + await _identityUserStore.SetPasswordHashAsync(user, "P@ssw0rd"); + (await _identityUserStore.HasPasswordAsync(user)).ShouldBeTrue(); + } + + + [Fact] + public async Task AddToRoleAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("david")); + user.ShouldNotBeNull(); + user.Roles.ShouldBeEmpty(); + + await _identityUserStore.AddToRoleAsync(user, _lookupNormalizer.Normalize("moderator")); + + user.Roles.ShouldContain(x => x.RoleId == _testData.RoleModeratorId); + + await uow.CompleteAsync(); + } + } + + + [Fact] + public async Task RemoveFromRoleAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + user.Roles.ShouldContain(x => x.RoleId == _testData.RoleModeratorId); + + await _identityUserStore.RemoveFromRoleAsync(user, _lookupNormalizer.Normalize("moderator")); + + user.Roles.ShouldNotContain(x => x.RoleId == _testData.RoleModeratorId); + + await uow.CompleteAsync(); + } + } + + + [Fact] + public async Task GetRolesAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + var roleNames = await _identityUserStore.GetRolesAsync(user); + roleNames.ShouldNotBeEmpty(); + roleNames.ShouldContain(x => x == "moderator"); + roleNames.ShouldContain(x => x == "supporter"); + } + + [Fact] + public async Task IsInRoleAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.IsInRoleAsync(user, _lookupNormalizer.Normalize("moderator"))).ShouldBeTrue(); + (await _identityUserStore.IsInRoleAsync(user, _lookupNormalizer.Normalize("moderatorNotExist"))).ShouldBeFalse(); + + await uow.CompleteAsync(); + } + } + + + [Fact] + public async Task GetClaimsAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + var claims = await _identityUserStore.GetClaimsAsync(user); + claims.ShouldNotBeEmpty(); + claims.ShouldContain(x => x.Type == "TestClaimType" && x.Value == "42"); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task AddClaimsAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.AddClaimsAsync(user, new List() + { + new Claim("MyClaimType", "MyClaimValue") + }); + + user.Claims.ShouldContain(x => x.ClaimType == "MyClaimType" && x.ClaimValue == "MyClaimValue"); + + await uow.CompleteAsync(); + } + } + + + [Fact] + public async Task ReplaceClaimAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.ReplaceClaimAsync(user, new Claim("TestClaimType", "42"), new Claim("MyClaimType", "MyClaimValue")); + + user.Claims.ShouldNotContain(x => x.ClaimType == "TestClaimType" && x.ClaimValue == "42"); + user.Claims.ShouldContain(x => x.ClaimType == "MyClaimType" && x.ClaimValue == "MyClaimValue"); + + await uow.CompleteAsync(); + } + } + + + [Fact] + public async Task RemoveClaimsAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.RemoveClaimsAsync(user, new List() + { + new Claim("TestClaimType", "42") + }); + + user.Claims.ShouldNotContain(x => x.ClaimType == "TestClaimType" && x.ClaimValue == "42"); + + await uow.CompleteAsync(); + } + } + + + [Fact] + public async Task AddLoginAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + user.Logins.ShouldNotContain(x => x.LoginProvider == "facebook" && x.ProviderKey == "john"); + + await _identityUserStore.AddLoginAsync(user, new UserLoginInfo("facebook", "john", "John Nash")); + + user.Logins.ShouldContain(x => x.LoginProvider == "facebook" && x.ProviderKey == "john"); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task RemoveLoginAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + user.Logins.ShouldContain(x => x.LoginProvider == "github" && x.ProviderKey == "john"); + + await _identityUserStore.RemoveLoginAsync(user, "github", "john"); + + user.Logins.ShouldNotContain(x => x.LoginProvider == "github" && x.ProviderKey == "john"); + + await uow.CompleteAsync(); + } + } + + + [Fact] + public async Task GetLoginsAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + var logins = await _identityUserStore.GetLoginsAsync(user); + + logins.ShouldNotBeNull(); + logins.ShouldContain(x => x.LoginProvider == "github" && x.ProviderKey == "john"); + logins.ShouldContain(x => x.LoginProvider == "twitter" && x.ProviderKey == "johnx"); + + await uow.CompleteAsync(); + } + } + + + [Fact] + public async Task FindByLoginAsync() + { + var user = await _identityUserStore.FindByLoginAsync("github", "john"); + user.ShouldNotBeNull(); + user.UserName.ShouldBe("john.nash"); + } + + + [Fact] + public async Task GetEmailConfirmedAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetEmailConfirmedAsync(user)).ShouldBe(user.EmailConfirmed); + } + + + [Fact] + public async Task SetEmailConfirmedAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + var emailConfirmed = user.EmailConfirmed; + + await _identityUserStore.SetEmailConfirmedAsync(user, !emailConfirmed); + + user.EmailConfirmed.ShouldBe(!emailConfirmed); + } + + [Fact] + public async Task SetEmailAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.SetEmailAsync(user, "john.nash.kobe@abp.io"); + + user.Email.ShouldBe("john.nash.kobe@abp.io"); + //user.NormalizedEmail.ShouldBe(_lookupNormalizer.Normalize("john.nash.kobe@abp.io")); + } + + [Fact] + public async Task GetEmailAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetEmailAsync(user)).ShouldBe(user.Email); + } + + [Fact] + public async Task GetNormalizedEmailAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetNormalizedEmailAsync(user)).ShouldBe(user.NormalizedEmail); + } + + [Fact] + public async Task SetNormalizedEmailAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.SetNormalizedEmailAsync(user, _lookupNormalizer.Normalize("john.nash.kobe@abp.io")); + + user.NormalizedEmail.ShouldBe(_lookupNormalizer.Normalize("john.nash.kobe@abp.io")); + } + + [Fact] + public async Task FindByEmailAsync() + { + var user = await _identityUserStore.FindByEmailAsync(_lookupNormalizer.Normalize("john.nash@abp.io")); + + user.ShouldNotBeNull(); + user.Email.ShouldBe("john.nash@abp.io"); + } + + [Fact] + public async Task GetLockoutEndDateAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetLockoutEndDateAsync(user)).ShouldBe(user.LockoutEnd); + } + + [Fact] + public async Task SetLockoutEndDateAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.SetLockoutEndDateAsync(user, DateTimeOffset.Parse("01/01/2019")); + + user.LockoutEnd.ShouldBe(DateTimeOffset.Parse("01/01/2019")); + } + + + [Fact] + public async Task IncrementAccessFailedCountAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + var count = user.AccessFailedCount; + + await _identityUserStore.IncrementAccessFailedCountAsync(user); + + user.AccessFailedCount.ShouldBe(count + 1); + } + + [Fact] + public async Task ResetAccessFailedCountAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.ResetAccessFailedCountAsync(user); + + user.AccessFailedCount.ShouldBe(0); + } + + [Fact] + public async Task GetAccessFailedCountAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetAccessFailedCountAsync(user)).ShouldBe(user.AccessFailedCount); + } + + [Fact] + public async Task GetLockoutEnabledAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetLockoutEnabledAsync(user)).ShouldBe(user.LockoutEnabled); + } + + [Fact] + public async Task SetLockoutEnabledAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + var lockoutEnabled = user.LockoutEnabled; + + await _identityUserStore.SetLockoutEnabledAsync(user, !lockoutEnabled); + + user.LockoutEnabled.ShouldBe(!lockoutEnabled); + } + + + [Fact] + public async Task SetPhoneNumberAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.SetPhoneNumberAsync(user, "13800138000"); + + user.PhoneNumber.ShouldBe("13800138000"); + } + + + [Fact] + public async Task GetPhoneNumberAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetPhoneNumberAsync(user)).ShouldBe(user.PhoneNumber); + } + + [Fact] + public async Task GetPhoneNumberConfirmedAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetPhoneNumberConfirmedAsync(user)).ShouldBe(user.PhoneNumberConfirmed); + } + + + [Fact] + public async Task SetPhoneNumberConfirmedAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + var phoneNumberConfirmed = user.PhoneNumberConfirmed; + + await _identityUserStore.SetPhoneNumberConfirmedAsync(user, !phoneNumberConfirmed); + + user.PhoneNumberConfirmed.ShouldBe(!phoneNumberConfirmed); + } + + + [Fact] + public async Task SetSecurityStampAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + var securityStamp = Guid.NewGuid().ToString(); + + await _identityUserStore.SetSecurityStampAsync(user, securityStamp); + + user.SecurityStamp.ShouldBe(securityStamp); + } + + [Fact] + public async Task GetSecurityStampAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetSecurityStampAsync(user)).ShouldBe(user.SecurityStamp); + } + + + [Fact] + public async Task SetTwoFactorEnabledAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + var twoFactorEnabled = user.TwoFactorEnabled; + + await _identityUserStore.SetTwoFactorEnabledAsync(user, !twoFactorEnabled); + + user.TwoFactorEnabled.ShouldBe(!twoFactorEnabled); + } + + + [Fact] + public async Task GetTwoFactorEnabledAsync() + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetTwoFactorEnabledAsync(user)).ShouldBe(user.TwoFactorEnabled); + } + + [Fact] + public async Task GetUsersForClaimAsync() + { + var user = await _identityUserStore.GetUsersForClaimAsync(new Claim("TestClaimType", "42")); + user.ShouldNotBeNull(); + user.ShouldNotBeEmpty(); + user.ShouldContain(x => x.UserName == "john.nash"); + } + + [Fact] + public async Task GetUsersInRoleAsync() + { + var user = await _identityUserStore.GetUsersInRoleAsync(_lookupNormalizer.Normalize("moderator")); + user.ShouldNotBeNull(); + user.ShouldContain(x => x.UserName == "john.nash"); + } + + [Fact] + public async Task SetTokenAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.SetTokenAsync(user, "test-provider", "test-name", "123123"); + + user.Tokens.ShouldNotBeEmpty(); + user.Tokens.ShouldContain(x => x.LoginProvider == "test-provider" && x.Name == "test-name" && x.Value == "123123"); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task RemoveTokenAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.RemoveTokenAsync(user, "test-provider", "test-name"); + + user.Tokens.ShouldNotContain(x => x.LoginProvider == "test-provider" && x.Name == "test-name" && x.Value == "123123"); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task GetTokenAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + (await _identityUserStore.GetTokenAsync(user, "test-provider", "test-name")).ShouldBe("test-value"); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task SetAuthenticatorKeyAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.SetAuthenticatorKeyAsync(user, "testKey"); + + user.Tokens.ShouldContain(x => x.LoginProvider == "[AspNetUserStore]" && x.Name == "AuthenticatorKey" && x.Value == "testKey"); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task GetAuthenticatorKeyAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + await _identityUserStore.SetAuthenticatorKeyAsync(user, "testKey"); + + (await _identityUserStore.GetAuthenticatorKeyAsync(user)).ShouldBe("testKey"); + + await uow.CompleteAsync(); + } + + } + + [Fact] + public async Task CountCodesAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + await _identityUserStore.SetTokenAsync(user, "[AspNetUserStore]", "RecoveryCodes", "testKey;testKey2"); + + (await _identityUserStore.CountCodesAsync(user)).ShouldBe(2); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task ReplaceCodesAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + + await _identityUserStore.ReplaceCodesAsync(user, new List() + { + "testKey", + "testKey2" + }); + + user.Tokens.ShouldContain(x => x.LoginProvider == "[AspNetUserStore]" && x.Name == "RecoveryCodes" && x.Value == "testKey;testKey2"); + + await uow.CompleteAsync(); + } + } + + [Fact] + public async Task RedeemCodeAsync() + { + using (var uow = _unitOfWorkManager.Begin()) + { + var user = await _userRepository.FindByNormalizedUserNameAsync(_lookupNormalizer.Normalize("john.nash")); + user.ShouldNotBeNull(); + await _identityUserStore.SetTokenAsync(user, "[AspNetUserStore]", "RecoveryCodes", "testKey;testKey2"); + + (await _identityUserStore.RedeemCodeAsync(user, "testKey")).ShouldBeTrue(); + + await uow.CompleteAsync(); + } + } + } +} diff --git a/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/UserRoleFinder_Tests.cs b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/UserRoleFinder_Tests.cs new file mode 100644 index 0000000000..ef06949500 --- /dev/null +++ b/modules/identity/test/Volo.Abp.Identity.Domain.Tests/Volo/Abp/Identity/UserRoleFinder_Tests.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.Identity +{ + public class UserRoleFinder_Tests : AbpIdentityDomainTestBase + { + private readonly IUserRoleFinder _userRoleFinder; + private readonly IdentityTestData _testData; + + public UserRoleFinder_Tests() + { + _userRoleFinder = GetRequiredService(); + _testData = GetRequiredService(); + } + + [Fact] + public async Task GetRolesAsync() + { + var roleNames = await _userRoleFinder.GetRolesAsync(_testData.UserJohnId); + roleNames.ShouldNotBeEmpty(); + roleNames.ShouldContain(x => x == "moderator"); + roleNames.ShouldContain(x => x == "supporter"); + } + } +} diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/Clients/ClientStore_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/ClientStore_Tests.cs similarity index 100% rename from modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/Clients/ClientStore_Tests.cs rename to modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/ClientStore_Tests.cs diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs similarity index 100% rename from modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs rename to modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/IdentityResourceStore_Tests.cs diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/Clients/PersistentGrant_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/PersistentGrant_Tests.cs similarity index 100% rename from modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/Clients/PersistentGrant_Tests.cs rename to modules/identityserver/test/Volo.Abp.IdentityServer.Domain.Tests/Volo/Abp/IdentityServer/Clients/PersistentGrant_Tests.cs diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs new file mode 100644 index 0000000000..79bab1d23a --- /dev/null +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.EntityFrameworkCore.Tests/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Volo.Abp.IdentityServer +{ + public class PersistentGrantRepository_Tests : PersistentGrantRepository_Tests + { + + } +} diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs new file mode 100644 index 0000000000..fd2763dc6c --- /dev/null +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.MongoDB.Tests/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Volo.Abp.IdentityServer +{ + public class PersistentGrantRepository_Tests : PersistentGrantRepository_Tests + { + + } +} diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs index 0c18e85350..016820af49 100644 --- a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/AbpIdentityServerTestDataBuilder.cs @@ -1,6 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; +using Volo.Abp.Identity; using Volo.Abp.IdentityServer.ApiResources; using Volo.Abp.IdentityServer.Clients; using Volo.Abp.IdentityServer.Grants; @@ -14,7 +16,8 @@ namespace Volo.Abp.IdentityServer private readonly IApiResourceRepository _apiResourceRepository; private readonly IClientRepository _clientRepository; private readonly IIdentityResourceRepository _identityResourceRepository; - //private readonly IPersistentGrantRepository _persistentGrantRepository; + private readonly IIdentityClaimTypeRepository _identityClaimTypeRepository; + private readonly IPersistentGrantRepository _persistentGrantRepository; private readonly AbpIdentityServerTestData _testData; public AbpIdentityServerTestDataBuilder( @@ -22,15 +25,17 @@ namespace Volo.Abp.IdentityServer IApiResourceRepository apiResourceRepository, IClientRepository clientRepository, IIdentityResourceRepository identityResourceRepository, - AbpIdentityServerTestData testData - /*IPersistentGrantRepository persistentGrantRepository*/) + IIdentityClaimTypeRepository identityClaimTypeRepository, + AbpIdentityServerTestData testData, + IPersistentGrantRepository persistentGrantRepository) { _testData = testData; _guidGenerator = guidGenerator; _apiResourceRepository = apiResourceRepository; _clientRepository = clientRepository; _identityResourceRepository = identityResourceRepository; - //_persistentGrantRepository = persistentGrantRepository; + _identityClaimTypeRepository = identityClaimTypeRepository; + _persistentGrantRepository = persistentGrantRepository; } public void Build() @@ -39,13 +44,30 @@ namespace Volo.Abp.IdentityServer AddIdentityResources(); AddApiResources(); AddClients(); + AddClaimTypes(); } private void AddPersistedGrants() { - //_persistentGrantRepository.Insert(new PersistedGrant(_guidGenerator.Create())); - //_persistentGrantRepository.Insert(new PersistedGrant(_guidGenerator.Create())); - //_persistentGrantRepository.Insert(new PersistedGrant(_guidGenerator.Create())); + _persistentGrantRepository.Insert(new PersistedGrant(_guidGenerator.Create()) + { + + Key = "PersistedGrantKey1", + SubjectId = "PersistedGrantSubjectId1", + ClientId = "PersistedGrantClientId1", + Type = "PersistedGrantType1" + }); + _persistentGrantRepository.Insert(new PersistedGrant(_guidGenerator.Create()) + { + Key = "PersistedGrantKey2", + SubjectId = "PersistedGrantSubjectId2" + }); + + _persistentGrantRepository.Insert(new PersistedGrant(_guidGenerator.Create()) + { + Key = "PersistedGrantKey3", + SubjectId = "PersistedGrantSubjectId3" + }); } private void AddIdentityResources() @@ -105,5 +127,12 @@ namespace Volo.Abp.IdentityServer _clientRepository.Insert(new Client(_guidGenerator.Create(), "ClientId2")); _clientRepository.Insert(new Client(_guidGenerator.Create(), "ClientId3")); } + + private void AddClaimTypes() + { + var ageClaim = new IdentityClaimType(Guid.NewGuid(), "Age", false, false, null, null, null, + IdentityClaimValueType.Int); + _identityClaimTypeRepository.Insert(ageClaim); + } } } diff --git a/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs new file mode 100644 index 0000000000..20f6674515 --- /dev/null +++ b/modules/identityserver/test/Volo.Abp.IdentityServer.TestBase/Volo/Abp/IdentityServer/PersistentGrantRepository_Tests.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.IdentityServer.Grants; +using Volo.Abp.Modularity; +using Xunit; + +namespace Volo.Abp.IdentityServer +{ + public abstract class PersistentGrantRepository_Tests : AbpIdentityServerTestBase + where TStartupModule : IAbpModule + { + private readonly IPersistentGrantRepository _persistentGrantRepository; + + protected PersistentGrantRepository_Tests() + { + _persistentGrantRepository = GetRequiredService(); + } + + [Fact] + public async Task FindByKeyAsync() + { + (await _persistentGrantRepository.FindByKeyAsync("PersistedGrantKey1")).ShouldNotBeNull(); + } + + [Fact] + public async Task GetListBySubjectIdAsync() + { + var persistedGrants = await _persistentGrantRepository.GetListBySubjectIdAsync("PersistedGrantSubjectId1"); + persistedGrants.ShouldNotBeEmpty(); + persistedGrants.ShouldContain(x => x.Key == "PersistedGrantKey1"); + } + + [Fact] + public async Task DeleteBySubjectIdAndClientId() + { + await _persistentGrantRepository.DeleteAsync("PersistedGrantSubjectId1", "PersistedGrantClientId1"); + + var persistedGrants = await _persistentGrantRepository.GetListAsync(); + persistedGrants.ShouldNotBeEmpty(); + persistedGrants.ShouldNotContain(x => + x.Key == "PersistedGrantKey1" && x.SubjectId == "PersistedGrantSubjectId1" && + x.ClientId == "PersistedGrantClientId1"); + } + + [Fact] + public async Task DeleteBySubjectIdAndClientIdAndType() + { + await _persistentGrantRepository.DeleteAsync("PersistedGrantSubjectId1", "PersistedGrantClientId1", + "PersistedGrantClientId1"); + + var persistedGrants = await _persistentGrantRepository.GetListAsync(); + persistedGrants.ShouldNotBeEmpty(); + persistedGrants.ShouldNotContain(x => + x.Key == "PersistedGrantKey1" && x.SubjectId == "PersistedGrantSubjectId1" && + x.ClientId == "PersistedGrantClientId1" && x.Type == "PersistedGrantClientId1"); + + } + } +} diff --git a/modules/permission-management/Volo.Abp.PermissionManagement.sln b/modules/permission-management/Volo.Abp.PermissionManagement.sln index e0fdd1e0ec..5812918a3c 100644 --- a/modules/permission-management/Volo.Abp.PermissionManagement.sln +++ b/modules/permission-management/Volo.Abp.PermissionManagement.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27428.1 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28729.10 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B559B878-38F7-49CC-BC06-43A32D68C1A7}" EndProject @@ -29,9 +29,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManageme EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.MongoDB.Tests", "test\Volo.Abp.PermissionManagement.MongoDB.Tests\Volo.Abp.PermissionManagement.MongoDB.Tests.csproj", "{AFA65E08-1F17-4BBE-96A6-80F3CFE22A75}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.HttpApi", "src\Volo.Abp.PermissionManagement.HttpApi\Volo.Abp.PermissionManagement.HttpApi.csproj", "{9E0B517E-F02E-436F-9695-7CF12795D34C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.HttpApi", "src\Volo.Abp.PermissionManagement.HttpApi\Volo.Abp.PermissionManagement.HttpApi.csproj", "{9E0B517E-F02E-436F-9695-7CF12795D34C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.HttpApi.Client", "src\Volo.Abp.PermissionManagement.HttpApi.Client\Volo.Abp.PermissionManagement.HttpApi.Client.csproj", "{1CD80519-9431-48DB-B0EA-291A73FF9F49}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.HttpApi.Client", "src\Volo.Abp.PermissionManagement.HttpApi.Client\Volo.Abp.PermissionManagement.HttpApi.Client.csproj", "{1CD80519-9431-48DB-B0EA-291A73FF9F49}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.Application.Tests", "test\Volo.Abp.PermissionManagement.Application.Tests\Volo.Abp.PermissionManagement.Application.Tests.csproj", "{A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -91,6 +93,10 @@ Global {1CD80519-9431-48DB-B0EA-291A73FF9F49}.Debug|Any CPU.Build.0 = Debug|Any CPU {1CD80519-9431-48DB-B0EA-291A73FF9F49}.Release|Any CPU.ActiveCfg = Release|Any CPU {1CD80519-9431-48DB-B0EA-291A73FF9F49}.Release|Any CPU.Build.0 = Release|Any CPU + {A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -109,6 +115,7 @@ Global {AFA65E08-1F17-4BBE-96A6-80F3CFE22A75} = {63DA4A89-5908-4F37-B7E6-525AEEF20C77} {9E0B517E-F02E-436F-9695-7CF12795D34C} = {B559B878-38F7-49CC-BC06-43A32D68C1A7} {1CD80519-9431-48DB-B0EA-291A73FF9F49} = {B559B878-38F7-49CC-BC06-43A32D68C1A7} + {A0F72F5F-3713-4E06-ADB7-15ADFDCB79B1} = {63DA4A89-5908-4F37-B7E6-525AEEF20C77} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {8FC7DF78-5E2D-489F-9D43-147D2ABAA112} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebAutoMapperProfile.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebAutoMapperProfile.cs index 631779b8ae..e707ba0676 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebAutoMapperProfile.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/AbpPermissionManagementWebAutoMapperProfile.cs @@ -1,4 +1,5 @@ using AutoMapper; +using Volo.Abp.AutoMapper; using Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement; namespace Volo.Abp.PermissionManagement.Web @@ -7,7 +8,7 @@ namespace Volo.Abp.PermissionManagement.Web { public AbpPermissionManagementWebAutoMapperProfile() { - CreateMap(); + CreateMap().Ignore(p=>p.IsAllPermissionsGranted); CreateMap() .ForMember(p => p.Depth, opts => opts.Ignore()); diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Localization/Resources/AbpPermissionManagement/en.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Localization/Resources/AbpPermissionManagement/en.json index bb6999c100..ba775f3ab0 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Localization/Resources/AbpPermissionManagement/en.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Localization/Resources/AbpPermissionManagement/en.json @@ -3,6 +3,8 @@ "texts": { "Permissions": "Permissions", "OnlyProviderPermissons": "Only this provider", - "All": "All" + "All": "All", + "SelectAllInAllTabs": "Grant all permissions", + "SelectAllInThisTab": "Select all" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Localization/Resources/AbpPermissionManagement/tr.json b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Localization/Resources/AbpPermissionManagement/tr.json index 8da6bccd95..7f278ce6c1 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Localization/Resources/AbpPermissionManagement/tr.json +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Localization/Resources/AbpPermissionManagement/tr.json @@ -3,6 +3,8 @@ "texts": { "Permissions": "İzinler", "OnlyProviderPermissons": "Sadece bu sağlayıcı", - "All": "Hepsi" + "All": "Hepsi", + "SelectAllInAllTabs": "Tüm izinleri ver", + "SelectAllInThisTab": "Hepsini seç" } } \ No newline at end of file diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml index d1081f2f84..dd2c73eb23 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml @@ -8,19 +8,28 @@ @{ Layout = null; } +

- - - - + + +
+ + + @for (var i = 0; i < Model.Groups.Count; i++) {

@Model.Groups[i].DisplayName

-
-
+
+
+
+ +
@for (var j = 0; j < Model.Groups[i].Permissions.Count; j++) { - + group-style="margin-left: @(Model.Groups[i].Permissions[j].Depth * 20)px"/> + } +
} @@ -38,4 +48,4 @@ - \ No newline at end of file + diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs index 0702c1e766..3bc688a6f1 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/PermissionManagementModal.cshtml.cs @@ -25,6 +25,10 @@ namespace Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement public string EntityDisplayName { get; set; } + public bool SelectAllInThisTab { get; set; } + + public bool SelectAllInAllTabs { get; set; } + private readonly IPermissionAppService _permissionAppService; public PermissionManagementModal(IPermissionAppService permissionAppService) @@ -49,6 +53,13 @@ namespace Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement { new FlatTreeDepthFinder().SetDepths(group.Permissions); } + + foreach (var group in Groups) + { + group.IsAllPermissionsGranted = group.Permissions.All(p => p.IsGranted); + } + + SelectAllInAllTabs = Groups.All(g => g.IsAllPermissionsGranted); } public async Task OnPostAsync() @@ -80,6 +91,8 @@ namespace Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement { public string Name { get; set; } + public bool IsAllPermissionsGranted { get; set; } + public string DisplayName { get; set; } public List Permissions { get; set; } diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.css b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.css new file mode 100644 index 0000000000..d1f8731614 --- /dev/null +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.css @@ -0,0 +1,12 @@ +.custom-scroll-container > .col-4 { + overflow: hidden; + overflow-y: auto; + max-height: 499px; + display: block; + position: relative; + z-index: 123; +} + +.custom-scroll-content { + max-height: 440px; +} diff --git a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js index f32b00720e..2972ccfffb 100644 --- a/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js +++ b/modules/permission-management/src/Volo.Abp.PermissionManagement.Web/Pages/AbpPermissionManagement/permission-management-modal.js @@ -12,7 +12,7 @@ $tab.find('.custom-checkbox') .filter('[data-permission-name="' + parentName + '"]') .find('input[type="checkbox"]') - .each(function() { + .each(function () { var $parent = $(this); $parent.prop('checked', true); checkParents($tab, $parent); @@ -35,20 +35,170 @@ }); } - this.initDom = function($el) { + function handleUncheck($tab) { + var $checkBox = $tab.find('input[name="SelectAllInThisTab"]'); + + if ($checkBox.is(':checked')) { + if ($tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').length > 1) { + $($checkBox).prop('indeterminate', true); + } + else { + $checkBox.prop('checked', false); + } + } + else if ($checkBox.is(':indeterminate')) { + var allUnchecked = true; + + $tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () { + if ($(this).is(':checked') === true) { + allUnchecked = false; + } + }); + + if (allUnchecked) { + $($checkBox).prop('indeterminate', false); + $checkBox.prop('checked', false); + } + } + } + + function handleCheck($tab) { + var $checkBox = $tab.find('input[name="SelectAllInThisTab"]'); + + var allChecked = true; + + $tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () { + if ($(this).is(':checked') === false) { + allChecked = false; + } + }); + + if (allChecked) { + $($checkBox).prop('indeterminate', false); + $checkBox.prop('checked', true); + } + else { + $($checkBox).prop('indeterminate', true); + } + } + + function initSelectAllInThisTab() { + var tabs = $('.tab-pane'); + for (var i = 0; i < tabs.length; i++) { + var $tab = $(tabs[i]); + var $checkBox = $tab.find('input[name="SelectAllInThisTab"]'); + + var allChecked = true; + var allUnChecked = true; + + $tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () { + if ($(this).is(':checked') === true) { + allUnChecked = false; + } else { + allChecked = false; + } + }); + + if (allChecked) { + $($checkBox).prop('checked', true); + } + else if (allUnChecked) { + $($checkBox).prop('checked', false); + } + else { + $($checkBox).prop('indeterminate', true); + } + } + } + + function setSelectAllInAllTabs() { + var $checkBox = $('#SelectAllInAllTabs'); + + var anyIndeterminate = false; + var allChecked = true; + var allUnChecked = true; + + $('input[name="SelectAllInThisTab"]').each(function () { + if ($(this).is(':checked') === true) { + allUnChecked = false; + } else { + allChecked = false; + } + + if ($(this).is(':indeterminate') === true) { + anyIndeterminate = true; + } + }); + + if (anyIndeterminate) { + $($checkBox).prop('indeterminate', true); + return; + } else { + $($checkBox).prop('indeterminate', false); + } + + if (allChecked) { + $($checkBox).prop('checked', true); + } + else if (allUnChecked) { + $($checkBox).prop('checked', false); + } + else { + $($checkBox).prop('indeterminate', true); + } + } + + this.initDom = function ($el) { $el.find('.tab-pane').each(function () { var $tab = $(this); - $tab.find('input[type="checkbox"]').each(function () { + $tab.find('input[type="checkbox"]').not('[name="SelectAllInThisTab"]').each(function () { var $checkBox = $(this); $checkBox.change(function () { if ($checkBox.is(':checked')) { checkParents($tab, $checkBox); + handleCheck($tab); } else { uncheckChildren($tab, $checkBox); + handleUncheck($tab); } + setSelectAllInAllTabs(); }); }); }); + + $('input[name="SelectAllInThisTab"]').change(function () { + var $checkBox = $(this); + var $tab = $('#' + $checkBox.attr('data-tab-id')); + if ($checkBox.is(':checked')) { + $tab.find('input[type="checkbox"]').prop('checked', true); + } else { + $tab.find('input[type="checkbox"]').prop('checked', false); + } + $($checkBox).prop('indeterminate', false); + setSelectAllInAllTabs(); + }); + + $('input[name="SelectAllInAllTabs"]').change(function () { + var $checkBox = $(this); + if ($checkBox.is(':checked')) { + $('.tab-pane input[type="checkbox"]').prop('checked', true); + } else { + $('.tab-pane input[type="checkbox"]').prop('checked', false); + } + $($checkBox).prop('indeterminate', false); + }); + + $(function () { + $(".custom-scroll-content").mCustomScrollbar({ + theme: "minimal-dark" + }); + $(".custom-scroll-container > .col-4").mCustomScrollbar({ + theme: "minimal-dark" + }); + }); + + initSelectAllInThisTab(); + setSelectAllInAllTabs(); }; }; })(jQuery); \ No newline at end of file diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj new file mode 100644 index 0000000000..7e817abf24 --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo.Abp.PermissionManagement.Application.Tests.csproj @@ -0,0 +1,18 @@ + + + + netcoreapp2.2 + + false + + + + + + + + + + + + diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestBase.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestBase.cs new file mode 100644 index 0000000000..7102b8f851 --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestBase.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; +using Volo.Abp.Users; + +namespace Volo.Abp.PermissionManagement +{ + public class AbpPermissionManagementApplicationTestBase : PermissionManagementTestBase + { + protected Guid? CurrentUserId { get; set; } + + protected AbpPermissionManagementApplicationTestBase() + { + CurrentUserId = Guid.NewGuid(); + } + protected override void AfterAddApplication(IServiceCollection services) + { + var currentUser = Substitute.For(); + //currentUser.Id.Returns(ci => CurrentUserId); + currentUser.IsAuthenticated.Returns(true); + + services.AddSingleton(currentUser); + } + } +} diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestModule.cs new file mode 100644 index 0000000000..2bbfb07acd --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/AbpPermissionManagementApplicationTestModule.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Modularity; + +namespace Volo.Abp.PermissionManagement +{ + [DependsOn( + typeof(AbpPermissionManagementApplicationModule), + typeof(AbpPermissionManagementTestModule) + )] + public class AbpPermissionManagementApplicationTestModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAlwaysAllowAuthorization(); + + context.Services.Configure(options => + { + options.ProviderPolicies[UserPermissionValueProvider.ProviderName] = UserPermissionValueProvider.ProviderName; + options.ProviderPolicies["Test"] = "Test"; + options.ManagementProviders.Add(); + }); + } + } +} diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs new file mode 100644 index 0000000000..8b36b02877 --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Application.Tests/Volo/Abp/PermissionManagement/PermissionAppService_Tests.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Authorization.Permissions; +using Xunit; + +namespace Volo.Abp.PermissionManagement.Application.Tests.Volo.Abp.PermissionManagement +{ + public class PermissionAppService_Tests : AbpPermissionManagementApplicationTestBase + { + private readonly IPermissionAppService _permissionAppService; + private readonly IPermissionGrantRepository _permissionGrantRepository; + + public PermissionAppService_Tests() + { + _permissionAppService = GetRequiredService(); + _permissionGrantRepository = GetRequiredService(); + } + + [Fact] + public async Task GetAsync() + { + var permissionListResultDto = await _permissionAppService.GetAsync(UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString()); + + permissionListResultDto.ShouldNotBeNull(); + permissionListResultDto.EntityDisplayName.ShouldBe(PermissionTestDataBuilder.User1Id.ToString()); + permissionListResultDto.Groups.Count.ShouldBe(1); + permissionListResultDto.Groups.ShouldContain(x => x.Name == "TestGroup"); + + permissionListResultDto.Groups.First().Permissions.Count.ShouldBe(4); + permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission1"); + permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission2"); + permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission2.ChildPermission1"); + permissionListResultDto.Groups.First().Permissions.ShouldContain(x => x.Name == "MyPermission3"); + + } + + [Fact] + public async Task UpdateAsync() + { + (await _permissionGrantRepository.FindAsync("MyPermission1", "Test", + "Test")).ShouldBeNull(); + + await _permissionAppService.UpdateAsync("Test", + "Test", new UpdatePermissionsDto() + { + Permissions = new UpdatePermissionDto[] + { + new UpdatePermissionDto() + { + IsGranted = true, + Name = "MyPermission1" + } + } + }); + + (await _permissionGrantRepository.FindAsync("MyPermission1", "Test", + "Test")).ShouldNotBeNull(); + } + + [Fact] + public async Task Update_Revoke_Test() + { + _permissionGrantRepository.Insert( + new PermissionGrant( + Guid.NewGuid(), + "MyPermission1", + "Test", + "Test" + ) + ); + (await _permissionGrantRepository.FindAsync("MyPermission1", "Test", + "Test")).ShouldNotBeNull(); + + await _permissionAppService.UpdateAsync("Test", + "Test", new UpdatePermissionsDto() + { + Permissions = new UpdatePermissionDto[] + { + new UpdatePermissionDto() + { + IsGranted = false, + Name = "MyPermission1" + } + } + }); + + (await _permissionGrantRepository.FindAsync("MyPermission1", "Test", + "Test")).ShouldBeNull(); + } + } +} diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs index 4423cf114b..ec343d9615 100644 --- a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/AbpPermissionManagementTestBaseModule.cs @@ -12,6 +12,14 @@ namespace Volo.Abp.PermissionManagement )] public class AbpPermissionManagementTestBaseModule : AbpModule { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.Configure(options => + { + options.ManagementProviders.Add(); + }); + } + public override void OnApplicationInitialization(ApplicationInitializationContext context) { SeedTestData(context); diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionManagementProvider.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionManagementProvider.cs new file mode 100644 index 0000000000..f66ed2995d --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.TestBase/Volo/Abp/PermissionManagement/TestPermissionManagementProvider.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Volo.Abp.Guids; +using Volo.Abp.MultiTenancy; + +namespace Volo.Abp.PermissionManagement +{ + public class TestPermissionManagementProvider : PermissionManagementProvider + { + public override string Name => "Test"; + + public TestPermissionManagementProvider( + IPermissionGrantRepository permissionGrantRepository, + IGuidGenerator guidGenerator, + ICurrentTenant currentTenant) + : base( + permissionGrantRepository, + guidGenerator, + currentTenant) + { + + } + } +} diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Basic_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionChecker_Basic_Tests.cs similarity index 100% rename from modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Basic_Tests.cs rename to modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionChecker_Basic_Tests.cs diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionDataSeeder_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionDataSeeder_Tests.cs new file mode 100644 index 0000000000..6868421a8a --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionDataSeeder_Tests.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.PermissionManagement +{ + public class PermissionDataSeeder_Tests : PermissionTestBase + { + private readonly IPermissionDataSeeder _permissionDataSeeder; + private readonly IPermissionGrantRepository _grantpermissionGrantRepository; + + public PermissionDataSeeder_Tests() + { + _permissionDataSeeder = GetRequiredService(); + _grantpermissionGrantRepository = GetRequiredService(); + } + + [Fact] + public async Task SeedAsync() + { + (await _grantpermissionGrantRepository.FindAsync("MyPermission1", "Test", "Test")).ShouldBeNull(); + (await _grantpermissionGrantRepository.FindAsync("MyPermission2", "Test", "Test")).ShouldBeNull(); + + await _permissionDataSeeder.SeedAsync("Test", "Test", new List() + { + "MyPermission1", + "MyPermission2" + }); + + (await _grantpermissionGrantRepository.FindAsync("MyPermission1", "Test", "Test")).ShouldNotBeNull(); + (await _grantpermissionGrantRepository.FindAsync("MyPermission2", "Test", "Test")).ShouldNotBeNull(); + + } + } +} diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionGrantCacheItemInvalidator_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionGrantCacheItemInvalidator_Tests.cs new file mode 100644 index 0000000000..9d4248bb5a --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionGrantCacheItemInvalidator_Tests.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Authorization.Permissions; +using Volo.Abp.Caching; +using Volo.Abp.MultiTenancy; +using Xunit; + +namespace Volo.Abp.PermissionManagement +{ + public class PermissionGrantCacheItemInvalidator_Tests : PermissionTestBase + { + private readonly IDistributedCache _cache; + private readonly IPermissionStore _permissionStore; + private readonly IPermissionGrantRepository _permissionGrantRepository; + + public PermissionGrantCacheItemInvalidator_Tests() + { + _cache = GetRequiredService>(); + _permissionStore = GetRequiredService(); + _permissionGrantRepository = GetRequiredService(); + } + + [Fact] + public async Task PermissionStore_IsGrantedAsync_Should_Cache_PermissionGrant() + { + (await _cache.GetAsync(PermissionGrantCacheItem.CalculateCacheKey("MyPermission1", + UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString()))).ShouldBeNull(); + + + await _permissionStore.IsGrantedAsync("MyPermission1", + UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString()); + + + (await _cache.GetAsync(PermissionGrantCacheItem.CalculateCacheKey("MyPermission1", + UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString()))).ShouldNotBeNull(); + } + + [Fact] + public async Task Cache_Should_Invalidator_WhenPermissionGrantChanged() + { + // IsGrantedAsync will cache PermissionGrant + await _permissionStore.IsGrantedAsync("MyPermission1", + UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString()); + + var permissionGrant = await _permissionGrantRepository.FindAsync("MyPermission1", + UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString()); + permissionGrant.ShouldNotBeNull(); + await _permissionGrantRepository.DeleteAsync(permissionGrant); + + (await _cache.GetAsync(PermissionGrantCacheItem.CalculateCacheKey("MyPermission1", + UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString()))).ShouldBeNull(); + } + } +} diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManagementProvider_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManagementProvider_Tests.cs new file mode 100644 index 0000000000..d1e249c29a --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManagementProvider_Tests.cs @@ -0,0 +1,79 @@ +using System; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Authorization.Permissions; +using Xunit; + +namespace Volo.Abp.PermissionManagement +{ + public class PermissionManagementProvider_Tests : PermissionTestBase + { + private readonly IPermissionManagementProvider _permissionManagementProvider; + private readonly IPermissionGrantRepository _permissionGrantRepository; + + + public PermissionManagementProvider_Tests() + { + _permissionManagementProvider = GetRequiredService(); + _permissionGrantRepository = GetRequiredService(); + } + + + [Fact] + public async Task CheckAsync() + { + _permissionGrantRepository.Insert( + new PermissionGrant( + Guid.NewGuid(), + "MyPermission1", + "Test", + "Test" + ) + ); + + var permissionValueProviderGrantInfo = await _permissionManagementProvider.CheckAsync("MyPermission1", + "Test", + "Test"); + + permissionValueProviderGrantInfo.IsGranted.ShouldBeTrue(); + permissionValueProviderGrantInfo.ProviderKey.ShouldBe("Test"); + } + + [Fact] + public async Task Check_Should_Return_NonGranted_When_ProviderName_NotEquals_Name() + { + var permissionValueProviderGrantInfo = await _permissionManagementProvider.CheckAsync("MyPermission1", + "TestNotExist", + "Test"); + + permissionValueProviderGrantInfo.IsGranted.ShouldBeFalse(); + permissionValueProviderGrantInfo.ProviderKey.ShouldBeNull(); + } + + + [Fact] + public async Task SetAsync() + { + _permissionGrantRepository.Insert( + new PermissionGrant( + Guid.NewGuid(), + "MyPermission1", + "Test", + "Test" + ) + ); + (await _permissionGrantRepository.FindAsync("MyPermission1", + "Test", + "Test")).ShouldNotBeNull(); + + await _permissionManagementProvider.SetAsync("MyPermission1", + "Test", + false); + + (await _permissionGrantRepository.FindAsync("MyPermission1", + "Test", + "Test")).ShouldBeNull(); + } + + } +} diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs new file mode 100644 index 0000000000..b5fe647c89 --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Authorization.Permissions; +using Xunit; + +namespace Volo.Abp.PermissionManagement +{ + public class PermissionManager_Tests : PermissionTestBase + { + private readonly IPermissionManager _permissionManager; + private readonly IPermissionGrantRepository _permissionGrantRepository; + + public PermissionManager_Tests() + { + _permissionManager = GetRequiredService(); + _permissionGrantRepository = GetRequiredService(); + } + + [Fact] + public async Task GetAsync() + { + await _permissionGrantRepository.InsertAsync(new PermissionGrant( + Guid.NewGuid(), + "MyPermission1", + "Test", + "Test") + ); + + var grantedProviders = await _permissionManager.GetAsync("MyPermission1", + "Test", + "Test"); + + grantedProviders.ShouldNotBeNull(); + grantedProviders.IsGranted.ShouldBeTrue(); + grantedProviders.Name.ShouldBe("MyPermission1"); + grantedProviders.Providers.ShouldContain(x => x.Key == "Test"); + } + + [Fact] + public async Task Get_Should_Exception_When_Permission_Undefined() + { + await Assert.ThrowsAsync(async () => await _permissionManager.GetAsync( + "MyPermission1NotExist", + "Test", + "Test")); + } + + [Fact] + public async Task GetAllAsync() + { + await _permissionGrantRepository.InsertAsync(new PermissionGrant( + Guid.NewGuid(), + "MyPermission1", + "Test", + "Test") + ); + + await _permissionGrantRepository.InsertAsync(new PermissionGrant( + Guid.NewGuid(), + "MyPermission2", + "Test", + "Test") + ); + + var permissionWithGrantedProviders = await _permissionManager.GetAllAsync( + "Test", + "Test"); + + permissionWithGrantedProviders.ShouldNotBeNull(); + permissionWithGrantedProviders.ShouldContain(x => + x.IsGranted && x.Name == "MyPermission1" && x.Providers.Any(p => p.Key == "Test")); + permissionWithGrantedProviders.ShouldContain(x => + x.IsGranted && x.Name == "MyPermission2" && x.Providers.Any(p => p.Key == "Test")); + } + + [Fact] + public async Task SetAsync() + { + (await _permissionGrantRepository.FindAsync("MyPermission2", + "Test", + "Test")).ShouldBeNull(); + + await _permissionManager.SetAsync( + "MyPermission2", + "Test", + "Test", true); + + (await _permissionGrantRepository.FindAsync("MyPermission2", + "Test", + "Test")).ShouldNotBeNull(); + } + + [Fact] + public async Task Set_Should_Exception_When_Permission_Undefined() + { + await Assert.ThrowsAsync(async () => await _permissionManager.SetAsync( + "MyPermission1NotExist", + "Test", + "Test", + true)); + } + + } +} diff --git a/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionStore_Tests.cs b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionStore_Tests.cs new file mode 100644 index 0000000000..965899ede9 --- /dev/null +++ b/modules/permission-management/test/Volo.Abp.PermissionManagement.Tests/Volo/Abp/PermissionManagement/PermissionStore_Tests.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.Authorization.Permissions; +using Xunit; + +namespace Volo.Abp.PermissionManagement +{ + public class PermissionStore_Tests : PermissionTestBase + { + private readonly IPermissionStore _permissionStore; + + public PermissionStore_Tests() + { + _permissionStore = GetRequiredService(); + } + + [Fact] + public async Task IsGrantedAsync() + { + (await _permissionStore.IsGrantedAsync("MyPermission1", + UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString())).ShouldBeTrue(); + + + (await _permissionStore.IsGrantedAsync("MyPermission1NotExist", + UserPermissionValueProvider.ProviderName, + PermissionTestDataBuilder.User1Id.ToString())).ShouldBeFalse(); + + } + } +} diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/ITenantAppService.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/ITenantAppService.cs index 3f6df9b6fe..637134abb3 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/ITenantAppService.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/ITenantAppService.cs @@ -1,10 +1,16 @@ using System; +using System.Threading.Tasks; using Volo.Abp.Application.Services; namespace Volo.Abp.TenantManagement { public interface ITenantAppService : IAsyncCrudAppService { - //TODO: Manage connection strings + Task GetDefaultConnectionStringAsync(Guid id); + + Task UpdateDefaultConnectionStringAsync(Guid id, string defaultConnectionString); + + Task DeleteDefaultConnectionStringAsync(Guid id); + } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs index c8b7c93311..fa1571a617 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs @@ -79,5 +79,25 @@ namespace Volo.Abp.TenantManagement await TenantRepository.DeleteAsync(tenant); } + + public async Task GetDefaultConnectionStringAsync(Guid id) + { + var tenant = await TenantRepository.GetAsync(id); + return tenant?.FindDefaultConnectionString(); + } + + public async Task UpdateDefaultConnectionStringAsync(Guid id, string defaultConnectionString) + { + var tenant = await TenantRepository.GetAsync(id); + tenant.SetDefaultConnectionString(defaultConnectionString); + await TenantRepository.UpdateAsync(tenant); + } + + public async Task DeleteDefaultConnectionStringAsync(Guid id) + { + var tenant = await TenantRepository.GetAsync(id); + tenant.RemoveDefaultConnectionString(); + await TenantRepository.UpdateAsync(tenant); + } } } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/Tenant.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/Tenant.cs index 74b9a7ebc0..2184368784 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/Tenant.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/Tenant.cs @@ -38,6 +38,40 @@ namespace Volo.Abp.TenantManagement return ConnectionStrings.FirstOrDefault(c => c.Name == name)?.Value; } + public virtual void SetDefaultConnectionString(string connectionString) + { + SetConnectionString(Data.ConnectionStrings.DefaultConnectionStringName, connectionString); + } + + public virtual void SetConnectionString(string name, string connectionString) + { + var tenantConnectionString = ConnectionStrings.FirstOrDefault(x => x.Name == name); + + if (tenantConnectionString != null) + { + tenantConnectionString.SetValue(connectionString); + } + else + { + ConnectionStrings.Add(new TenantConnectionString(Id, name, connectionString)); + } + } + + public virtual void RemoveDefaultConnectionString() + { + RemoveConnectionString(Data.ConnectionStrings.DefaultConnectionStringName); + } + + public virtual void RemoveConnectionString(string name) + { + var tenantConnectionString = ConnectionStrings.FirstOrDefault(x => x.Name == name); + + if (tenantConnectionString != null) + { + ConnectionStrings.Remove(tenantConnectionString); + } + } + internal void SetName([NotNull] string name) { Name = Check.NotNullOrWhiteSpace(name, nameof(name), TenantConsts.MaxNameLength); diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo/Abp/TenantManagement/TenantController.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo/Abp/TenantManagement/TenantController.cs index 8d6b894fba..e8df39d2fa 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo/Abp/TenantManagement/TenantController.cs +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.HttpApi/Volo/Abp/TenantManagement/TenantController.cs @@ -42,5 +42,20 @@ namespace Volo.Abp.TenantManagement { return _service.DeleteAsync(id); } + + public Task GetDefaultConnectionStringAsync(Guid id) + { + return _service.GetDefaultConnectionStringAsync(id); + } + + public Task UpdateDefaultConnectionStringAsync(Guid id, string defaultConnectionString) + { + return _service.UpdateDefaultConnectionStringAsync(id, defaultConnectionString); + } + + public Task DeleteDefaultConnectionStringAsync(Guid id) + { + return _service.DeleteDefaultConnectionStringAsync(id); + } } } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/en.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/en.json index c223908ffa..f38deeea89 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/en.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/en.json @@ -6,6 +6,9 @@ "NewTenant": "New tenant", "TenantName": "Tenant name", "DisplayName:TenantName": "Tenant name", - "TenantDeletionConfirmationMessage": "Tenant '{0}' will be deleted. Do you confirm that?" + "TenantDeletionConfirmationMessage": "Tenant '{0}' will be deleted. Do you confirm that?", + "ConnectionStrings": "Connection Strings", + "DisplayName:DefaultConnectionString": "Default Connection String", + "DisplayName:UseSharedDatabase": "Use the Shared Database" } } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/pt-BR.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/pt-BR.json index 44ea338604..5f310218a6 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/pt-BR.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/pt-BR.json @@ -6,6 +6,9 @@ "NewTenant": "Novo Inquilino", "TenantName": "Inquilino", "DisplayName:TenantName": "Inquilino", - "TenantDeletionConfirmationMessage": "Inquilino '{0}' será excluído. Tem certeza?" + "TenantDeletionConfirmationMessage": "Inquilino '{0}' será excluído. Tem certeza?", + "ConnectionStrings": "Cordas de Conexão", + "DisplayName:DefaultConnectionString": "String de Conexão Padrão", + "DisplayName:UseSharedDatabase": "Use o banco de dados compartilhado" } } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/tr.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/tr.json index 5656ad0c03..a3d40067f7 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/tr.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/tr.json @@ -6,6 +6,9 @@ "NewTenant": "Yeni müşteri", "TenantName": "Müşteri adı", "DisplayName:TenantName": "Müşteri adı", - "TenantDeletionConfirmationMessage": "'{0}' isimli müşteri silinecektir. Onaylıyor musunuz?" + "TenantDeletionConfirmationMessage": "'{0}' isimli müşteri silinecektir. Onaylıyor musunuz?", + "ConnectionStrings": "Bağlantı cümlesi", + "DisplayName:DefaultConnectionString": "Varsayılan bağlantı cümlesi", + "DisplayName:UseSharedDatabase": "Paylaşılan veritabanını kullan" } } \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/zh-Hans.json b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/zh-Hans.json index d47cdf0233..da5951a7f4 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/zh-Hans.json +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Localization/Resources/AbpTenantManagement/Web/zh-Hans.json @@ -1,11 +1,14 @@ { - "culture": "zh-Hans", - "texts": { - "Menu:TenantManagement": "租户管理", - "Tenants": "租户", - "NewTenant": "新租户", - "TenantName": "租户名称", - "DisplayName:TenantName": "租户名称", - "TenantDeletionConfirmationMessage": "租户 '{0}' 将被删除. 你确定吗?" - } - } \ No newline at end of file + "culture": "zh-Hans", + "texts": { + "Menu:TenantManagement": "租户管理", + "Tenants": "租户", + "NewTenant": "新租户", + "TenantName": "租户名称", + "DisplayName:TenantName": "租户名称", + "TenantDeletionConfirmationMessage": "租户 '{0}' 将被删除. 你确定吗?", + "ConnectionStrings": "连接字符串", + "DisplayName:DefaultConnectionString": "默认连接字符串", + "DisplayName:UseSharedDatabase": "使用共享数据库" + } +} \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml new file mode 100644 index 0000000000..6b6e33ed55 --- /dev/null +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml @@ -0,0 +1,26 @@ +@page +@using Microsoft.Extensions.Localization +@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal +@using Volo.Abp.TenantManagement.Localization +@using Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants +@model ConnectionStringsModal +@inject IStringLocalizer L +@{ + Layout = null; +} +
+ + + + + + + +
+ +
+ +
+ +
+
\ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml.cs b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml.cs new file mode 100644 index 0000000000..a2beeda27d --- /dev/null +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml.cs @@ -0,0 +1,59 @@ +using System; +using System.ComponentModel.DataAnnotations; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; + +namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants +{ + public class ConnectionStringsModal : AbpPageModel + { + [BindProperty] + public TenantInfoModel Tenant { get; set; } + + private readonly ITenantAppService _tenantAppService; + + public ConnectionStringsModal(ITenantAppService tenantAppService) + { + _tenantAppService = tenantAppService; + } + + public async Task OnGetAsync(Guid id) + { + var defaultConnectionString = await _tenantAppService.GetDefaultConnectionStringAsync(id); + Tenant = new TenantInfoModel + { + Id = id, + DefaultConnectionString = defaultConnectionString, + UseSharedDatabase = defaultConnectionString.IsNullOrWhiteSpace() + }; + } + + public async Task OnPostAsync() + { + ValidateModel(); + + if (Tenant.UseSharedDatabase || Tenant.DefaultConnectionString.IsNullOrWhiteSpace()) + { + await _tenantAppService.DeleteDefaultConnectionStringAsync(Tenant.Id); + } + else + { + await _tenantAppService.UpdateDefaultConnectionStringAsync(Tenant.Id, Tenant.DefaultConnectionString); + } + + return NoContent(); + } + + public class TenantInfoModel + { + [HiddenInput] + public Guid Id { get; set; } + + public bool UseSharedDatabase { get; set; } + + [StringLength(TenantConnectionStringConsts.MaxNameLength)] + public string DefaultConnectionString { get; set; } + } + } +} diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.js b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.js new file mode 100644 index 0000000000..b72d2b3505 --- /dev/null +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.js @@ -0,0 +1,20 @@ +(function ($) { + + abp.modals.TenantConnectionStringManagement = function() { + + var initModal = function (publicApi, args) { + publicApi.getModal() + .find('input[name="Tenant.UseSharedDatabase"]') + .change(function () { + var $this = $(this); + $("#Tenant_DefaultConnectionString_Wrap").toggleClass("d-none"); + $this.val($this.prop("checked")); + }); + }; + + return { + initModal: initModal + }; + }; + +})(jQuery); \ No newline at end of file diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml index 95cd3d8331..b5db7642ba 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.cshtml @@ -14,8 +14,9 @@ } @section scripts { - + + } diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/wwwroot/modules/multi-tenancy/views/tenants/index.js b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js similarity index 81% rename from modules/tenant-management/src/Volo.Abp.TenantManagement.Web/wwwroot/modules/multi-tenancy/views/tenants/index.js rename to modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js index 344cc1963d..09a9cc90c5 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/wwwroot/modules/multi-tenancy/views/tenants/index.js +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/Index.js @@ -1,4 +1,4 @@ -(function () { +(function () { var l = abp.localization.getResource('AbpTenantManagement'); var _tenantAppService = volo.abp.tenantManagement.tenant; @@ -6,6 +6,10 @@ var _editModal = new abp.ModalManager(abp.appPath + 'TenantManagement/Tenants/EditModal'); var _createModal = new abp.ModalManager(abp.appPath + 'TenantManagement/Tenants/CreateModal'); var _featuresModal = new abp.ModalManager(abp.appPath + 'FeatureManagement/FeatureManagementModal'); + var _connectionStringsModal = new abp.ModalManager({ + viewUrl: abp.appPath + 'TenantManagement/Tenants/ConnectionStringsModal', + modalClass: 'TenantConnectionStringManagement' + }); $(function () { @@ -28,6 +32,17 @@ }); } }, + { + text: l('ConnectionStrings'), + visible: function () { + return true; //TODO: Check permission + }, + action: function (data) { + _connectionStringsModal.open({ + id: data.record.id + }); + } + }, { text: l('Features'), visible: function () { diff --git a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj index c542768e8c..f644ff2f7b 100644 --- a/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj +++ b/modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Volo.Abp.TenantManagement.Web.csproj @@ -12,14 +12,14 @@ - - + - + + diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index 3d8ac6e8b1..e83acaa57c 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -25,8 +25,10 @@ $solutions = ( $projects = ( # framework + "framework/src/Volo.Abp", "framework/src/Volo.Abp.ApiVersioning.Abstractions", "framework/src/Volo.Abp.AspNetCore", + "framework/src/Volo.Abp.AspNetCore.Authentication.JwtBearer", "framework/src/Volo.Abp.AspNetCore.Authentication.OAuth", "framework/src/Volo.Abp.AspNetCore.MultiTenancy", "framework/src/Volo.Abp.AspNetCore.Mvc", @@ -51,6 +53,7 @@ $projects = ( "framework/src/Volo.Abp.BackgroundWorkers", "framework/src/Volo.Abp.Caching", "framework/src/Volo.Abp.Castle.Core", + "framework/src/Volo.Abp.Cli", "framework/src/Volo.Abp.Core", "framework/src/Volo.Abp.Data", "framework/src/Volo.Abp.Ddd.Application", diff --git a/samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication/AppModule.cs b/samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication/AppModule.cs index dd29111a5d..9343740fc5 100644 --- a/samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication/AppModule.cs +++ b/samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication/AppModule.cs @@ -2,7 +2,6 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Volo.Abp; -using Volo.Abp.AspNetCore.Modularity; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.Autofac; using Volo.Abp.Modularity; diff --git a/samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication/BasicAspNetCoreApplication.csproj b/samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication/BasicAspNetCoreApplication.csproj index 8aeb4809a2..07a1ba541a 100644 --- a/samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication/BasicAspNetCoreApplication.csproj +++ b/samples/BasicAspNetCoreApplication/BasicAspNetCoreApplication/BasicAspNetCoreApplication.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/samples/BasicConsoleApplication/AbpConsoleDemo/AbpConsoleDemo.csproj b/samples/BasicConsoleApplication/AbpConsoleDemo/AbpConsoleDemo.csproj index b2557ef085..ca84a4353b 100644 --- a/samples/BasicConsoleApplication/AbpConsoleDemo/AbpConsoleDemo.csproj +++ b/samples/BasicConsoleApplication/AbpConsoleDemo/AbpConsoleDemo.csproj @@ -6,7 +6,7 @@ - + diff --git a/samples/BookStore/.gitattributes b/samples/BookStore/.gitattributes new file mode 100644 index 0000000000..c941e52669 --- /dev/null +++ b/samples/BookStore/.gitattributes @@ -0,0 +1 @@ +**/wwwroot/libs/** linguist-vendored diff --git a/samples/BookStore/.gitignore b/samples/BookStore/.gitignore new file mode 100644 index 0000000000..78d93c60d8 --- /dev/null +++ b/samples/BookStore/.gitignore @@ -0,0 +1,255 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# BookStore +src/Acme.BookStore.Web/Logs/logs.txt diff --git a/samples/BookStore/Acme.BookStore.sln b/samples/BookStore/Acme.BookStore.sln index b0a02d2dde..74836646a2 100644 --- a/samples/BookStore/Acme.BookStore.sln +++ b/samples/BookStore/Acme.BookStore.sln @@ -19,7 +19,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Application. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Acme.BookStore.Web.Tests", "test\Acme.BookStore.Web.Tests\Acme.BookStore.Web.Tests.csproj", "{5F1B28C6-8D0C-4155-92D0-252F7EA5F674}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Acme.BookStore.ConsoleApiClient", "test\Acme.BookStore.ConsoleApiClient\Acme.BookStore.ConsoleApiClient.csproj", "{3DED9AA7-1FC4-435D-9934-BCD37B43F744}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Acme.BookStore.EntityFrameworkCore.DbMigrations", "src\Acme.BookStore.EntityFrameworkCore.DbMigrations\Acme.BookStore.EntityFrameworkCore.DbMigrations.csproj", "{0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -51,10 +51,10 @@ Global {5F1B28C6-8D0C-4155-92D0-252F7EA5F674}.Debug|Any CPU.Build.0 = Debug|Any CPU {5F1B28C6-8D0C-4155-92D0-252F7EA5F674}.Release|Any CPU.ActiveCfg = Release|Any CPU {5F1B28C6-8D0C-4155-92D0-252F7EA5F674}.Release|Any CPU.Build.0 = Release|Any CPU - {3DED9AA7-1FC4-435D-9934-BCD37B43F744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3DED9AA7-1FC4-435D-9934-BCD37B43F744}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DED9AA7-1FC4-435D-9934-BCD37B43F744}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3DED9AA7-1FC4-435D-9934-BCD37B43F744}.Release|Any CPU.Build.0 = Release|Any CPU + {0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -66,7 +66,7 @@ Global {068855E8-9240-4F1A-910B-CF825794513B} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} {50B2631D-129C-47B3-A587-029CCD6099BC} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} {5F1B28C6-8D0C-4155-92D0-252F7EA5F674} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} - {3DED9AA7-1FC4-435D-9934-BCD37B43F744} = {04DBDB01-70F4-4E06-B468-8F87850B22BE} + {0372FA84-C517-4EB3-9A9F-B9ACAC0CA5E0} = {CA9AC87F-097E-4F15-8393-4BC07735A5B0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {28315BFD-90E7-4E14-A2EA-F3D23AF4126F} diff --git a/samples/BookStore/Acme.BookStore.sln.DotSettings b/samples/BookStore/Acme.BookStore.sln.DotSettings new file mode 100644 index 0000000000..b89df7b544 --- /dev/null +++ b/samples/BookStore/Acme.BookStore.sln.DotSettings @@ -0,0 +1,7 @@ + + True + D:\github\abp\common.DotSettings + ..\..\..\common.DotSettings + True + 1 + \ No newline at end of file diff --git a/samples/BookStore/common.props b/samples/BookStore/common.props new file mode 100644 index 0000000000..771bc6bd29 --- /dev/null +++ b/samples/BookStore/common.props @@ -0,0 +1,7 @@ + + + latest + 0.16.0 + $(NoWarn);CS1591 + + \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj b/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj index c4c7a91bd8..9926530966 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj +++ b/samples/BookStore/src/Acme.BookStore.Application/Acme.BookStore.Application.csproj @@ -1,5 +1,7 @@  + + netcoreapp2.2 Acme.BookStore @@ -7,8 +9,10 @@ - - + + + + diff --git a/samples/BookStore/src/Acme.BookStore.Application/BookAppService.cs b/samples/BookStore/src/Acme.BookStore.Application/BookAppService.cs index 9534ab7f12..1d5e844f30 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/BookAppService.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/BookAppService.cs @@ -1,5 +1,4 @@ using System; -using System.Threading.Tasks; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; @@ -16,19 +15,5 @@ namespace Acme.BookStore { } - - public override async Task UpdateAsync(Guid id, CreateUpdateBookDto input) - { - await CheckUpdatePolicyAsync(); - - var entity = await GetEntityByIdAsync(id); - - //TODO: Check if input has id different than given id and normalize if it's default value, throw ex otherwise - - MapToEntity(input, entity); - await CurrentUnitOfWork.SaveChangesAsync(); - - return MapToEntityDto(entity); - } } } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs index 55b344b1ea..4203ef0ccd 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/BookStoreApplicationModule.cs @@ -1,16 +1,19 @@ -using Acme.BookStore.Permissions; -using Volo.Abp.Authorization.Permissions; -using Volo.Abp.AutoMapper; +using Volo.Abp.AutoMapper; +using Volo.Abp.FeatureManagement; using Volo.Abp.Identity; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement; +using Volo.Abp.TenantManagement; namespace Acme.BookStore { [DependsOn( typeof(BookStoreDomainModule), typeof(AbpIdentityApplicationModule), - typeof(AbpPermissionManagementApplicationModule))] + typeof(AbpPermissionManagementApplicationModule), + typeof(AbpTenantManagementApplicationModule), + typeof(AbpFeatureManagementApplicationModule) + )] public class BookStoreApplicationModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) diff --git a/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissions.cs b/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissions.cs index b05c4883bd..b1ec575904 100644 --- a/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissions.cs +++ b/samples/BookStore/src/Acme.BookStore.Application/Permissions/BookStorePermissions.cs @@ -1,4 +1,6 @@ -namespace Acme.BookStore.Permissions +using System; + +namespace Acme.BookStore.Permissions { public static class BookStorePermissions { @@ -6,5 +8,11 @@ //Add your own permission names. Example: //public const string MyPermission1 = GroupName + ".MyPermission1"; + + public static string[] GetAll() + { + //Return an array of all permissions + return Array.Empty(); + } } } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj b/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj index 02e24618ee..c358910b01 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj +++ b/samples/BookStore/src/Acme.BookStore.Domain/Acme.BookStore.Domain.csproj @@ -1,18 +1,25 @@  + + netcoreapp2.2 Acme.BookStore - - + + + + + + + - + diff --git a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreConsts.cs b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreConsts.cs new file mode 100644 index 0000000000..5c8cab1e72 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreConsts.cs @@ -0,0 +1,11 @@ +namespace Acme.BookStore +{ + public static class BookStoreConsts + { + public const string DbTablePrefix = "App"; + + public const string DbSchema = null; + + public const bool IsMultiTenancyEnabled = true; + } +} diff --git a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs index abd062308b..7575b109e2 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Domain/BookStoreDomainModule.cs @@ -1,26 +1,35 @@ -using Microsoft.Extensions.DependencyInjection; -using Acme.BookStore.Localization.BookStore; -using Acme.BookStore.Settings; +using Acme.BookStore.Localization.BookStore; +using Volo.Abp.Auditing; +using Volo.Abp.AuditLogging; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.FeatureManagement; using Volo.Abp.Identity; using Volo.Abp.Localization; using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; +using Volo.Abp.MultiTenancy; using Volo.Abp.PermissionManagement.Identity; -using Volo.Abp.Settings; +using Volo.Abp.TenantManagement; using Volo.Abp.VirtualFileSystem; namespace Acme.BookStore { [DependsOn( typeof(AbpIdentityDomainModule), - typeof(AbpPermissionManagementDomainIdentityModule))] + typeof(AbpPermissionManagementDomainIdentityModule), + typeof(AbpAuditingModule), + typeof(BackgroundJobsDomainModule), + typeof(AbpAuditLoggingDomainModule), + typeof(AbpTenantManagementDomainModule), + typeof(AbpFeatureManagementDomainModule) + )] public class BookStoreDomainModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { Configure(options => { - options.FileSets.AddEmbedded(); + options.FileSets.AddEmbedded("Acme.BookStore"); }); Configure(options => @@ -30,6 +39,11 @@ namespace Acme.BookStore .AddBaseTypes(typeof(AbpValidationResource)) .AddVirtualJson("/Localization/BookStore"); }); + + Configure(options => + { + options.IsEnabled = BookStoreConsts.IsMultiTenancyEnabled; + }); } } } diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/BookStoreResource.cs b/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/BookStoreResource.cs index 61a4d30826..068968babf 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/BookStoreResource.cs +++ b/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/BookStoreResource.cs @@ -7,4 +7,4 @@ namespace Acme.BookStore.Localization.BookStore { } -} +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/pt-BR.json b/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/pt-BR.json new file mode 100644 index 0000000000..8c818a07af --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/pt-BR.json @@ -0,0 +1,8 @@ +{ + "culture": "pt-BR", + "texts": { + "Menu:Home": "Principal", + "Welcome": "Seja bem-vindo!", + "LongWelcomeMessage": "Bem-vindo a esta aplicação. Este é um projeto inicial baseado no ABP framework. Para mais informações, visite abp.io." + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/zh-Hans.json b/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/zh-Hans.json index 209368696a..be57798695 100644 --- a/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/zh-Hans.json +++ b/samples/BookStore/src/Acme.BookStore.Domain/Localization/BookStore/zh-Hans.json @@ -1,20 +1,20 @@ { "culture": "zh-Hans", - "texts": { - "Menu:Home": "首页", - "Welcome": "欢迎", - "LongWelcomeMessage": "欢迎来到该应用程序. 这是一个基于ABP框架的启动项目. 有关更多信息, 请访问 cn.abp.io.", - "Menu:BookStore": "图书商店", - "Menu:Books": "图书", - "Name": "名称", - "Type": "类型", - "PublishDate": "出版时间", - "Price": "价格", - "CreationTime": "添加时间", - "NewBook": "新书籍", - "Books": "图书", - "Update": "更新", - "BookDeletionConfirmationMessage": "你确定删除书箱: {0} 吗", - "SuccessfullyDeleted": "删除成功." - } + "texts": { + "Menu:Home": "首页", + "Welcome": "欢迎", + "LongWelcomeMessage": "欢迎来到该应用程序. 这是一个基于ABP框架的启动项目. 有关更多信息, 请访问 cn.abp.io.", + "Menu:BookStore": "图书商店", + "Menu:Books": "图书", + "Name": "名称", + "Type": "类型", + "PublishDate": "出版时间", + "Price": "价格", + "CreationTime": "添加时间", + "NewBook": "新书籍", + "Books": "图书", + "Update": "更新", + "BookDeletionConfirmationMessage": "你确定删除书箱: {0} 吗", + "SuccessfullyDeleted": "删除成功." + } } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Domain/Users/AppUser.cs b/samples/BookStore/src/Acme.BookStore.Domain/Users/AppUser.cs new file mode 100644 index 0000000000..c4ccf28076 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Domain/Users/AppUser.cs @@ -0,0 +1,53 @@ +using System; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.Users; + +namespace Acme.BookStore.Users +{ + /* This entity shares the same table/collection ("AbpUsers" by default) with the + * IdentityUser entity of the Identity module. + * + * - You can define your custom properties into this class. + * - You never create or delete this entity, becase it is Identity module's job. + * - You can query users from database with this entity. + * - You can update values of your custom properties. + */ + public class AppUser : FullAuditedAggregateRoot, IUser + { + #region Base properties + + /* These properties are shared with the IdentityUser entity of the Identity module. + * Do not change these properties through this class. Instead, use Identity module + * services (like IdentityUserManager) to change them. + * So, this properties are designed as read only! + */ + + public virtual Guid? TenantId { get; private set; } + + public virtual string UserName { get; private set; } + + public virtual string Name { get; private set; } + + public virtual string Surname { get; private set; } + + public virtual string Email { get; private set; } + + public virtual bool EmailConfirmed { get; private set; } + + public virtual string PhoneNumber { get; private set; } + + public virtual bool PhoneNumberConfirmed { get; private set; } + + #endregion + + /* Add your own properties here. Example: + * + * public virtual string MyProperty { get; set; } + */ + + private AppUser() + { + + } + } +} diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Acme.BookStore.EntityFrameworkCore.DbMigrations.csproj b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Acme.BookStore.EntityFrameworkCore.DbMigrations.csproj new file mode 100644 index 0000000000..da6638173c --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Acme.BookStore.EntityFrameworkCore.DbMigrations.csproj @@ -0,0 +1,18 @@ + + + + + + netcoreapp2.2 + Acme.BookStore + + + + + + + + + + + diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContext.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContext.cs new file mode 100644 index 0000000000..a43cc52fb6 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContext.cs @@ -0,0 +1,46 @@ +using Microsoft.EntityFrameworkCore; +using Volo.Abp.AuditLogging.EntityFrameworkCore; +using Volo.Abp.BackgroundJobs.EntityFrameworkCore; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Identity; +using Volo.Abp.Identity.EntityFrameworkCore; +using Volo.Abp.PermissionManagement.EntityFrameworkCore; +using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.TenantManagement.EntityFrameworkCore; + +namespace Acme.BookStore.EntityFrameworkCore +{ + public class BookStoreMigrationsDbContext : AbpDbContext + { + public BookStoreMigrationsDbContext(DbContextOptions options) + : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + /* Include modules to your migration db context */ + + builder.ConfigurePermissionManagement(); + builder.ConfigureSettingManagement(); + builder.ConfigureBackgroundJobs(); + builder.ConfigureAuditLogging(); + builder.ConfigureIdentity(); + builder.ConfigureTenantManagement(); + + /* Configure customizations for entities from the modules included */ + + builder.Entity(b => + { + b.ConfigureCustomUserProperties(); + }); + + /* Configure your own tables/entities inside the ConfigureBookStore method */ + + builder.ConfigureBookStore(); + } + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextFactory.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContextFactory.cs similarity index 59% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextFactory.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContextFactory.cs index 43056714e8..bc1006d729 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextFactory.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/BookStoreMigrationsDbContextFactory.cs @@ -5,22 +5,22 @@ using Microsoft.Extensions.Configuration; namespace Acme.BookStore.EntityFrameworkCore { - public class BookStoreDbContextFactory : IDesignTimeDbContextFactory + public class BookStoreMigrationsDbContextFactory : IDesignTimeDbContextFactory { - public BookStoreDbContext CreateDbContext(string[] args) + public BookStoreMigrationsDbContext CreateDbContext(string[] args) { var configuration = BuildConfiguration(); - var builder = new DbContextOptionsBuilder() + var builder = new DbContextOptionsBuilder() .UseSqlServer(configuration.GetConnectionString("Default")); - return new BookStoreDbContext(builder.Options); + return new BookStoreMigrationsDbContext(builder.Options); } private static IConfigurationRoot BuildConfiguration() { var builder = new ConfigurationBuilder() - .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../Acme.BookStore.Web/")) + .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false); return builder.Build(); diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20190111135616_ABP_v0_11_Upgrade.Designer.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.Designer.cs similarity index 57% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20190111135616_ABP_v0_11_Upgrade.Designer.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.Designer.cs index 457e197cdc..37937a0bb6 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20190111135616_ABP_v0_11_Upgrade.Designer.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.Designer.cs @@ -1,17 +1,17 @@ // using System; -using Acme.BookStore.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Metadata; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Acme.BookStore.EntityFrameworkCore; namespace Acme.BookStore.Migrations { - [DbContext(typeof(BookStoreDbContext))] - [Migration("20190111135616_ABP_v0_11_Upgrade")] - partial class ABP_v0_11_Upgrade + [DbContext(typeof(BookStoreMigrationsDbContext))] + [Migration("20190402131334_Initial")] + partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -21,43 +21,248 @@ namespace Acme.BookStore.Migrations .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - modelBuilder.Entity("Acme.BookStore.Book", b => + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => { b.Property("Id") .ValueGeneratedOnAdd(); - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp"); + b.Property("ApplicationName") + .HasColumnName("ApplicationName") + .HasMaxLength(96); + + b.Property("BrowserInfo") + .HasColumnName("BrowserInfo") + .HasMaxLength(512); + + b.Property("ClientId") + .HasColumnName("ClientId") + .HasMaxLength(64); + + b.Property("ClientIpAddress") + .HasColumnName("ClientIpAddress") + .HasMaxLength(64); + + b.Property("ClientName") + .HasColumnName("ClientName") + .HasMaxLength(128); + + b.Property("Comments") + .HasColumnName("Comments") + .HasMaxLength(256); + + b.Property("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnName("CorrelationId") + .HasMaxLength(64); + + b.Property("Exceptions") + .HasColumnName("Exceptions") + .HasMaxLength(4000); + + b.Property("ExecutionDuration") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasColumnName("HttpMethod") + .HasMaxLength(16); + + b.Property("HttpStatusCode") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorUserId") + .HasColumnName("ImpersonatorUserId"); + + b.Property("TenantId") + .HasColumnName("TenantId"); + + b.Property("TenantName"); + + b.Property("Url") + .HasColumnName("Url") + .HasMaxLength(256); + + b.Property("UserId") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasColumnName("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuditLogId") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasColumnName("MethodName") + .HasMaxLength(128); + + b.Property("Parameters") + .HasColumnName("Parameters") + .HasMaxLength(2000); + + b.Property("ServiceName") + .HasColumnName("ServiceName") + .HasMaxLength(256); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuditLogId") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .IsRequired() + .HasColumnName("EntityId") + .HasMaxLength(128); + + b.Property("EntityTenantId"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasColumnName("EntityTypeFullName") + .HasMaxLength(128); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("EntityChangeId"); + + b.Property("NewValue") + .HasColumnName("NewValue") + .HasMaxLength(512); + + b.Property("OriginalValue") + .HasColumnName("OriginalValue") + .HasMaxLength(512); + + b.Property("PropertyName") + .IsRequired() + .HasColumnName("PropertyName") + .HasMaxLength(128); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp"); b.Property("CreationTime") .HasColumnName("CreationTime"); - b.Property("CreatorId") - .HasColumnName("CreatorId"); - b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime"); + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasDefaultValue(false); - b.Property("LastModifierId") - .HasColumnName("LastModifierId"); + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576); - b.Property("Name") + b.Property("JobName") .IsRequired() .HasMaxLength(128); - b.Property("Price"); + b.Property("LastTryTime"); - b.Property("PublishDate"); + b.Property("NextTryTime"); - b.Property("Type"); + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasDefaultValue((short)0); b.HasKey("Id"); - b.ToTable("Books"); + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs"); }); modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => @@ -410,6 +615,93 @@ namespace Acme.BookStore.Migrations b.ToTable("AbpSettings"); }); + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpTenants"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId"); + + b.Property("Name") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog") + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog") + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange") + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => { b.HasOne("Volo.Abp.Identity.IdentityRole") @@ -454,6 +746,14 @@ namespace Acme.BookStore.Migrations .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant") + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade); + }); #pragma warning restore 612, 618 } } diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.cs similarity index 53% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.cs index 237dc43192..fb85c4cc6d 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190402131334_Initial.cs @@ -7,11 +7,66 @@ namespace Acme.BookStore.Migrations { protected override void Up(MigrationBuilder migrationBuilder) { + migrationBuilder.CreateTable( + name: "AbpAuditLogs", + columns: table => new + { + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(nullable: true), + ApplicationName = table.Column(maxLength: 96, nullable: true), + UserId = table.Column(nullable: true), + UserName = table.Column(maxLength: 256, nullable: true), + TenantId = table.Column(nullable: true), + TenantName = table.Column(nullable: true), + ImpersonatorUserId = table.Column(nullable: true), + ImpersonatorTenantId = table.Column(nullable: true), + ExecutionTime = table.Column(nullable: false), + ExecutionDuration = table.Column(nullable: false), + ClientIpAddress = table.Column(maxLength: 64, nullable: true), + ClientName = table.Column(maxLength: 128, nullable: true), + ClientId = table.Column(maxLength: 64, nullable: true), + CorrelationId = table.Column(maxLength: 64, nullable: true), + BrowserInfo = table.Column(maxLength: 512, nullable: true), + HttpMethod = table.Column(maxLength: 16, nullable: true), + Url = table.Column(maxLength: 256, nullable: true), + Exceptions = table.Column(maxLength: 4000, nullable: true), + Comments = table.Column(maxLength: 256, nullable: true), + HttpStatusCode = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogs", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "AbpBackgroundJobs", + columns: table => new + { + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(nullable: true), + JobName = table.Column(maxLength: 128, nullable: false), + JobArgs = table.Column(maxLength: 1048576, nullable: false), + TryCount = table.Column(nullable: false, defaultValue: (short)0), + CreationTime = table.Column(nullable: false), + NextTryTime = table.Column(nullable: false), + LastTryTime = table.Column(nullable: true), + IsAbandoned = table.Column(nullable: false, defaultValue: false), + Priority = table.Column(nullable: false, defaultValue: (byte)15) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpBackgroundJobs", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpClaimTypes", columns: table => new { Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), Name = table.Column(maxLength: 256, nullable: false), Required = table.Column(nullable: false), IsStatic = table.Column(nullable: false), @@ -45,10 +100,11 @@ namespace Acme.BookStore.Migrations columns: table => new { Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), TenantId = table.Column(nullable: true), Name = table.Column(maxLength: 256, nullable: false), NormalizedName = table.Column(maxLength: 256, nullable: false), - ConcurrencyStamp = table.Column(nullable: true), IsDefault = table.Column(nullable: false), IsStatic = table.Column(nullable: false), IsPublic = table.Column(nullable: false) @@ -73,16 +129,39 @@ namespace Acme.BookStore.Migrations table.PrimaryKey("PK_AbpSettings", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpTenants", + columns: table => new + { + Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(nullable: true), + CreationTime = table.Column(nullable: false), + CreatorId = table.Column(nullable: true), + LastModificationTime = table.Column(nullable: true), + LastModifierId = table.Column(nullable: true), + IsDeleted = table.Column(nullable: false, defaultValue: false), + DeleterId = table.Column(nullable: true), + DeletionTime = table.Column(nullable: true), + Name = table.Column(maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenants", x => x.Id); + }); + migrationBuilder.CreateTable( name: "AbpUsers", columns: table => new { Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), LastModifierId = table.Column(nullable: true), - IsDeleted = table.Column(nullable: false), + IsDeleted = table.Column(nullable: false, defaultValue: false), DeleterId = table.Column(nullable: true), DeletionTime = table.Column(nullable: true), TenantId = table.Column(nullable: true), @@ -95,20 +174,68 @@ namespace Acme.BookStore.Migrations EmailConfirmed = table.Column(nullable: false, defaultValue: false), PasswordHash = table.Column(maxLength: 256, nullable: true), SecurityStamp = table.Column(maxLength: 256, nullable: false), - ConcurrencyStamp = table.Column(maxLength: 256, nullable: false), PhoneNumber = table.Column(maxLength: 16, nullable: true), PhoneNumberConfirmed = table.Column(nullable: false, defaultValue: false), TwoFactorEnabled = table.Column(nullable: false, defaultValue: false), LockoutEnd = table.Column(nullable: true), LockoutEnabled = table.Column(nullable: false, defaultValue: false), - AccessFailedCount = table.Column(nullable: false, defaultValue: 0), - ExtraProperties = table.Column(nullable: true) + AccessFailedCount = table.Column(nullable: false, defaultValue: 0) }, constraints: table => { table.PrimaryKey("PK_AbpUsers", x => x.Id); }); + migrationBuilder.CreateTable( + name: "AbpAuditLogActions", + columns: table => new + { + Id = table.Column(nullable: false), + TenantId = table.Column(nullable: true), + AuditLogId = table.Column(nullable: false), + ServiceName = table.Column(maxLength: 256, nullable: true), + MethodName = table.Column(maxLength: 128, nullable: true), + Parameters = table.Column(maxLength: 2000, nullable: true), + ExecutionTime = table.Column(nullable: false), + ExecutionDuration = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpAuditLogActions", x => x.Id); + table.ForeignKey( + name: "FK_AbpAuditLogActions_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AbpEntityChanges", + columns: table => new + { + Id = table.Column(nullable: false), + AuditLogId = table.Column(nullable: false), + TenantId = table.Column(nullable: true), + ChangeTime = table.Column(nullable: false), + ChangeType = table.Column(nullable: false), + EntityTenantId = table.Column(nullable: true), + EntityId = table.Column(maxLength: 128, nullable: false), + EntityTypeFullName = table.Column(maxLength: 128, nullable: false), + ExtraProperties = table.Column(nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityChanges_AbpAuditLogs_AuditLogId", + column: x => x.AuditLogId, + principalTable: "AbpAuditLogs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpRoleClaims", columns: table => new @@ -130,6 +257,25 @@ namespace Acme.BookStore.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "AbpTenantConnectionStrings", + columns: table => new + { + TenantId = table.Column(nullable: false), + Name = table.Column(maxLength: 64, nullable: false), + Value = table.Column(maxLength: 1024, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpTenantConnectionStrings", x => new { x.TenantId, x.Name }); + table.ForeignKey( + name: "FK_AbpTenantConnectionStrings_AbpTenants_TenantId", + column: x => x.TenantId, + principalTable: "AbpTenants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "AbpUserClaims", columns: table => new @@ -155,9 +301,9 @@ namespace Acme.BookStore.Migrations name: "AbpUserLogins", columns: table => new { - TenantId = table.Column(nullable: true), UserId = table.Column(nullable: false), LoginProvider = table.Column(maxLength: 64, nullable: false), + TenantId = table.Column(nullable: true), ProviderKey = table.Column(maxLength: 196, nullable: false), ProviderDisplayName = table.Column(maxLength: 128, nullable: true) }, @@ -176,9 +322,9 @@ namespace Acme.BookStore.Migrations name: "AbpUserRoles", columns: table => new { - TenantId = table.Column(nullable: true), UserId = table.Column(nullable: false), - RoleId = table.Column(nullable: false) + RoleId = table.Column(nullable: false), + TenantId = table.Column(nullable: true) }, constraints: table => { @@ -201,10 +347,10 @@ namespace Acme.BookStore.Migrations name: "AbpUserTokens", columns: table => new { - TenantId = table.Column(nullable: true), UserId = table.Column(nullable: false), LoginProvider = table.Column(maxLength: 64, nullable: false), Name = table.Column(maxLength: 128, nullable: false), + TenantId = table.Column(nullable: true), Value = table.Column(nullable: true) }, constraints: table => @@ -218,6 +364,69 @@ namespace Acme.BookStore.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "AbpEntityPropertyChanges", + columns: table => new + { + Id = table.Column(nullable: false), + TenantId = table.Column(nullable: true), + EntityChangeId = table.Column(nullable: false), + NewValue = table.Column(maxLength: 512, nullable: true), + OriginalValue = table.Column(maxLength: 512, nullable: true), + PropertyName = table.Column(maxLength: 128, nullable: false), + PropertyTypeFullName = table.Column(maxLength: 64, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AbpEntityPropertyChanges", x => x.Id); + table.ForeignKey( + name: "FK_AbpEntityPropertyChanges_AbpEntityChanges_EntityChangeId", + column: x => x.EntityChangeId, + principalTable: "AbpEntityChanges", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_AuditLogId", + table: "AbpAuditLogActions", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogActions_TenantId_ServiceName_MethodName_ExecutionTime", + table: "AbpAuditLogActions", + columns: new[] { "TenantId", "ServiceName", "MethodName", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpAuditLogs_TenantId_UserId_ExecutionTime", + table: "AbpAuditLogs", + columns: new[] { "TenantId", "UserId", "ExecutionTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpBackgroundJobs_IsAbandoned_NextTryTime", + table: "AbpBackgroundJobs", + columns: new[] { "IsAbandoned", "NextTryTime" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_AuditLogId", + table: "AbpEntityChanges", + column: "AuditLogId"); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityChanges_TenantId_EntityTypeFullName_EntityId", + table: "AbpEntityChanges", + columns: new[] { "TenantId", "EntityTypeFullName", "EntityId" }); + + migrationBuilder.CreateIndex( + name: "IX_AbpEntityPropertyChanges_EntityChangeId", + table: "AbpEntityPropertyChanges", + column: "EntityChangeId"); + migrationBuilder.CreateIndex( name: "IX_AbpPermissionGrants_Name_ProviderName_ProviderKey", table: "AbpPermissionGrants", @@ -238,6 +447,12 @@ namespace Acme.BookStore.Migrations table: "AbpSettings", columns: new[] { "Name", "ProviderName", "ProviderKey" }); + migrationBuilder.CreateIndex( + name: "IX_AbpTenants_Name", + table: "AbpTenants", + column: "Name", + unique: true); + migrationBuilder.CreateIndex( name: "IX_AbpUserClaims_UserId", table: "AbpUserClaims", @@ -276,9 +491,18 @@ namespace Acme.BookStore.Migrations protected override void Down(MigrationBuilder migrationBuilder) { + migrationBuilder.DropTable( + name: "AbpAuditLogActions"); + + migrationBuilder.DropTable( + name: "AbpBackgroundJobs"); + migrationBuilder.DropTable( name: "AbpClaimTypes"); + migrationBuilder.DropTable( + name: "AbpEntityPropertyChanges"); + migrationBuilder.DropTable( name: "AbpPermissionGrants"); @@ -288,6 +512,9 @@ namespace Acme.BookStore.Migrations migrationBuilder.DropTable( name: "AbpSettings"); + migrationBuilder.DropTable( + name: "AbpTenantConnectionStrings"); + migrationBuilder.DropTable( name: "AbpUserClaims"); @@ -300,11 +527,20 @@ namespace Acme.BookStore.Migrations migrationBuilder.DropTable( name: "AbpUserTokens"); + migrationBuilder.DropTable( + name: "AbpEntityChanges"); + + migrationBuilder.DropTable( + name: "AbpTenants"); + migrationBuilder.DropTable( name: "AbpRoles"); migrationBuilder.DropTable( name: "AbpUsers"); + + migrationBuilder.DropTable( + name: "AbpAuditLogs"); } } } diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.Designer.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.Designer.cs new file mode 100644 index 0000000000..2ec683d7ed --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.Designer.cs @@ -0,0 +1,793 @@ +// +using System; +using Acme.BookStore.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace Acme.BookStore.Migrations +{ + [DbContext(typeof(BookStoreMigrationsDbContext))] + [Migration("20190416070050_Created_Book_Entity")] + partial class Created_Book_Entity + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.2.3-servicing-35854") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Acme.BookStore.Book", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp"); + + b.Property("CreationTime"); + + b.Property("CreatorId"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("LastModificationTime"); + + b.Property("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128); + + b.Property("Price"); + + b.Property("PublishDate"); + + b.Property("Type"); + + b.HasKey("Id"); + + b.ToTable("AppBooks"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ApplicationName") + .HasColumnName("ApplicationName") + .HasMaxLength(96); + + b.Property("BrowserInfo") + .HasColumnName("BrowserInfo") + .HasMaxLength(512); + + b.Property("ClientId") + .HasColumnName("ClientId") + .HasMaxLength(64); + + b.Property("ClientIpAddress") + .HasColumnName("ClientIpAddress") + .HasMaxLength(64); + + b.Property("ClientName") + .HasColumnName("ClientName") + .HasMaxLength(128); + + b.Property("Comments") + .HasColumnName("Comments") + .HasMaxLength(256); + + b.Property("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnName("CorrelationId") + .HasMaxLength(64); + + b.Property("Exceptions") + .HasColumnName("Exceptions") + .HasMaxLength(4000); + + b.Property("ExecutionDuration") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasColumnName("HttpMethod") + .HasMaxLength(16); + + b.Property("HttpStatusCode") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorUserId") + .HasColumnName("ImpersonatorUserId"); + + b.Property("TenantId") + .HasColumnName("TenantId"); + + b.Property("TenantName"); + + b.Property("Url") + .HasColumnName("Url") + .HasMaxLength(256); + + b.Property("UserId") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasColumnName("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuditLogId") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasColumnName("MethodName") + .HasMaxLength(128); + + b.Property("Parameters") + .HasColumnName("Parameters") + .HasMaxLength(2000); + + b.Property("ServiceName") + .HasColumnName("ServiceName") + .HasMaxLength(256); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuditLogId") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .IsRequired() + .HasColumnName("EntityId") + .HasMaxLength(128); + + b.Property("EntityTenantId"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasColumnName("EntityTypeFullName") + .HasMaxLength(128); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("EntityChangeId"); + + b.Property("NewValue") + .HasColumnName("NewValue") + .HasMaxLength(512); + + b.Property("OriginalValue") + .HasColumnName("OriginalValue") + .HasMaxLength(512); + + b.Property("PropertyName") + .IsRequired() + .HasColumnName("PropertyName") + .HasMaxLength(128); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128); + + b.Property("LastTryTime"); + + b.Property("NextTryTime"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasColumnName("ConcurrencyStamp") + .HasMaxLength(256); + + b.Property("Description") + .HasMaxLength(256); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256); + + b.Property("Regex") + .HasMaxLength(512); + + b.Property("RegexDescription") + .HasMaxLength(128); + + b.Property("Required"); + + b.Property("ValueType"); + + b.HasKey("Id"); + + b.ToTable("AbpClaimTypes"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .IsRequired() + .HasColumnName("ConcurrencyStamp") + .HasMaxLength(256); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDefault") + .HasColumnName("IsDefault"); + + b.Property("IsPublic") + .HasColumnName("IsPublic"); + + b.Property("IsStatic") + .HasColumnName("IsStatic"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256); + + b.Property("NormalizedName") + .IsRequired() + .HasMaxLength(256); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName"); + + b.ToTable("AbpRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256); + + b.Property("ClaimValue") + .HasMaxLength(1024); + + b.Property("RoleId"); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AbpRoleClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount") + .ValueGeneratedOnAdd() + .HasColumnName("AccessFailedCount") + .HasDefaultValue(0); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("Email") + .HasColumnName("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed") + .ValueGeneratedOnAdd() + .HasColumnName("EmailConfirmed") + .HasDefaultValue(false); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("LockoutEnabled") + .ValueGeneratedOnAdd() + .HasColumnName("LockoutEnabled") + .HasDefaultValue(false); + + b.Property("LockoutEnd"); + + b.Property("Name") + .HasColumnName("Name") + .HasMaxLength(64); + + b.Property("NormalizedEmail") + .HasColumnName("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .IsRequired() + .HasColumnName("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash") + .HasColumnName("PasswordHash") + .HasMaxLength(256); + + b.Property("PhoneNumber") + .HasColumnName("PhoneNumber") + .HasMaxLength(16); + + b.Property("PhoneNumberConfirmed") + .ValueGeneratedOnAdd() + .HasColumnName("PhoneNumberConfirmed") + .HasDefaultValue(false); + + b.Property("SecurityStamp") + .IsRequired() + .HasColumnName("SecurityStamp") + .HasMaxLength(256); + + b.Property("Surname") + .HasColumnName("Surname") + .HasMaxLength(64); + + b.Property("TenantId") + .HasColumnName("TenantId"); + + b.Property("TwoFactorEnabled") + .ValueGeneratedOnAdd() + .HasColumnName("TwoFactorEnabled") + .HasDefaultValue(false); + + b.Property("UserName") + .IsRequired() + .HasColumnName("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("Email"); + + b.HasIndex("NormalizedEmail"); + + b.HasIndex("NormalizedUserName"); + + b.HasIndex("UserName"); + + b.ToTable("AbpUsers"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ClaimType") + .IsRequired() + .HasMaxLength(256); + + b.Property("ClaimValue") + .HasMaxLength(1024); + + b.Property("TenantId"); + + b.Property("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AbpUserClaims"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.Property("UserId"); + + b.Property("LoginProvider") + .HasMaxLength(64); + + b.Property("ProviderDisplayName") + .HasMaxLength(128); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(196); + + b.Property("TenantId"); + + b.HasKey("UserId", "LoginProvider"); + + b.HasIndex("LoginProvider", "ProviderKey"); + + b.ToTable("AbpUserLogins"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.Property("TenantId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId", "UserId"); + + b.ToTable("AbpUserRoles"); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider") + .HasMaxLength(64); + + b.Property("Name") + .HasMaxLength(128); + + b.Property("TenantId"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AbpUserTokens"); + }); + + modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128); + + b.Property("ProviderKey") + .IsRequired() + .HasMaxLength(64); + + b.Property("ProviderName") + .IsRequired() + .HasMaxLength(64); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpPermissionGrants"); + }); + + modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("Name") + .IsRequired() + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasMaxLength(64); + + b.Property("ProviderName") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasMaxLength(2048); + + b.HasKey("Id"); + + b.HasIndex("Name", "ProviderName", "ProviderKey"); + + b.ToTable("AbpSettings"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpTenants"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId"); + + b.Property("Name") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog") + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog") + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange") + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole") + .WithMany("Claims") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser") + .WithMany("Claims") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser") + .WithMany("Logins") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => + { + b.HasOne("Volo.Abp.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Volo.Abp.Identity.IdentityUser") + .WithMany("Roles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => + { + b.HasOne("Volo.Abp.Identity.IdentityUser") + .WithMany("Tokens") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant") + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.cs similarity index 81% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.cs index 5fd4adb7d0..f4e67242e3 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/20190416070050_Created_Book_Entity.cs @@ -8,10 +8,12 @@ namespace Acme.BookStore.Migrations protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( - name: "Books", + name: "AppBooks", columns: table => new { Id = table.Column(nullable: false), + ExtraProperties = table.Column(nullable: true), + ConcurrencyStamp = table.Column(nullable: true), CreationTime = table.Column(nullable: false), CreatorId = table.Column(nullable: true), LastModificationTime = table.Column(nullable: true), @@ -23,14 +25,14 @@ namespace Acme.BookStore.Migrations }, constraints: table => { - table.PrimaryKey("PK_Books", x => x.Id); + table.PrimaryKey("PK_AppBooks", x => x.Id); }); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( - name: "Books"); + name: "AppBooks"); } } } diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/BookStoreMigrationsDbContextModelSnapshot.cs similarity index 56% rename from samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs rename to samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/BookStoreMigrationsDbContextModelSnapshot.cs index 646df02f86..fcd623b85e 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/BookStoreDbContextModelSnapshot.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore.DbMigrations/Migrations/BookStoreMigrationsDbContextModelSnapshot.cs @@ -8,14 +8,14 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace Acme.BookStore.Migrations { - [DbContext(typeof(BookStoreDbContext))] - partial class BookStoreDbContextModelSnapshot : ModelSnapshot + [DbContext(typeof(BookStoreMigrationsDbContext))] + partial class BookStoreMigrationsDbContextModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.2.0-rtm-35687") + .HasAnnotation("ProductVersion", "2.2.3-servicing-35854") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -24,24 +24,18 @@ namespace Acme.BookStore.Migrations b.Property("Id") .ValueGeneratedOnAdd(); - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnName("ConcurrencyStamp"); + b.Property("ConcurrencyStamp"); - b.Property("CreationTime") - .HasColumnName("CreationTime"); + b.Property("CreationTime"); - b.Property("CreatorId") - .HasColumnName("CreatorId"); + b.Property("CreatorId"); b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); - b.Property("LastModificationTime") - .HasColumnName("LastModificationTime"); + b.Property("LastModificationTime"); - b.Property("LastModifierId") - .HasColumnName("LastModifierId"); + b.Property("LastModifierId"); b.Property("Name") .IsRequired() @@ -55,7 +49,251 @@ namespace Acme.BookStore.Migrations b.HasKey("Id"); - b.ToTable("Books"); + b.ToTable("AppBooks"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ApplicationName") + .HasColumnName("ApplicationName") + .HasMaxLength(96); + + b.Property("BrowserInfo") + .HasColumnName("BrowserInfo") + .HasMaxLength(512); + + b.Property("ClientId") + .HasColumnName("ClientId") + .HasMaxLength(64); + + b.Property("ClientIpAddress") + .HasColumnName("ClientIpAddress") + .HasMaxLength(64); + + b.Property("ClientName") + .HasColumnName("ClientName") + .HasMaxLength(128); + + b.Property("Comments") + .HasColumnName("Comments") + .HasMaxLength(256); + + b.Property("ConcurrencyStamp"); + + b.Property("CorrelationId") + .HasColumnName("CorrelationId") + .HasMaxLength(64); + + b.Property("Exceptions") + .HasColumnName("Exceptions") + .HasMaxLength(4000); + + b.Property("ExecutionDuration") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("HttpMethod") + .HasColumnName("HttpMethod") + .HasMaxLength(16); + + b.Property("HttpStatusCode") + .HasColumnName("HttpStatusCode"); + + b.Property("ImpersonatorTenantId") + .HasColumnName("ImpersonatorTenantId"); + + b.Property("ImpersonatorUserId") + .HasColumnName("ImpersonatorUserId"); + + b.Property("TenantId") + .HasColumnName("TenantId"); + + b.Property("TenantName"); + + b.Property("Url") + .HasColumnName("Url") + .HasMaxLength(256); + + b.Property("UserId") + .HasColumnName("UserId"); + + b.Property("UserName") + .HasColumnName("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("TenantId", "ExecutionTime"); + + b.HasIndex("TenantId", "UserId", "ExecutionTime"); + + b.ToTable("AbpAuditLogs"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuditLogId") + .HasColumnName("AuditLogId"); + + b.Property("ExecutionDuration") + .HasColumnName("ExecutionDuration"); + + b.Property("ExecutionTime") + .HasColumnName("ExecutionTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("MethodName") + .HasColumnName("MethodName") + .HasMaxLength(128); + + b.Property("Parameters") + .HasColumnName("Parameters") + .HasMaxLength(2000); + + b.Property("ServiceName") + .HasColumnName("ServiceName") + .HasMaxLength(256); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "ServiceName", "MethodName", "ExecutionTime"); + + b.ToTable("AbpAuditLogActions"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AuditLogId") + .HasColumnName("AuditLogId"); + + b.Property("ChangeTime") + .HasColumnName("ChangeTime"); + + b.Property("ChangeType") + .HasColumnName("ChangeType"); + + b.Property("EntityId") + .IsRequired() + .HasColumnName("EntityId") + .HasMaxLength(128); + + b.Property("EntityTenantId"); + + b.Property("EntityTypeFullName") + .IsRequired() + .HasColumnName("EntityTypeFullName") + .HasMaxLength(128); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("TenantId") + .HasColumnName("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("AuditLogId"); + + b.HasIndex("TenantId", "EntityTypeFullName", "EntityId"); + + b.ToTable("AbpEntityChanges"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("EntityChangeId"); + + b.Property("NewValue") + .HasColumnName("NewValue") + .HasMaxLength(512); + + b.Property("OriginalValue") + .HasColumnName("OriginalValue") + .HasMaxLength(512); + + b.Property("PropertyName") + .IsRequired() + .HasColumnName("PropertyName") + .HasMaxLength(128); + + b.Property("PropertyTypeFullName") + .IsRequired() + .HasColumnName("PropertyTypeFullName") + .HasMaxLength(64); + + b.Property("TenantId"); + + b.HasKey("Id"); + + b.HasIndex("EntityChangeId"); + + b.ToTable("AbpEntityPropertyChanges"); + }); + + modelBuilder.Entity("Volo.Abp.BackgroundJobs.BackgroundJobRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsAbandoned") + .ValueGeneratedOnAdd() + .HasDefaultValue(false); + + b.Property("JobArgs") + .IsRequired() + .HasMaxLength(1048576); + + b.Property("JobName") + .IsRequired() + .HasMaxLength(128); + + b.Property("LastTryTime"); + + b.Property("NextTryTime"); + + b.Property("Priority") + .ValueGeneratedOnAdd() + .HasDefaultValue((byte)15); + + b.Property("TryCount") + .ValueGeneratedOnAdd() + .HasDefaultValue((short)0); + + b.HasKey("Id"); + + b.HasIndex("IsAbandoned", "NextTryTime"); + + b.ToTable("AbpBackgroundJobs"); }); modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => @@ -408,6 +646,93 @@ namespace Acme.BookStore.Migrations b.ToTable("AbpSettings"); }); + modelBuilder.Entity("Volo.Abp.TenantManagement.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnName("ConcurrencyStamp"); + + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + + b.Property("ExtraProperties") + .HasColumnName("ExtraProperties"); + + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(64); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("AbpTenants"); + }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.Property("TenantId"); + + b.Property("Name") + .HasMaxLength(64); + + b.Property("Value") + .IsRequired() + .HasMaxLength(1024); + + b.HasKey("TenantId", "Name"); + + b.ToTable("AbpTenantConnectionStrings"); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.AuditLogAction", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog") + .WithMany("Actions") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.AuditLog") + .WithMany("EntityChanges") + .HasForeignKey("AuditLogId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Volo.Abp.AuditLogging.EntityPropertyChange", b => + { + b.HasOne("Volo.Abp.AuditLogging.EntityChange") + .WithMany("PropertyChanges") + .HasForeignKey("EntityChangeId") + .OnDelete(DeleteBehavior.Cascade); + }); + modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => { b.HasOne("Volo.Abp.Identity.IdentityRole") @@ -452,6 +777,14 @@ namespace Acme.BookStore.Migrations .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade); }); + + modelBuilder.Entity("Volo.Abp.TenantManagement.TenantConnectionString", b => + { + b.HasOne("Volo.Abp.TenantManagement.Tenant") + .WithMany("ConnectionStrings") + .HasForeignKey("TenantId") + .OnDelete(DeleteBehavior.Cascade); + }); #pragma warning restore 612, 618 } } diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj index 88d54432b2..c42ea44516 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Acme.BookStore.EntityFrameworkCore.csproj @@ -1,16 +1,22 @@  + + netcoreapp2.2 Acme.BookStore - + - - - - + + + + + + + + diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs index ed7e9862ed..1aebc9b1ae 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContext.cs @@ -1,15 +1,18 @@ using Microsoft.EntityFrameworkCore; +using Acme.BookStore.Users; +using Volo.Abp.Data; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.Modeling; -using Volo.Abp.Identity.EntityFrameworkCore; -using Volo.Abp.PermissionManagement.EntityFrameworkCore; -using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.Users.EntityFrameworkCore; namespace Acme.BookStore.EntityFrameworkCore { + [ConnectionStringName("Default")] public class BookStoreDbContext : AbpDbContext { - public DbSet Book { get; set; } + public DbSet Users { get; set; } + + public DbSet Books { get; set; } public BookStoreDbContext(DbContextOptions options) : base(options) @@ -17,13 +20,28 @@ namespace Acme.BookStore.EntityFrameworkCore } - protected override void OnModelCreating(ModelBuilder modelBuilder) + protected override void OnModelCreating(ModelBuilder builder) { - base.OnModelCreating(modelBuilder); + base.OnModelCreating(builder); + + /* Configure the shared tables (with included modules) here */ + + builder.Entity(b => + { + b.ToTable("AbpUsers"); //Sharing the same table "AbpUsers" with the IdentityUser + + b.ConfigureFullAudited(); + b.ConfigureExtraProperties(); + b.ConfigureConcurrencyStamp(); + b.ConfigureAbpUser(); + + //Moved customization to a method so we can share it with the BookStoreMigrationsDbContext class + b.ConfigureCustomUserProperties(); + }); + + /* Configure your own tables/entities inside the ConfigureBookStore method */ - modelBuilder.ConfigureIdentity(); - modelBuilder.ConfigurePermissionManagement(); - modelBuilder.ConfigureSettingManagement(); + builder.ConfigureBookStore(); } } } diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextModelCreatingExtensions.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextModelCreatingExtensions.cs new file mode 100644 index 0000000000..b7cdd8705d --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreDbContextModelCreatingExtensions.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Volo.Abp; +using Volo.Abp.Users; +using Volo.Abp.EntityFrameworkCore.Modeling; + +namespace Acme.BookStore.EntityFrameworkCore +{ + public static class BookStoreDbContextModelCreatingExtensions + { + public static void ConfigureBookStore(this ModelBuilder builder) + { + Check.NotNull(builder, nameof(builder)); + + /* Configure your own tables/entities inside here */ + + builder.Entity(b => + { + b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); + b.ConfigureExtraProperties(); + }); + } + + public static void ConfigureCustomUserProperties(this EntityTypeBuilder b) + where TUser: class, IUser + { + //b.Property(nameof(AppUser.MyProperty))... + } + } +} \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs index c28764df91..a8e4d2de0c 100644 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs +++ b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/EntityFrameworkCore/BookStoreEntityFrameworkCoreModule.cs @@ -1,9 +1,13 @@ using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AuditLogging.EntityFrameworkCore; +using Volo.Abp.BackgroundJobs.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore.SqlServer; +using Volo.Abp.FeatureManagement.EntityFrameworkCore; using Volo.Abp.Identity.EntityFrameworkCore; using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore; +using Volo.Abp.TenantManagement.EntityFrameworkCore; namespace Acme.BookStore.EntityFrameworkCore { @@ -12,14 +16,20 @@ namespace Acme.BookStore.EntityFrameworkCore typeof(AbpIdentityEntityFrameworkCoreModule), typeof(AbpPermissionManagementEntityFrameworkCoreModule), typeof(AbpSettingManagementEntityFrameworkCoreModule), - typeof(AbpEntityFrameworkCoreSqlServerModule))] + typeof(AbpEntityFrameworkCoreSqlServerModule), + typeof(BackgroundJobsEntityFrameworkCoreModule), + typeof(AbpAuditLoggingEntityFrameworkCoreModule), + typeof(AbpTenantManagementEntityFrameworkCoreModule), + typeof(AbpFeatureManagementEntityFrameworkCoreModule) + )] public class BookStoreEntityFrameworkCoreModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAbpDbContext(options => { - options.AddDefaultRepositories(); + //Remove "includeAllEntities: true" to create default repositories only for aggregate roots + options.AddDefaultRepositories(includeAllEntities: true); }); } } diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.Designer.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.Designer.cs deleted file mode 100644 index c9ae3e5b0a..0000000000 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060805_Initial.Designer.cs +++ /dev/null @@ -1,397 +0,0 @@ -// -using System; -using Acme.BookStore.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace Acme.BookStore.Migrations -{ - [DbContext(typeof(BookStoreDbContext))] - [Migration("20181204060805_Initial")] - partial class Initial - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("Description") - .HasMaxLength(256); - - b.Property("IsStatic"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256); - - b.Property("Regex") - .HasMaxLength(512); - - b.Property("RegexDescription") - .HasMaxLength(128); - - b.Property("Required"); - - b.Property("ValueType"); - - b.HasKey("Id"); - - b.ToTable("AbpClaimTypes"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp"); - - b.Property("IsDefault") - .HasColumnName("IsDefault"); - - b.Property("IsPublic") - .HasColumnName("IsPublic"); - - b.Property("IsStatic") - .HasColumnName("IsStatic"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256); - - b.Property("NormalizedName") - .IsRequired() - .HasMaxLength(256); - - b.Property("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName"); - - b.ToTable("AbpRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType") - .IsRequired() - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasMaxLength(1024); - - b.Property("RoleId"); - - b.Property("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AbpRoleClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("AccessFailedCount") - .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") - .HasDefaultValue(0); - - b.Property("ConcurrencyStamp") - .IsRequired() - .HasColumnName("ConcurrencyStamp") - .HasMaxLength(256); - - b.Property("CreationTime"); - - b.Property("CreatorId"); - - b.Property("DeleterId"); - - b.Property("DeletionTime"); - - b.Property("Email") - .HasColumnName("Email") - .HasMaxLength(256); - - b.Property("EmailConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") - .HasDefaultValue(false); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted"); - - b.Property("LastModificationTime"); - - b.Property("LastModifierId"); - - b.Property("LockoutEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") - .HasDefaultValue(false); - - b.Property("LockoutEnd"); - - b.Property("Name") - .HasColumnName("Name") - .HasMaxLength(64); - - b.Property("NormalizedEmail") - .HasColumnName("NormalizedEmail") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .IsRequired() - .HasColumnName("NormalizedUserName") - .HasMaxLength(256); - - b.Property("PasswordHash") - .HasColumnName("PasswordHash") - .HasMaxLength(256); - - b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") - .HasMaxLength(16); - - b.Property("PhoneNumberConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") - .HasDefaultValue(false); - - b.Property("SecurityStamp") - .IsRequired() - .HasColumnName("SecurityStamp") - .HasMaxLength(256); - - b.Property("Surname") - .HasColumnName("Surname") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId"); - - b.Property("TwoFactorEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") - .HasDefaultValue(false); - - b.Property("UserName") - .IsRequired() - .HasColumnName("UserName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("Email"); - - b.HasIndex("NormalizedEmail"); - - b.HasIndex("NormalizedUserName"); - - b.HasIndex("UserName"); - - b.ToTable("AbpUsers"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType") - .IsRequired() - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasMaxLength(1024); - - b.Property("TenantId"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AbpUserClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.Property("UserId"); - - b.Property("LoginProvider") - .HasMaxLength(64); - - b.Property("ProviderDisplayName") - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasMaxLength(196); - - b.Property("TenantId"); - - b.HasKey("UserId", "LoginProvider"); - - b.HasIndex("LoginProvider", "ProviderKey"); - - b.ToTable("AbpUserLogins"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.Property("UserId"); - - b.Property("RoleId"); - - b.Property("TenantId"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId", "UserId"); - - b.ToTable("AbpUserRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.Property("UserId"); - - b.Property("LoginProvider") - .HasMaxLength(64); - - b.Property("Name") - .HasMaxLength(128); - - b.Property("TenantId"); - - b.Property("Value"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AbpUserTokens"); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasMaxLength(64); - - b.Property("ProviderName") - .IsRequired() - .HasMaxLength(64); - - b.Property("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpPermissionGrants"); - }); - - modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasMaxLength(64); - - b.Property("ProviderName") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2048); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpSettings"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole") - .WithMany("Claims") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Claims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Logins") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Roles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Tokens") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.Designer.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.Designer.cs deleted file mode 100644 index 5e6cc3ac1e..0000000000 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181204060902_Created_Book_Entity.Designer.cs +++ /dev/null @@ -1,425 +0,0 @@ -// -using System; -using Acme.BookStore.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace Acme.BookStore.Migrations -{ - [DbContext(typeof(BookStoreDbContext))] - [Migration("20181204060902_Created_Book_Entity")] - partial class Created_Book_Entity - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("Acme.BookStore.Book", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("CreationTime"); - - b.Property("CreatorId"); - - b.Property("LastModificationTime"); - - b.Property("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128); - - b.Property("Price"); - - b.Property("PublishDate"); - - b.Property("Type"); - - b.HasKey("Id"); - - b.ToTable("Books"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("Description") - .HasMaxLength(256); - - b.Property("IsStatic"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256); - - b.Property("Regex") - .HasMaxLength(512); - - b.Property("RegexDescription") - .HasMaxLength(128); - - b.Property("Required"); - - b.Property("ValueType"); - - b.HasKey("Id"); - - b.ToTable("AbpClaimTypes"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp"); - - b.Property("IsDefault") - .HasColumnName("IsDefault"); - - b.Property("IsPublic") - .HasColumnName("IsPublic"); - - b.Property("IsStatic") - .HasColumnName("IsStatic"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256); - - b.Property("NormalizedName") - .IsRequired() - .HasMaxLength(256); - - b.Property("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName"); - - b.ToTable("AbpRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType") - .IsRequired() - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasMaxLength(1024); - - b.Property("RoleId"); - - b.Property("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AbpRoleClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("AccessFailedCount") - .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") - .HasDefaultValue(0); - - b.Property("ConcurrencyStamp") - .IsRequired() - .HasColumnName("ConcurrencyStamp") - .HasMaxLength(256); - - b.Property("CreationTime"); - - b.Property("CreatorId"); - - b.Property("DeleterId"); - - b.Property("DeletionTime"); - - b.Property("Email") - .HasColumnName("Email") - .HasMaxLength(256); - - b.Property("EmailConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") - .HasDefaultValue(false); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted"); - - b.Property("LastModificationTime"); - - b.Property("LastModifierId"); - - b.Property("LockoutEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") - .HasDefaultValue(false); - - b.Property("LockoutEnd"); - - b.Property("Name") - .HasColumnName("Name") - .HasMaxLength(64); - - b.Property("NormalizedEmail") - .HasColumnName("NormalizedEmail") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .IsRequired() - .HasColumnName("NormalizedUserName") - .HasMaxLength(256); - - b.Property("PasswordHash") - .HasColumnName("PasswordHash") - .HasMaxLength(256); - - b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") - .HasMaxLength(16); - - b.Property("PhoneNumberConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") - .HasDefaultValue(false); - - b.Property("SecurityStamp") - .IsRequired() - .HasColumnName("SecurityStamp") - .HasMaxLength(256); - - b.Property("Surname") - .HasColumnName("Surname") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId"); - - b.Property("TwoFactorEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") - .HasDefaultValue(false); - - b.Property("UserName") - .IsRequired() - .HasColumnName("UserName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("Email"); - - b.HasIndex("NormalizedEmail"); - - b.HasIndex("NormalizedUserName"); - - b.HasIndex("UserName"); - - b.ToTable("AbpUsers"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType") - .IsRequired() - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasMaxLength(1024); - - b.Property("TenantId"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AbpUserClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.Property("UserId"); - - b.Property("LoginProvider") - .HasMaxLength(64); - - b.Property("ProviderDisplayName") - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasMaxLength(196); - - b.Property("TenantId"); - - b.HasKey("UserId", "LoginProvider"); - - b.HasIndex("LoginProvider", "ProviderKey"); - - b.ToTable("AbpUserLogins"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.Property("UserId"); - - b.Property("RoleId"); - - b.Property("TenantId"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId", "UserId"); - - b.ToTable("AbpUserRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.Property("UserId"); - - b.Property("LoginProvider") - .HasMaxLength(64); - - b.Property("Name") - .HasMaxLength(128); - - b.Property("TenantId"); - - b.Property("Value"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AbpUserTokens"); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasMaxLength(64); - - b.Property("ProviderName") - .IsRequired() - .HasMaxLength(64); - - b.Property("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpPermissionGrants"); - }); - - modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasMaxLength(64); - - b.Property("ProviderName") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2048); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpSettings"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole") - .WithMany("Claims") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Claims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Logins") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Roles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Tokens") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181224122651_Upgreded_ABP_Packages.Designer.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181224122651_Upgreded_ABP_Packages.Designer.cs deleted file mode 100644 index c3cbd8e6d2..0000000000 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181224122651_Upgreded_ABP_Packages.Designer.cs +++ /dev/null @@ -1,448 +0,0 @@ -// -using System; -using Acme.BookStore.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -namespace Acme.BookStore.Migrations -{ - [DbContext(typeof(BookStoreDbContext))] - [Migration("20181224122651_Upgreded_ABP_Packages")] - partial class Upgreded_ABP_Packages - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") - .HasAnnotation("Relational:MaxIdentifierLength", 128) - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - modelBuilder.Entity("Acme.BookStore.Book", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken(); - - b.Property("CreationTime"); - - b.Property("CreatorId"); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); - - b.Property("LastModificationTime"); - - b.Property("LastModifierId"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128); - - b.Property("Price"); - - b.Property("PublishDate"); - - b.Property("Type"); - - b.HasKey("Id"); - - b.ToTable("Books"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityClaimType", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasColumnName("ConcurrencyStamp") - .HasMaxLength(256); - - b.Property("Description") - .HasMaxLength(256); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); - - b.Property("IsStatic"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256); - - b.Property("Regex") - .HasMaxLength(512); - - b.Property("RegexDescription") - .HasMaxLength(128); - - b.Property("Required"); - - b.Property("ValueType"); - - b.HasKey("Id"); - - b.ToTable("AbpClaimTypes"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRole", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasColumnName("ConcurrencyStamp") - .HasMaxLength(256); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); - - b.Property("IsDefault") - .HasColumnName("IsDefault"); - - b.Property("IsPublic") - .HasColumnName("IsPublic"); - - b.Property("IsStatic") - .HasColumnName("IsStatic"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(256); - - b.Property("NormalizedName") - .IsRequired() - .HasMaxLength(256); - - b.Property("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName"); - - b.ToTable("AbpRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType") - .IsRequired() - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasMaxLength(1024); - - b.Property("RoleId"); - - b.Property("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("AbpRoleClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUser", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("AccessFailedCount") - .ValueGeneratedOnAdd() - .HasColumnName("AccessFailedCount") - .HasDefaultValue(0); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .IsRequired() - .HasColumnName("ConcurrencyStamp") - .HasMaxLength(256); - - b.Property("CreationTime"); - - b.Property("CreatorId"); - - b.Property("DeleterId"); - - b.Property("DeletionTime"); - - b.Property("Email") - .HasColumnName("Email") - .HasMaxLength(256); - - b.Property("EmailConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("EmailConfirmed") - .HasDefaultValue(false); - - b.Property("ExtraProperties") - .HasColumnName("ExtraProperties"); - - b.Property("IsDeleted"); - - b.Property("LastModificationTime"); - - b.Property("LastModifierId"); - - b.Property("LockoutEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("LockoutEnabled") - .HasDefaultValue(false); - - b.Property("LockoutEnd"); - - b.Property("Name") - .HasColumnName("Name") - .HasMaxLength(64); - - b.Property("NormalizedEmail") - .HasColumnName("NormalizedEmail") - .HasMaxLength(256); - - b.Property("NormalizedUserName") - .IsRequired() - .HasColumnName("NormalizedUserName") - .HasMaxLength(256); - - b.Property("PasswordHash") - .HasColumnName("PasswordHash") - .HasMaxLength(256); - - b.Property("PhoneNumber") - .HasColumnName("PhoneNumber") - .HasMaxLength(16); - - b.Property("PhoneNumberConfirmed") - .ValueGeneratedOnAdd() - .HasColumnName("PhoneNumberConfirmed") - .HasDefaultValue(false); - - b.Property("SecurityStamp") - .IsRequired() - .HasColumnName("SecurityStamp") - .HasMaxLength(256); - - b.Property("Surname") - .HasColumnName("Surname") - .HasMaxLength(64); - - b.Property("TenantId") - .HasColumnName("TenantId"); - - b.Property("TwoFactorEnabled") - .ValueGeneratedOnAdd() - .HasColumnName("TwoFactorEnabled") - .HasDefaultValue(false); - - b.Property("UserName") - .IsRequired() - .HasColumnName("UserName") - .HasMaxLength(256); - - b.HasKey("Id"); - - b.HasIndex("Email"); - - b.HasIndex("NormalizedEmail"); - - b.HasIndex("NormalizedUserName"); - - b.HasIndex("UserName"); - - b.ToTable("AbpUsers"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("ClaimType") - .IsRequired() - .HasMaxLength(256); - - b.Property("ClaimValue") - .HasMaxLength(1024); - - b.Property("TenantId"); - - b.Property("UserId"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("AbpUserClaims"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.Property("UserId"); - - b.Property("LoginProvider") - .HasMaxLength(64); - - b.Property("ProviderDisplayName") - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasMaxLength(196); - - b.Property("TenantId"); - - b.HasKey("UserId", "LoginProvider"); - - b.HasIndex("LoginProvider", "ProviderKey"); - - b.ToTable("AbpUserLogins"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.Property("UserId"); - - b.Property("RoleId"); - - b.Property("TenantId"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId", "UserId"); - - b.ToTable("AbpUserRoles"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.Property("UserId"); - - b.Property("LoginProvider") - .HasMaxLength(64); - - b.Property("Name") - .HasMaxLength(128); - - b.Property("TenantId"); - - b.Property("Value"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("AbpUserTokens"); - }); - - modelBuilder.Entity("Volo.Abp.PermissionManagement.PermissionGrant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128); - - b.Property("ProviderKey") - .IsRequired() - .HasMaxLength(64); - - b.Property("ProviderName") - .IsRequired() - .HasMaxLength(64); - - b.Property("TenantId"); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpPermissionGrants"); - }); - - modelBuilder.Entity("Volo.Abp.SettingManagement.Setting", b => - { - b.Property("Id") - .ValueGeneratedOnAdd(); - - b.Property("Name") - .IsRequired() - .HasMaxLength(128); - - b.Property("ProviderKey") - .HasMaxLength(64); - - b.Property("ProviderName") - .HasMaxLength(64); - - b.Property("Value") - .IsRequired() - .HasMaxLength(2048); - - b.HasKey("Id"); - - b.HasIndex("Name", "ProviderName", "ProviderKey"); - - b.ToTable("AbpSettings"); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityRoleClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole") - .WithMany("Claims") - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserClaim", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Claims") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserLogin", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Logins") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserRole", b => - { - b.HasOne("Volo.Abp.Identity.IdentityRole") - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade); - - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Roles") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity("Volo.Abp.Identity.IdentityUserToken", b => - { - b.HasOne("Volo.Abp.Identity.IdentityUser") - .WithMany("Tokens") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181224122651_Upgreded_ABP_Packages.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181224122651_Upgreded_ABP_Packages.cs deleted file mode 100644 index 77545ed9a3..0000000000 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20181224122651_Upgreded_ABP_Packages.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace Acme.BookStore.Migrations -{ - public partial class Upgreded_ABP_Packages : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "ConcurrencyStamp", - table: "Books", - nullable: true); - - migrationBuilder.AddColumn( - name: "ExtraProperties", - table: "Books", - nullable: true); - - migrationBuilder.AlterColumn( - name: "ConcurrencyStamp", - table: "AbpRoles", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldNullable: true); - - migrationBuilder.AddColumn( - name: "ExtraProperties", - table: "AbpRoles", - nullable: true); - - migrationBuilder.AddColumn( - name: "ConcurrencyStamp", - table: "AbpClaimTypes", - maxLength: 256, - nullable: false, - defaultValue: ""); - - migrationBuilder.AddColumn( - name: "ExtraProperties", - table: "AbpClaimTypes", - nullable: true); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "ConcurrencyStamp", - table: "Books"); - - migrationBuilder.DropColumn( - name: "ExtraProperties", - table: "Books"); - - migrationBuilder.DropColumn( - name: "ExtraProperties", - table: "AbpRoles"); - - migrationBuilder.DropColumn( - name: "ConcurrencyStamp", - table: "AbpClaimTypes"); - - migrationBuilder.DropColumn( - name: "ExtraProperties", - table: "AbpClaimTypes"); - - migrationBuilder.AlterColumn( - name: "ConcurrencyStamp", - table: "AbpRoles", - nullable: true, - oldClrType: typeof(string), - oldMaxLength: 256); - } - } -} diff --git a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20190111135616_ABP_v0_11_Upgrade.cs b/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20190111135616_ABP_v0_11_Upgrade.cs deleted file mode 100644 index b77106644b..0000000000 --- a/samples/BookStore/src/Acme.BookStore.EntityFrameworkCore/Migrations/20190111135616_ABP_v0_11_Upgrade.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -namespace Acme.BookStore.Migrations -{ - public partial class ABP_v0_11_Upgrade : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "IsDeleted", - table: "AbpUsers", - nullable: false, - defaultValue: false, - oldClrType: typeof(bool)); - - migrationBuilder.AlterColumn( - name: "ConcurrencyStamp", - table: "AbpUsers", - nullable: true, - oldClrType: typeof(string), - oldMaxLength: 256); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "IsDeleted", - table: "AbpUsers", - nullable: false, - oldClrType: typeof(bool), - oldDefaultValue: false); - - migrationBuilder.AlterColumn( - name: "ConcurrencyStamp", - table: "AbpUsers", - maxLength: 256, - nullable: false, - oldClrType: typeof(string), - oldNullable: true); - } - } -} diff --git a/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj b/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj index ae71fd38d8..46616b452a 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj +++ b/samples/BookStore/src/Acme.BookStore.Web/Acme.BookStore.Web.csproj @@ -1,5 +1,7 @@  + + netcoreapp2.2 Acme.BookStore @@ -8,6 +10,7 @@ true true true + false @@ -18,19 +21,27 @@ - + + + + + + + - + - - - - - + + + + + + + diff --git a/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs b/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs index 7c5b2b39d2..9f42c3d330 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/BookStoreWebModule.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Linq; using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -6,26 +7,34 @@ using Microsoft.Extensions.DependencyInjection; using Acme.BookStore.EntityFrameworkCore; using Acme.BookStore.Localization.BookStore; using Acme.BookStore.Menus; +using Acme.BookStore.Permissions; using Swashbuckle.AspNetCore.Swagger; using Volo.Abp; using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc.Localization; +using Volo.Abp.AspNetCore.Mvc.UI; +using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.Authorization.Permissions; using Volo.Abp.Autofac; using Volo.Abp.AutoMapper; -using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.Data; using Volo.Abp.Identity; using Volo.Abp.Identity.Web; using Volo.Abp.Localization; using Volo.Abp.Localization.Resources.AbpValidation; using Volo.Abp.Modularity; -using Volo.Abp.PermissionManagement; +using Volo.Abp.PermissionManagement.Web; using Volo.Abp.Threading; +using Volo.Abp.UI; using Volo.Abp.UI.Navigation; using Volo.Abp.VirtualFileSystem; +using Volo.Abp.PermissionManagement; +using Volo.Abp.EntityFrameworkCore; +using Volo.Abp.TenantManagement.Web; + namespace Acme.BookStore { @@ -35,7 +44,8 @@ namespace Acme.BookStore typeof(AbpAutofacModule), typeof(AbpIdentityWebModule), typeof(AbpAccountWebModule), - typeof(AbpAspNetCoreMvcUiBasicThemeModule) + typeof(AbpAspNetCoreMvcUiBasicThemeModule), + typeof(AbpTenantManagementWebModule) )] public class BookStoreWebModule : AbpModule { @@ -89,7 +99,6 @@ namespace Acme.BookStore Configure(options => { options.FileSets.ReplaceEmbeddedByPhysical(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}Acme.BookStore.Domain", Path.DirectorySeparatorChar))); - }); } } @@ -106,7 +115,9 @@ namespace Acme.BookStore ); options.Languages.Add(new LanguageInfo("en", "en", "English")); + options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português")); options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe")); + options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); }); } @@ -154,6 +165,11 @@ namespace Acme.BookStore app.UseVirtualFiles(); app.UseAuthentication(); + if (BookStoreConsts.IsMultiTenancyEnabled) + { + app.UseMultiTenancy(); + } + app.UseAbpRequestLocalization(); app.UseSwagger(); @@ -162,40 +178,22 @@ namespace Acme.BookStore options.SwaggerEndpoint("/swagger/v1/swagger.json", "BookStore API"); }); - //TODO: use app.UseMvcWithDefaultRouteAndArea(); after v1.3.0 release - app.UseMvc(routes => - { - routes.MapRoute( - name: "defaultWithArea", - template: "{area}/{controller=Home}/{action=Index}/{id?}"); + app.UseAuditing(); - routes.MapRoute( - name: "default", - template: "{controller=Home}/{action=Index}/{id?}"); - }); + app.UseMvcWithDefaultRouteAndArea(); SeedDatabase(context); } - private void SeedDatabase(ApplicationInitializationContext context) + private static void SeedDatabase(ApplicationInitializationContext context) { using (var scope = context.ServiceProvider.CreateScope()) { AsyncHelper.RunSync(async () => { await scope.ServiceProvider - .GetRequiredService() - .SeedAsync( - "1q2w3E*" - ); - - await scope.ServiceProvider - .GetRequiredService() - .SeedAsync( - RolePermissionValueProvider.ProviderName, - "admin", - IdentityPermissions.GetAll() //.Union(BookStorePermissions.GetAll()) - ); + .GetRequiredService() + .SeedAsync(); }); } } diff --git a/samples/BookStore/src/Acme.BookStore.Web/Menus/BookStoreMenuContributor.cs b/samples/BookStore/src/Acme.BookStore.Web/Menus/BookStoreMenuContributor.cs index 9600f04b3b..4b6aa2821a 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Menus/BookStoreMenuContributor.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Menus/BookStoreMenuContributor.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; using Acme.BookStore.Localization.BookStore; +using Volo.Abp.TenantManagement.Web.Navigation; using Volo.Abp.UI.Navigation; namespace Acme.BookStore.Menus @@ -18,14 +19,19 @@ namespace Acme.BookStore.Menus private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) { + if (!BookStoreConsts.IsMultiTenancyEnabled) + { + ApplicationMenuItem administration = context.Menu.GetAdministration(); + administration.TryRemoveMenuItem(TenantManagementMenuNames.GroupName); + } + var l = context.ServiceProvider.GetRequiredService>(); context.Menu.Items.Insert(0, new ApplicationMenuItem("BookStore.Home", l["Menu:Home"], "/")); - context.Menu.AddItem( new ApplicationMenuItem("BooksStore", l["Menu:BookStore"]) .AddItem(new ApplicationMenuItem("BooksStore.Books", l["Menu:Books"], url: "/Books")) - ); + ); } } } diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageModelBase.cs b/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageModelBase.cs index aef0f3d311..5dd1fc918c 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageModelBase.cs +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/BookStorePageModelBase.cs @@ -1,11 +1,13 @@ -using Microsoft.AspNetCore.Mvc.Localization; -using Acme.BookStore.Localization.BookStore; +using Acme.BookStore.Localization.BookStore; using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; namespace Acme.BookStore.Pages { public abstract class BookStorePageModelBase : AbpPageModel { - public IHtmlLocalizer L { get; set; } + protected BookStorePageModelBase() + { + LocalizationResourceType = typeof(BookStoreResource); + } } } \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml b/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml index 039876c75d..e6e24beeae 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml +++ b/samples/BookStore/src/Acme.BookStore.Web/Pages/Index.cshtml @@ -2,6 +2,9 @@ @using Acme.BookStore.Pages @inherits BookStorePageBase @model IndexModel +@section styles { + +} @L["Welcome"] diff --git a/samples/BookStore/src/Acme.BookStore.Web/package.json b/samples/BookStore/src/Acme.BookStore.Web/package.json index a8ed109cba..6d3170da8c 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/package.json +++ b/samples/BookStore/src/Acme.BookStore.Web/package.json @@ -1,8 +1,8 @@ { "version": "0.1.0", - "name": "volo.supportapp", + "name": "Acme.BookStore", "private": true, "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^0.4.1" + "@abp/aspnetcore.mvc.ui.theme.basic": "^0.4.9" } } diff --git a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.css b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.css new file mode 100644 index 0000000000..e02abfc9b0 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.css @@ -0,0 +1 @@ + diff --git a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.min.css b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.min.css new file mode 100644 index 0000000000..5f282702bb --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.min.css @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.scss b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.scss new file mode 100644 index 0000000000..b945ade091 --- /dev/null +++ b/samples/BookStore/src/Acme.BookStore.Web/wwwroot/pages/index.scss @@ -0,0 +1,3 @@ +body{ + +} diff --git a/samples/BookStore/src/Acme.BookStore.Web/yarn.lock b/samples/BookStore/src/Acme.BookStore.Web/yarn.lock index 43590623a0..e5f81f3581 100644 --- a/samples/BookStore/src/Acme.BookStore.Web/yarn.lock +++ b/samples/BookStore/src/Acme.BookStore.Web/yarn.lock @@ -2,31 +2,31 @@ # yarn lockfile v1 -"@abp/aspnetcore.mvc.ui.theme.basic@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-0.4.1.tgz#be341dc021031584bb77a2e13113cfc60656f6b6" - dependencies: - "@abp/aspnetcore.mvc.ui.theme.shared" "^0.4.1" - -"@abp/aspnetcore.mvc.ui.theme.shared@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-0.4.1.tgz#d62619679f531fa285058a67ff1477e5ffe5d696" - dependencies: - "@abp/aspnetcore.mvc.ui" "^0.4.1" - "@abp/bootstrap" "^0.3.5" - "@abp/datatables.net-bs4" "^0.3.5" - "@abp/font-awesome" "^0.3.5" - "@abp/jquery-form" "^0.3.5" - "@abp/jquery-validation-unobtrusive" "^0.3.5" - "@abp/lodash" "^0.3.5" - "@abp/select2" "^0.3.5" - "@abp/sweetalert" "^0.3.5" - "@abp/timeago" "^0.3.5" - "@abp/toastr" "^0.3.5" - -"@abp/aspnetcore.mvc.ui@^0.4.1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-0.4.1.tgz#0b0dd5c918a7327efa94fb1f4aff7356568d37b1" +"@abp/aspnetcore.mvc.ui.theme.basic@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.basic/-/aspnetcore.mvc.ui.theme.basic-0.4.9.tgz#926a25c641225598c8666b658c1df3fa7fbed7cf" + dependencies: + "@abp/aspnetcore.mvc.ui.theme.shared" "^0.4.9" + +"@abp/aspnetcore.mvc.ui.theme.shared@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui.theme.shared/-/aspnetcore.mvc.ui.theme.shared-0.4.9.tgz#cc8d83162329e3044e12a358c3f3ce6fb3e75f1b" + dependencies: + "@abp/aspnetcore.mvc.ui" "^0.4.9" + "@abp/bootstrap" "^0.4.9" + "@abp/datatables.net-bs4" "^0.4.9" + "@abp/font-awesome" "^0.4.9" + "@abp/jquery-form" "^0.4.9" + "@abp/jquery-validation-unobtrusive" "^0.4.9" + "@abp/lodash" "^0.4.9" + "@abp/select2" "^0.4.9" + "@abp/sweetalert" "^0.4.9" + "@abp/timeago" "^0.4.9" + "@abp/toastr" "^0.4.9" + +"@abp/aspnetcore.mvc.ui@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/aspnetcore.mvc.ui/-/aspnetcore.mvc.ui-0.4.9.tgz#cb7a1905ec003fd459e13e577ef7b3d2ada55f5f" dependencies: ansi-colors "^1.1.0" extend-object "^1.0.0" @@ -35,99 +35,99 @@ path "^0.12.7" rimraf "^2.6.2" -"@abp/bootstrap@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-0.3.5.tgz#7bf9f16b7d0657ddf38caa97cdb21eb26d758637" +"@abp/bootstrap@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/bootstrap/-/bootstrap-0.4.9.tgz#2092858956c9b770509619ffa70d46b382531ce1" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" bootstrap "^4.1.1" -"@abp/core@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/core/-/core-0.3.5.tgz#0e26c03259c10b223465d9cf4f541113ce6a56ae" +"@abp/core@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/core/-/core-0.4.9.tgz#d644dde25fb9749e4d179bd72729afeae3b6e230" -"@abp/datatables.net-bs4@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-0.3.5.tgz#b0e40c8f2d40113bebaf62c5219c41a8c5e918cd" +"@abp/datatables.net-bs4@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/datatables.net-bs4/-/datatables.net-bs4-0.4.9.tgz#a51dcc6c166af8a3126f121cf410a170027e6d11" dependencies: - "@abp/datatables.net" "^0.3.5" + "@abp/datatables.net" "^0.4.9" datatables.net-bs4 "^1.10.16" -"@abp/datatables.net@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-0.3.5.tgz#784d14462a3e08e7cc921e8d9d0c7f384b8f6e6a" +"@abp/datatables.net@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/datatables.net/-/datatables.net-0.4.9.tgz#1c96f4c800b9b05fc0dcec29dac471e1e5c5624a" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" datatables.net "^1.10.16" -"@abp/font-awesome@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-0.3.5.tgz#25385a24d8cbb9475b9d57a51c6402e48963da44" +"@abp/font-awesome@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/font-awesome/-/font-awesome-0.4.9.tgz#eb1691ff33be53832b5063aa2a382dc7d65a3f43" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" font-awesome "^4.7.0" -"@abp/jquery-form@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-0.3.5.tgz#ec8315dbf87fa6be841448acd3fbccf51507f6da" +"@abp/jquery-form@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/jquery-form/-/jquery-form-0.4.9.tgz#70af1af668f6a55dbadb455f64b6d1cbdc63caf8" dependencies: - "@abp/jquery" "^0.3.5" + "@abp/jquery" "^0.4.9" jquery-form "^4.2.2" -"@abp/jquery-validation-unobtrusive@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-0.3.5.tgz#6b8b5c821718266ae13e1a3f65da4862ed0a7e6d" +"@abp/jquery-validation-unobtrusive@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation-unobtrusive/-/jquery-validation-unobtrusive-0.4.9.tgz#3512f1f7fbf9f982b084b8f9cb68f91553dfbcef" dependencies: - "@abp/jquery-validation" "^0.3.5" + "@abp/jquery-validation" "^0.4.9" jquery-validation-unobtrusive "^3.2.9" -"@abp/jquery-validation@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-0.3.5.tgz#c3f2e3d695f333261cdefadc35c962ebf6f016d3" +"@abp/jquery-validation@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/jquery-validation/-/jquery-validation-0.4.9.tgz#5751da6dac87a6783dd4d1165240b3c29eed3ac3" dependencies: - "@abp/jquery" "^0.3.5" + "@abp/jquery" "^0.4.9" jquery-validation "^1.17.0" -"@abp/jquery@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-0.3.5.tgz#928252246400ed0c5519dcd3d5fca8be471ce11f" +"@abp/jquery@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/jquery/-/jquery-0.4.9.tgz#4033a4e3d6df643babc6baf29cd47ba5519338f0" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" jquery "^3.3.1" -"@abp/lodash@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-0.3.5.tgz#5cc9397b23be9a3f99e2b20db5b3c1af8d01d06b" +"@abp/lodash@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/lodash/-/lodash-0.4.9.tgz#5d30d2d1f6245bf519160d5ba3ce5f4d08e9b48b" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" lodash "^4.17.10" -"@abp/select2@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-0.3.5.tgz#065727e1948fff2d454ced9183ce03f0b01b377f" +"@abp/select2@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/select2/-/select2-0.4.9.tgz#6bbb4d8ffd67876787a400647659f5bb7a1d642d" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" select2 "^4.0.5" -"@abp/sweetalert@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-0.3.5.tgz#399f5daad720dd7187abaa191d58928555a26a8f" +"@abp/sweetalert@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/sweetalert/-/sweetalert-0.4.9.tgz#34cd4f36004229621c454c3d80cc0d2d8d57d42e" dependencies: - "@abp/core" "^0.3.5" + "@abp/core" "^0.4.9" sweetalert "^2.1.0" -"@abp/timeago@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-0.3.5.tgz#c54080833136da6055fac64d4fbab1da637cb821" +"@abp/timeago@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/timeago/-/timeago-0.4.9.tgz#9314bb2c7194636d2dc294ab0b8a07522e26e905" dependencies: - "@abp/jquery" "^0.3.5" + "@abp/jquery" "^0.4.9" timeago "^1.6.3" -"@abp/toastr@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-0.3.5.tgz#3584a92dcac7e0694c45364ed604c11c8e6ef009" +"@abp/toastr@^0.4.9": + version "0.4.9" + resolved "https://registry.yarnpkg.com/@abp/toastr/-/toastr-0.4.9.tgz#c95703330fefb4e9204292970d17d9facebdffb5" dependencies: - "@abp/jquery" "^0.3.5" + "@abp/jquery" "^0.4.9" toastr "^2.1.4" almond@~0.3.1: diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj b/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj index baa40a77a4..6813e17ee6 100644 --- a/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj +++ b/samples/BookStore/test/Acme.BookStore.Application.Tests/Acme.BookStore.Application.Tests.csproj @@ -1,5 +1,7 @@  + + netcoreapp2.2 Acme.BookStore @@ -7,9 +9,9 @@ - - - + + + diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs b/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs index d1fc68319b..102a983013 100644 --- a/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs +++ b/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreApplicationTestModule.cs @@ -53,11 +53,11 @@ namespace Acme.BookStore var connection = new SqliteConnection("Data Source=:memory:"); connection.Open(); - var options = new DbContextOptionsBuilder() + var options = new DbContextOptionsBuilder() .UseSqlite(connection) .Options; - using (var context = new BookStoreDbContext(options)) + using (var context = new BookStoreMigrationsDbContext(options)) { context.GetService().CreateTables(); } diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreTestDataBuilder.cs b/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreTestDataBuilder.cs index d29cad952f..4d31c1d4cb 100644 --- a/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreTestDataBuilder.cs +++ b/samples/BookStore/test/Acme.BookStore.Application.Tests/BookStoreTestDataBuilder.cs @@ -1,5 +1,6 @@ using System; using System.Threading.Tasks; +using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Domain.Repositories; using Volo.Abp.Identity; @@ -9,14 +10,12 @@ namespace Acme.BookStore { public class BookStoreTestDataBuilder : ITransientDependency { - private readonly IIdentityDataSeeder _identityDataSeeder; + private readonly IDataSeeder _dataSeeder; private readonly IRepository _bookRepository; - public BookStoreTestDataBuilder( - IIdentityDataSeeder identityDataSeeder, - IRepository bookRepository) + public BookStoreTestDataBuilder(IDataSeeder dataSeeder, IRepository bookRepository) { - _identityDataSeeder = identityDataSeeder; + _dataSeeder = dataSeeder; _bookRepository = bookRepository; } @@ -27,8 +26,7 @@ namespace Acme.BookStore public async Task BuildInternalAsync() { - await _identityDataSeeder.SeedAsync("1q2w3E*"); - + await _dataSeeder.SeedAsync(); await _bookRepository.InsertAsync( new Book { diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleTest.cs b/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleTest.cs deleted file mode 100644 index b9be986f16..0000000000 --- a/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleTest.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Shouldly; -using Volo.Abp.Identity; -using Xunit; - -namespace Acme.BookStore.Samples -{ - public class SampleTest : BookStoreApplicationTestBase - { - private readonly IIdentityUserAppService _userAppService; - - public SampleTest() - { - _userAppService = ServiceProvider.GetRequiredService(); - } - - [Fact] - public async Task Initial_Data_Should_Contain_Admin_User() - { - var result = await _userAppService.GetListAsync(new GetIdentityUsersInput()); - result.TotalCount.ShouldBeGreaterThan(0); - result.Items.ShouldContain(u => u.UserName == "admin"); - } - } -} diff --git a/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleTests.cs b/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleTests.cs new file mode 100644 index 0000000000..0470eaec1e --- /dev/null +++ b/samples/BookStore/test/Acme.BookStore.Application.Tests/Samples/SampleTests.cs @@ -0,0 +1,59 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using Acme.BookStore.Users; +using Shouldly; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; +using Volo.Abp.Uow; +using Xunit; + +namespace Acme.BookStore.Samples +{ + public class SampleTests : BookStoreApplicationTestBase + { + private readonly IIdentityUserAppService _userAppService; + private readonly IRepository _appUserRepository; + private readonly IUnitOfWorkManager _unitOfWorkManager; + + public SampleTests() + { + _userAppService = ServiceProvider.GetRequiredService(); + _appUserRepository = ServiceProvider.GetRequiredService>(); + _unitOfWorkManager = ServiceProvider.GetRequiredService(); + } + + [Fact] + public async Task Initial_Data_Should_Contain_Admin_User() + { + //Act + var result = await _userAppService.GetListAsync(new GetIdentityUsersInput()); + + //Assert + result.TotalCount.ShouldBeGreaterThan(0); + result.Items.ShouldContain(u => u.UserName == "admin"); + } + + [Fact] + public async Task Should_Query_AppUser() + { + /* Need to manually start Unit Of Work because + * FirstOrDefaultAsync should be executed while db connection / context is available. + */ + using (var uow = _unitOfWorkManager.Begin()) + { + //Act + var adminUser = await _appUserRepository + .Where(u => u.UserName == "admin") + .FirstOrDefaultAsync(); + + //Assert + adminUser.ShouldNotBeNull(); + + await uow.CompleteAsync(); + } + } + } +} diff --git a/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/Acme.BookStore.ConsoleApiClient.csproj b/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/Acme.BookStore.ConsoleApiClient.csproj deleted file mode 100644 index 0972a7878d..0000000000 --- a/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/Acme.BookStore.ConsoleApiClient.csproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - Exe - netcoreapp2.2 - - - - - - - - - - - Always - - - - diff --git a/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/ApiClientDemoService.cs b/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/ApiClientDemoService.cs deleted file mode 100644 index 5aa617da5e..0000000000 --- a/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/ApiClientDemoService.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Threading.Tasks; -using Volo.Abp.Application.Dtos; -using Volo.Abp.DependencyInjection; - -namespace Acme.BookStore.ConsoleApiClient -{ - public class ApiClientDemoService : ITransientDependency - { - private readonly IBookAppService _bookAppService; - - public ApiClientDemoService(IBookAppService bookAppService) - { - _bookAppService = bookAppService; - } - - public async Task RunAsync() - { - //While it seems like a regular method call, it actually calls a remote REST API. - var output = await _bookAppService.GetListAsync(new PagedAndSortedResultRequestDto()); - foreach (var bookDto in output.Items) - { - Console.WriteLine($"[BOOK {bookDto.Id}] Name={bookDto.Name}, Price={bookDto.Price}"); - } - } - } -} diff --git a/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/ConsoleApiClientModule.cs b/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/ConsoleApiClientModule.cs deleted file mode 100644 index 2d2be8b568..0000000000 --- a/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/ConsoleApiClientModule.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Autofac; -using Volo.Abp.Http.Client; -using Volo.Abp.Modularity; - -namespace Acme.BookStore.ConsoleApiClient -{ - [DependsOn( - typeof(AbpAutofacModule), - typeof(AbpHttpClientModule), - typeof(BookStoreApplicationModule) - )] - public class ConsoleApiClientModule : AbpModule - { - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddHttpClientProxies( - typeof(BookStoreApplicationModule).Assembly - ); - } - } -} diff --git a/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/Program.cs b/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/Program.cs deleted file mode 100644 index 2e0ffa25c7..0000000000 --- a/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/Program.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; -using Volo.Abp.Threading; - -namespace Acme.BookStore.ConsoleApiClient -{ - /* Before running this application, ensure that the Acme.BookStore.Web application is running. - */ - class Program - { - static void Main(string[] args) - { - using (var application = AbpApplicationFactory.Create(options => - { - options.UseAutofac(); - })) - { - application.Initialize(); - - using (var scope = application.ServiceProvider.CreateScope()) - { - var demoService = scope.ServiceProvider.GetRequiredService(); - AsyncHelper.RunSync(() => demoService.RunAsync()); - } - - Console.WriteLine("Press ENTER to stop application..."); - Console.ReadLine(); - } - } - } -} diff --git a/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/appsettings.json b/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/appsettings.json deleted file mode 100644 index 1f3cc219b5..0000000000 --- a/samples/BookStore/test/Acme.BookStore.ConsoleApiClient/appsettings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "RemoteServices": { - "Default": { - "BaseUrl": "http://localhost:53929/" - } - } -} \ No newline at end of file diff --git a/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj b/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj index 208552c0a8..263836714f 100644 --- a/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj +++ b/samples/BookStore/test/Acme.BookStore.Web.Tests/Acme.BookStore.Web.Tests.csproj @@ -1,5 +1,7 @@  + + netcoreapp2.2 Exe @@ -15,7 +17,7 @@ - + diff --git a/samples/BookStore/test/Acme.BookStore.Web.Tests/BookStoreWebTestModule.cs b/samples/BookStore/test/Acme.BookStore.Web.Tests/BookStoreWebTestModule.cs index bdd9918069..efae3e3755 100644 --- a/samples/BookStore/test/Acme.BookStore.Web.Tests/BookStoreWebTestModule.cs +++ b/samples/BookStore/test/Acme.BookStore.Web.Tests/BookStoreWebTestModule.cs @@ -4,6 +4,7 @@ using Localization.Resources.AbpUi; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Mvc.ApplicationParts; +using Microsoft.AspNetCore.Mvc.Internal; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Acme.BookStore.Localization.BookStore; @@ -11,6 +12,7 @@ using Acme.BookStore.Menus; using Volo.Abp; using Volo.Abp.Account.Web; using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic; +using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared; using Volo.Abp.AspNetCore.TestBase; using Volo.Abp.Identity.Web; using Volo.Abp.Localization; @@ -84,16 +86,7 @@ namespace Acme.BookStore app.UseRequestLocalization(app.ApplicationServices.GetRequiredService>().Value); - app.UseMvc(routes => - { - routes.MapRoute( - name: "defaultWithArea", - template: "{area}/{controller=Home}/{action=Index}/{id?}"); - - routes.MapRoute( - name: "default", - template: "{controller=Home}/{action=Index}/{id?}"); - }); + app.UseMvcWithDefaultRouteAndArea(); } } } \ No newline at end of file diff --git a/samples/MicroserviceDemo/databases/MsDemo_Identity.zip b/samples/MicroserviceDemo/databases/MsDemo_Identity.zip index f31c9e4f3d..0cba5df02d 100644 Binary files a/samples/MicroserviceDemo/databases/MsDemo_Identity.zip and b/samples/MicroserviceDemo/databases/MsDemo_Identity.zip differ diff --git a/samples/MicroserviceDemo/databases/MsDemo_ProductManagement.zip b/samples/MicroserviceDemo/databases/MsDemo_ProductManagement.zip index 28ed35d8ca..2e722f4eda 100644 Binary files a/samples/MicroserviceDemo/databases/MsDemo_ProductManagement.zip and b/samples/MicroserviceDemo/databases/MsDemo_ProductManagement.zip differ diff --git a/samples/MicroserviceDemo/databases/restore/entrypoint.sh b/samples/MicroserviceDemo/databases/restore/entrypoint.sh index 91de230f78..6a13650271 100644 --- a/samples/MicroserviceDemo/databases/restore/entrypoint.sh +++ b/samples/MicroserviceDemo/databases/restore/entrypoint.sh @@ -25,7 +25,7 @@ done /opt/mssql-tools/bin/sqlcmd \ -S sqlserver -U SA -P $SA_PASSWORD \ -d MsDemo_Identity \ - -Q 'UPDATE IdentityServerClientRedirectUris SET RedirectUri = "http://localhost:51512/signin-oidc" WHERE ClientId = "00265494-2D70-9615-4BD0-39EB2AF3CD33" - UPDATE IdentityServerClientRedirectUris SET RedirectUri = "http://localhost:51513/signin-oidc" WHERE ClientId = "10265494-2D70-9615-4BD0-39EB2AF3CD33" - UPDATE IdentityServerClientPostLogoutRedirectUris SET PostLogoutRedirectUri = "http://localhost:51512/signout-callback-oidc" WHERE ClientId = "00265494-2D70-9615-4BD0-39EB2AF3CD33" - UPDATE IdentityServerClientPostLogoutRedirectUris SET PostLogoutRedirectUri = "http://localhost:51513/signout-callback-oidc" WHERE ClientId = "10265494-2D70-9615-4BD0-39EB2AF3CD33"' \ No newline at end of file + -Q 'UPDATE IdentityServerClientRedirectUris SET RedirectUri = "http://localhost:51512/signin-oidc" WHERE RedirectUri = "http://localhost:51954/signin-oidc" + UPDATE IdentityServerClientRedirectUris SET RedirectUri = "http://localhost:51513/signin-oidc" WHERE RedirectUri = "http://localhost:53435/signin-oidc" + UPDATE IdentityServerClientPostLogoutRedirectUris SET PostLogoutRedirectUri = "http://localhost:51512/signout-callback-oidc" WHERE PostLogoutRedirectUri = "http://localhost:51954/signout-callback-oidc" + UPDATE IdentityServerClientPostLogoutRedirectUris SET PostLogoutRedirectUri = "http://localhost:51513/signout-callback-oidc" WHERE PostLogoutRedirectUri = "http://localhost:53435/signout-callback-oidc"' \ No newline at end of file diff --git a/templates/module/app/MyCompanyName.MyProjectName.DemoApp/DemoAppModule.cs b/templates/module/app/MyCompanyName.MyProjectName.DemoApp/DemoAppModule.cs index 4bf1ab94f8..442ffa7d07 100644 --- a/templates/module/app/MyCompanyName.MyProjectName.DemoApp/DemoAppModule.cs +++ b/templates/module/app/MyCompanyName.MyProjectName.DemoApp/DemoAppModule.cs @@ -115,7 +115,6 @@ namespace MyCompanyName.MyProjectName.DemoApp app.UseAbpRequestLocalization(); app.UseAuditing(); - app.UseMvcWithDefaultRouteAndArea(); using (var scope = context.ServiceProvider.CreateScope()) diff --git a/templates/module/app/MyCompanyName.MyProjectName.DemoApp/Migrations/20190320125012_Initial.Designer.cs b/templates/module/app/MyCompanyName.MyProjectName.DemoApp/Migrations/20190410095748_Initial.Designer.cs similarity index 99% rename from templates/module/app/MyCompanyName.MyProjectName.DemoApp/Migrations/20190320125012_Initial.Designer.cs rename to templates/module/app/MyCompanyName.MyProjectName.DemoApp/Migrations/20190410095748_Initial.Designer.cs index 91a4c096ff..9189ba1c41 100644 --- a/templates/module/app/MyCompanyName.MyProjectName.DemoApp/Migrations/20190320125012_Initial.Designer.cs +++ b/templates/module/app/MyCompanyName.MyProjectName.DemoApp/Migrations/20190410095748_Initial.Designer.cs @@ -10,7 +10,7 @@ using MyCompanyName.MyProjectName.DemoApp; namespace MyCompanyName.MyProjectName.DemoApp.Migrations { [DbContext(typeof(DemoAppDbContext))] - [Migration("20190320125012_Initial")] + [Migration("20190410095748_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/templates/module/app/MyCompanyName.MyProjectName.DemoApp/Migrations/20190320125012_Initial.cs b/templates/module/app/MyCompanyName.MyProjectName.DemoApp/Migrations/20190410095748_Initial.cs similarity index 100% rename from templates/module/app/MyCompanyName.MyProjectName.DemoApp/Migrations/20190320125012_Initial.cs rename to templates/module/app/MyCompanyName.MyProjectName.DemoApp/Migrations/20190410095748_Initial.cs diff --git a/templates/module/app/MyCompanyName.MyProjectName.DemoApp/MyCompanyName.MyProjectName.DemoApp.csproj b/templates/module/app/MyCompanyName.MyProjectName.DemoApp/MyCompanyName.MyProjectName.DemoApp.csproj index 041d6cf9ce..4e019c6d9b 100644 --- a/templates/module/app/MyCompanyName.MyProjectName.DemoApp/MyCompanyName.MyProjectName.DemoApp.csproj +++ b/templates/module/app/MyCompanyName.MyProjectName.DemoApp/MyCompanyName.MyProjectName.DemoApp.csproj @@ -35,8 +35,4 @@ - - - - diff --git a/templates/service/docker-compose.override.yml b/templates/service/docker-compose.override.yml index 6fb4c52fa2..8d583bacd7 100644 --- a/templates/service/docker-compose.override.yml +++ b/templates/service/docker-compose.override.yml @@ -6,10 +6,11 @@ services: - SA_PASSWORD=yourStrong(!)Password - ACCEPT_EULA=Y ports: - - "1433:1433" + - "51599:1433" identity-server: environment: + - ASPNETCORE_URLS=http://0.0.0.0:80 - ConnectionStrings__Default=Server=sqlserver;Database=MyProjectName_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - ConnectionStrings__SqlServerCache=Server=sqlserver;Database=MyProjectName_Cache;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false ports: @@ -17,10 +18,12 @@ services: my-project-name: environment: + - ASPNETCORE_URLS=http://0.0.0.0:80 - ConnectionStrings__Default=Server=sqlserver;Database=MyProjectName_ModuleDb;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - ConnectionStrings__AbpSettingManagement=Server=sqlserver;Database=MyProjectName_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - ConnectionStrings__AbpPermissionManagement=Server=sqlserver;Database=MyProjectName_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - ConnectionStrings__AbpAuditLogging=Server=sqlserver;Database=MyProjectName_Identity;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false - ConnectionStrings__SqlServerCache=Server=sqlserver;Database=MyProjectName_Cache;Trusted_Connection=True;MultipleActiveResultSets=true;User=sa;Password=yourStrong(!)Password;Integrated Security=false + - AuthServer__Authority=http://identity-server ports: - "51601:80" \ No newline at end of file diff --git a/templates/service/host/IdentityServerHost/Migrations/20190320142333_Initial.Designer.cs b/templates/service/host/IdentityServerHost/Migrations/20190410095119_Initial.Designer.cs similarity index 93% rename from templates/service/host/IdentityServerHost/Migrations/20190320142333_Initial.Designer.cs rename to templates/service/host/IdentityServerHost/Migrations/20190410095119_Initial.Designer.cs index 8ef18c7e12..edb0c5cedf 100644 --- a/templates/service/host/IdentityServerHost/Migrations/20190320142333_Initial.Designer.cs +++ b/templates/service/host/IdentityServerHost/Migrations/20190410095119_Initial.Designer.cs @@ -10,7 +10,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace IdentityServerHost.Migrations { [DbContext(typeof(DemoAppDbContext))] - [Migration("20190320142333_Initial")] + [Migration("20190410095119_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -84,6 +84,8 @@ namespace IdentityServerHost.Migrations b.Property("TenantId") .HasColumnName("TenantId"); + b.Property("TenantName"); + b.Property("Url") .HasColumnName("Url") .HasMaxLength(256); @@ -163,6 +165,8 @@ namespace IdentityServerHost.Migrations .HasColumnName("EntityId") .HasMaxLength(128); + b.Property("EntityTenantId"); + b.Property("EntityTypeFullName") .IsRequired() .HasColumnName("EntityTypeFullName") @@ -522,6 +526,18 @@ namespace IdentityServerHost.Migrations b.Property("ConcurrencyStamp"); + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + b.Property("Description") .HasMaxLength(1000); @@ -533,6 +549,17 @@ namespace IdentityServerHost.Migrations b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + b.Property("Name") .IsRequired() .HasMaxLength(200); @@ -660,6 +687,18 @@ namespace IdentityServerHost.Migrations b.Property("ConsentLifetime"); + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + b.Property("Description") .HasMaxLength(1000); @@ -679,6 +718,17 @@ namespace IdentityServerHost.Migrations b.Property("IncludeJwtId"); + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + b.Property("LogoUri") .HasMaxLength(300); @@ -890,6 +940,18 @@ namespace IdentityServerHost.Migrations b.Property("ConcurrencyStamp"); + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + b.Property("Description") .HasMaxLength(1000); @@ -903,6 +965,17 @@ namespace IdentityServerHost.Migrations b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + b.Property("Name") .IsRequired() .HasMaxLength(200); diff --git a/templates/service/host/IdentityServerHost/Migrations/20190320142333_Initial.cs b/templates/service/host/IdentityServerHost/Migrations/20190410095119_Initial.cs similarity index 96% rename from templates/service/host/IdentityServerHost/Migrations/20190320142333_Initial.cs rename to templates/service/host/IdentityServerHost/Migrations/20190410095119_Initial.cs index 88588fb970..b90275e883 100644 --- a/templates/service/host/IdentityServerHost/Migrations/20190320142333_Initial.cs +++ b/templates/service/host/IdentityServerHost/Migrations/20190410095119_Initial.cs @@ -18,6 +18,7 @@ namespace IdentityServerHost.Migrations UserId = table.Column(nullable: true), UserName = table.Column(maxLength: 256, nullable: true), TenantId = table.Column(nullable: true), + TenantName = table.Column(nullable: true), ImpersonatorUserId = table.Column(nullable: true), ImpersonatorTenantId = table.Column(nullable: true), ExecutionTime = table.Column(nullable: false), @@ -150,6 +151,13 @@ namespace IdentityServerHost.Migrations Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), ConcurrencyStamp = table.Column(nullable: true), + CreationTime = table.Column(nullable: false), + CreatorId = table.Column(nullable: true), + LastModificationTime = table.Column(nullable: true), + LastModifierId = table.Column(nullable: true), + IsDeleted = table.Column(nullable: false, defaultValue: false), + DeleterId = table.Column(nullable: true), + DeletionTime = table.Column(nullable: true), Name = table.Column(maxLength: 200, nullable: false), DisplayName = table.Column(maxLength: 200, nullable: true), Description = table.Column(maxLength: 1000, nullable: true), @@ -167,6 +175,13 @@ namespace IdentityServerHost.Migrations Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), ConcurrencyStamp = table.Column(nullable: true), + CreationTime = table.Column(nullable: false), + CreatorId = table.Column(nullable: true), + LastModificationTime = table.Column(nullable: true), + LastModifierId = table.Column(nullable: true), + IsDeleted = table.Column(nullable: false, defaultValue: false), + DeleterId = table.Column(nullable: true), + DeletionTime = table.Column(nullable: true), ClientId = table.Column(maxLength: 200, nullable: false), ClientName = table.Column(maxLength: 200, nullable: true), Description = table.Column(maxLength: 1000, nullable: true), @@ -214,6 +229,13 @@ namespace IdentityServerHost.Migrations Id = table.Column(nullable: false), ExtraProperties = table.Column(nullable: true), ConcurrencyStamp = table.Column(nullable: true), + CreationTime = table.Column(nullable: false), + CreatorId = table.Column(nullable: true), + LastModificationTime = table.Column(nullable: true), + LastModifierId = table.Column(nullable: true), + IsDeleted = table.Column(nullable: false, defaultValue: false), + DeleterId = table.Column(nullable: true), + DeletionTime = table.Column(nullable: true), Name = table.Column(maxLength: 200, nullable: false), DisplayName = table.Column(maxLength: 200, nullable: true), Description = table.Column(maxLength: 1000, nullable: true), @@ -281,6 +303,7 @@ namespace IdentityServerHost.Migrations TenantId = table.Column(nullable: true), ChangeTime = table.Column(nullable: false), ChangeType = table.Column(nullable: false), + EntityTenantId = table.Column(nullable: true), EntityId = table.Column(maxLength: 128, nullable: false), EntityTypeFullName = table.Column(maxLength: 128, nullable: false), ExtraProperties = table.Column(nullable: true) diff --git a/templates/service/host/IdentityServerHost/Migrations/DemoAppDbContextModelSnapshot.cs b/templates/service/host/IdentityServerHost/Migrations/DemoAppDbContextModelSnapshot.cs index 1aec48ea05..3b63d152aa 100644 --- a/templates/service/host/IdentityServerHost/Migrations/DemoAppDbContextModelSnapshot.cs +++ b/templates/service/host/IdentityServerHost/Migrations/DemoAppDbContextModelSnapshot.cs @@ -82,6 +82,8 @@ namespace IdentityServerHost.Migrations b.Property("TenantId") .HasColumnName("TenantId"); + b.Property("TenantName"); + b.Property("Url") .HasColumnName("Url") .HasMaxLength(256); @@ -161,6 +163,8 @@ namespace IdentityServerHost.Migrations .HasColumnName("EntityId") .HasMaxLength(128); + b.Property("EntityTenantId"); + b.Property("EntityTypeFullName") .IsRequired() .HasColumnName("EntityTypeFullName") @@ -520,6 +524,18 @@ namespace IdentityServerHost.Migrations b.Property("ConcurrencyStamp"); + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + b.Property("Description") .HasMaxLength(1000); @@ -531,6 +547,17 @@ namespace IdentityServerHost.Migrations b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + b.Property("Name") .IsRequired() .HasMaxLength(200); @@ -658,6 +685,18 @@ namespace IdentityServerHost.Migrations b.Property("ConsentLifetime"); + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + b.Property("Description") .HasMaxLength(1000); @@ -677,6 +716,17 @@ namespace IdentityServerHost.Migrations b.Property("IncludeJwtId"); + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + b.Property("LogoUri") .HasMaxLength(300); @@ -888,6 +938,18 @@ namespace IdentityServerHost.Migrations b.Property("ConcurrencyStamp"); + b.Property("CreationTime") + .HasColumnName("CreationTime"); + + b.Property("CreatorId") + .HasColumnName("CreatorId"); + + b.Property("DeleterId") + .HasColumnName("DeleterId"); + + b.Property("DeletionTime") + .HasColumnName("DeletionTime"); + b.Property("Description") .HasMaxLength(1000); @@ -901,6 +963,17 @@ namespace IdentityServerHost.Migrations b.Property("ExtraProperties") .HasColumnName("ExtraProperties"); + b.Property("IsDeleted") + .ValueGeneratedOnAdd() + .HasColumnName("IsDeleted") + .HasDefaultValue(false); + + b.Property("LastModificationTime") + .HasColumnName("LastModificationTime"); + + b.Property("LastModifierId") + .HasColumnName("LastModifierId"); + b.Property("Name") .IsRequired() .HasMaxLength(200); diff --git a/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190320142412_Initial.Designer.cs b/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190410095222_Initial.Designer.cs similarity index 98% rename from templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190320142412_Initial.Designer.cs rename to templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190410095222_Initial.Designer.cs index 423eb1cb0a..4803948516 100644 --- a/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190320142412_Initial.Designer.cs +++ b/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190410095222_Initial.Designer.cs @@ -10,7 +10,7 @@ using MyCompanyName.MyProjectName.Host; namespace MyCompanyName.MyProjectName.Host.Migrations { [DbContext(typeof(DemoAppDbContext))] - [Migration("20190320142412_Initial")] + [Migration("20190410095222_Initial")] partial class Initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -84,6 +84,8 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.Property("TenantId") .HasColumnName("TenantId"); + b.Property("TenantName"); + b.Property("Url") .HasColumnName("Url") .HasMaxLength(256); @@ -163,6 +165,8 @@ namespace MyCompanyName.MyProjectName.Host.Migrations .HasColumnName("EntityId") .HasMaxLength(128); + b.Property("EntityTenantId"); + b.Property("EntityTypeFullName") .IsRequired() .HasColumnName("EntityTypeFullName") diff --git a/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190320142412_Initial.cs b/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190410095222_Initial.cs similarity index 98% rename from templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190320142412_Initial.cs rename to templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190410095222_Initial.cs index b2074c3513..ecef8c8f9a 100644 --- a/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190320142412_Initial.cs +++ b/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/20190410095222_Initial.cs @@ -18,6 +18,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations UserId = table.Column(nullable: true), UserName = table.Column(maxLength: 256, nullable: true), TenantId = table.Column(nullable: true), + TenantName = table.Column(nullable: true), ImpersonatorUserId = table.Column(nullable: true), ImpersonatorTenantId = table.Column(nullable: true), ExecutionTime = table.Column(nullable: false), @@ -102,6 +103,7 @@ namespace MyCompanyName.MyProjectName.Host.Migrations TenantId = table.Column(nullable: true), ChangeTime = table.Column(nullable: false), ChangeType = table.Column(nullable: false), + EntityTenantId = table.Column(nullable: true), EntityId = table.Column(maxLength: 128, nullable: false), EntityTypeFullName = table.Column(maxLength: 128, nullable: false), ExtraProperties = table.Column(nullable: true) diff --git a/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/DemoAppDbContextModelSnapshot.cs b/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/DemoAppDbContextModelSnapshot.cs index ffe92c9c59..b6682a0c1c 100644 --- a/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/DemoAppDbContextModelSnapshot.cs +++ b/templates/service/host/MyCompanyName.MyProjectName.Host/Migrations/DemoAppDbContextModelSnapshot.cs @@ -82,6 +82,8 @@ namespace MyCompanyName.MyProjectName.Host.Migrations b.Property("TenantId") .HasColumnName("TenantId"); + b.Property("TenantName"); + b.Property("Url") .HasColumnName("Url") .HasMaxLength(256); @@ -161,6 +163,8 @@ namespace MyCompanyName.MyProjectName.Host.Migrations .HasColumnName("EntityId") .HasMaxLength(128); + b.Property("EntityTenantId"); + b.Property("EntityTypeFullName") .IsRequired() .HasColumnName("EntityTypeFullName")