pull/1600/head
mehmet-erim 6 years ago
commit 69a6f558c8

@ -49,14 +49,14 @@ abp new Acme.BookStore
* `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers:
* `ef`: Entity Framework Core.
* `mongodb`: MongoDB.
* `mvc-module`: ASP.NET Core [module template](Startup-Templates/Mvc-Module.md). Additional options:
* `module`: [Module template](Startup-Templates/Module.md). Additional options:
* `--no-ui`: Specifies to not include the UI. This makes possible to create service-only modules (a.k.a. microservices - without UI).
* `--output-folder` or `-o`: Specifies the output folder. Default value is the current directory.
* `--version` or `-v`: Specifies the ABP & template version. It can be a [release tag](https://github.com/abpframework/abp/releases) or a [branch name](https://github.com/abpframework/abp/branches). Uses the latest release if not specified. Most of the times, you will want to use the latest version.
### add-package
Adds a new ABP package to a project by,
Adds an ABP package to a project by,
* Adding related nuget package as a dependency to the project.
* Adding `[DependsOn(...)]` attribute to the module class in the project (see the [module development document](Module-Development-Basics.md)).
@ -83,9 +83,9 @@ abp add-package Volo.Abp.MongoDB
### add-module
Adds a multi-package module to a solution by finding all packages of the module, finding related projects in the solution and adding each package to the corresponding project in the solution.
Adds a [multi-package application module](Modules/Index) to a solution by finding all packages of the module, finding related projects in the solution and adding each package to the corresponding project in the solution.
> A business module generally consists of several packages (because of layering, different database providr options or other reasons). Using `add-module` command dramatically simplifies adding a module to a solution. However, each module may require some additional configurations which is generally indicated in the documentation of the related module.
> A business module generally consists of several packages (because of layering, different database provider options or other reasons). Using `add-module` command dramatically simplifies adding a module to a solution. However, each module may require some additional configurations which is generally indicated in the documentation of the related module.
Basic usage:
@ -105,6 +105,7 @@ abp add-module Volo.Blogging
* `--solution` or `-s`: Specifies the solution (.sln) file path. If not specified, CLI tries to find a .sln file in the current directory.
* `--skip-db-migrations`: For EF Core database provider, it automatically adds a new code first migration (`Add-Migration`) and updates the database (`Update-Database`) if necessary. Specify this option to skip this operation.
* `-sp` or `--startup-project`: Relative path to the project folder of the startup project. Default value is the current folder.
### update

@ -3,7 +3,7 @@
While you can start with an empty project and add needed packages manually, startup templates make easy and comfortable to start a new solution with the ABP framework. Click the name from the list below to see the documentation of the related startup template:
* [**app**](Application.md): Application template.
* [**mvc-module**](Mvc-Module.md): Module/service template.
* [**module**](Module.md): Module/service template.

@ -15,14 +15,14 @@ dotnet tool install -g Volo.Abp.Cli
Then use the `abp new` command in an empty folder to create a new solution:
```bash
abp new Acme.IssueManagement -t mvc-module
abp new Acme.IssueManagement -t module
```
- `Acme.IssueManagement` is the solution name, like *YourCompany.YourProduct*. You can use single level, two-levels or three-levels naming.
### Without User Interface
The template comes with a UI by default. You can use `--no-ui` option to not include the UI layer.
The template comes with an MVC UI by default. You can use `--no-ui` option to not include the UI layer.
````bash
abp new Acme.IssueManagement -t mvc-module --no-ui
@ -119,7 +119,7 @@ You can still create unit tests for your classes which will be harder to write (
### Host Projects
The solution has a few host applications to run your module on development. Host applications are used to run your module in a fully configured application. It is useful on development. Host applications includes some other modules in addition to the module being developed:
The solution has a few host applications to run your module. Host applications are used to run your module in a fully configured application. It is useful on development. Host applications includes some other modules in addition to the module being developed:
Host applications support two types of scenarios.

@ -12,6 +12,8 @@ This is the first part of the ASP.NET Core MVC tutorial series. See all parts:
You can access to the **source code** of the application from [the GitHub repository](https://github.com/abpframework/abp/tree/master/samples/BookStore).
> You can also watch [this video course](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) prepared by an ABP community member, based on this tutorial.
### Creating the Project
Create a new project named `Acme.BookStore`, create the database and run the application by following the [Getting Started document](../../Getting-Started-AspNetCore-MVC-Template.md).
@ -98,7 +100,7 @@ Open `BookStoreDbContextModelCreatingExtensions.cs` file in the `Acme.BookStore.
builder.Entity<Book>(b =>
{
b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema);
b.ConfigureAuditedAggregateRoot(); //auto configure for the base class props
b.ConfigureByConvention(); //auto configure for the base class props
b.Property(x => x.Name).IsRequired().HasMaxLength(128);
});
````

@ -10,6 +10,8 @@ This is the second part of the ASP.NET Core MVC tutorial series. See all parts:
You can access to the **source code** of the application from [the GitHub repository](https://github.com/volosoft/abp/tree/master/samples/BookStore).
> You can also watch [this video course](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) prepared by an ABP community member, based on this tutorial.
### Creating a New Book
In this section, you will learn how to create a new modal dialog form to create a new book. The result dialog will be like that:

@ -10,6 +10,8 @@ This is the third part of the ASP.NET Core MVC tutorial series. See all parts:
You can access to the **source code** of the application from [the GitHub repository](https://github.com/volosoft/abp/tree/master/samples/BookStore).
> You can also watch [this video course](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) prepared by an ABP community member, based on this tutorial.
### Test Projects in the Solution
There are multiple test projects in the solution:

@ -0,0 +1,12 @@
using Microsoft.AspNetCore.Cors.Infrastructure;
namespace Microsoft.AspNetCore.Cors
{
public static class AbpCorsPolicyBuilderExtensions
{
public static CorsPolicyBuilder WithAbpExposedHeaders(this CorsPolicyBuilder corsPolicyBuilder)
{
return corsPolicyBuilder.WithExposedHeaders("_AbpErrorFormat");
}
}
}

@ -32,6 +32,7 @@
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Localization" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Cors" Version="2.2.0" />
</ItemGroup>
</Project>

@ -133,8 +133,8 @@ namespace Volo.Abp.Cli.Commands
sb.AppendLine(" abp new Acme.BookStore -u angular -d mongodb");
sb.AppendLine(" abp new Acme.BookStore -d mongodb");
sb.AppendLine(" abp new Acme.BookStore -d mongodb -o d:\\my-project");
sb.AppendLine(" abp new Acme.BookStore -t mvc-module");
sb.AppendLine(" abp new Acme.BookStore -t mvc-module no-ui");
sb.AppendLine(" abp new Acme.BookStore -t module");
sb.AppendLine(" abp new Acme.BookStore -t module no-ui");
sb.AppendLine("");
sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI");

@ -19,8 +19,8 @@ namespace Volo.Abp.Cli.ProjectBuilding
{
case AppTemplate.TemplateName:
return new AppTemplate();
case MvcModuleTemplate.TemplateName:
return new MvcModuleTemplate();
case ModuleTemplate.TemplateName:
return new ModuleTemplate();
default:
throw new Exception("There is no template found with given name: " + name);
}

@ -65,7 +65,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep());
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44303"));
}
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds"));
@ -87,6 +87,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer"));
steps.Add(new AppTemplateProjectRenameStep("MyCompanyName.MyProjectName.HttpApi.HostWithIds", "MyCompanyName.MyProjectName.HttpApi.Host"));
steps.Add(new AppTemplateChangeConsoleTestClientPortSettingsStep("44305"));
}
}

@ -5,12 +5,25 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
{
public class AppTemplateChangeConsoleTestClientPortSettingsStep : ProjectBuildPipelineStep
{
public string RemoteServicePort { get; }
public string IdentityServerPort { get; }
/// <param name="remoteServicePort"></param>
/// <param name="identityServerPort">Assumed same as the <paramref name="remoteServicePort"/> if leaved as null.</param>
public AppTemplateChangeConsoleTestClientPortSettingsStep(
string remoteServicePort,
string identityServerPort = null)
{
RemoteServicePort = remoteServicePort;
IdentityServerPort = identityServerPort ?? remoteServicePort;
}
public override void Execute(ProjectBuildContext context)
{
context
.GetFile("/aspnet-core/test/MyCompanyName.MyProjectName.HttpApi.Client.ConsoleTestApp/appsettings.json")
.ReplaceText("44395", "44361")
.ReplaceText("44348", "44361");
.ReplaceText("44300", RemoteServicePort)
.ReplaceText("44301", IdentityServerPort);
}
}
}

@ -76,6 +76,29 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
"/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json"
);
//MyCompanyName.MyProjectName.HttpApi.HostWithIds
ChangeProjectReference(
context,
"/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyCompanyName.MyProjectName.HttpApi.HostWithIds.csproj",
"EntityFrameworkCore.DbMigrations",
"MongoDB"
);
ChangeModuleDependency(
context,
"/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/MyProjectNameHttpApiHostModule.cs",
"MyCompanyName.MyProjectName.EntityFrameworkCore",
"MyCompanyName.MyProjectName.MongoDB",
"MyProjectNameEntityFrameworkCoreDbMigrationsModule",
"MyProjectNameMongoDbModule"
);
ChangeConnectionStringToMongoDb(
context,
"/aspnet-core/src/MyCompanyName.MyProjectName.HttpApi.HostWithIds/appsettings.json"
);
//MyCompanyName.MyProjectName.DbMigrator
ChangeProjectReference(

@ -4,17 +4,17 @@ using Volo.Abp.Cli.ProjectBuilding.Building.Steps;
namespace Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule
{
public class MvcModuleTemplate : TemplateInfo
public class ModuleTemplate : TemplateInfo
{
/// <summary>
/// "mvc-module".
/// "module".
/// </summary>
public const string TemplateName = "mvc-module";
public const string TemplateName = "module";
public MvcModuleTemplate()
public ModuleTemplate()
: base(TemplateName)
{
DocumentUrl = "https://docs.abp.io/en/abp/latest/Startup-Templates/Mvc-Module";
DocumentUrl = "https://docs.abp.io/en/abp/latest/Startup-Templates/Module";
}
public override IEnumerable<ProjectBuildPipelineStep> GetCustomSteps(ProjectBuildContext context)
@ -22,14 +22,8 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule
var steps = new List<ProjectBuildPipelineStep>();
DeleteUnrelatedProjects(context, steps);
steps.Add(new TemplateRandomSslPortStep(new List<string>
{
"https://localhost:44300",
"https://localhost:44301",
"https://localhost:44302",
"https://localhost:44303"
}));
RandomizeSslPorts(context, steps);
CleanupFolderHierarchy(context, steps);
return steps;
}
@ -44,14 +38,30 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule
steps.Add(new RemoveProjectFromSolutionStep(
"MyCompanyName.MyProjectName.Web.Host",
projectFolderPath: "/host/MyCompanyName.MyProjectName.Web.Host"
projectFolderPath: "/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host"
));
steps.Add(new RemoveProjectFromSolutionStep(
"MyCompanyName.MyProjectName.Web.Unified",
projectFolderPath: "/host/MyCompanyName.MyProjectName.Web.Unified"
projectFolderPath: "/aspnet-core/host/MyCompanyName.MyProjectName.Web.Unified"
));
}
}
private void RandomizeSslPorts(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new TemplateRandomSslPortStep(new List<string>
{
"https://localhost:44300",
"https://localhost:44301",
"https://localhost:44302",
"https://localhost:44303"
}));
}
private void CleanupFolderHierarchy(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new MoveFolderStep("/aspnet-core/", "/"));
}
}
}

@ -201,7 +201,6 @@ namespace Volo.Docs.Pages.Documents.Project
{
LatestVersionInfo = versions.First();
LatestVersionInfo.DisplayText = $"{LatestVersionInfo.DisplayText} ({DocsAppConsts.Latest})";
LatestVersionInfo.Version = LatestVersionInfo.Version;
if (string.Equals(Version, DocsAppConsts.Latest, StringComparison.OrdinalIgnoreCase))
{

@ -1,174 +0,0 @@
body {
padding-top: unset;
}
#main-navbar-tools a.dropdown-toggle {
text-decoration: unset;
color: unset;
}
#docsContainer .document-title {
font-size: 2.5em;
}
#docsContainer .document-toolbar {
margin-bottom: 1.5em;
}
@supports (position: sticky) {
#docsContainer .bd-toc {
top: 0rem !important;
}
}
@supports (position: sticky) {
#docsContainer .bd-sidebar {
top: 0;
/*height: calc(~"100vh");*/
}
@media (min-width: 768px) {
#docsContainer .bd-sidebar {
height: calc(100vh);
}
}
}
#docsContainer .bd-sidebar .flat {
border-color: #BBBBBB;
border: 1px solid #BBB;
border-radius: 0;
-webkit-box-shadow: none;
/* box-shadow:inset 0 1px 1px rgba(0,0,0,.075); */
-webkit-transition: none;
-o-transition: none;
transition: none;
}
#docsContainer .bd-sidebar .document-version {
margin-top: 10px;
padding-left: 15px;
padding-right: 15px;
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
margin-right: -15px;
margin-left: -15px;
}
#docsContainer .bd-sidebar .document-version > .form-group {
margin-bottom: 10px;
}
#docsContainer .bd-sidebar .bd-links.collapse.in {
display: block;
}
@supports ((position: -webkit-sticky) or (position:sticky)) {
#docsContainer .bd-toc {
height: calc(100vh);
}
}
#docsContainer .nav {
display: block;
border-left: 1px solid #eee;
}
#docsContainer main.bd-content div.top-toc p.toc-ticle {
font-weight: 500;
margin: 0;
}
#docsContainer main.bd-content div.top-toc .nav {
margin-left: 0 !important;
}
#docsContainer main.bd-content div.top-toc nav.toc-navigaton {
margin-bottom: 10px;
}
#docsContainer main.bd-content .img-thumbnail {
padding: 0;
border: 1px solid #dee2e6;
border-radius: 0.25rem;
}
#docsContainer main.bd-content img {
max-width: 100%;
display: inline-block;
min-width: 48px;
min-height: 48px;
background-repeat: no-repeat;
background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDhweCIgIGhlaWdodD0iNDhweCIgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiBjbGFzcz0ibGRzLXNxdWFyZSIgc3R5bGU9ImJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMCkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDAlOyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAgMjApIj48cmVjdCB4PSItMTUiIHk9Ii0xNSIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjMWQzZjcyIj48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InNjYWxlIiBjYWxjTW9kZT0ic3BsaW5lIiB2YWx1ZXM9IjE7MTswLjI7MTsxIiBrZXlUaW1lcz0iMDswLjI7MC41OzAuODsxIiBkdXI9IjJzIiBrZXlTcGxpbmVzPSIwLjUgMC41IDAuNSAwLjU7MCAwLjEgMC45IDE7MC4xIDAgMSAwLjk7MC41IDAuNSAwLjUgMC41IiBiZWdpbj0iLTAuOHMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIj48L2FuaW1hdGVUcmFuc2Zvcm0+PC9yZWN0PjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MCAyMCkiPjxyZWN0IHg9Ii0xNSIgeT0iLTE1IiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIGZpbGw9IiM1Njk5ZDIiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0ic2NhbGUiIGNhbGNNb2RlPSJzcGxpbmUiIHZhbHVlcz0iMTsxOzAuMjsxOzEiIGtleVRpbWVzPSIwOzAuMjswLjU7MC44OzEiIGR1cj0iMnMiIGtleVNwbGluZXM9IjAuNSAwLjUgMC41IDAuNTswIDAuMSAwLjkgMTswLjEgMCAxIDAuOTswLjUgMC41IDAuNSAwLjUiIGJlZ2luPSItMC42cyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiPjwvYW5pbWF0ZVRyYW5zZm9ybT48L3JlY3Q+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgwIDIwKSI+PHJlY3QgeD0iLTE1IiB5PSItMTUiIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCIgZmlsbD0iI2Q4ZWJmOSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJzY2FsZSIgY2FsY01vZGU9InNwbGluZSIgdmFsdWVzPSIxOzE7MC4yOzE7MSIga2V5VGltZXM9IjA7MC4yOzAuNTswLjg7MSIgZHVyPSIycyIga2V5U3BsaW5lcz0iMC41IDAuNSAwLjUgMC41OzAgMC4xIDAuOSAxOzAuMSAwIDEgMC45OzAuNSAwLjUgMC41IDAuNSIgYmVnaW49Ii0wLjRzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvcmVjdD48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAgNTApIj48cmVjdCB4PSItMTUiIHk9Ii0xNSIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjNTY5OWQyIj48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InNjYWxlIiBjYWxjTW9kZT0ic3BsaW5lIiB2YWx1ZXM9IjE7MTswLjI7MTsxIiBrZXlUaW1lcz0iMDswLjI7MC41OzAuODsxIiBkdXI9IjJzIiBrZXlTcGxpbmVzPSIwLjUgMC41IDAuNSAwLjU7MCAwLjEgMC45IDE7MC4xIDAgMSAwLjk7MC41IDAuNSAwLjUgMC41IiBiZWdpbj0iLTAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIj48L2FuaW1hdGVUcmFuc2Zvcm0+PC9yZWN0PjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MCA1MCkiPjxyZWN0IHg9Ii0xNSIgeT0iLTE1IiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIGZpbGw9IiNkOGViZjkiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0ic2NhbGUiIGNhbGNNb2RlPSJzcGxpbmUiIHZhbHVlcz0iMTsxOzAuMjsxOzEiIGtleVRpbWVzPSIwOzAuMjswLjU7MC44OzEiIGR1cj0iMnMiIGtleVNwbGluZXM9IjAuNSAwLjUgMC41IDAuNTswIDAuMSAwLjkgMTswLjEgMCAxIDAuOTswLjUgMC41IDAuNSAwLjUiIGJlZ2luPSItMC40cyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiPjwvYW5pbWF0ZVRyYW5zZm9ybT48L3JlY3Q+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgwIDUwKSI+PHJlY3QgeD0iLTE1IiB5PSItMTUiIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCIgZmlsbD0iIzcxYzJjYyI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJzY2FsZSIgY2FsY01vZGU9InNwbGluZSIgdmFsdWVzPSIxOzE7MC4yOzE7MSIga2V5VGltZXM9IjA7MC4yOzAuNTswLjg7MSIgZHVyPSIycyIga2V5U3BsaW5lcz0iMC41IDAuNSAwLjUgMC41OzAgMC4xIDAuOSAxOzAuMSAwIDEgMC45OzAuNSAwLjUgMC41IDAuNSIgYmVnaW49Ii0wLjJzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvcmVjdD48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAgODApIj48cmVjdCB4PSItMTUiIHk9Ii0xNSIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZDhlYmY5Ij48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InNjYWxlIiBjYWxjTW9kZT0ic3BsaW5lIiB2YWx1ZXM9IjE7MTswLjI7MTsxIiBrZXlUaW1lcz0iMDswLjI7MC41OzAuODsxIiBkdXI9IjJzIiBrZXlTcGxpbmVzPSIwLjUgMC41IDAuNSAwLjU7MCAwLjEgMC45IDE7MC4xIDAgMSAwLjk7MC41IDAuNSAwLjUgMC41IiBiZWdpbj0iLTAuNHMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIj48L2FuaW1hdGVUcmFuc2Zvcm0+PC9yZWN0PjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MCA4MCkiPjxyZWN0IHg9Ii0xNSIgeT0iLTE1IiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIGZpbGw9IiM3MWMyY2MiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0ic2NhbGUiIGNhbGNNb2RlPSJzcGxpbmUiIHZhbHVlcz0iMTsxOzAuMjsxOzEiIGtleVRpbWVzPSIwOzAuMjswLjU7MC44OzEiIGR1cj0iMnMiIGtleVNwbGluZXM9IjAuNSAwLjUgMC41IDAuNTswIDAuMSAwLjkgMTswLjEgMCAxIDAuOTswLjUgMC41IDAuNSAwLjUiIGJlZ2luPSItMC4ycyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiPjwvYW5pbWF0ZVRyYW5zZm9ybT48L3JlY3Q+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgwIDgwKSI+PHJlY3QgeD0iLTE1IiB5PSItMTUiIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCIgZmlsbD0iIzQ5OTZhMiI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJzY2FsZSIgY2FsY01vZGU9InNwbGluZSIgdmFsdWVzPSIxOzE7MC4yOzE7MSIga2V5VGltZXM9IjA7MC4yOzAuNTswLjg7MSIgZHVyPSIycyIga2V5U3BsaW5lcz0iMC41IDAuNSAwLjUgMC41OzAgMC4xIDAuOSAxOzAuMSAwIDEgMC45OzAuNSAwLjUgMC41IDAuNSIgYmVnaW49IjBzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvcmVjdD48L2c+PC9zdmc+);
background-position: center;
-ms-background-position: center;
border: 1px solid #dee2e6;
border-radius: 0.25rem;
opacity: 0.4;
-webkit-transition: opacity 0.4s ease-in;
-moz-transition: opacity 0.4s ease-in;
-o-transition: opacity 0.4s ease-in;
transition: opacity 0.4s ease-in;
}
#docsContainer main.bd-content .cs {
color: inherit;
}
#docsContainer main.bd-content pre.hljs {
background-color: #fbfbfb !important;
}
#docsContainer main.bd-content pre[class*="language-"] {
margin-top: 0;
margin-bottom: 1rem;
padding: 0.5em;
}
#docsContainer main.bd-content .code-header {
background-color: #f5f5f5;
color: #707070;
border: 1px solid #ddd;
border-bottom: 0;
text-align: right;
}
#docsContainer main.bd-content .code-header button {
background-color: #ededed;
border: 0;
}
#docsContainer main.bd-content .code-header button:hover {
background-color: #d5d5d5;
}
#docsContainer main.bd-content .code-header button.copy {
border-left: 1px solid #ddd;
}
#docsContainer main.bd-content .code-header button.copy::before {
background-size: 15px auto;
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath fill='%23707070' d='M13 6.8V14H4v-3H0V0h5.2l3 3h1L13 6.8zM4 3h2.8l-2-2H1v9h3V3zm8 5H8V4H5v9h7V8zM9 7h2.8L9 4.2V7z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position-y: 4px;
padding-right: 17px;
content: "";
}
#docsContainer nav.bd-links {
padding: 15px;
}
#docsContainer nav.bd-links h3 {
font-size: 1em;
margin-top: 8px;
padding-bottom: 5px;
border-bottom: 1px solid #eee;
}
#docsContainer nav.bd-links p {
font-size: 1em;
font-weight: 400;
margin: 0 0 0 5px;
}
#docsContainer nav.bd-links ul {
list-style-type: none;
margin: 0;
line-height: inherit;
}
#docsContainer nav.bd-links ul li a {
word-wrap: break-word;
display: block;
padding: 0.2rem 0.1rem 0.2rem 1rem;
font-size: 90%;
color: #28c;
}
#docsContainer b,
#docsContainer strong {
font-weight: 500;
}
#docsContainer nav[data-toggle='toc'] .nav {
flex-direction: column;
}
#docsContainer nav[data-toggle='toc'] .nav > .active > a,
#docsContainer nav[data-toggle='toc'] .nav > .active:hover > a,
#docsContainer nav[data-toggle='toc'] .nav > .active:focus > a {
color: #28c;
border-left: 2px solid #28c;
}
#docsContainer nav[data-toggle='toc'] .nav > li > a:hover,
#docsContainer nav[data-toggle='toc'] .nav > li > a:focus {
color: #28c;
border-left: 1px solid #28c;
}

@ -1,219 +0,0 @@
body {
padding-top: unset;
}
#main-navbar-tools a.dropdown-toggle {
text-decoration: unset;
color: unset;
}
#docsContainer {
.document-title {
font-size: 2.5em;
}
.document-toolbar {
margin-bottom: 1.5em;
}
.bd-toc {
@supports
(position: sticky) {
top: 0rem !important
}
}
.bd-sidebar {
@supports
(position: sticky) {
top: 0;
/*height: calc(~"100vh");*/
@media (min-width: 768px) {
height: calc(~"100vh");
}
}
.flat {
border-color: #BBBBBB;
border: 1px solid #BBB;
border-radius: 0;
-webkit-box-shadow: none;
/* box-shadow:inset 0 1px 1px rgba(0,0,0,.075); */
-webkit-transition: none;
-o-transition: none;
transition: none;
}
.document-version {
margin-top: 10px;
padding-left: 15px;
padding-right: 15px;
border-bottom: 1px solid rgba(0,0,0,.05);
margin-right: -15px;
margin-left: -15px;
> .form-group {
margin-bottom: 10px;
}
}
.bd-links.collapse.in {
display: block;
}
}
@supports
((position: -webkit-sticky) or (position:sticky)) {
.bd-toc {
height: calc(100vh);
}
}
.nav {
display: block;
border-left: 1px solid #eee;
}
main.bd-content {
div.top-toc {
p.toc-ticle {
font-weight: 500;
margin: 0;
}
.nav {
margin-left: 0 !important;
}
nav.toc-navigaton {
margin-bottom: 10px;
}
}
.img-thumbnail {
padding: 0;
border: 1px solid #dee2e6;
border-radius: .25rem;
}
img {
max-width: 100%;
display: inline-block;
min-width: 48px;
min-height: 48px;
background-repeat: no-repeat;
background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDhweCIgIGhlaWdodD0iNDhweCIgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDEwMCAxMDAiIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIiBjbGFzcz0ibGRzLXNxdWFyZSIgc3R5bGU9ImJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMCkgbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDAlOyI+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAgMjApIj48cmVjdCB4PSItMTUiIHk9Ii0xNSIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjMWQzZjcyIj48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InNjYWxlIiBjYWxjTW9kZT0ic3BsaW5lIiB2YWx1ZXM9IjE7MTswLjI7MTsxIiBrZXlUaW1lcz0iMDswLjI7MC41OzAuODsxIiBkdXI9IjJzIiBrZXlTcGxpbmVzPSIwLjUgMC41IDAuNSAwLjU7MCAwLjEgMC45IDE7MC4xIDAgMSAwLjk7MC41IDAuNSAwLjUgMC41IiBiZWdpbj0iLTAuOHMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIj48L2FuaW1hdGVUcmFuc2Zvcm0+PC9yZWN0PjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MCAyMCkiPjxyZWN0IHg9Ii0xNSIgeT0iLTE1IiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIGZpbGw9IiM1Njk5ZDIiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0ic2NhbGUiIGNhbGNNb2RlPSJzcGxpbmUiIHZhbHVlcz0iMTsxOzAuMjsxOzEiIGtleVRpbWVzPSIwOzAuMjswLjU7MC44OzEiIGR1cj0iMnMiIGtleVNwbGluZXM9IjAuNSAwLjUgMC41IDAuNTswIDAuMSAwLjkgMTswLjEgMCAxIDAuOTswLjUgMC41IDAuNSAwLjUiIGJlZ2luPSItMC42cyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiPjwvYW5pbWF0ZVRyYW5zZm9ybT48L3JlY3Q+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgwIDIwKSI+PHJlY3QgeD0iLTE1IiB5PSItMTUiIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCIgZmlsbD0iI2Q4ZWJmOSI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJzY2FsZSIgY2FsY01vZGU9InNwbGluZSIgdmFsdWVzPSIxOzE7MC4yOzE7MSIga2V5VGltZXM9IjA7MC4yOzAuNTswLjg7MSIgZHVyPSIycyIga2V5U3BsaW5lcz0iMC41IDAuNSAwLjUgMC41OzAgMC4xIDAuOSAxOzAuMSAwIDEgMC45OzAuNSAwLjUgMC41IDAuNSIgYmVnaW49Ii0wLjRzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvcmVjdD48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAgNTApIj48cmVjdCB4PSItMTUiIHk9Ii0xNSIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjNTY5OWQyIj48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InNjYWxlIiBjYWxjTW9kZT0ic3BsaW5lIiB2YWx1ZXM9IjE7MTswLjI7MTsxIiBrZXlUaW1lcz0iMDswLjI7MC41OzAuODsxIiBkdXI9IjJzIiBrZXlTcGxpbmVzPSIwLjUgMC41IDAuNSAwLjU7MCAwLjEgMC45IDE7MC4xIDAgMSAwLjk7MC41IDAuNSAwLjUgMC41IiBiZWdpbj0iLTAuNnMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIj48L2FuaW1hdGVUcmFuc2Zvcm0+PC9yZWN0PjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MCA1MCkiPjxyZWN0IHg9Ii0xNSIgeT0iLTE1IiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIGZpbGw9IiNkOGViZjkiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0ic2NhbGUiIGNhbGNNb2RlPSJzcGxpbmUiIHZhbHVlcz0iMTsxOzAuMjsxOzEiIGtleVRpbWVzPSIwOzAuMjswLjU7MC44OzEiIGR1cj0iMnMiIGtleVNwbGluZXM9IjAuNSAwLjUgMC41IDAuNTswIDAuMSAwLjkgMTswLjEgMCAxIDAuOTswLjUgMC41IDAuNSAwLjUiIGJlZ2luPSItMC40cyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiPjwvYW5pbWF0ZVRyYW5zZm9ybT48L3JlY3Q+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgwIDUwKSI+PHJlY3QgeD0iLTE1IiB5PSItMTUiIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCIgZmlsbD0iIzcxYzJjYyI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJzY2FsZSIgY2FsY01vZGU9InNwbGluZSIgdmFsdWVzPSIxOzE7MC4yOzE7MSIga2V5VGltZXM9IjA7MC4yOzAuNTswLjg7MSIgZHVyPSIycyIga2V5U3BsaW5lcz0iMC41IDAuNSAwLjUgMC41OzAgMC4xIDAuOSAxOzAuMSAwIDEgMC45OzAuNSAwLjUgMC41IDAuNSIgYmVnaW49Ii0wLjJzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvcmVjdD48L2c+PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjAgODApIj48cmVjdCB4PSItMTUiIHk9Ii0xNSIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIiBmaWxsPSIjZDhlYmY5Ij48YW5pbWF0ZVRyYW5zZm9ybSBhdHRyaWJ1dGVOYW1lPSJ0cmFuc2Zvcm0iIHR5cGU9InNjYWxlIiBjYWxjTW9kZT0ic3BsaW5lIiB2YWx1ZXM9IjE7MTswLjI7MTsxIiBrZXlUaW1lcz0iMDswLjI7MC41OzAuODsxIiBkdXI9IjJzIiBrZXlTcGxpbmVzPSIwLjUgMC41IDAuNSAwLjU7MCAwLjEgMC45IDE7MC4xIDAgMSAwLjk7MC41IDAuNSAwLjUgMC41IiBiZWdpbj0iLTAuNHMiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIj48L2FuaW1hdGVUcmFuc2Zvcm0+PC9yZWN0PjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MCA4MCkiPjxyZWN0IHg9Ii0xNSIgeT0iLTE1IiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiIGZpbGw9IiM3MWMyY2MiPjxhbmltYXRlVHJhbnNmb3JtIGF0dHJpYnV0ZU5hbWU9InRyYW5zZm9ybSIgdHlwZT0ic2NhbGUiIGNhbGNNb2RlPSJzcGxpbmUiIHZhbHVlcz0iMTsxOzAuMjsxOzEiIGtleVRpbWVzPSIwOzAuMjswLjU7MC44OzEiIGR1cj0iMnMiIGtleVNwbGluZXM9IjAuNSAwLjUgMC41IDAuNTswIDAuMSAwLjkgMTswLjEgMCAxIDAuOTswLjUgMC41IDAuNSAwLjUiIGJlZ2luPSItMC4ycyIgcmVwZWF0Q291bnQ9ImluZGVmaW5pdGUiPjwvYW5pbWF0ZVRyYW5zZm9ybT48L3JlY3Q+PC9nPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDgwIDgwKSI+PHJlY3QgeD0iLTE1IiB5PSItMTUiIHdpZHRoPSIzMCIgaGVpZ2h0PSIzMCIgZmlsbD0iIzQ5OTZhMiI+PGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJzY2FsZSIgY2FsY01vZGU9InNwbGluZSIgdmFsdWVzPSIxOzE7MC4yOzE7MSIga2V5VGltZXM9IjA7MC4yOzAuNTswLjg7MSIgZHVyPSIycyIga2V5U3BsaW5lcz0iMC41IDAuNSAwLjUgMC41OzAgMC4xIDAuOSAxOzAuMSAwIDEgMC45OzAuNSAwLjUgMC41IDAuNSIgYmVnaW49IjBzIiByZXBlYXRDb3VudD0iaW5kZWZpbml0ZSI+PC9hbmltYXRlVHJhbnNmb3JtPjwvcmVjdD48L2c+PC9zdmc+);
background-position: center;
-ms-background-position: center;
border: 1px solid #dee2e6;
border-radius: .25rem;
opacity: 0.4;
transition: opacity .4s ease-in;
-webkit-transition: opacity .4s ease-in;
-moz-transition: opacity .4s ease-in;
-o-transition: opacity .4s ease-in;
transition: opacity .4s ease-in;
}
.cs {
color: inherit;
}
pre.hljs {
background-color: #fbfbfb !important;
}
pre[class*="language-"] {
margin-top: 0;
margin-bottom: 1rem;
padding: 0.5em;
}
.code-header {
background-color: #f5f5f5;
color: #707070;
border: 1px solid #ddd;
border-bottom: 0;
text-align: right;
button {
background-color: #ededed;
border: 0;
&:hover {
background-color: #d5d5d5;
}
&.copy {
border-left: 1px solid #ddd;
}
&.copy::before {
background-size: 15px auto;
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath fill='%23707070' d='M13 6.8V14H4v-3H0V0h5.2l3 3h1L13 6.8zM4 3h2.8l-2-2H1v9h3V3zm8 5H8V4H5v9h7V8zM9 7h2.8L9 4.2V7z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position-y: 4px;
padding-right: 17px;
content: "";
}
}
}
}
nav.bd-links {
padding: 15px;
h3 {
font-size: 1em;
margin-top: 8px;
padding-bottom: 5px;
border-bottom: 1px solid #eee;
}
p {
font-size: 1em;
font-weight: 400;
margin: 0 0 0 5px;
}
ul {
list-style-type: none;
margin: 0;
line-height: inherit;
li {
a {
word-wrap: break-word;
display: block;
padding: .20rem 0.1rem .20rem 1.0rem;
font-size: 90%;
color: #28c;
}
}
}
}
b, strong {
font-weight: 500;
}
nav[data-toggle='toc'] .nav {
flex-direction: column;
}
nav[data-toggle='toc'] .nav > .active > a, nav[data-toggle='toc'] .nav > .active:hover > a, nav[data-toggle='toc'] .nav > .active:focus > a {
color: #28c;
border-left: 2px solid #28c;
}
nav[data-toggle='toc'] .nav > li > a:hover, nav[data-toggle='toc'] .nav > li > a:focus {
color: #28c;
border-left: 1px solid #28c;
}
}

File diff suppressed because one or more lines are too long

@ -201,6 +201,13 @@
padding-top: 2rem;
padding-bottom: 10px;
font-size: 2rem; }
.docs-page .docs-content article.docs-body .blockquote {
margin-bottom: 1rem;
margin-left: 0;
border-left: 2px solid gray;
padding: 1em;
background-color: #eee;
padding-bottom: .2em; }
.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;

File diff suppressed because one or more lines are too long

@ -367,6 +367,15 @@ body {
}
}
.blockquote {
margin-bottom: 1rem;
margin-left: 0;
border-left: 2px solid gray;
padding: 1em;
background-color: #eee;
padding-bottom: .2em
}
img {
max-width: 100%;
border: 1px solid #f4f5f7;

@ -1,9 +0,0 @@
using Volo.Abp.Application.Dtos;
namespace Volo.Abp.Identity
{
public class GetIdentityRolesInput : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
}

@ -1,13 +1,21 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace Volo.Abp.Identity
{
public interface IIdentityRoleAppService : ICrudAppService<IdentityRoleDto, Guid, GetIdentityRolesInput, IdentityRoleCreateDto, IdentityRoleUpdateDto>
public interface IIdentityRoleAppService : IApplicationService
{
//TODO: remove after a better design
Task<List<IdentityRoleDto>> GetAllListAsync();
Task<ListResultDto<IdentityRoleDto>> GetListAsync();
Task<IdentityRoleDto> CreateAsync(IdentityRoleCreateDto input);
Task<IdentityRoleDto> GetAsync(Guid id);
Task<IdentityRoleDto> UpdateAsync(Guid id, IdentityRoleUpdateDto input);
Task DeleteAsync(Guid id);
}
}

@ -31,22 +31,11 @@ namespace Volo.Abp.Identity
);
}
public async Task<PagedResultDto<IdentityRoleDto>> GetListAsync(GetIdentityRolesInput input) //TODO: Remove this method since it's not used
public async Task<ListResultDto<IdentityRoleDto>> GetListAsync()
{
var count = (int) await _roleRepository.GetCountAsync();
var list = await _roleRepository.GetListAsync();
return new PagedResultDto<IdentityRoleDto>(
count,
ObjectMapper.Map<List<IdentityRole>, List<IdentityRoleDto>>(list)
);
}
public async Task<List<IdentityRoleDto>> GetAllListAsync() //TODO: Rename to GetList (however it's not possible because of the design of the IAsyncCrudAppService)
{
var list = await _roleRepository.GetListAsync();
return ObjectMapper.Map<List<IdentityRole>, List<IdentityRoleDto>>(list);
return new ListResultDto<IdentityRoleDto>(ObjectMapper.Map<List<IdentityRole>, List<IdentityRoleDto>>(list));
}
[Authorize(IdentityPermissions.Roles.Create)]

@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.Application.Dtos;
@ -21,16 +20,16 @@ namespace Volo.Abp.Identity
}
[HttpGet]
[Route("{id}")]
public virtual Task<IdentityRoleDto> GetAsync(Guid id)
public virtual Task<ListResultDto<IdentityRoleDto>> GetListAsync()
{
return _roleAppService.GetAsync(id);
return _roleAppService.GetListAsync();
}
[HttpGet]
public virtual Task<PagedResultDto<IdentityRoleDto>> GetListAsync(GetIdentityRolesInput input)
[Route("{id}")]
public virtual Task<IdentityRoleDto> GetAsync(Guid id)
{
return _roleAppService.GetListAsync(input);
return _roleAppService.GetAsync(id);
}
[HttpPost]
@ -52,12 +51,5 @@ namespace Volo.Abp.Identity
{
return _roleAppService.DeleteAsync(id);
}
[HttpGet]
[Route("all")]
public virtual Task<List<IdentityRoleDto>> GetAllListAsync()
{
return _roleAppService.GetAllListAsync();
}
}
}

@ -14,6 +14,9 @@
var _dataTable = _$table.DataTable(abp.libs.datatables.normalizeConfiguration({
order: [[1, "asc"]],
searching:false,
paging:false,
info:false,
ajax: abp.libs.datatables.createAjax(_identityRoleAppService.getList),
columnDefs: [
{

@ -28,9 +28,9 @@ namespace Volo.Abp.Identity.Web.Pages.Identity.Users
{
UserInfo = new UserInfoViewModel();
var roleDtoList = await _identityRoleAppService.GetAllListAsync();
var roleDtoList = await _identityRoleAppService.GetListAsync();
Roles = ObjectMapper.Map<List<IdentityRoleDto>, AssignedRoleViewModel[]>(roleDtoList);
Roles = ObjectMapper.Map<IReadOnlyList<IdentityRoleDto>, AssignedRoleViewModel[]>(roleDtoList.Items);
foreach (var role in Roles)
{

@ -30,8 +30,8 @@ namespace Volo.Abp.Identity.Web.Pages.Identity.Users
{
UserInfo = ObjectMapper.Map<IdentityUserDto, UserInfoViewModel>(await _identityUserAppService.GetAsync(id));
Roles = ObjectMapper.Map<List<IdentityRoleDto>, AssignedRoleViewModel[]>(
await _identityRoleAppService.GetAllListAsync()
Roles = ObjectMapper.Map<IReadOnlyList<IdentityRoleDto>, AssignedRoleViewModel[]>(
(await _identityRoleAppService.GetListAsync()).Items
);
var userRoleNames = (await _identityUserAppService.GetRolesAsync(UserInfo.Id)).Items.Select(r => r.Name).ToList();

@ -38,11 +38,10 @@ namespace Volo.Abp.Identity
{
//Act
var result = await _roleAppService.GetListAsync(new GetIdentityRolesInput());
var result = await _roleAppService.GetListAsync();
//Assert
result.TotalCount.ShouldBeGreaterThan(0);
result.Items.Count.ShouldBeGreaterThan(0);
}

@ -1,5 +1,5 @@
{
"version": "0.8.0",
"version": "0.8.1",
"packages": [
"ng-packs/dist/*",
"packs/*"

@ -3,6 +3,7 @@ import { ABP } from '@abp/ng.core';
export class IdentityGetRoles {
static readonly type = '[Identity] Get Roles';
constructor(public payload?: ABP.PageQueryParams) {}
}
export class IdentityGetRoleById {

@ -17,11 +17,20 @@
><input
type="search"
class="form-control form-control-sm"
placeholder="Search"
(input)="dt.filterGlobal($event.target.value, 'contains')"
[placeholder]="'AbpUi::PagerSearch' | abpLocalization"
(input)="search$.next($event.target.value)"
/></label>
</div>
<p-table #dt [value]="roles$ | async" [globalFilterFields]="['name']" [paginator]="true" [rows]="10">
<p-table
[value]="data$ | async"
[lazy]="true"
[lazyLoadOnInit]="false"
[paginator]="true"
[rows]="10"
[totalRecords]="totalCount$ | async"
[loading]="loading"
(onLazyLoad)="onPageChange($event)"
>
<ng-template pTemplate="header">
<tr>
<th>{{ 'AbpIdentity::Actions' | abpLocalization }}</th>

@ -1,6 +1,6 @@
import { Component, TemplateRef, ViewChild } from '@angular/core';
import { Component, TemplateRef, ViewChild, OnInit } from '@angular/core';
import { Select, Store } from '@ngxs/store';
import { Observable } from 'rxjs';
import { Observable, Subject } from 'rxjs';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { IdentityState } from '../../states/identity.state';
import { Identity } from '../../models/identity';
@ -9,17 +9,22 @@ import {
IdentityAddRole,
IdentityDeleteRole,
IdentityGetRoleById,
IdentityGetRoles,
} from '../../actions/identity.actions';
import { pluck } from 'rxjs/operators';
import { pluck, debounceTime, finalize } from 'rxjs/operators';
import { ConfirmationService, Toaster } from '@abp/ng.theme.shared';
import { ABP } from '@abp/ng.core';
@Component({
selector: 'abp-roles',
templateUrl: './roles.component.html',
})
export class RolesComponent {
export class RolesComponent implements OnInit {
@Select(IdentityState.getRoles)
roles$: Observable<Identity.RoleItem[]>;
data$: Observable<Identity.RoleItem[]>;
@Select(IdentityState.getRolesTotalCount)
totalCount$: Observable<number>;
form: FormGroup;
@ -31,11 +36,26 @@ export class RolesComponent {
providerKey: string;
pageQuery: ABP.PageQueryParams = {
sorting: 'name',
};
loading: boolean = false;
search$ = new Subject<string>();
@ViewChild('modalContent', { static: false })
modalContent: TemplateRef<any>;
constructor(private confirmationService: ConfirmationService, private fb: FormBuilder, private store: Store) {}
ngOnInit() {
this.search$.pipe(debounceTime(300)).subscribe(value => {
this.pageQuery.filter = value;
this.get();
});
}
createForm() {
this.form = this.fb.group({
name: [this.selected.name || '', [Validators.required, Validators.maxLength(256)]],
@ -89,4 +109,19 @@ export class RolesComponent {
}
});
}
onPageChange(data) {
this.pageQuery.skipCount = data.first;
this.pageQuery.maxResultCount = data.rows;
this.get();
}
get() {
this.loading = true;
this.store
.dispatch(new IdentityGetRoles(this.pageQuery))
.pipe(finalize(() => (this.loading = false)))
.subscribe();
}
}

@ -23,7 +23,7 @@
><input
type="search"
class="form-control form-control-sm"
placeholder="Search"
[placeholder]="'AbpUi::PagerSearch' | abpLocalization"
(input)="search$.next($event.target.value)"
/></label>
</div>

@ -4,7 +4,7 @@ import { Component, OnInit, TemplateRef, TrackByFunction, ViewChild } from '@ang
import { AbstractControl, FormArray, FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Select, Store } from '@ngxs/store';
import { combineLatest, Observable, Subject } from 'rxjs';
import { debounceTime, filter, map, pluck, take } from 'rxjs/operators';
import { debounceTime, filter, map, pluck, take, finalize } from 'rxjs/operators';
import snq from 'snq';
import {
IdentityAddUser,
@ -163,6 +163,9 @@ export class UsersComponent implements OnInit {
get() {
this.loading = true;
this.store.dispatch(new IdentityGetUsers(this.pageQuery)).subscribe(() => (this.loading = false));
this.store
.dispatch(new IdentityGetUsers(this.pageQuery))
.pipe(finalize(() => (this.loading = false)))
.subscribe();
}
}

@ -9,10 +9,11 @@ import { Identity } from '../models/identity';
export class IdentityService {
constructor(private rest: RestService) {}
getRoles(): Observable<Identity.RoleResponse> {
getRoles(params = {} as ABP.PageQueryParams): Observable<Identity.RoleResponse> {
const request: Rest.Request<null> = {
method: 'GET',
url: '/api/identity/roles',
params,
};
return this.rest.request<null, Identity.RoleResponse>(request);

@ -44,8 +44,8 @@ export class IdentityState {
constructor(private identityService: IdentityService) {}
@Action(IdentityGetRoles)
getRoles({ patchState }: StateContext<Identity.State>) {
return this.identityService.getRoles().pipe(
getRoles({ patchState }: StateContext<Identity.State>, { payload }: IdentityGetRoles) {
return this.identityService.getRoles(payload).pipe(
tap(roles =>
patchState({
roles,

@ -1,7 +1,9 @@
import { TenantManagement } from '../models/tenant-management';
import { ABP } from '@abp/ng.core';
export class TenantManagementGet {
static readonly type = '[TenantManagement] Get';
constructor(public payload?: ABP.PageQueryParams) {}
}
export class TenantManagementGetById {

@ -26,11 +26,20 @@
><input
type="search"
class="form-control form-control-sm"
placeholder="Search"
(input)="dt.filterGlobal($event.target.value, 'contains')"
[placeholder]="'AbpUi::PagerSearch' | abpLocalization"
(input)="search$.next($event.target.value)"
/></label>
</div>
<p-table #dt [value]="datas$ | async" [globalFilterFields]="['name']" [paginator]="true" [rows]="10">
<p-table
[value]="data$ | async"
[lazy]="true"
[lazyLoadOnInit]="false"
[paginator]="true"
[rows]="10"
[totalRecords]="totalCount$ | async"
[loading]="loading"
(onLazyLoad)="onPageChange($event)"
>
<ng-template pTemplate="header">
<tr>
<th>{{ 'AbpTenantManagement::Actions' | abpLocalization }}</th>
@ -112,7 +121,7 @@
<div class="mt-2">
<div class="form-group">
<label for="name">{{ 'AbpTenantManagement::TenantName' | abpLocalization }}</label>
<input type="text" id="name" class="form-control" formControlName="name" autofocus/>
<input type="text" id="name" class="form-control" formControlName="name" autofocus />
</div>
</div>
</form>
@ -123,7 +132,13 @@
<div class="mt-2">
<div class="form-group">
<div class="form-check">
<input id="useSharedDatabase" type="checkbox" class="form-check-input" formControlName="useSharedDatabase" autofocus/>
<input
id="useSharedDatabase"
type="checkbox"
class="form-check-input"
formControlName="useSharedDatabase"
autofocus
/>
<label for="useSharedDatabase" class="font-check-label">{{
'AbpTenantManagement::DisplayName:UseSharedDatabase' | abpLocalization
}}</label>

@ -1,13 +1,14 @@
import { ABP } from '@abp/ng.core';
import { ConfirmationService, Toaster } from '@abp/ng.theme.shared';
import { Component, TemplateRef, ViewChild } from '@angular/core';
import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Select, Store } from '@ngxs/store';
import { Observable } from 'rxjs';
import { pluck, switchMap, take } from 'rxjs/operators';
import { Observable, Subject } from 'rxjs';
import { debounceTime, finalize, pluck, switchMap, take } from 'rxjs/operators';
import {
TenantManagementAdd,
TenantManagementDelete,
TenantManagementGet,
TenantManagementGetById,
TenantManagementUpdate,
} from '../../actions/tenant-management.actions';
@ -24,9 +25,12 @@ type SelectedModalContent = {
selector: 'abp-tenants',
templateUrl: './tenants.component.html',
})
export class TenantsComponent {
export class TenantsComponent implements OnInit {
@Select(TenantManagementState.get)
datas$: Observable<ABP.BasicItem[]>;
data$: Observable<ABP.BasicItem[]>;
@Select(TenantManagementState.getTenantsTotalCount)
totalCount$: Observable<number>;
selected: ABP.BasicItem;
@ -42,6 +46,14 @@ export class TenantsComponent {
_useSharedDatabase: boolean;
pageQuery: ABP.PageQueryParams = {
sorting: 'name',
};
loading: boolean = false;
search$ = new Subject<string>();
get useSharedDatabase(): boolean {
return this.defaultConnectionStringForm.get('useSharedDatabase').value;
}
@ -66,6 +78,13 @@ export class TenantsComponent {
private store: Store,
) {}
ngOnInit() {
this.search$.pipe(debounceTime(300)).subscribe(value => {
this.pageQuery.filter = value;
this.get();
});
}
private createTenantForm() {
this.tenantForm = this.fb.group({
name: [this.selected.name || '', [Validators.required, Validators.maxLength(256)]],
@ -178,4 +197,19 @@ export class TenantsComponent {
}
});
}
onPageChange(data) {
this.pageQuery.skipCount = data.first;
this.pageQuery.maxResultCount = data.rows;
this.get();
}
get() {
this.loading = true;
this.store
.dispatch(new TenantManagementGet(this.pageQuery))
.pipe(finalize(() => (this.loading = false)))
.subscribe();
}
}

@ -9,10 +9,11 @@ import { TenantManagement } from '../models/tenant-management';
export class TenantManagementService {
constructor(private rest: RestService) {}
get(): Observable<TenantManagement.Response> {
get(params = {} as ABP.PageQueryParams): Observable<TenantManagement.Response> {
const request: Rest.Request<null> = {
method: 'GET',
url: '/api/multi-tenancy/tenants',
params,
};
return this.rest.request<null, TenantManagement.Response>(request);

@ -21,11 +21,16 @@ export class TenantManagementState {
return result.items || [];
}
@Selector()
static getTenantsTotalCount({ result }: TenantManagement.State): number {
return result.totalCount;
}
constructor(private tenantManagementService: TenantManagementService) {}
@Action(TenantManagementGet)
get({ patchState }: StateContext<TenantManagement.State>) {
return this.tenantManagementService.get().pipe(
get({ patchState }: StateContext<TenantManagement.State>, { payload }: TenantManagementGet) {
return this.tenantManagementService.get(payload).pipe(
tap(result =>
patchState({
result,

@ -1,5 +1,5 @@
{
"version": "0.8.0",
"version": "0.8.1",
"name": "@abp/chart.js",
"publishConfig": {
"access": "public"

@ -17,11 +17,7 @@ namespace Acme.BookStore.EntityFrameworkCore
builder.Entity<Book>(b =>
{
b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema);
b.ConfigureAudited();
b.ConfigureExtraProperties();
b.ConfigureConcurrencyStamp();
b.ConfigureByConvention();
b.Property(x => x.Name).IsRequired().HasMaxLength(128);
});
}

@ -4,6 +4,6 @@
"private": true,
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.basic": "^0.6.6",
"@abp/chart.js": "^0.8.0"
"@abp/chart.js": "^0.8.1"
}
}

@ -3,7 +3,7 @@ export const environment = {
hmr: true,
oAuthConfig: {
issuer: 'https://localhost:44305',
clientId: 'MyProjectName_ConsoleTestApp',
clientId: 'MyProjectName_App',
dummyClientSecret: '1q2w3e*',
scope: 'MyProjectName',
showDebugInformation: true,

@ -3,7 +3,7 @@ export const environment = {
hmr: false,
oAuthConfig: {
issuer: 'https://localhost:44305',
clientId: 'MyProjectName_ConsoleTestApp',
clientId: 'MyProjectName_App',
dummyClientSecret: '1q2w3e*',
scope: 'MyProjectName',
showDebugInformation: true,

@ -3,7 +3,7 @@ export const environment = {
hmr: false,
oAuthConfig: {
issuer: 'https://localhost:44305',
clientId: 'MyProjectName_ConsoleTestApp',
clientId: 'MyProjectName_App',
dummyClientSecret: '1q2w3e*',
scope: 'MyProjectName',
showDebugInformation: true,

@ -9,8 +9,8 @@
"ClientSecret": "1q2w3e*",
"RootUrl": "https://localhost:44302"
},
"MyProjectName_ConsoleTestApp": {
"ClientId": "MyProjectName_ConsoleTestApp",
"MyProjectName_App": {
"ClientId": "MyProjectName_App",
"ClientSecret": "1q2w3e*"
}
}

@ -126,14 +126,14 @@ namespace MyCompanyName.MyProjectName.IdentityServer
}
//Console Test Client
var consoleClientId = configurationSection["MyProjectName_ConsoleTestApp:ClientId"];
var consoleClientId = configurationSection["MyProjectName_App:ClientId"];
if (!consoleClientId.IsNullOrWhiteSpace())
{
await CreateClientAsync(
consoleClientId,
commonScopes,
new[] { "password", "client_credentials" },
(configurationSection["MyProjectName_ConsoleTestApp:ClientSecret"] ?? "1q2w3e*").Sha256()
(configurationSection["MyProjectName_App:ClientSecret"] ?? "1q2w3e*").Sha256()
);
}
}

@ -40,10 +40,7 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore
builder.Entity<AppUser>(b =>
{
b.ToTable("AbpUsers"); //Sharing the same table "AbpUsers" with the IdentityUser
b.ConfigureFullAudited();
b.ConfigureExtraProperties();
b.ConfigureConcurrencyStamp();
b.ConfigureByConvention();
b.ConfigureAbpUser();
//Moved customization to a method so we can share it with the MyProjectNameMigrationsDbContext class

@ -2,6 +2,7 @@
using System.IO;
using System.Linq;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
@ -134,6 +135,7 @@ namespace MyCompanyName.MyProjectName
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()

@ -3,6 +3,7 @@ using System.IO;
using System.Linq;
using System.Net.Http;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
@ -133,6 +134,7 @@ namespace MyCompanyName.MyProjectName
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()

@ -6,9 +6,6 @@
"ConnectionStrings": {
"Default": "Server=localhost;Database=MyProjectName;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Redis": {
"Configuration": "127.0.0.1"
},
"AuthServer": {
"Authority": "https://localhost:44305"
}

@ -3,6 +3,7 @@ using System.IO;
using System.Linq;
using Localization.Resources.AbpUi;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
@ -114,6 +115,7 @@ namespace MyCompanyName.MyProjectName
.Select(o => o.RemovePostFix("/"))
.ToArray()
)
.WithAbpExposedHeaders()
.SetIsOriginAllowedToAllowWildcardSubdomains()
.AllowAnyHeader()
.AllowAnyMethod()

@ -10,8 +10,8 @@
},
"IdentityServer": {
"Clients": {
"MyProjectName_ConsoleTestApp": {
"ClientId": "MyProjectName_ConsoleTestApp"
"MyProjectName_App": {
"ClientId": "MyProjectName_App"
}
}
}

@ -13,7 +13,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
</ItemGroup>
</Project>

@ -12,7 +12,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
</ItemGroup>
</Project>

@ -13,9 +13,9 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="2.2.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.4" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="2.2.6" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="2.2.6" />
</ItemGroup>
</Project>

@ -7,7 +7,7 @@
"IdentityClients": {
"Default": {
"GrantType": "password",
"ClientId": "MyProjectName_ConsoleTestApp",
"ClientId": "MyProjectName_App",
"ClientSecret": "1q2w3e*",
"UserName": "admin",
"UserPassword": "1q2w3E*",

@ -1,4 +1,5 @@
using Mongo2Go;
using System;
using Mongo2Go;
using Volo.Abp;
using Volo.Abp.Data;
using Volo.Abp.Modularity;
@ -19,7 +20,7 @@ namespace MyCompanyName.MyProjectName.MongoDB
Configure<DbConnectionOptions>(options =>
{
options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString + "|MyProjectName";
options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString.EnsureEndsWith('/') + "MyProjectName";
});
}

@ -13,7 +13,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
<PackageReference Include="Mongo2Go" Version="2.2.11" />
</ItemGroup>

@ -15,8 +15,8 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
<PackageReference Include="NSubstitute" Version="4.2.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
<PackageReference Include="NSubstitute" Version="4.2.1" />
<PackageReference Include="Shouldly" Version="3.0.2" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.extensibility.execution" Version="2.4.1" />

@ -14,7 +14,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.1.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.2.0" />
<ProjectReference Include="..\MyCompanyName.MyProjectName.Application.Tests\MyCompanyName.MyProjectName.Application.Tests.csproj" />
<ProjectReference Include="..\..\src\MyCompanyName.MyProjectName.Web\MyCompanyName.MyProjectName.Web.csproj" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.AspNetCore.TestBase\Volo.Abp.AspNetCore.TestBase.csproj" />

@ -1 +0,0 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation" />

@ -16,12 +16,12 @@
<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="2.7.0" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="2.2.5" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="2.2.5" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.AspNetCore.MultiTenancy\Volo.Abp.AspNetCore.MultiTenancy.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.EntityFrameworkCore.SqlServer\Volo.Abp.EntityFrameworkCore.SqlServer.csproj" />
<ProjectReference Include="..\..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.EntityFrameworkCore\Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.EntityFrameworkCore\Volo.Abp.SettingManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\modules\audit-logging\src\Volo.Abp.AuditLogging.EntityFrameworkCore\Volo.Abp.AuditLogging.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.AspNetCore.MultiTenancy\Volo.Abp.AspNetCore.MultiTenancy.csproj" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.EntityFrameworkCore.SqlServer\Volo.Abp.EntityFrameworkCore.SqlServer.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.EntityFrameworkCore\Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.EntityFrameworkCore\Volo.Abp.SettingManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\audit-logging\src\Volo.Abp.AuditLogging.EntityFrameworkCore\Volo.Abp.AuditLogging.EntityFrameworkCore.csproj" />
</ItemGroup>
<ItemGroup>
@ -38,13 +38,4 @@
<None Remove="Logs\**" />
</ItemGroup>
<ItemGroup>
<None Update="Pages\**\*.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Pages\**\*.css">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

@ -0,0 +1,58 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
<RootNamespace>MyCompanyName.MyProjectName</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Serilog.AspNetCore" Version="2.1.1" />
<PackageReference Include="Serilog.Sinks.File" Version="4.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="4.0.1" />
<PackageReference Include="IdentityServer4.AccessTokenValidation" Version="2.7.0" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="2.2.5" />
<PackageReference Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" Version="2.2.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="2.2.6" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.AspNetCore.Authentication.JwtBearer\Volo.Abp.AspNetCore.Authentication.JwtBearer.csproj" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic\Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.csproj" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.AspNetCore.Mvc\Volo.Abp.AspNetCore.Mvc.csproj" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.AspNetCore.MultiTenancy\Volo.Abp.AspNetCore.MultiTenancy.csproj" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\..\..\..\framework\src\Volo.Abp.EntityFrameworkCore.SqlServer\Volo.Abp.EntityFrameworkCore.SqlServer.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\account\src\Volo.Abp.Account.Web.IdentityServer\Volo.Abp.Account.Web.IdentityServer.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\setting-management\src\Volo.Abp.SettingManagement.EntityFrameworkCore\Volo.Abp.SettingManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\audit-logging\src\Volo.Abp.AuditLogging.EntityFrameworkCore\Volo.Abp.AuditLogging.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\identityserver\src\Volo.Abp.IdentityServer.EntityFrameworkCore\Volo.Abp.IdentityServer.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.EntityFrameworkCore\Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.Application\Volo.Abp.PermissionManagement.Application.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\permission-management\src\Volo.Abp.PermissionManagement.HttpApi\Volo.Abp.PermissionManagement.HttpApi.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\identity\src\Volo.Abp.Identity.EntityFrameworkCore\Volo.Abp.Identity.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\identity\src\Volo.Abp.Identity.Application\Volo.Abp.Identity.Application.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\identity\src\Volo.Abp.Identity.HttpApi\Volo.Abp.Identity.HttpApi.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\identity\src\Volo.Abp.PermissionManagement.Domain.Identity\Volo.Abp.PermissionManagement.Domain.Identity.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.EntityFrameworkCore\Volo.Abp.TenantManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.Application\Volo.Abp.TenantManagement.Application.csproj" />
<ProjectReference Include="..\..\..\..\..\modules\tenant-management\src\Volo.Abp.TenantManagement.HttpApi\Volo.Abp.TenantManagement.HttpApi.csproj" />
<ProjectReference Include="..\..\src\MyCompanyName.MyProjectName.Application.Contracts\MyCompanyName.MyProjectName.Application.Contracts.csproj" />
<ProjectReference Include="..\MyCompanyName.MyProjectName.Host.Shared\MyCompanyName.MyProjectName.Host.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Remove="Logs\**" />
<Content Remove="Logs\**" />
<EmbeddedResource Remove="Logs\**" />
<None Remove="Logs\**" />
</ItemGroup>
<ItemGroup>
<None Update="Pages\**\*.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="Pages\**\*.css">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save