diff --git a/.github/workflows/auto-pr.yml b/.github/workflows/auto-pr.yml index 49175d217c..19001963a6 100644 --- a/.github/workflows/auto-pr.yml +++ b/.github/workflows/auto-pr.yml @@ -1,13 +1,13 @@ -name: Merge branch dev with rel-8.2 +name: Merge branch dev with prerel-8.3 on: push: branches: - - rel-8.2 + - prerel-8.3 permissions: contents: read jobs: - merge-dev-with-rel-8-2: + merge-dev-with-prerel-8-3: permissions: contents: write # for peter-evans/create-pull-request to create branch pull-requests: write # for peter-evans/create-pull-request to create a PR @@ -18,19 +18,19 @@ jobs: ref: dev - name: Reset promotion branch run: | - git fetch origin rel-8.2:rel-8.2 - git reset --hard rel-8.2 + git fetch origin prerel-8.3:prerel-8.3 + git reset --hard prerel-8.3 - name: Create Pull Request uses: peter-evans/create-pull-request@v3 with: - branch: auto-merge/rel-8-2/${{github.run_number}} - title: Merge branch dev with rel-8.2 - body: This PR generated automatically to merge dev with rel-8.2. Please review the changed files before merging to prevent any errors that may occur. + branch: auto-merge/prerel-8-3/${{github.run_number}} + title: Merge branch dev with prerel-8.3 + body: This PR generated automatically to merge dev with prerel-8.3. Please review the changed files before merging to prevent any errors that may occur. reviewers: maliming token: ${{ github.token }} - name: Merge Pull Request env: GH_TOKEN: ${{ secrets.BOT_SECRET }} run: | - gh pr review auto-merge/rel-8-2/${{github.run_number}} --approve - gh pr merge auto-merge/rel-8-2/${{github.run_number}} --merge --auto --delete-branch \ No newline at end of file + gh pr review auto-merge/prerel-8-3/${{github.run_number}} --approve + gh pr merge auto-merge/prerel-8-3/${{github.run_number}} --merge --auto --delete-branch \ No newline at end of file diff --git a/Directory.Packages.props b/Directory.Packages.props index b1398663ee..93cbd3cfdf 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -49,7 +49,7 @@ - + diff --git a/common.props b/common.props index 2b87badaf8..f189fd7d3f 100644 --- a/common.props +++ b/common.props @@ -1,8 +1,8 @@ latest - 8.3.0-preview - 3.3.0-preview + 9.0.0-preview + 4.0.0-preview $(NoWarn);CS1591;CS0436 https://abp.io/assets/abp_nupkg.png https://abp.io/ diff --git a/docs/cs/AspNetCore/Widgets.md b/docs/cs/AspNetCore/Widgets.md deleted file mode 100644 index f0ee218804..0000000000 --- a/docs/cs/AspNetCore/Widgets.md +++ /dev/null @@ -1,506 +0,0 @@ -# Widgety - -ABP poskytuje model a infastrukturu k vytváření **znovu použitelných widgetů**. Systém widgetů je rozšíření pro [ASP.NET Core pohledové komponenty](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components). Widgety jsou zvláště užitečné, když chcete; - -* Mít závislosti na **skriptech & stylech** ve vašem widgetu. -* Vytvářet **řídící panely** za použítí widgetů. -* Definovat widgety v znovu použitelných **[modulech](../Module-Development-Basics.md)**. -* Spolupráci widgetů s **[authorizačními](../Authorization.md)** a **[svazovacími](Bundling-Minification.md)** systémy. - -## Základní definice widgetu - -### Tvorba pohledové komponenty - -Jako první krok, vytvořte běžnou ASP.NET Core pohledovou komponentu: - -![widget-basic-files](../images/widget-basic-files.png) - -**MySimpleWidgetViewComponent.cs**: - -````csharp -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; - -namespace DashboardDemo.Web.Pages.Components.MySimpleWidget -{ - public class MySimpleWidgetViewComponent : AbpViewComponent - { - public IViewComponentResult Invoke() - { - return View(); - } - } -} -```` - -Dědění z `AbpViewComponent` není vyžadováno. Můžete dědit ze standardního ASP.NET Core `ViewComponent`. `AbpViewComponent` pouze definuje pár základních a užitečných vlastnosti. - -Můžete vložit službu a pomocí metody `Invoke` z ní získat některá data. Možná budete muset provést metodu Invoke jako asynchronní `public async Task InvokeAsync()`. Podívejte se na dokument [ASP.NET Core ViewComponents](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components) pro všechna další použítí. - -**Default.cshtml**: - -```xml -
-

My Simple Widget

-

This is a simple widget!

-
-``` - -### Definice widgetu - -Přidejte atribut `Widget` k třídě `MySimpleWidgetViewComponent` pro označení této pohledové komponenty jako widgetu: - -````csharp -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.UI.Widgets; - -namespace DashboardDemo.Web.Pages.Components.MySimpleWidget -{ - [Widget] - public class MySimpleWidgetViewComponent : AbpViewComponent - { - public IViewComponentResult Invoke() - { - return View(); - } - } -} -```` - -## Vykreslení widgetu - -Vykreslení widgetu je vcelku standardní. Použijte metodu `Component.InvokeAsync` v razor pohledu/stránce jako s kteroukoliv jinou pohledovou komponentou. Příklady: - -````xml -@await Component.InvokeAsync("MySimpleWidget") -@await Component.InvokeAsync(typeof(MySimpleWidgetViewComponent)) -```` - -První přístup používá název widgetu, zatímco druhý používá typ pohledové komponenty. - -### Widgety s argumenty - -Systém ASP.NET Core pohledových komponent umožňuje přijímat argumenty pro pohledové komponenty. Níže uvedená pohledová komponenta přijímá `startDate` a `endDate` a používá tyto argumenty k získání dat ze služby. - -````csharp -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.UI.Widgets; - -namespace DashboardDemo.Web.Pages.Shared.Components.CountersWidget -{ - [Widget] - public class CountersWidgetViewComponent : AbpViewComponent - { - private readonly IDashboardAppService _dashboardAppService; - - public CountersWidgetViewComponent(IDashboardAppService dashboardAppService) - { - _dashboardAppService = dashboardAppService; - } - - public async Task InvokeAsync( - DateTime startDate, DateTime endDate) - { - var result = await _dashboardAppService.GetCountersWidgetAsync( - new CountersWidgetInputDto - { - StartDate = startDate, - EndDate = endDate - } - ); - - return View(result); - } - } -} -```` - -Nyní musíte předat anonymní objekt k předání argumentů tak jak je ukázáno níže: - -````xml -@await Component.InvokeAsync("CountersWidget", new -{ - startDate = DateTime.Now.Subtract(TimeSpan.FromDays(7)), - endDate = DateTime.Now -}) -```` - -## Název widgetu - -Výchozí název pohledových komponent je vypočítán na základě názvu typu pohledové komponenty. Pokud je typ pohledové komponenty `MySimpleWidgetViewComponent` potom název widgetu bude `MySimpleWidget` (odstraní se `ViewComponent` postfix). Takto ASP.NET Core vypočítává název pohledové komponenty. - -Chcete-li přizpůsobit název widgetu, stačí použít standardní atribut `ViewComponent` z ASP.NET Core: - -```csharp -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.UI.Widgets; - -namespace DashboardDemo.Web.Pages.Components.MySimpleWidget -{ - [Widget] - [ViewComponent(Name = "MyCustomNamedWidget")] - public class MySimpleWidgetViewComponent : AbpViewComponent - { - public IViewComponentResult Invoke() - { - return View("~/Pages/Components/MySimpleWidget/Default.cshtml"); - } - } -} -``` - -ABP bude respektovat přizpůsobený název při zpracování widgetu. - -> Pokud jsou názvy pohledové komponenty a složky, která pohledovou komponentu obsahuje rozdílné, pravděpodobně budete muset ručně uvést cestu pohledu tak jako je to provedeno v tomto příkladu. - -### Zobrazovaný název - -Můžete také definovat čitelný & lokalizovatelný zobrazovaný název pro widget. Tento zobrazovaný název může být využít na uživatelském rozhraní kdykoliv je to potřeba. Zobrazovaný název je nepovinný a lze ho definovat pomocí vlastností atributu `Widget`: - -````csharp -using DashboardDemo.Localization; -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.UI.Widgets; - -namespace DashboardDemo.Web.Pages.Components.MySimpleWidget -{ - [Widget( - DisplayName = "MySimpleWidgetDisplayName", // Lokalizační klíč - DisplayNameResource = typeof(DashboardDemoResource) // Lokalizační zdroj - )] - public class MySimpleWidgetViewComponent : AbpViewComponent - { - public IViewComponentResult Invoke() - { - return View(); - } - } -} -```` - -Podívejte se na [dokument lokalizace](../Localization.md) pro více informací o lokalizačních zdrojích a klíčích. - -## Závislosti na stylech & skriptech - -Problémy když má widget soubory skriptů a stylů; - -* Každý stránka, která používá widget musí také přidat soubory **skriptů & stylů** tohoto widgetu. -* Stránka se také musí postarat o **závislé knihovny/soubory** widgetu. - -ABP tyto problémy řeší, když správně propojíme zdroje s widgetem. O závislosti widgetu se při jeho používání nestaráme. - -### Definování jednoduchých cest souborů - -Níže uvedený příklad widgetu přidá stylové a skriptové soubory: - -````csharp -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.UI.Widgets; - -namespace DashboardDemo.Web.Pages.Components.MySimpleWidget -{ - [Widget( - StyleFiles = new[] { "/Pages/Components/MySimpleWidget/Default.css" }, - ScriptFiles = new[] { "/Pages/Components/MySimpleWidget/Default.js" } - )] - public class MySimpleWidgetViewComponent : AbpViewComponent - { - public IViewComponentResult Invoke() - { - return View(); - } - } -} -```` - -ABP bere v úvahu tyto závislosti a správně je přidává do pohledu/stránky při použití widgetu. Stylové/skriptové soubory mohou být **fyzické nebo virtuální**. Plně integrováno do [virtuálního systému souborů](../Virtual-File-System.md). - -### Definování přispěvatelů balíku - -Všechny zdroje použité ve widgetech na stránce jsou přidány jako **svazek** (svázány & minifikovány v produkci pokud nenastavíte jinak). Kromě přidání jednoduchého souboru můžete využít plnou funkčnost přispěvatelů balíčků. - -Níže uvedený ukázkový kód provádí totéž co výše uvedený kód, ale definuje a používá přispěvatele balíků: - -````csharp -using System.Collections.Generic; -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.UI.Bundling; -using Volo.Abp.AspNetCore.Mvc.UI.Widgets; - -namespace DashboardDemo.Web.Pages.Components.MySimpleWidget -{ - [Widget( - StyleTypes = new []{ typeof(MySimpleWidgetStyleBundleContributor) }, - ScriptTypes = new[]{ typeof(MySimpleWidgetScriptBundleContributor) } - )] - public class MySimpleWidgetViewComponent : AbpViewComponent - { - public IViewComponentResult Invoke() - { - return View(); - } - } - - public class MySimpleWidgetStyleBundleContributor : BundleContributor - { - public override void ConfigureBundle(BundleConfigurationContext context) - { - context.Files - .AddIfNotContains("/Pages/Components/MySimpleWidget/Default.css"); - } - } - - public class MySimpleWidgetScriptBundleContributor : BundleContributor - { - public override void ConfigureBundle(BundleConfigurationContext context) - { - context.Files - .AddIfNotContains("/Pages/Components/MySimpleWidget/Default.js"); - } - } -} - -```` - -Systém přispěvatelů balíků je velmi schopný. Pokud váš widget používá k vykreslení grafu JavaScript knihovnu, můžete ji deklarovat jako závislost, díky tomu se knihovna pokud nebyla dříve přidána automaticky přidá na stránku Tímto způsobem se stránka využívající váš widget nestará o závislosti. - -Podívejte se na dokumentaci [svazování & minifikace](Bundling-Minification.md) pro více informací o tomto systému. - -## RefreshUrl - -Widget může navrhnout `RefreshUrl`, který se používá vždy, když je potřeba widget aktualizovat. Je-li definován, widget se při každé aktualizaci znovu vykreslí na straně serveru (viz refresh `methoda` u `WidgetManager` níže). - -````csharp -[Widget(RefreshUrl = "Widgets/Counters")] -public class CountersWidgetViewComponent : AbpViewComponent -{ - -} -```` - -Jakmile pro svůj widget definujete `RefreshUrl`, musíte poskytnout koncový bod pro jeho vykreslení a vrátit ho: - -````csharp -[Route("Widgets")] -public class CountersWidgetController : AbpController -{ - [HttpGet] - [Route("Counters")] - public IActionResult Counters(DateTime startDate, DateTime endDate) - { - return ViewComponent("CountersWidget", new {startDate, endDate}); - } -} -```` - -Trasa `Widgets/Counters` předchozímu `RefreshUrl`. - -> Widget lze obnovit dvěma způsoby: Prvním způsobem je použití `RefreshUrl`, kdy se znovu vykreslí na serveru a nahradí HTML vrácené tím ze serveru. Druhým způsobem widget získá data (obvykle JSON objekt) ze serveru a obnoví se sám u klienta (viz refresh metoda v sekci Widget JavaScript API). - -## JavaScript API - -Možná bude potřeba vykreslit a obnovit widget na straně klienta. V takových případech můžete použít ABP `WidgetManager` a definovat API pro vaše widgety. - -### WidgetManager - -`WidgetManager` se používá k inicializaci a aktualizaci jednoho nebo více widgetů. Vytvořte nový `WidgetManager` jako je ukázáno níže: - -````js -$(function() { - var myWidgetManager = new abp.WidgetManager('#MyDashboardWidgetsArea'); -}) -```` - -`MyDashboardWidgetsArea` může obsahovat jeden nebo více widgetů. - -> Použíti `WidgetManager` uvnitř document.ready (jako nahoře) je dobrá praktika jelikož jeho funkce používají DOM a potřebují, aby byl DOM připraven. - -#### WidgetManager.init() - -`init` jednoduše inicializuje `WidgetManager` a volá metody `init` v souvisejících widgetech pokud je obsahují (podívejte se na sekci Widget JavaScript API section níže) - -```js -myWidgetManager.init(); -``` - -#### WidgetManager.refresh() - -`refresh` metoda obnoví všechny widgety související s tímto `WidgetManager`: - -```` -myWidgetManager.refresh(); -```` - -#### WidgetManager možnosti - -WidgetManager má několik dalších možností. - -##### Filtrační formulář - -Pokud vaše widgety vyžadují parametry/filtry pak budete obvykle mít formulář pro filtrování widgetů. V takových případech můžete vytvořit formulář, který obsahuje prvky formuláře a oblast řídicího panelu s nějakými widgety uvnitř. Příklad: - -````xml -
- ...prvky formuláře -
- -
- ...widgety -
-```` - -`data-widget-filter` atribut propojuje formulář s widgety. Kdykoli je formulář odeslán, všechny widgety jsou automaticky aktualizovány pomocí polí formuláře jako filtru. - -Místo atributu `data-widget-filter`, můžete použít parametr `filterForm` v konstruktoru `WidgetManager`. Příklad: - -````js -var myWidgetManager = new abp.WidgetManager({ - wrapper: '#MyDashboardWidgetsArea', - filterForm: '#MyDashboardFilterForm' -}); -```` - -##### Zpětné volání filtru - -Možná budete chtít mít lepší kontrolu nad poskytováním filtrů při inicializaci a aktualizaci widgetů. V tomto případě můžete použít volbu `filterCallback`: - -````js -var myWidgetManager = new abp.WidgetManager({ - wrapper: '#MyDashboardWidgetsArea', - filterCallback: function() { - return $('#MyDashboardFilterForm').serializeFormToObject(); - } -}); -```` - -Tento příklad ukazuje výchozí implementaci `filterCallback`. Pomocí polí můžete vrátit jakýkoli JavaScript objekt. Příklad: - -````js -filterCallback: function() { - return { - 'startDate': $('#StartDateInput').val(), - 'endDate': $('#EndDateInput').val() - }; -} -```` - -Vrácené filtry jsou předávány všem widgetům na `init` a` refresh`. - -### Widget JavaScript API - -Widget může definovat rozhraní API jazyka JavaScript, které je v případě potřeby vyvoláno přes `WidgetManager`. Ukázku kódu níže lze použít k definování API pro widget. - -````js -(function () { - abp.widgets.NewUserStatisticWidget = function ($wrapper) { - - var getFilters = function () { - return { - ... - }; - } - - var refresh = function (filters) { - ... - }; - - var init = function (filters) { - ... - }; - - return { - getFilters: getFilters, - init: init, - refresh: refresh - }; - }; -})(); -```` - -`NewUserStatisticWidget` je tady název widgetu. Měl by odpovídat názvu widgetu definovanému na straně serveru. Všechny funkce jsou volitelné. - -#### getFilters - -Pokud má widget vlastní interní filtry, měla by tato funkce vrátit objekt filtru. Příklad: - -````js -var getFilters = function() { - return { - frequency: $wrapper.find('.frequency-filter option:selected').val() - }; -} -```` - -Tuto metodu používá `WidgetManager` při vytváření filtrů. - -#### init - -Slouží k inicializaci widgetu kdykoli je potřeba. Má argument filtru, který lze použít při získávání dat ze serveru. Metoda `init` je použita když je volána funkce `WidgetManager.init()`. Použita je i v případě že váš widget vyžaduje úplné obnovení při aktualizaci. Viz `RefreshUrl` v možnostech widgetu. - -#### refresh - -Slouží k aktualizaci widgetu kdykoli je potřeba. Má argument filtru, který lze použít při získávání dat ze serveru. Metoda `refresh` se používá kdykoliv je volána funkce `WidgetManager.refresh()`. - -## Autorizace - -Některé widgety budou pravděpodobně muset být dostupné pouze pro ověřené nebo autorizované uživatele. V tomto případě použijte následující vlastnosti atributu `Widget`: - -* `RequiresAuthentication` (`bool`): Nastavte na true, aby byl tento widget použitelný pouze pro ověřené uživatele (uživatel je přihlášen do aplikace). -* `RequiredPolicies` (`List`): Seznam názvů zásad k autorizaci uživatele. Další informace o zásadách naleznete v [dokumentu autorizace](../Authorization.md). - -Příklad: - -````csharp -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc.UI.Widgets; - -namespace DashboardDemo.Web.Pages.Components.MySimpleWidget -{ - [Widget(RequiredPolicies = new[] { "MyPolicyName" })] - public class MySimpleWidgetViewComponent : AbpViewComponent - { - public IViewComponentResult Invoke() - { - return View(); - } - } -} -```` - -## WidgetOptions - -Jako alternativu k atributu `Widget` můžete ke konfiguraci widgetů použít `AbpWidgetOptions`: - -```csharp -Configure(options => -{ - options.Widgets.Add(); -}); -``` - -Toto vepište do metody `ConfigureServices` vašeho [modulu](../Module-Development-Basics.md). Veškerá konfigurace udělaná přes atribut `Widget` je dostupná i za pomoci `AbpWidgetOptions`. Příklad konfigurace, která přidává styl pro widget: - -````csharp -Configure(options => -{ - options.Widgets - .Add() - .WithStyles("/Pages/Components/MySimpleWidget/Default.css"); -}); -```` - -> Tip: `AbpWidgetOptions` lze také použít k získání existujícího widgetu a ke změně jeho konfigurace. To je obzvláště užitečné, pokud chcete změnit konfiguraci widgetu uvnitř modulu používaného vaší aplikací. Použíjte `options.Widgets.Find` k získání existujícího `WidgetDefinition`. - -## Podívejte se také na - -* [Příklad projektu (zdrojový kód)](https://github.com/abpframework/abp-samples/tree/master/DashboardDemo). - diff --git a/docs/cs/Autofac-Integration.md b/docs/cs/Autofac-Integration.md deleted file mode 100644 index 109dca6286..0000000000 --- a/docs/cs/Autofac-Integration.md +++ /dev/null @@ -1,84 +0,0 @@ -# Autofac integrace - -Autofac je jedním z nejpoužívanějších frameworků pro .Net pro vkládání závislostí (DI). Poskytuje pokročilejší funkce v porovnáním se standardní .Net Core DI knihovnou, jako dynamickou proxy a injekci vlastností. - -## Instalace Autofac integrace - -> Všechny startovací šablony a vzorky jsou s Autofac již integrovány. Takže většinou nemusíte tento balíček instalovat ručně. - -Nainstalujte do vašeho projektu balíček [Volo.Abp.Autofac](https://www.nuget.org/packages/Volo.Abp.Autofac) (pro víceprojektovou aplikaci se doporučuje přidat do spustitelného/webového projektu.) - -```` -Install-Package Volo.Abp.Autofac -```` - -Poté přídejte k vašemu modulu závislost na `AbpAutofacModule`: - -```csharp -using Volo.Abp.Modularity; -using Volo.Abp.Autofac; - -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpAutofacModule))] - public class MyModule : AbpModule - { - //... - } -} -``` - -Nakonec nastavte `AbpApplicationCreationOptions` aby nahradil výchozí služby pro vkládání závislostí na Autofac. Záleží na typu aplikace. - -### ASP.NET Core aplikace - -Volejte `UseAutofac()` v souboru **Startup.cs** jako je ukázáno níže: - -````csharp -public class Startup -{ - public IServiceProvider ConfigureServices(IServiceCollection services) - { - services.AddApplication(options => - { - //Integrace Autofac! - options.UseAutofac(); - }); - - return services.BuildServiceProviderFromFactory(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } -} -```` - -### Konzolová aplikace - -Volejte metodu `UseAutofac()` v možnostech `AbpApplicationFactory.Create` jako je ukázáno níže: - -````csharp -using System; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; - -namespace AbpConsoleDemo -{ - class Program - { - static void Main(string[] args) - { - using (var application = AbpApplicationFactory.Create(options => - { - options.UseAutofac(); //Autofac integrace - })) - { - //... - } - } - } -} -```` - diff --git a/docs/cs/Best-Practices/images/postgresql-delete-initial-migrations.png b/docs/cs/Best-Practices/images/postgresql-delete-initial-migrations.png deleted file mode 100644 index 14788c5fb8..0000000000 Binary files a/docs/cs/Best-Practices/images/postgresql-delete-initial-migrations.png and /dev/null differ diff --git a/docs/cs/Best-Practices/images/postgresql-update-database.png b/docs/cs/Best-Practices/images/postgresql-update-database.png deleted file mode 100644 index 30a5f3abe1..0000000000 Binary files a/docs/cs/Best-Practices/images/postgresql-update-database.png and /dev/null differ diff --git a/docs/cs/CLI.md b/docs/cs/CLI.md deleted file mode 100644 index f77c3ad969..0000000000 --- a/docs/cs/CLI.md +++ /dev/null @@ -1,167 +0,0 @@ -# ABP CLI - -ABP CLI (Command Line Interface) je nástroj v příkazovém řádku k provádění některých běžných úkonů v řešeních založených na ABP. - -## Instalace - -ABP CLI je [dotnet global tool](https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools). Nainstalujete jej pomocí okna příkazového řádku: - -````bash -dotnet tool install -g Volo.Abp.Cli -```` - -Aktualizace stávající instalace: - -````bash -dotnet tool update -g Volo.Abp.Cli -```` - -## Příkazy - -### new - -Vygeneruje nové řešení založené na ABP [startovací šabloně](Startup-Templates/Index.md). - -Základní použití: - -````bash -abp new [možnosti] -```` - -Příklad: - -````bash -abp new Acme.BookStore -```` - -* `Acme.BookStore` je tady název řešení. -* Běžná konvence je nazvat řešení stylem *VaseSpolecnost.VasProjekt*. Nicméně můžete použít i jiné pojmenování jako *VasProjekt* (jednostupňový jmenný prostor) nebo *VaseSpolecnost.VasProjekt.VasModul* (třístupňový jmenný prostor). - -#### Možnosti - -* `--template` nebo `-t`: Určuje název šablony. Výchozí šablona je `app`, která generuje webovou aplikaci. Dostupné šablony: - * `app` (výchozí): [Aplikační šablona](Startup-Templates/Application.md). Dodatečné možnosti: - * `--ui` nebo `-u`: Určuje UI framework. Výchozí framework je `mvc`. Dostupné frameworky: - * `mvc`: ASP.NET Core MVC. Pro tuto šablonu jsou dostupné dodatečné možnosti: - * `--tiered`: Vytvoří stupňovité řešení, kde jsou vrstvy Web a Http API fyzicky odděleny. Pokud není uvedeno, tak vytvoří vrstvené řešení, které je méně složité a vhodné pro většinu scénářů. - * `angular`: Angular. Pro tuto šablonu jsou dostupné dodatečné možnosti: - * `--separate-auth-server`: Oddělí Auth Server aplikaci od API host aplikace. Pokud není uvedeno, bude na straně serveru jediný koncový bod. - * `none`: Bez UI. Pro tuto šablonu jsou dostupné dodatečné možnosti: - * `--separate-auth-server`: Oddělí Auth Server aplikaci od API host aplikace. Pokud není uvedeno, bude na straně serveru jediný koncový bod. - * `--database-provider` nebo `-d`: Určuje poskytovatele databáze. Výchozí poskytovatel je `ef`. Dostupní poskytovatelé: - * `ef`: Entity Framework Core. - * `mongodb`: MongoDB. - * `module`: [Šablona modulu](Startup-Templates/Module.md). Dodatečné možnosti: - * `--no-ui`: Určuje nezahrnutí uživatelského rozhraní. Umožňuje vytvořit moduly pouze pro služby (a.k.a. mikroslužby - bez uživatelského rozhraní). -* `--output-folder` nebo `-o`: Určuje výstupní složku. Výchozí hodnota je aktuální adresář. -* `--version` nebo `-v`: Určuje verzi ABP & šablony. Může to být [štítek vydání](https://github.com/abpframework/abp/releases) nebo [název větve](https://github.com/abpframework/abp/branches). Pokud není uvedeno, používá nejnovější vydání. Většinou budete chtít použít nejnovější verzi. - - -### add-package - -Přidá ABP balíček do projektu, - -* Přidáním souvisejícícho nuget balíčku jako závislost do projektu. -* Přidáním `[DependsOn(...)]` atributu k modulové tříde v projektu (podívejte se na [dokument vývoje modulu](Module-Development-Basics.md)). - -> Všimněte si, že přidaný modul může vyžadovat další konfiguraci, která je obecně uvedena v dokumentaci příslušného balíčku. - -Základní použití: - -````bash -abp add-package [možnosti] -```` - -Příklad: - -```` -abp add-package Volo.Abp.MongoDB -```` - -* Tento příklad přidá do projektu balíček Volo.Abp.MongoDB. - -#### Možnosti - -* `--project` nebo `-p`: Určuje cestu k projektu (.csproj). Pokud není zadáno, CLI se pokusí najít soubor .csproj v aktuálním adresáři. - -### add-module - -Přidá [více-balíčkový aplikační modul](Modules/Index) k řešení tím, že najde všechny balíčky modulu, vyhledá související projekty v řešení a přidá každý balíček do odpovídajícího projektu v řešení. - -> Modul se obecně skládá z několika balíčků (z důvodu vrstvení, různých možností poskytovatele databáze nebo jiných důvodů). Použití příkazu `add-module` dramaticky zjednodušuje přidání modulu do řešení. Každý modul však může vyžadovat další konfiguraci, která je obecně uvedena v dokumentaci příslušného modulu. - -Základní použití: - -````bash -abp add-module [možnosti] -```` - -Příklad: - -```bash -abp add-module Volo.Blogging -``` - -* Tento příklad přidá do projektu modul Volo.Blogging. - -#### Možnosti - -* `--solution` nebo `-s`: Určuje cestu k řešení (.sln). Pokud není zadáno, CLI se pokusí najít soubor .sln v aktuálním adresáři. -* `--skip-db-migrations`: Pro poskytovatele databáze EF Core automaticky přidá nový kód první migrace (`Add-Migration`) a v případě potřeby aktualizuje databázi (`Update-Database`). Tuto možnost určete k vynechání této operace. -* `-sp` nebo `--startup-project`: Relativní cesta ke složce spouštěcího projektu. Výchozí hodnota je aktuální adresář. -* `--with-source-code`: Místo balíčků NuGet/NPM přidejte zdrojový kód modulu. - -### update - -Aktualizace všech balíčků souvisejících s ABP může být únavná, protože existuje mnoho balíčků frameworku a modulů. Tento příkaz automaticky aktualizuje na poslední verze všechny související ABP NuGet a NPM balíčky v řešení nebo projektu. - -Použití: - -````bash -abp update [možnosti] -```` - -* Pokud spouštíte v adresáři se souborem .sln, aktualizuje všechny balíčky všech projektů v řešení souvisejících s ABP na nejnovější verze. -* Pokud spouštíte v adresáři se souborem .csproj, aktualizuje všechny balíčky v projektu na nejnovější verze. - -#### Možnosti - -* `--include-previews` nebo `-p`: Zahrne náhledové, beta a rc balíčky při kontrole nových verzí. -* `--npm`: Aktualizuje pouze balíčky NPM. -* `--nuget`: Aktualizuje pouze balíčky NuGet. - -### login - -Některé funkce CLI vyžadují přihlášení k platformě abp.io. Chcete-li se přihlásit pomocí svého uživatelského jména, napište - -```bash -abp login -``` - -Všimněte si, že nové přihlášení s již aktivní relací ukončí předchozí relaci a vytvoří novou. - -### logout - -Odhlásí vás odebráním tokenu relace z počítače. - -``` -abp logout -``` - -### help - -Vypíše základní informace k používání CLI. - -Použítí: - -````bash -abp help [název-příkazu] -```` - -Příklady: - -````bash -abp help # Zobrazí obecnou nápovědu. -abp help new # Zobrazí nápovědu k příkazu "new". -```` - diff --git a/docs/cs/Contribution/Index.md b/docs/cs/Contribution/Index.md deleted file mode 100644 index ac1aaf00c1..0000000000 --- a/docs/cs/Contribution/Index.md +++ /dev/null @@ -1,64 +0,0 @@ -## Průvodce pro přispěvatele - -ABP je [open source](https://github.com/abpframework) a komunitně řízený projekt. Tento průvodce má za cíl pomoci každému kdo chce do projektu nějak přispět. - -### Příspěvek kódu - -Vždy můžete zaslat pull request do Github repositáře. - -- Naklonujte [ABP repozitář](https://github.com/abpframework/abp/) z Githubu. -- Učiňte potřebné změny. -- Zašlete pull request. - -Než budete dělat nějaké změny, diskutujte o nich prosím na [Github problémy](https://github.com/abpframework/abp/issues). Díky tomu nebude žádný jiný vývojář pracovat na stejném problému a Váš PR má lepší šanci na to být přijat. - -#### Opravy chyb a vylepšení - -Pokud chcete opravit známou chybu nebo pracovat na plánovaném vylepšení podívejte se na [seznam problémů](https://github.com/abpframework/abp/issues) na Githubu. - -#### Požadavky na funkce - -Pokud máte nápad na funkci pro framework nebo modul [vytvořte problém](https://github.com/abpframework/abp/issues/new) na Githubu nebo se připojte ke stávající diskuzi. V případě přijetí komunitou ho pak můžete implementovat. - -### Překlad dokumentů - -Pokud chcete přeložit celou [dokumentaci](https://abp.io/documents/) (včetně této stránky) do Vašeho rodného jazyka, následujte tyto kroky: - -* Naklonujte [ABP repozitář](https://github.com/abpframework/abp/) z Githubu. -* K přidání nového jazyka vytvořte novou složku v [docs](https://github.com/abpframework/abp/tree/master/docs). Název složky musí být "en", "es", "fr", "tr" atd. v závislosti na jazyku (navštivte [všechny jazykové kódy](https://msdn.microsoft.com/en-us/library/hh441729.aspx)). -* Pro referenci použijte ["en" složku](https://github.com/abpframework/abp/tree/master/docs/en) a její názvy souborů a strom složek. Při překladu této dokumentace zachovejte prosím tyto názvy stejné. -* Zašlete pull request (PR) po překladu jakéhokoliv dokumentu klidně i po jednom. Nečekejte až budete mít překlad všech dokumentů. - -Existuje několik základních dokumentů, které je třeba přeložit než bude jazyk uveřejněn na [stránkách ABP dokumentace](https://docs.abp.io) - -* Začínáme dokumenty -* Tutoriály -* CLI - -Nový jazyk je publikován jakmile jsou minimálně tyto překlady dokončeny. - -### Lokalizace zdrojů - -ABP framework má flexibilní [lokalizační systém](../Localization.md). Můžete tak vytvořit lokalizované uživatelské prostředí pro svou vlastní aplikaci. - -K tomu mají framework a vestavěné moduly již lokalizované texty. Například [lokalizační texty pro Volo.Abp.UI balík](https://github.com/abpframework/abp/blob/master/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json). - -Můžete vytvořit nový soubor ve [stejné složce](https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi) k přidání překladu. - -* Naklonujte [ABP repozitář](https://github.com/abpframework/abp/) z Githubu. -* Vytvořte nový soubor pro cílový jazyk pro lokalizační text v (json) souboru (u souboru en.json). -* Zkopírujte veškerý text ze souboru en.json. -* Přeložte texty. -* Zašlete pull request na Githubu. - -K překladu lokalizovaných textů můžete také použít příkaz `abp translate` of [ABP CLI](CLI.md). - -ABP je modulářní framework, proto je zde mnoho zdrojů lokalizačních textů, jeden pro každý modul. K najití všech .json souborů, vyhledejte po naklonování repozitáře soubory "en.json". Můžete se taky podívat na [tento seznam](Localization-Text-Files.md) souborů lokalizačních textů. - -### Příspevky do blogu a návody - -Pokud se rozhodnete pro ABP vytvořit nějaké návody nebo příspěvky do blogu, dejte nám vědět (prostřednictvím [Github problémy](https://github.com/abpframework/abp/issues)), ať můžeme přidat odkaz na Váš návod/příspěvek v oficiální dokumentaci a oznámit na našem [Twitter účtu](https://twitter.com/abpframework). - -### Zpráva o chybě - -Pokud najdete chybu, [vytvořte prosím problém v Github repozitáři](https://github.com/abpframework/abp/issues/new). diff --git a/docs/cs/Dapper.md b/docs/cs/Dapper.md deleted file mode 100644 index 94e40347f0..0000000000 --- a/docs/cs/Dapper.md +++ /dev/null @@ -1,61 +0,0 @@ -# Dapper integrace - -Jelikož myšlenka Dapper je taková, že sql příkaz má přednost, tak hlavně poskytuje metody rozšíření pro `IDbConnection` rozhraní. - -Abp nezapouzdřuje přílíš mnoho funkcí pro Dapper. Abp Dapper poskytuje základní třídu `DapperRepository` založenou na Abp EntityFrameworkCore, který poskytuje vlastnosti `IDbConnection` a `IDbTransaction` vyžadované v Dapper. - -Tyto dvě vlastnosti fungují dobře s [jednotkou práce](Unit-Of-Work.md). - -## Instalace - -Nainstalujte a nakonfigurujte EF Core podle [EF Core integrační dokumentace](Entity-Framework-Core.md). - -`Volo.Abp.Dapper` je hlavní NuGet balík pro Dapper integraci. Nainstalujte jej proto do vašeho projektu (pro strukturovanou aplikaci do datové/infrastrukturní vrstvy): - -```shell -Install-Package Volo.Abp.Dapper -``` - -Poté přidejte závislost na `AbpDapperModule` modulu (atribut `DependsOn`) do Vašeho [modulu](Module-Development-Basics.md): - -````C# -using Volo.Abp.Dapper; -using Volo.Abp.Modularity; - -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpDapperModule))] - public class MyModule : AbpModule - { - //... - } -} -```` - -## Implementace Dapper repozitáře - -Následující kód implementuje repozitář `Person`, který vyžaduje `DbContext` z EF Core (MyAppDbContext). Můžete vložit `PersonDapperRepository` k volání jeho metod. - -`DbConnection` a `DbTransaction` jsou ze základní třídy `DapperRepository`. - -```C# -public class PersonDapperRepository : DapperRepository, ITransientDependency -{ - public PersonDapperRepository(IDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public virtual async Task> GetAllPersonNames() - { - return (await DbConnection.QueryAsync("select Name from People", transaction: DbTransaction)) - .ToList(); - } - - public virtual async Task UpdatePersonNames(string name) - { - return await DbConnection.ExecuteAsync("update People set Name = @NewName", new { NewName = name }, - DbTransaction); - } -} -``` diff --git a/docs/cs/Domain-Driven-Design.md b/docs/cs/Domain-Driven-Design.md deleted file mode 100644 index 161e92c8a2..0000000000 --- a/docs/cs/Domain-Driven-Design.md +++ /dev/null @@ -1,33 +0,0 @@ -# Domain Driven Design - -## Co je DDD? - -ABP framework poskytuje **infrastrukturu**, která zjednodušuje implementaci vývoje založeného na **DDD**. DDD je [definován ve Wikipedii](https://en.wikipedia.org/wiki/Domain-driven_design) takto: - -> **Domain-driven design** (**DDD**) je přístup k vývoji softwaru pro komplexní potřeby propojením implementace s vyvíjejícím se modelem. Předpoklad DDD je následující: -> -> - Primární zaměření projektu je na jádře domény a doménové logice; -> - Zakládání komplexních návrhů na modelu domény; -> - Iniciování tvůrčí spolupráce mezi technickými a doménovými odborníky s cílem iterativně zdokonalit koncepční model, který řeší konkrétní problémy v doméně. - -### Vrstvy - -ABP dodržuje principy a vzorce DDD pro dosažení vrstveného aplikačního modelu, který se skládá ze čtyř základních vrstev: - -- **Prezentační vrstva**: Poskytuje uživateli rozhraní. Používá *Aplikační vrstvu* k dosažení uživatelských interakcí. -- **Aplikační vrstva**: Prostředník mezi prezentační a doménovou vrstvou. Instrumentuje business objekty k provádění specifických úloh aplikace. Implementuje případy použití jako logiku aplikace. -- **Doménová vrstva**: Zahrnuje business objekty a jejich business pravidla. Je jádrem aplikace. -- **Vrstva infrastruktury**: Poskytuje obecné technické možnosti, které podporují vyšší vrstvy většinou pomocí knihoven třetích stran. - -## Obsah - -* **Doménová vrstva** - * [Entity & agregované kořeny](Entities.md) - * Hodnotové objekty - * [Repozitáře](Repositories.md) - * Doménové služby - * Specifikace -* **Aplikační vrstva** - * [Aplikační služby](Application-Services.md) - * [Objekty přenosu dat (DTOs)](Data-Transfer-Objects.md) - * Jednotka práce \ No newline at end of file diff --git a/docs/cs/Entity-Framework-Core-PostgreSQL.md b/docs/cs/Entity-Framework-Core-PostgreSQL.md deleted file mode 100644 index dc50c8a742..0000000000 --- a/docs/cs/Entity-Framework-Core-PostgreSQL.md +++ /dev/null @@ -1,39 +0,0 @@ -# Přepnutí na EF Core PostgreSQL providera - -Tento dokument vysvětluje, jak přepnout na poskytovatele databáze **PostgreSQL** pro **[spouštěcí šablonu aplikace](Startup-Templates/Application.md)**, která je dodávána s předem nakonfigurovaným SQL poskytovatelem. - -## Výměna balíku Volo.Abp.EntityFrameworkCore.SqlServer - -Projekt `.EntityFrameworkCore` v řešení závisí na NuGet balíku [Volo.Abp.EntityFrameworkCore.SqlServer](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.SqlServer). Odstraňte tento balík a přidejte stejnou verzi balíku [Volo.Abp.EntityFrameworkCore.PostgreSql](https://www.nuget.org/packages/Volo.Abp.EntityFrameworkCore.PostgreSql). - -## Nahrazení závislosti modulu - -Najděte třídu ***YourProjectName*EntityFrameworkCoreModule** v projektu `.EntityFrameworkCore`, odstraňte `typeof(AbpEntityFrameworkCoreSqlServerModule)` z atributu `DependsOn`, přidejte `typeof(AbpEntityFrameworkCorePostgreSqlModule)` (také nahraďte `using Volo.Abp.EntityFrameworkCore.SqlServer;` za `using Volo.Abp.EntityFrameworkCore.PostgreSql;`). - -## UseNpgsql() - -Najděte volání `UseSqlServer()` v *YourProjectName*EntityFrameworkCoreModule.cs uvnitř projektu `.EntityFrameworkCore` a nahraďte za `UseNpgsql()`. - -Najděte volání `UseSqlServer()` v *YourProjectName*MigrationsDbContextFactory.cs uvnitř projektu `.EntityFrameworkCore.DbMigrations` a nahraďte za `UseNpgsql()`. - -> V závislosti na struktuře řešení můžete najít více volání `UseSqlServer()`, které je třeba změnit. - -## Změna connection stringů - -PostgreSql connection stringy se od těch pro SQL Server liší. Je proto potřeba zkontrolovat všechny soubory `appsettings.json` v řešení a connection stringy v nich nahradit. Podívejte se na [connectionstrings.com](https://www.connectionstrings.com/postgresql/) pro více detailů o možnostech PostgreSql connection stringů. - -Typicky je potřeba změnit `appsettings.json` v projektech `.DbMigrator` a `.Web` projects, ale to záleží na vaší struktuře řešení. - -## Regenerace migrací - -Startovací šablona používá [Entity Framework Core Code First migrace](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/). EF Core migrace závisí na zvoleném DBMS poskytovateli. Tudíž změna DBMS poskytovatele způsobí selhání migrace. -* Smažte složku Migrations v projektu `.EntityFrameworkCore.DbMigrations` and znovu sestavte řešení. -* Spusťte `Add-Migration "Initial"` v Package Manager Console (je nutné zvolit `.DbMigrator` (nebo `.Web`) projekt jako startovací projekt v Solution Explorer a zvolit projekt `.EntityFrameworkCore.DbMigrations` jako výchozí v Package Manager Console). - -Tímto vytvoříte migraci databáze se všemi nakonfigurovanými databázovými objekty (tabulkami). - -Spusťte projekt `.DbMigrator` k vytvoření databáze a vložení počátečních dat. - -## Spuštění aplikace - -Vše je připraveno. Stačí už jen spustit aplikaci a užívat si kódování. diff --git a/docs/cs/Getting-Started-Angular-Template.md b/docs/cs/Getting-Started-Angular-Template.md deleted file mode 100644 index 076fb45671..0000000000 --- a/docs/cs/Getting-Started-Angular-Template.md +++ /dev/null @@ -1,126 +0,0 @@ -## Začínáme s Angular aplikační šablonou - -Tento tutoriál vysvětluje, jak vytvořit novou Angular aplikaci pomocí spouštěcí šablony, jak ji nakonfigurovat a spustit. - -### Tvorba nového projektu - -Tento tutorial používá k vytvoření nového projektu **ABP CLI**. Podívejte se na stránku [začínáme](https://abp.io/get-started) pro více možností. - -Pokud jste tak dosud neučinili, nainstalujte ABP CLI pomocí okna příkazového řádku: - -````bash -dotnet tool install -g Volo.Abp.Cli -```` - -Použíjte příkaz `abp new` v prázdné složce k vytvoření Vašeho projektu: - -````bash -abp new Acme.BookStore -u angular -```` - -> Můžete použít různé úrovně jmenných prostorů; např. BookStore, Acme.BookStore nebo Acme.Retail.BookStore. - -`-u angular` volba specifikuje Angular jako UI framework. Výchozí poskytovatel databáze je EF Core. Podívejte se na [CLI dokumentaci](CLI.md) pro všechny dostupné možnosti. - -#### Předběžné požadavky - -Vytvořené řešení vyžaduje; - -* [Visual Studio 2019 (v16.4.0+)](https://visualstudio.microsoft.com/vs/) -* [.NET Core 3.0+](https://www.microsoft.com/net/download/dotnet-core/) -* [Node v12+](https://nodejs.org) -* [Yarn v1.19+](https://classic.yarnpkg.com/) - -### Struktura řešení - -Otevřete řešení ve **Visual Studio**: - -![bookstore-visual-studio-solution](images/bookstore-visual-studio-solution-for-spa.png) - -Řešení má vrstvenou strukturu (založenou na [domain driven designu](Domain-Driven-Design.md)) a obsahuje projekty testů jednotek a integrace správně nakonfigurované pro práci s **EF Core** & **SQLite in-memory** databází. - -> Podívejte se na [dokument šablony aplikace](Startup-Templates/Application.md) k detailnímu pochopení struktury řešení. - -### Databázový connection string - -Zkontrolujte **connection string** v souboru `appsettings.json` u projektu `.HttpApi.Host`: - -````json -{ - "ConnectionStrings": { - "Default": "Server=localhost;Database=BookStore;Trusted_Connection=True" - } -} -```` - -Řešení je nakonfigurováno pro použití **Entity Framework Core** s **MS SQL Server**. EF Core podporuje [různé](https://docs.microsoft.com/en-us/ef/core/providers/) poskytovatele databáze, takže pokud chcete můžete použít jiný DBMS. V případě potřeby změňte connection string. - -### Tvorba databáze & aplikace migrací databáze - -K vytvoření databáze máte dvě možnosti. - -#### Použití aplikace DbMigrator - -Řešení obsahuje konzolovou aplikaci (v tomto příkladu nazvanou `Acme.BookStore.DbMigrator`), která dokáže vytvořit databázi, aplikovat migrace a vložit počáteční data. Ta je užitečná jak pro vývojové tak pro produkční prostředí. - -> `.DbMigrator` má vlastní `appsettings.json`. Pokud jste změnili connection string výše, měli byste změnit i tento. - -Klikněte pravým na projekt `.DbMigrator` zvolte **Set as StartUp Project**: - -![set-as-startup-project](images/set-as-startup-project.png) - -Zmáčkněte F5 (nebo Ctrl+F5) ke spuštění aplikace. Výstup by měl být podobný vyobrazení níže: - -![set-as-startup-project](images/db-migrator-app.png) - -#### Použití příkazu EF Core Update-Database - -Ef Core máš příkaz `Update-Database`, který v případě potřeby vytvoří databázi a aplikuje čekající migrace. Klikněte pravým na projekt `.HttpApi.Host` a zvolte **Set as StartUp Project**: - -![set-as-startup-project](images/set-as-startup-project.png) - -Otevřete **Package Manager Console**, zvolte `.EntityFrameworkCore.DbMigrations` jako **Default Project** a proveďte příkaz `Update-Database`: - -![pcm-update-database](images/pcm-update-database-v2.png) - -Tímto vytvoříte novou databáze podle nakonfigurovaného connection string. - -> Je doporučeno užití nástroje `.DbMigrator`, protože zároveň vloží i počáteční data ke správnému běhu webové aplikace. - -### Spuštění aplikace - -#### Spuštění API Host (na straně serveru) - -Ujistěte se že je projekt `.HttpApi.Host` nastaven jako startovací a spusťte aplikaci což otevře Swagger UI: - -![bookstore-homepage](images/bookstore-swagger-ui-host.png) - -Tady můžete vidět API aplikace a zároveň je i otestovat. Získejte [více informací](https://swagger.io/tools/swagger-ui/) o Swagger UI. - -##### Autorizace pro Swagger UI - -Vetšina API aplikace vyžaduje autentizaci & autorizaci. Pokud chcete otestovat autorizované API, manuálně přejděte na stránku `/Account/Login`, vložte `admin` jako uživatelské jméno a `1q2w3E*` jako heslo k příhlášení do aplikace. Poté budete moci provádět autorizované požadavky API. - -#### Spuštění Angular aplikace (na straně klienta) - -Přejděte do složky `angular`, otevřete terminál příkazového řádku, proveďte příkaz `yarn` (doporučujeme používat správce balíků [yarn](https://yarnpkg.com), npm install bude v mnoha případech také fungovat): - -````bash -yarn -```` - -Jakmile jsou načteny všechny node moduly, proveďte příkaz `yarn start` nebo `npm start`: - -````bash -yarn start -```` - -Otevřete Váš oblíbený prohlížeč a přejděte na adresu `localhost:4200`. Počáteční uživatelské jméno je `admin` a heslo `1q2w3E*`. - -Startovací šablona obsahuje moduly **správa identit** a **správa tenantů**. Jakmile se přihlásíte, zprístupní se administrační menu kde můžete spravovat **tenanty**, **role**, **uživatele** a jejich **oprávnění**. - -> Doporučujeme [Visual Studio Code](https://code.visualstudio.com/) jako editor pro Angular projekt, ale klidně použijte Váš oblíbený editor. - -### Co dále? - -* [Tutoriál vývoje aplikace](Tutorials/Angular/Part-I.md) diff --git a/docs/cs/Getting-Started-AspNetCore-Application.md b/docs/cs/Getting-Started-AspNetCore-Application.md deleted file mode 100644 index e269a08ba2..0000000000 --- a/docs/cs/Getting-Started-AspNetCore-Application.md +++ /dev/null @@ -1,157 +0,0 @@ -# Začínáme s ASP.NET Core MVC aplikací - -Tento tutoriál vysvětluje jak začít s ABP z ničeho s minimem závislostí. Obvykle chcete začít se **[startovací šablonou](https://abp.io/Templates)**. - -## Tvorba nového projektu - -1. Vytvořte novou AspNet Core Web aplikaci ve Visual Studio 2019 (16.4.0+): - -![](images/create-new-aspnet-core-application-v2.png) - -2. Nakonfigurujte váš nový projekt: - -![](images/select-empty-web-application-v2.png) - -3. Potvrďte kliknutím na tlačítko vytvořit - -![create-aspnet-core-application](images/create-aspnet-core-application.png) - -## Instalace Volo.Abp.AspNetCore.Mvc balíku - -Volo.Abp.AspNetCore.Mvc je AspNet Core MVC integrační balík pro ABP. Takže ho nainstalujeme do projektu: - -```` -Install-Package Volo.Abp.AspNetCore.Mvc -```` - -## Tvorba prvního ABP modulu - -ABP je modulární framework a proto vyžaduje **spouštěcí (kořenový) modul** což je třída dědící z ``AbpModule``: - -````C# -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Hosting; -using Volo.Abp; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.Modularity; - -namespace BasicAspNetCoreApplication -{ - [DependsOn(typeof(AbpAspNetCoreMvcModule))] - public class AppModule : AbpModule - { - public override void OnApplicationInitialization( - ApplicationInitializationContext context) - { - var app = context.GetApplicationBuilder(); - var env = context.GetEnvironment(); - - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - else - { - app.UseExceptionHandler("/Error"); - } - - app.UseStaticFiles(); - app.UseRouting(); - app.UseConfiguredEndpoints(); - } - } -} -```` - -``AppModule`` je dobrý název pro spouštěcí modul aplikace. - -ABP balíky definují modulové třídy a modul může mít závislost na jiném. V kódu výše, ``AppModule`` má závislost na ``AbpAspNetCoreMvcModule`` (definován v balíku [Volo.Abp.AspNetCore.Mvc](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc)). Je běžné přidat ``DependsOn`` atribute po instalaci nového ABP NuGet balíku. - -Místo třídy Startup, konfigurujeme ASP.NET Core pipeline v této modulové třídě. - -## Třída Startup - -V dalším kroku upravíme Startup třídu k integraci ABP modulového systému: - -````C# -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace BasicAspNetCoreApplication -{ - public class Startup - { - public void ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} -```` - -``services.AddApplication()`` přidává všechny služby definované ve všech modulech počínaje od ``AppModule``. - -``app.InitializeApplication()`` v metodě ``Configure`` inicializuje a spustí aplikaci. - -## Spusťte aplikaci! - -To je vše! Spusťte aplikaci, bude fungovat podle očekávání. - -## Použití Autofac jako frameworku pro vkládání závislostí - -Ačkoliv je AspNet Core systém pro vkládání závíslostí (DI) dostatečný pro základní požadavky, [Autofac](https://autofac.org/) poskytuje pokročilé funkce jako injekce vlastností nebo záchyt metod, které jsou v ABP užity k provádění pokročilých funkcí frameworku. - -Nahrazení AspNet Core DI systému za Autofac a integrace s ABP je snadná. - -1. Nainstalujeme [Volo.Abp.Autofac](https://www.nuget.org/packages/Volo.Abp.Autofac) balík - -```` -Install-Package Volo.Abp.Autofac -```` - -2. Přidáme ``AbpAutofacModule`` závislost - -````C# -[DependsOn(typeof(AbpAspNetCoreMvcModule))] -[DependsOn(typeof(AbpAutofacModule))] // Přidá závislost na AbpAutofacModule -public class AppModule : AbpModule -{ - ... -} -```` - -3. Upravíme `Program.cs` aby používal Autofac: - -````csharp -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -namespace BasicAspNetCoreApplication -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }) - .UseAutofac(); // Přidejte tento řádek - } -} -```` - -## Zdrojový kód - -Získejte zdrojový kód vzorového projektu vytvořeného v tomto tutoriálů [z tohoto odkazu](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication). - diff --git a/docs/cs/Getting-Started-AspNetCore-MVC-Template.md b/docs/cs/Getting-Started-AspNetCore-MVC-Template.md deleted file mode 100644 index c053e1d76a..0000000000 --- a/docs/cs/Getting-Started-AspNetCore-MVC-Template.md +++ /dev/null @@ -1,104 +0,0 @@ -## Začínáme s ASP.NET Core MVC šablonou - -Tento tutoriál vysvětluje, jak vytvořit novou ASP.NET Core MVC webovou aplikaci pomocí úvodní šablony, jak ji nakonfigurovat a spustit. - -### Tvorba nového projektu - -Tento tutoriál používá k tvorbě nového projektu **ABP CLI**. Podívejte se na stránku [Začínáme](https://abp.io/get-started) pro více možností. - -Pokud ještě nemáte ABP CLI nainstalováno, učiňte tak pomocí okna příkazového řádku: - -````bash -dotnet tool install -g Volo.Abp.Cli -```` - -K tvorbě vašeho projektu použijte příkaz `abp new` v prázdné složce: - -````bash -abp new Acme.BookStore -```` - -> Můžete použít různé úrovně jmenných prostorů; např. BookStore, Acme.BookStore nebo Acme.Retail.BookStore. - -Příkaz `new` vytvoří **vrstvenou MVC aplikaci** s **Entity Framework Core** jako databázovým poskytovatelem. Jsou zde však i jiné možnosti. Podívejte se na [CLI dokumnentaci](CLI.md) pro všechny další možností. - -#### Požadavky - -Vytvořené řešení vyžaduje; - -* [Visual Studio 2019 (v16.4.0+)](https://visualstudio.microsoft.com/vs/) -* [.NET Core 3.0+](https://www.microsoft.com/net/download/dotnet-core/) -* [Node v12+](https://nodejs.org) -* [Yarn v1.19+](https://classic.yarnpkg.com/) - -### Struktura řešení - -Otevřete řešení ve **Visual Studio**: - -![bookstore-visual-studio-solution](images/bookstore-visual-studio-solution-v3.png) - -Řešení má vrstvenou strukturu (založenou na [Domain Driven Design](Domain-Driven-Design.md)) a obsahuje projekty jednotkovových a integračních testů předkonfigurované pro práci s **EF Core** & **SQLite in-memory** databází. - -> Podívejte se na [dokument šablony aplikace](Startup-Templates/Application.md) k detailnímu pochopení struktury řešení. - -### Connection string databáze - -Zkontrolujte **connection string** v souboru `appsettings.json` v projektu `.Web`: - -````json -{ - "ConnectionStrings": { - "Default": "Server=localhost;Database=BookStore;Trusted_Connection=True" - } -} -```` - -Řešení je nakonfigurováno k používání **Entity Framework Core** s **MS SQL Server**. EF Core podporuje [různé](https://docs.microsoft.com/en-us/ef/core/providers/) databázové poskytovatele, takže můžete použít i jiné DBMS. V případě potřeby změňte connection string. - -### Tvorba databáze & aplikace databázových migrací - -K vytvoření databáze máte dvě možnosti. - -#### Použití DbMigrator aplikace - -Řešení obsahuje konzolovou aplikaci (v tomto příkladu nazvanou `Acme.BookStore.DbMigrator`), která může vytvářet databáze, aplikovat migrace a vkládat seed data. Je užitečná jak pro vývojové, tak pro produkční prostředí. - -> Projekt `.DbMigrator` má vlastní `appsettings.json`. Takže pokud jste změnili connection string uvedený výše, musíte změnit také tento. - -Klikněte pravým na projekt `.DbMigrator` a vyberte **Set as StartUp Project**: - -![set-as-startup-project](images/set-as-startup-project.png) - -Zmáčkněte F5 (nebo Ctrl+F5) ke spuštění aplikace. Výstup bude vypadat následovně: - -![set-as-startup-project](images/db-migrator-app.png) - -#### Použití EF Core Update-Database příkazu - -Ef Core má `Update-Database` příkaz, který v případě potřeby vytvoří databázi a aplikuje čekající migrace. Klikněte pravým na projekt `.Web` a vyberte **Set as StartUp Project**: - -![set-as-startup-project](images/set-as-startup-project.png) - -Otevřete **Package Manager Console**, vyberte projekt `.EntityFrameworkCore.DbMigrations` jako **Default Project** and spusťte příkaz `Update-Database`: - -![pcm-update-database](images/pcm-update-database-v2.png) - -Dojde k vytvoření nové databáze na základě nakonfigurovaného connection stringu. - -> Použití nástroje `.Migrator` je doporučený způsob, jelikož zároveň vloží seed data nutné k správnému běhu webové aplikace. - -### Spuštění aplikace - -Ujistěte se že je projekt `.Web` nastaven jako startovací projekt. Spusťte aplikaci což následně otevře **úvodní** stránku ve vašem prohlížeči: - -![bookstore-homepage](images/bookstore-homepage.png) - -Klikněte na tlačítko **Přihlásit**, vložte `admin` jako uživatelské jméno a `1q2w3E*` jako heslo k přihlášení do aplikace. - -Startovací šabloná obsahuje **identity management** a **tenant management** moduly. Jakmile se přihlásite, budete mít přístup do nabídky Administrace, kde můžete spravovat **tenanty**, **role**, **uživatele** a jejich **oprávnění**. Správa uživatelů vypadá takto: - -![bookstore-user-management](images/bookstore-user-management-v2.png) - -### Co dále? - -* [Tutoriál vývoje aplikace](Tutorials/AspNetCore-Mvc/Part-I.md) diff --git a/docs/cs/Getting-Started-Console-Application.md b/docs/cs/Getting-Started-Console-Application.md deleted file mode 100644 index a6ee50dbe6..0000000000 --- a/docs/cs/Getting-Started-Console-Application.md +++ /dev/null @@ -1,181 +0,0 @@ -# Začínáme s konzolovou aplikací - -Tento tutoriál vysvětluje jak začít s ABP z ničeho s minimem závislostí. Obvykle chcete začít se **[startovací šablonou](https://abp.io/Templates)**. - -## Tvorba nového projektu - -Vytvořte regulérní .NET Core konzolovou aplikaci z Visual Studio: - -![](images/create-new-net-core-console-application.png) - -## Instalace Volo.Abp balíku - -Volo.Abp.Core je základní NuGet balík k tvorbě aplikací založených na ABP. Takže ho nainstalujeme do projektu: - -```` -Install-Package Volo.Abp.Core -```` - -## Tvorba prvního ABP modulu - -ABP je modulární framework a proto vyžaduje **spouštěcí (kořenový) modul** což je třída dědící z ``AbpModule``: - -````C# -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Modularity; - -namespace AbpConsoleDemo -{ - public class AppModule : AbpModule - { - - } -} -```` - -``AppModule`` je dobrý název pro spouštěcí modul aplikace. - -## Inicializace aplikace - -Dalším krokem je bootstrap aplikace pomocí spouštěcího modulu vytvořeného výše: - -````C# -using System; -using Volo.Abp; - -namespace AbpConsoleDemo -{ - class Program - { - static void Main(string[] args) - { - using (var application = AbpApplicationFactory.Create()) - { - application.Initialize(); - - Console.WriteLine("Press ENTER to stop application..."); - Console.ReadLine(); - } - } - } -} - -```` - -``AbpApplicationFactory`` se používá k vytvoření aplikace a načtení všech modulů, s využitím ``AppModule`` jako spouštěcím modulem. ``Initialize()`` metoda spouští aplikaci. - -## Ahoj světe! - -Aplikace výše zatím nic nedělá. Pojďme proto vytvořit službu která už něco dělá: - -````C# -using System; -using Volo.Abp.DependencyInjection; - -namespace AbpConsoleDemo -{ - public class HelloWorldService : ITransientDependency - { - public void SayHello() - { - Console.WriteLine("Hello World!"); - } - } -} - -```` - -``ITransientDependency`` je speciální rozhraní ABP, které automaticky registruje službu jako přechodnou (více v [dokumentu vkládání závislostí](Dependency-Injection.md)). - -Nyní můžeme vyřešit ``HelloWorldService`` a vypsat naše ahoj. Změníme Program.cs podle vyobrazení níže: - -````C# -using System; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; - -namespace AbpConsoleDemo -{ - class Program - { - static void Main(string[] args) - { - using (var application = AbpApplicationFactory.Create()) - { - application.Initialize(); - - // Vyřeší službu a použije ji - var helloWorldService = - application.ServiceProvider.GetService(); - helloWorldService.SayHello(); - - Console.WriteLine("Press ENTER to stop application..."); - Console.ReadLine(); - } - } - } -} -```` - -I když je to dostačující pro tento jednoduchý príklad kódu, je vždy lepší v případě přímého řešení závislostí z ``IServiceProvider`` vytvořit rámce (více v [dokumentu vkládání závislostí](Dependency-Injection.md)). - -## Využití Autofac jako frameworku pro vkládání závislostí - -Ačkoliv je AspNet Core systém pro vkládání závíslostí (DI) skvělý pro základní požadavky, Autofac poskytuje pokročilé funkce jako injekce vlastností nebo záchyt metod, které jsou v ABP užity k provádění pokročilých funkcí frameworku. - -Nahrazení AspNet Core DI systému za Autofac a integrace s ABP je snadná. - -1. Nainstalujeme [Volo.Abp.Autofac](https://www.nuget.org/packages/Volo.Abp.Autofac) balík - -``` -Install-Package Volo.Abp.Autofac -``` - -1. Přidáme ``AbpAutofacModule`` závislost - -```c# -[DependsOn(typeof(AbpAutofacModule))] // Přidá závislost na AbpAutofacModule -public class AppModule : AbpModule -{ - -} -``` - -1. Změníme soubor ``Program.cs`` podle vyobrazení níže: - -```c# -using System; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; - -namespace AbpConsoleDemo -{ - class Program - { - static void Main(string[] args) - { - using (var application = AbpApplicationFactory.Create(options => - { - options.UseAutofac(); // Autofac integrace - })) - { - application.Initialize(); - - // Vyřeší službu a použije ji - var helloWorldService = - application.ServiceProvider.GetService(); - helloWorldService.SayHello(); - - Console.WriteLine("Press ENTER to stop application..."); - Console.ReadLine(); - } - } - } -} -``` - -Stačí volat metodu `options.UseAutofac()` v možnostech `AbpApplicationFactory.Create`. - -## Zdrojový kód - -Získejte zdrojový kód vzorového projektu vytvořeného v tomto tutoriálů [z tohoto odkazu](https://github.com/abpframework/abp-samples/tree/master/BasicConsoleApplication). diff --git a/docs/cs/Index.md b/docs/cs/Index.md deleted file mode 100644 index 875f4e066e..0000000000 --- a/docs/cs/Index.md +++ /dev/null @@ -1,25 +0,0 @@ -# ABP dokumentace - -ABP je **open source aplikační framework** se zaměřením na vývoj webových aplikací založených na ASP.NET Core, zároveň ho však lze využít i k vývoji jiných typů aplikací. - -K procházení dokumentace využijte navigační nabídky vlevo. - -## Začínáme - -Nejsnazší cestou jak začít nový projekt s ABP je užití startovací šablony: - -* [ASP.NET Core MVC (Razor Pages) UI Počáteční Šablona](Getting-Started-AspNetCore-MVC-Template.md) -* [Angular UI Počáteční Šablona](Getting-Started-Angular-Template.md) - -Pokud chcete začít od nuly (s prázdným projektem) tak manuálně nainstalujte ABP Framework s pomocí následujících tutoriálů: - -* [Konzolová Aplikace](Getting-Started-Console-Application.md) -* [ASP.NET Core Web Aplikace](Getting-Started-AspNetCore-Application.md) - -## Zdrojový kód - -ABP je hostovaný na GitHub. Zobrazit [zdrojový kód](https://github.com/abpframework/abp). - -## Chcete přispět? - -ABP je komunitně řízený open source projekt. Podívejte se na [průvodce pro přispěvatele](Contribution/Index.md) pokud chcete být součástí tohoto projektu. diff --git a/docs/cs/Nightly-Builds.md b/docs/cs/Nightly-Builds.md deleted file mode 100644 index e69588f5ff..0000000000 --- a/docs/cs/Nightly-Builds.md +++ /dev/null @@ -1,26 +0,0 @@ -# Noční sestavení - -Všechny balíky frameworku a modulů jsou každý večer nasazeny na MyGet. Takže můžete používat nebo testovat nejnovější kód bez čekání na další vydání. - -## Konfigurace Visual Studia - -> Vyžaduje Visual Studio 2017+ - -1. Přejděte do `Tools > Options > NuGet Package Manager > Package Source`. -2. Klikněte na zelenou ikonku `+`. -3. Nastavte `ABP Nightly` jako *Name* a `https://www.myget.org/F/abp-nightly/api/v3/index.json` jako *Source* podle vyobrazení níže: - ![night-build-add-nuget-source](images/night-build-add-nuget-source.png) -4. Klikněte na `Update`. -5. Klikněte na `OK` k uložení změn. - -## Instalace balíku - -Nyní můžete instalovat náhledové / noční balíky do Vašeho projektu z NuGet prohlížeče nebo Package Manager Console. - -![night-build-add-nuget-package](images/night-build-add-nuget-package.png) - -1. V nuget prohlížeči, vyberte "Include prereleases". -2. Změňte zdroj balíků na "All". -3. Vyhledejte balík. Uvidíte prerelease balík formátovaný jako `(VERZE)-preview(DATUM)` (např *v0.16.0-preview20190401* jako v tomto vzorku). -4. Můžete kliknout na `Install` k přídání balíku do projektu. - diff --git a/docs/cs/docs-nav.json b/docs/cs/docs-nav.json deleted file mode 100644 index 6c05d77dcf..0000000000 --- a/docs/cs/docs-nav.json +++ /dev/null @@ -1,376 +0,0 @@ -{ - "items": [ - { - "text": "Začínáme", - "items": [ - { - "text": "Ze startovacích šablon", - "items": [ - { - "text": "Aplikace s MVC (Razor Pages) UI", - "path": "Getting-Started-AspNetCore-MVC-Template.md" - }, - { - "text": "Aplikace s Angular UI", - "path": "Getting-Started-Angular-Template.md" - } - ] - }, - { - "text": "Z prázdných projektů", - "items": [ - { - "text": "S ASP.NET Core Web aplikací", - "path": "Getting-Started-AspNetCore-Application.md" - }, - { - "text": "S konzolovou aplikací", - "path": "Getting-Started-Console-Application.md" - } - ] - } - ] - }, - { - "text": "Tutoriály", - "items": [ - { - "text": "Vývoj aplikace", - "items": [ - { - "text": "S ASP.NET Core MVC UI", - "path": "Tutorials/AspNetCore-Mvc/Part-I.md" - }, - { - "text": "S Angular UI", - "path": "Tutorials/Angular/Part-I.md" - } - ] - } - ] - }, - { - "text": "CLI", - "path": "CLI.md" - }, - { - "text": "Základy", - "items": [ - { - "text": "Konfigurace", - "path": "Configuration.md" - }, - { - "text": "Možnosti", - "path": "Options.md" - }, - { - "text": "Vkládání závislostí", - "path": "Dependency-Injection.md", - "items": [ - { - "text": "AutoFac integrace", - "path": "Autofac-Integration.md" - } - ] - }, - { - "text": "Virtuální systém souborů", - "path": "Virtual-File-System.md" - }, - { - "text": "Lokalizace", - "path": "Localization.md" - }, - { - "text": "Zpracování výjimek", - "path": "Exception-Handling.md" - }, - { - "text": "Validace", - "path": "Validation.md", - "items": [ - { - "text": "FluentValidation integrace", - "path": "FluentValidation.md" - } - ] - }, - { - "text": "Autorizace", - "path": "Authorization.md" - }, - { - "text": "Ukládání do mezipaměti", - "path": "Caching.md" - }, - { - "text": "Audit" - }, - { - "text": "Nastavení", - "path": "Settings.md" - } - ] - }, - { - "text": "Události", - "items": [ - { - "text": "Event bus (místní)" - }, - { - "text": "Distribuovaný event bus", - "items": [ - { - "text": "RabbitMQ integrace" - } - ] - } - ] - }, - { - "text": "Služby", - "items": [ - { - "text": "Současný uživatel", - "path": "CurrentUser.md" - }, - { - "text": "Mapování objekt na objekt", - "path": "Object-To-Object-Mapping.md" - }, - { - "text": "Serializace objektu" - }, - { - "text": "Serializace JSON" - }, - { - "text": "Emailování" - }, - { - "text": "GUIDy" - }, - { - "text": "Vláknování" - }, - { - "text": "Časování" - } - ] - }, - { - "text": "Multitenance", - "path": "Multi-Tenancy.md" - }, - { - "text": "Vývoj modulů", - "items": [ - { - "text": "Základy", - "path": "Module-Development-Basics.md" - }, - { - "text": "Zásuvné moduly" - }, - { - "text": "Nejlepší praktiky", - "path": "Best-Practices/Index.md" - } - ] - }, - { - "text": "Domain driven design", - "path": "Domain-Driven-Design.md", - "items": [ - { - "text": "Doménová vrstva", - "items": [ - { - "text": "Entity & agregované kořeny", - "path": "Entities.md" - }, - { - "text": "Hodnotové objekty" - }, - { - "text": "Repozitáře", - "path": "Repositories.md" - }, - { - "text": "Doménové služby" - }, - { - "text": "Specifikace" - } - ] - }, - { - "text": "Aplikační vrstva", - "items": [ - { - "text": "Aplikační služby", - "path": "Application-Services.md" - }, - { - "text": "Objekty přenosu dat" - }, - { - "text": "Jednotka práce" - } - ] - } - ] - }, - { - "text": "ASP.NET Core", - "items": [ - { - "text": "API", - "items": [ - { - "text": "Automatické API řadiče", - "path": "AspNetCore/Auto-API-Controllers.md" - }, - { - "text": "Dynamičtí C# API klienti", - "path": "AspNetCore/Dynamic-CSharp-API-Clients.md" - } - ] - }, - { - "text": "Uživatelské rozhraní", - "items": [ - { - "text": "Správa klientských balíčků", - "path": "AspNetCore/Client-Side-Package-Management.md" - }, - { - "text": "Svazování & minifikace", - "path": "AspNetCore/Bundling-Minification.md" - }, - { - "text": "Tag pomocníci", - "path": "AspNetCore/Tag-Helpers/Index.md" - }, - { - "text": "Widgety", - "path": "AspNetCore/Widgets.md" - }, - { - "text": "Motivy", - "path": "AspNetCore/Theming.md" - } - ] - } - ] - }, - { - "text": "Přístup k datům", - "path": "Data-Access.md", - "items": [ - { - "text": "Connection stringy", - "path": "Connection-Strings.md" - }, - { - "text": "Poskytovatelé databází", - "items": [ - { - "text": "Entity Framework Core", - "path": "Entity-Framework-Core.md", - "items": [ - { - "text": "Přepnutí na MySQL", - "path": "Entity-Framework-Core-MySQL.md" - }, - { - "text": "Přepnutí na PostgreSQL", - "path": "Entity-Framework-Core-PostgreSQL.md" - }, - { - "text": "Přepnutí na SQLite", - "path": "Entity-Framework-Core-SQLite.md" - }, - { - "text": "Přepnutí na jiný DBMS", - "path": "Entity-Framework-Core-Other-DBMS.md" - } - ] - }, - { - "text": "MongoDB", - "path": "MongoDB.md" - }, - { - "text": "Dapper", - "path": "Dapper.md" - } - ] - } - ] - }, - { - "text": "Pozadí", - "items": [ - { - "text": "Úkony na pozadí", - "path": "Background-Jobs.md", - "items": [ - { - "text": "Hangfire integrace", - "path": "Background-Jobs-Hangfire.md" - }, - { - "text": "RabbitMQ integrace", - "path": "Background-Jobs-RabbitMq.md" - } - ] - } - ] - }, - { - "text": "Startovací šablony", - "path": "Startup-Templates/Index.md", - "items": [ - { - "text": "Aplikace", - "path": "Startup-Templates/Application.md" - }, - { - "text": "Modul", - "path": "Startup-Templates/Module.md" - } - ] - }, - { - "text": "Vzorky", - "items": [ - { - "text": "Mikroslužby demo", - "path": "Samples/Microservice-Demo.md" - } - ] - }, - { - "text": "Moduly aplikace", - "path": "Modules/Index.md" - }, - { - "text": "Architektura mikroslužby", - "path": "Microservice-Architecture.md" - }, - { - "text": "Testování" - }, - { - "text": "Noční sestavení", - "path": "Nightly-Builds.md" - }, - { - "text": "Průvodce pro přispěvatele", - "path": "Contribution/Index.md" - } - ] -} \ No newline at end of file diff --git a/docs/cs/images/MonthlyProfitWidgetFiles.png b/docs/cs/images/MonthlyProfitWidgetFiles.png deleted file mode 100644 index c3e4d6f1ab..0000000000 Binary files a/docs/cs/images/MonthlyProfitWidgetFiles.png and /dev/null differ diff --git a/docs/cs/images/authorization-new-permission-ui-hierarcy.png b/docs/cs/images/authorization-new-permission-ui-hierarcy.png deleted file mode 100644 index 07abfc7132..0000000000 Binary files a/docs/cs/images/authorization-new-permission-ui-hierarcy.png and /dev/null differ diff --git a/docs/cs/images/authorization-new-permission-ui-localized.png b/docs/cs/images/authorization-new-permission-ui-localized.png deleted file mode 100644 index 948fd618d9..0000000000 Binary files a/docs/cs/images/authorization-new-permission-ui-localized.png and /dev/null differ diff --git a/docs/cs/images/authorization-new-permission-ui.png b/docs/cs/images/authorization-new-permission-ui.png deleted file mode 100644 index 1190f04b70..0000000000 Binary files a/docs/cs/images/authorization-new-permission-ui.png and /dev/null differ diff --git a/docs/cs/images/bookstore-apis.png b/docs/cs/images/bookstore-apis.png deleted file mode 100644 index b7928c9637..0000000000 Binary files a/docs/cs/images/bookstore-apis.png and /dev/null differ diff --git a/docs/cs/images/bookstore-create-template.png b/docs/cs/images/bookstore-create-template.png deleted file mode 100644 index bae34a3b64..0000000000 Binary files a/docs/cs/images/bookstore-create-template.png and /dev/null differ diff --git a/docs/cs/images/bookstore-homepage.png b/docs/cs/images/bookstore-homepage.png deleted file mode 100644 index dc015aa67d..0000000000 Binary files a/docs/cs/images/bookstore-homepage.png and /dev/null differ diff --git a/docs/cs/images/bookstore-swagger-ui-host.png b/docs/cs/images/bookstore-swagger-ui-host.png deleted file mode 100644 index 7ebd8d8e37..0000000000 Binary files a/docs/cs/images/bookstore-swagger-ui-host.png and /dev/null differ diff --git a/docs/cs/images/bookstore-user-management-v2.png b/docs/cs/images/bookstore-user-management-v2.png deleted file mode 100644 index cd66010e05..0000000000 Binary files a/docs/cs/images/bookstore-user-management-v2.png and /dev/null differ diff --git a/docs/cs/images/bookstore-visual-studio-solution-for-spa.png b/docs/cs/images/bookstore-visual-studio-solution-for-spa.png deleted file mode 100644 index d114ed188c..0000000000 Binary files a/docs/cs/images/bookstore-visual-studio-solution-for-spa.png and /dev/null differ diff --git a/docs/cs/images/bookstore-visual-studio-solution-tiered.png b/docs/cs/images/bookstore-visual-studio-solution-tiered.png deleted file mode 100644 index 9affe841aa..0000000000 Binary files a/docs/cs/images/bookstore-visual-studio-solution-tiered.png and /dev/null differ diff --git a/docs/cs/images/bookstore-visual-studio-solution-v3.png b/docs/cs/images/bookstore-visual-studio-solution-v3.png deleted file mode 100644 index ce821eba72..0000000000 Binary files a/docs/cs/images/bookstore-visual-studio-solution-v3.png and /dev/null differ diff --git a/docs/cs/images/build-action-embedded-resource-sample.png b/docs/cs/images/build-action-embedded-resource-sample.png deleted file mode 100644 index 700e9921f4..0000000000 Binary files a/docs/cs/images/build-action-embedded-resource-sample.png and /dev/null differ diff --git a/docs/cs/images/create-aspnet-core-application.png b/docs/cs/images/create-aspnet-core-application.png deleted file mode 100644 index 03fde7e38a..0000000000 Binary files a/docs/cs/images/create-aspnet-core-application.png and /dev/null differ diff --git a/docs/cs/images/create-new-aspnet-core-application-v2.png b/docs/cs/images/create-new-aspnet-core-application-v2.png deleted file mode 100644 index d2bce84775..0000000000 Binary files a/docs/cs/images/create-new-aspnet-core-application-v2.png and /dev/null differ diff --git a/docs/cs/images/create-new-aspnet-core-application.png b/docs/cs/images/create-new-aspnet-core-application.png deleted file mode 100644 index 2c38289810..0000000000 Binary files a/docs/cs/images/create-new-aspnet-core-application.png and /dev/null differ diff --git a/docs/cs/images/create-new-net-core-console-application.png b/docs/cs/images/create-new-net-core-console-application.png deleted file mode 100644 index 0c2b3dbcb8..0000000000 Binary files a/docs/cs/images/create-new-net-core-console-application.png and /dev/null differ diff --git a/docs/cs/images/dashboard1.png b/docs/cs/images/dashboard1.png deleted file mode 100644 index 8c542b8786..0000000000 Binary files a/docs/cs/images/dashboard1.png and /dev/null differ diff --git a/docs/cs/images/db-migrator-app.png b/docs/cs/images/db-migrator-app.png deleted file mode 100644 index d2248d4588..0000000000 Binary files a/docs/cs/images/db-migrator-app.png and /dev/null differ diff --git a/docs/cs/images/docs-create-project.jpg b/docs/cs/images/docs-create-project.jpg deleted file mode 100644 index d2baa3242a..0000000000 Binary files a/docs/cs/images/docs-create-project.jpg and /dev/null differ diff --git a/docs/cs/images/docs-module_download-new-abp-project.png b/docs/cs/images/docs-module_download-new-abp-project.png deleted file mode 100644 index bc7aaacbd6..0000000000 Binary files a/docs/cs/images/docs-module_download-new-abp-project.png and /dev/null differ diff --git a/docs/cs/images/docs-module_download-sample-navigation-menu.png b/docs/cs/images/docs-module_download-sample-navigation-menu.png deleted file mode 100644 index 8d8eb42d52..0000000000 Binary files a/docs/cs/images/docs-module_download-sample-navigation-menu.png and /dev/null differ diff --git a/docs/cs/images/docs-module_solution-explorer.png b/docs/cs/images/docs-module_solution-explorer.png deleted file mode 100644 index 97bd3fc18e..0000000000 Binary files a/docs/cs/images/docs-module_solution-explorer.png and /dev/null differ diff --git a/docs/cs/images/docs-section-ui.png b/docs/cs/images/docs-section-ui.png deleted file mode 100644 index 1c63d1ad3a..0000000000 Binary files a/docs/cs/images/docs-section-ui.png and /dev/null differ diff --git a/docs/cs/images/github-access-token-private-repo.jpg b/docs/cs/images/github-access-token-private-repo.jpg deleted file mode 100644 index cb74f1eea3..0000000000 Binary files a/docs/cs/images/github-access-token-private-repo.jpg and /dev/null differ diff --git a/docs/cs/images/github-access-token-public-repo.jpg b/docs/cs/images/github-access-token-public-repo.jpg deleted file mode 100644 index d091a6d511..0000000000 Binary files a/docs/cs/images/github-access-token-public-repo.jpg and /dev/null differ diff --git a/docs/cs/images/github-myusername.jpg b/docs/cs/images/github-myusername.jpg deleted file mode 100644 index a723c17713..0000000000 Binary files a/docs/cs/images/github-myusername.jpg and /dev/null differ diff --git a/docs/cs/images/issuemanagement-module-solution.png b/docs/cs/images/issuemanagement-module-solution.png deleted file mode 100644 index d5f64b01d2..0000000000 Binary files a/docs/cs/images/issuemanagement-module-solution.png and /dev/null differ diff --git a/docs/cs/images/layered-project-dependencies-module.png b/docs/cs/images/layered-project-dependencies-module.png deleted file mode 100644 index de3b7a412f..0000000000 Binary files a/docs/cs/images/layered-project-dependencies-module.png and /dev/null differ diff --git a/docs/cs/images/layered-project-dependencies.png b/docs/cs/images/layered-project-dependencies.png deleted file mode 100644 index ed3e03fe4d..0000000000 Binary files a/docs/cs/images/layered-project-dependencies.png and /dev/null differ diff --git a/docs/cs/images/localization-resource-json-files.png b/docs/cs/images/localization-resource-json-files.png deleted file mode 100644 index 1a1d43403c..0000000000 Binary files a/docs/cs/images/localization-resource-json-files.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-authserver-home.png b/docs/cs/images/microservice-sample-authserver-home.png deleted file mode 100644 index 684fdb1a5a..0000000000 Binary files a/docs/cs/images/microservice-sample-authserver-home.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-authserver-login.png b/docs/cs/images/microservice-sample-authserver-login.png deleted file mode 100644 index 99d898ccd2..0000000000 Binary files a/docs/cs/images/microservice-sample-authserver-login.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-backend-ui-permissions.png b/docs/cs/images/microservice-sample-backend-ui-permissions.png deleted file mode 100644 index 3e1610294f..0000000000 Binary files a/docs/cs/images/microservice-sample-backend-ui-permissions.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-backend-ui.png b/docs/cs/images/microservice-sample-backend-ui.png deleted file mode 100644 index e649c8da59..0000000000 Binary files a/docs/cs/images/microservice-sample-backend-ui.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-blogservice-permission-in-database.png b/docs/cs/images/microservice-sample-blogservice-permission-in-database.png deleted file mode 100644 index 45d7f2b115..0000000000 Binary files a/docs/cs/images/microservice-sample-blogservice-permission-in-database.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-diagram-2.png b/docs/cs/images/microservice-sample-diagram-2.png deleted file mode 100644 index 414a942aca..0000000000 Binary files a/docs/cs/images/microservice-sample-diagram-2.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-diagram.png b/docs/cs/images/microservice-sample-diagram.png deleted file mode 100644 index 47e6443852..0000000000 Binary files a/docs/cs/images/microservice-sample-diagram.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-kibana-1.png b/docs/cs/images/microservice-sample-kibana-1.png deleted file mode 100644 index 51777f6bd7..0000000000 Binary files a/docs/cs/images/microservice-sample-kibana-1.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-kibana-2.png b/docs/cs/images/microservice-sample-kibana-2.png deleted file mode 100644 index cb1d0b748c..0000000000 Binary files a/docs/cs/images/microservice-sample-kibana-2.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-product-module-in-solution.png b/docs/cs/images/microservice-sample-product-module-in-solution.png deleted file mode 100644 index 2c07ad4b99..0000000000 Binary files a/docs/cs/images/microservice-sample-product-module-in-solution.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-public-product-list.png b/docs/cs/images/microservice-sample-public-product-list.png deleted file mode 100644 index 932b0b531c..0000000000 Binary files a/docs/cs/images/microservice-sample-public-product-list.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-solution.png b/docs/cs/images/microservice-sample-solution.png deleted file mode 100644 index d1497d9be2..0000000000 Binary files a/docs/cs/images/microservice-sample-solution.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-update-database-authserver.png b/docs/cs/images/microservice-sample-update-database-authserver.png deleted file mode 100644 index 094fd20fa6..0000000000 Binary files a/docs/cs/images/microservice-sample-update-database-authserver.png and /dev/null differ diff --git a/docs/cs/images/microservice-sample-update-database-products.png b/docs/cs/images/microservice-sample-update-database-products.png deleted file mode 100644 index 32a0927c1f..0000000000 Binary files a/docs/cs/images/microservice-sample-update-database-products.png and /dev/null differ diff --git a/docs/cs/images/module-layers-and-packages.jpg b/docs/cs/images/module-layers-and-packages.jpg deleted file mode 100644 index f71a91eb8d..0000000000 Binary files a/docs/cs/images/module-layers-and-packages.jpg and /dev/null differ diff --git a/docs/cs/images/night-build-add-nuget-package.png b/docs/cs/images/night-build-add-nuget-package.png deleted file mode 100644 index f475d3aaa0..0000000000 Binary files a/docs/cs/images/night-build-add-nuget-package.png and /dev/null differ diff --git a/docs/cs/images/night-build-add-nuget-source.png b/docs/cs/images/night-build-add-nuget-source.png deleted file mode 100644 index df3176aa12..0000000000 Binary files a/docs/cs/images/night-build-add-nuget-source.png and /dev/null differ diff --git a/docs/cs/images/pcm-update-database-v2.png b/docs/cs/images/pcm-update-database-v2.png deleted file mode 100644 index 72d02e9186..0000000000 Binary files a/docs/cs/images/pcm-update-database-v2.png and /dev/null differ diff --git a/docs/cs/images/pcm-update-database.png b/docs/cs/images/pcm-update-database.png deleted file mode 100644 index a9379d2571..0000000000 Binary files a/docs/cs/images/pcm-update-database.png and /dev/null differ diff --git a/docs/cs/images/select-empty-web-application-v2.png b/docs/cs/images/select-empty-web-application-v2.png deleted file mode 100644 index 9bfd2ec6a8..0000000000 Binary files a/docs/cs/images/select-empty-web-application-v2.png and /dev/null differ diff --git a/docs/cs/images/select-empty-web-application.png b/docs/cs/images/select-empty-web-application.png deleted file mode 100644 index f4b884140d..0000000000 Binary files a/docs/cs/images/select-empty-web-application.png and /dev/null differ diff --git a/docs/cs/images/set-as-startup-project.png b/docs/cs/images/set-as-startup-project.png deleted file mode 100644 index 8a5445bf38..0000000000 Binary files a/docs/cs/images/set-as-startup-project.png and /dev/null differ diff --git a/docs/cs/images/tiered-solution-applications.png b/docs/cs/images/tiered-solution-applications.png deleted file mode 100644 index df8d2b5f4a..0000000000 Binary files a/docs/cs/images/tiered-solution-applications.png and /dev/null differ diff --git a/docs/cs/images/tiered-solution-servers.png b/docs/cs/images/tiered-solution-servers.png deleted file mode 100644 index 68e72990d7..0000000000 Binary files a/docs/cs/images/tiered-solution-servers.png and /dev/null differ diff --git a/docs/cs/images/volodocs-iis-add-website.png b/docs/cs/images/volodocs-iis-add-website.png deleted file mode 100644 index aa7da8095b..0000000000 Binary files a/docs/cs/images/volodocs-iis-add-website.png and /dev/null differ diff --git a/docs/cs/images/volodocs-iis-application-pool.png b/docs/cs/images/volodocs-iis-application-pool.png deleted file mode 100644 index 28ccfa5c42..0000000000 Binary files a/docs/cs/images/volodocs-iis-application-pool.png and /dev/null differ diff --git a/docs/cs/images/widget-basic-files.png b/docs/cs/images/widget-basic-files.png deleted file mode 100644 index c692abd9e0..0000000000 Binary files a/docs/cs/images/widget-basic-files.png and /dev/null differ diff --git a/docs/docs-langs.json b/docs/docs-langs.json index 3986dc8618..b33b751207 100644 --- a/docs/docs-langs.json +++ b/docs/docs-langs.json @@ -4,16 +4,6 @@ "DisplayName" : "English", "Code" : "en", "IsDefault": true - }, - { - "DisplayName" : "Português", - "Code" : "pt-BR", - "IsDefault": false - }, - { - "DisplayName" : "简体中文", - "Code" : "zh-Hans", - "IsDefault": false } ] } diff --git a/docs/en/CLI.md b/docs/en/CLI.md index cb16fb2897..58ca9f4629 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -118,6 +118,8 @@ For more samples, go to [ABP CLI Create Solution Samples](CLI-New-Command-Sample * `angular`: Angular UI. There are some additional options for this template: * `--separate-auth-server`: The Auth Server project comes as a separate project and runs at a different endpoint. It separates the Auth Server from the API Host application. If not specified, you will have a single endpoint in the server side. * `--pwa`: Specifies the project as Progressive Web Application. + * `blazor-webapp`: Blazor Web App UI. There are some additional options for this template: + * `--tiered`: The Auth Server and the API Host project comes as separate projects and run at different endpoints. It has 3 startup projects: *HttpApi.Host*, *AuthServer* and *Blazor* and and each runs on different endpoints. If not specified, you will have a single endpoint for your web project. * `blazor`: Blazor UI. There are some additional options for this template: * `--separate-auth-server`The Auth Server project comes as a separate project and runs at a different endpoint. It separates the Auth Server from the API Host application. If not specified, you will have a single endpoint in the server side. * `--pwa`: Specifies the project as Progressive Web Application. diff --git a/docs/en/Contribution/Index.md b/docs/en/Contribution/Index.md index 8ebac70c20..77dd3cdb8b 100644 --- a/docs/en/Contribution/Index.md +++ b/docs/en/Contribution/Index.md @@ -29,23 +29,6 @@ You may want to fix a known bug or work on a planned enhancement. See [the issue If you have a feature idea for the framework or modules, [create an issue](https://github.com/abpframework/abp/issues/new) on Github or attend to an existing discussion. Then you can implement it if it's embraced by the community. -## Document Translation - -You may want to translate the complete [documentation](https://docs.abp.io) (including this one) to your mother language. If so, follow these steps: - -* Clone the [ABP repository](https://github.com/abpframework/abp/) from Github. -* To add a new language, create a new folder inside the [docs](https://github.com/abpframework/abp/tree/master/docs) folder. Folder names can be "en", "es", "fr", "tr" and so on based on the language (see [all culture codes](https://msdn.microsoft.com/en-us/library/hh441729.aspx)). -* Get the ["en" folder](https://github.com/abpframework/abp/tree/master/docs/en) as a reference for the file names and folder structure. Keep the same naming if you are translating the same documentation. -* Send a pull request (PR) once you translate any document. Please translate documents & send PRs one by one. Don't wait to finish translations for all documents. - -There are some fundamental documents need to be translated before publishing a language on the [ABP documentation web site](https://docs.abp.io): - -* Index (Home) -* Getting Started -* Web Application Development Tutorial - -A new language is published after these minimum translations have been completed. - ## Resource Localization ABP framework has a flexible [localization system](../Localization.md). You can create localized user interfaces for your own application. diff --git a/docs/en/Modules/Docs.md b/docs/en/Modules/Docs.md index 81a8c49ab2..e52db93a23 100644 --- a/docs/en/Modules/Docs.md +++ b/docs/en/Modules/Docs.md @@ -34,7 +34,7 @@ abp new Acme.MyProject ### 2- Running The Empty Application -After you download the project, extract the ZIP file and open `Acme.MyProject.sln`. You will see that the solution consists of `Application`, `Application.Contracts`, `DbMigrator`, `Domain`, `Domain.Shared`, `EntityFrameworkCore`, `HttpApi`, `HttpApi.Client` and `Web` projects. Right click on `Acme.MyProject.Web` project and **Set as StartUp Project**. +After you created the project, open `Acme.MyProject.sln`. You will see that the solution consists of `Application`, `Application.Contracts`, `DbMigrator`, `Domain`, `Domain.Shared`, `EntityFrameworkCore`, `HttpApi`, `HttpApi.Client` and `Web` projects. Right click on `Acme.MyProject.Web` project and **Set as StartUp Project**. ![Create a new project](../images/docs-module_solution-explorer.png) @@ -332,7 +332,7 @@ Open `DocsProjects` in your database, and insert a new record with the following * **DocumentStoreType**: The source of the documents (for GitHub:`GitHub`, for file system`FileSystem`) * **ExtraProperties**: A serialized `JSON` that stores special configuration for the selected `DocumentStoreType`. * **MainWebsiteUrl**: The URL when user clicks to the logo of the Docs module page. You can simply set as `/` to link to your website root address. -* **LatestVersionBranchName**: This is a config for GitHub. It's the branch name which to retrieve the docs. You can set it as `master`. +* **LatestVersionBranchName**: This is a config for GitHub. It's the branch name which to retrieve the docs. You can set it as `dev`. #### Sample Project Record for "GitHub" @@ -367,7 +367,7 @@ You can use [ABP Framework](https://github.com/abpframework/abp/) GitHub documen For `SQL` databases, you can use the below `T-SQL` command to insert the specified sample into your `DocsProjects` table: ```mssql -INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName], [ConcurrencyStamp]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP framework (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'', N'12f21123e08e4f15bedbae0b2d939659') +INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName], [ConcurrencyStamp]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939658', N'ABP framework (GitHub)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'GitHub', N'{"GitHubRootUrl":"https://github.com/abpframework/abp/tree/{version}/docs","GitHubAccessToken":"","GitHubUserAgent":""}', N'/', N'dev', N'', N'12f21123e08e4f15bedbae0b2d939659') ``` Be aware that `GitHubAccessToken` is masked. It's a private token and you must get your own token and replace the `***` string. @@ -402,12 +402,12 @@ You can use [ABP Framework](https://github.com/abpframework/abp/) GitHub documen - MainWebsiteUrl: `/` -- LatestVersionBranchName: `` +- LatestVersionBranchName: `latest` For `SQL` databases, you can use the below `T-SQL` command to insert the specified sample into your `DocsProjects` table: ```mssql -INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP framework (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'') +INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName], [ConcurrencyStamp]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP framework (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', N'latest', N'', N'12f21123e08e4f15bedbae0b2d939659') ``` Add one of the sample projects above and run the application. In the menu you will see `Documents` link, click the menu link to open the documents page. diff --git a/docs/en/Road-Map.md b/docs/en/Road-Map.md index 9dfbb86d41..667e256fbf 100644 --- a/docs/en/Road-Map.md +++ b/docs/en/Road-Map.md @@ -4,17 +4,17 @@ This document provides a road map, release schedule, and planned features for th ## Next Versions -### v8.2 +### v8.3 -The next version will be 8.2 and planned to release the stable 8.2 version in June 2024. We will be mostly working on the following topics: +The next version will be 8.3 and planned to release the stable 8.3 version in August 2024. We will be mostly working on the following topics: -* Blazor Full-Stack UI ([#18289](https://github.com/abpframework/abp/issues/18289)) * Angular Universal ([#15782](https://github.com/abpframework/abp/issues/15782)) -* Upgrading React Native template to the latest major release 0.72.7 ([#18191](https://github.com/abpframework/abp/issues/18191)) -* Deployment Documents Improvements ([#15034](https://github.com/abpframework/abp/issues/15034)) +* Angular generate-proxy root namespace options ([#18932](https://github.com/abpframework/abp/issues/18932)) +* Blazor global JS & CSS at runtime ([#19963](https://github.com/abpframework/abp/issues/19963)) +* CMS Kit - Improvement in editing approval system for comments ([#19976](https://github.com/abpframework/abp/issues/19976)) * Improvements on the existing features and provide more guides. -See the [8.2 milestone](https://github.com/abpframework/abp/milestone/95) for all the issues we've planned to work on. +See the [8.3 milestone](https://github.com/abpframework/abp/milestone/101) for all the issues we've planned to work on. ## Backlog Items @@ -23,7 +23,7 @@ The *Next Versions* section above shows the main focus of the planned versions. Here is a list of major items in the backlog we are considering working on in the next versions. * [#86](https://github.com/abpframework/abp/issues/86) / GrapQL Integration -* [#236](https://github.com/abpframework/abp/issues/236) / Resource based authorization system +* [#236](https://github.com/abpframework/abp/issues/236) / Resource-based authorization system * [#2882](https://github.com/abpframework/abp/issues/2882) / Providing a gRPC integration infrastructure (while it is [already possible](https://github.com/abpframework/abp-samples/tree/master/GrpcDemo) to create or consume gRPC endpoints for your application, we plan to create endpoints for the [standard application modules](https://docs.abp.io/en/abp/latest/Modules/Index)) * [#57](https://github.com/abpframework/abp/issues/57) / Built-in CQRS infrastructure * [#4223](https://github.com/abpframework/abp/issues/4223) / WebHook system @@ -35,7 +35,7 @@ Here is a list of major items in the backlog we are considering working on in th * [#16756](https://github.com/abpframework/abp/issues/16756) / Blob Storing - Provider configuration UI * [#16744](https://github.com/abpframework/abp/issues/16744) / State Management API -You can always check the milestone planning and the prioritized backlog issues on [the GitHub repository](https://github.com/abpframework/abp/milestones) for a detailed road map. The backlog items are subject to change. We are adding new items and changing priorities based on the community feedbacks and goals of the project. +You can always check the milestone planning and the prioritized backlog issues on [the GitHub repository](https://github.com/abpframework/abp/milestones) for a detailed road map. The backlog items are subject to change. We are adding new items and changing priorities based on the community feedback and goals of the project. ## Feature Requests diff --git a/docs/es/Getting-Started-AspNetCore-Application.md b/docs/es/Getting-Started-AspNetCore-Application.md deleted file mode 100644 index c4d124d827..0000000000 --- a/docs/es/Getting-Started-AspNetCore-Application.md +++ /dev/null @@ -1,140 +0,0 @@ -# Empezando con ABP y una Aplicacion AspNet Core MVC Web - -Este tutorial explica como empezar una aplicacion ABP desde cero usando las dependencias minimas. Uno generalmente desea -empezar con la **[plantilla de inicio](Getting-Started-AspNetCore-MVC-Template.md)**. - -## Crea un Proyecto Nuevo - -1. Crea una Aplicacion Web AspNet Core nueva usando Visual Studio 2022 (17.0.0+): - -![](images/create-new-aspnet-core-application-v2.png) - -2. Configura el nuevo proyecto: - -![](images/select-empty-web-application-v2.png) - -3. Presione el boton Create: - -![create-aspnet-core-application](images/create-aspnet-core-application.png) - -## Instale el paquete Volo.Abp.AspNetCore.Mvc - -Volo.Abp.AspNetCore.Mvc es el paquete de integracion con AspNet Core MVC para ABP. Siendo asi, instalalo en su proyecto: - -```` -Install-Package Volo.Abp.AspNetCore.Mvc -```` - -## Crea el primer modulo ABP - -ABP es un marco de referencia modular y require una clase de **inicio (raíz) tipo modulo** derivada de ``AbpModule``: - -````C# -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.Hosting; -using Volo.Abp; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.Modularity; - -namespace BasicAspNetCoreApplication -{ - [DependsOn(typeof(AbpAspNetCoreMvcModule))] - public class AppModule : AbpModule - { - public override void OnApplicationInitialization(ApplicationInitializationContext context) - { - var app = context.GetApplicationBuilder(); - var env = context.GetEnvironment(); - - // Configura la canalización de peticiones HTTP. - if (env.IsDevelopment()) - { - app.UseExceptionHandler("/Error"); - // El valor por defecto de HSTS es 30 dias. Debes cambiar esto en ambientes productivos. Referencia https://aka.ms/aspnetcore-hsts. - app.UseHsts(); - } - - app.UseHttpsRedirection(); - app.UseStaticFiles(); - app.UseRouting(); - app.UseConfiguredEndpoints(); - } - } -} -```` - -``AppModule`` es un buen nombre para el modulo de inicio de una aplicacion. - -Los paquetes de ABP definen clases de tipo modulo y cada modulo puede depender de otro. -En el codigo anterior, el ``AppModule`` depende de el modulo ``AbpAspNetCoreMvcModule`` (definido por el paquete [Volo.Abp.AspNetCore.Mvc](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc)). Es comun agregar el atributo ``DependsOn`` despues de instalar un paquete ABP nuevo. - -En vez de la clase de inicion Startup, estamos configurando una canalizacion de ASP.NET Core en este modulo. - -## La clase Program - -El proximo paso es modificar la clase Program para integrate el sistema de modulos ABP: - -````C# -using BasicAspNetCoreApplication; - -var builder = WebApplication.CreateBuilder(args); - -await builder.Services.AddApplicationAsync(); - -var app = builder.Build(); - -await app.InitializeApplicationAsync(); -await app.RunAsync(); -```` - -``builder.Services.AddApplicationAsync();`` Agrega todos los servicios definidos en todos los modulos empezando desde ``AppModule``. - -``app.InitializeApplicationAsync()`` inicializa y empieza la aplicacion. - -## Ejecutar la Aplicación - -Es todo! Ejecuta la aplicación, debe funcionar como esperado. - -## Uso de Autofac como Marco de Inyección de Dependencia - -Mientras el sistema de Inyección de Dependencia de ASP.NET Core es suficiente para requerimientos basico, [Autofac](https://autofac.org/) proporciona características avanzadas como Inyección de Propiedades e Intercepcion de Metodos, los cuales son necesarios para que ABP pueda llevar a cabo funciones avanzadas. - -El acto de remplazar el sistema DI de ASP.NET Core por Autofac e integrarlo con ABP es facil. - -1. Instala el paquete [Volo.Abp.Autofac](https://www.nuget.org/packages/Volo.Abp.Autofac) - -```` -Install-Package Volo.Abp.Autofac -```` - -2. Agrega la dependencia sobre el modulo ``AbpAutofacModule`` - -````C# -[DependsOn(typeof(AbpAspNetCoreMvcModule))] -[DependsOn(typeof(AbpAutofacModule))] //Agrega la dependencia sobre el modulo ABP Autofac -public class AppModule : AbpModule -{ - ... -} -```` - -3. Actualiza `Program.cs` para que use Autofac: - -````C# -using BasicAspNetCoreApplication; - -var builder = WebApplication.CreateBuilder(args); - -builder.Host.UseAutofac(); //Agrega esta linea - -await builder.Services.AddApplicationAsync(); - -var app = builder.Build(); - -await app.InitializeApplicationAsync(); -await app.RunAsync(); -```` - -## Codigo fuente - - Obten el codigo fuente del ejemplo creado en este tutorial de [aqui](https://github.com/abpframework/abp-samples/tree/master/BasicAspNetCoreApplication). diff --git a/docs/es/Index.md b/docs/es/Index.md deleted file mode 100644 index d05a4032da..0000000000 --- a/docs/es/Index.md +++ /dev/null @@ -1,31 +0,0 @@ -# Documentación de ABP - -ABP es un **marco de desarrollo de código abierto** enfocado en el desarrollo de aplicaciones web basadas en ASP.NET Core, pero tambien soporta el desarrollo de otro tipo de aplicaciones. - -Explora el menú de navegación de la izquierda para profundizar en la documentación. - -## Estado del proyecto - -ABP es la **próxima generación** del marco de desarrollo de código abierto [ASP.NET Boilerplate](https://aspnetboilerplate.com/). Actualmente se encuentra en una fase preliminar y no está listo para su uso en producción. La documentación todavía está en progreso y se encuentra lejos de estar completa. - -Para aplicaciones en fase de producción o que lo vayan a estar en el corto plazo, se sugiere usar el marco de desarrollo [ASP.NET Boilerplate](https://aspnetboilerplate.com/) el cual tiene un completo conjunto de funciones, es maduro, mantenido y actualizado activamente. - -## Primeros pasos - -La manera más facil para iniciar un proyecto con ABP es usar las plantillas de inicio: - -* [Plantilla ASP.NET Core MVC (Razor Pages) UI](Getting-Started-AspNetCore-MVC-Template.md) -* [Plantilla Angular UI](Getting-Started-Angular-Template.md) - -Si quieres iniciar desde cero (con un proyecto vacío), entonces instala manualmente el marco de desarrollo ABP y usa los siguientes tutoriales: - -* [Aplicación de Consola](Getting-Started-Console-Application.md) -* [Aplicación web con ASP.NET Core](Getting-Started-AspNetCore-Application.md) - -## Código fuente - -ABP está hospedado en GitHub. Mira el [código fuente](https://github.com/abpframework/abp). - -## ¿Quieres contribuir? - -ABP es un proyecto de código abierto impulsado por la comunidad. Mira la [guía de contribución](Contribution/Index.md) si quieres formar parte de este proyecto. \ No newline at end of file diff --git a/docs/es/images/create-aspnet-core-application.png b/docs/es/images/create-aspnet-core-application.png deleted file mode 100644 index afd1447ba8..0000000000 Binary files a/docs/es/images/create-aspnet-core-application.png and /dev/null differ diff --git a/docs/es/images/create-new-aspnet-core-application-v2.png b/docs/es/images/create-new-aspnet-core-application-v2.png deleted file mode 100644 index d2bce84775..0000000000 Binary files a/docs/es/images/create-new-aspnet-core-application-v2.png and /dev/null differ diff --git a/docs/es/images/select-empty-web-application-v2.png b/docs/es/images/select-empty-web-application-v2.png deleted file mode 100644 index 9bfd2ec6a8..0000000000 Binary files a/docs/es/images/select-empty-web-application-v2.png and /dev/null differ diff --git a/docs/pt-BR/AspNetCore/Auto-API-Controllers.md b/docs/pt-BR/AspNetCore/Auto-API-Controllers.md deleted file mode 100644 index 01c62bab94..0000000000 --- a/docs/pt-BR/AspNetCore/Auto-API-Controllers.md +++ /dev/null @@ -1,3 +0,0 @@ -Este documento foi movido. - -[Clique para navegar até o documento Auto API Controllers](../API/Auto-API-Controllers.md) \ No newline at end of file diff --git a/docs/pt-BR/AspNetCore/Bundling-Minification.md b/docs/pt-BR/AspNetCore/Bundling-Minification.md deleted file mode 100644 index 48b33d2ee2..0000000000 --- a/docs/pt-BR/AspNetCore/Bundling-Minification.md +++ /dev/null @@ -1,3 +0,0 @@ -Este documento foi movido. - -[Clique para navegar até o documento de Bundling & Minification do ASP.NET Core MVC](../UI/AspNetCore/Bundling-Minification.md) \ No newline at end of file diff --git a/docs/pt-BR/AspNetCore/Client-Side-Package-Management.md b/docs/pt-BR/AspNetCore/Client-Side-Package-Management.md deleted file mode 100644 index 9d90d3407d..0000000000 --- a/docs/pt-BR/AspNetCore/Client-Side-Package-Management.md +++ /dev/null @@ -1,3 +0,0 @@ -Este documento foi movido. - -[Clique para navegar até o documento de Gerenciamento de Pacotes do Lado do Cliente do ASP.NET Core MVC](../UI/AspNetCore/Client-Side-Package-Management.md) \ No newline at end of file diff --git a/docs/pt-BR/AspNetCore/Dynamic-CSharp-API-Clients.md b/docs/pt-BR/AspNetCore/Dynamic-CSharp-API-Clients.md deleted file mode 100644 index 80ba2f16d3..0000000000 --- a/docs/pt-BR/AspNetCore/Dynamic-CSharp-API-Clients.md +++ /dev/null @@ -1,3 +0,0 @@ -Este documento foi movido. - -[Clique para navegar até o documento Dynamic C# API Clients](../API/Dynamic-CSharp-API-Clients.md) \ No newline at end of file diff --git a/docs/pt-BR/AspNetCore/Tag-Helpers/Dynamic-Forms.md b/docs/pt-BR/AspNetCore/Tag-Helpers/Dynamic-Forms.md deleted file mode 100644 index 8f1d7e0fed..0000000000 --- a/docs/pt-BR/AspNetCore/Tag-Helpers/Dynamic-Forms.md +++ /dev/null @@ -1,3 +0,0 @@ -Este documento foi movido. - -[Clique para navegar até o documento de Formulários Dinâmicos](../../UI/AspNetCore/Tag-Helpers/Dynamic-Forms.md) \ No newline at end of file diff --git a/docs/pt-BR/AspNetCore/Tag-Helpers/Index.md b/docs/pt-BR/AspNetCore/Tag-Helpers/Index.md deleted file mode 100644 index 83137c23e7..0000000000 --- a/docs/pt-BR/AspNetCore/Tag-Helpers/Index.md +++ /dev/null @@ -1,3 +0,0 @@ -Este documento foi movido. - -[Clique para navegar até o documento ABP Tag Helpers](../../UI/AspNetCore/Tag-Helpers/Index.md) \ No newline at end of file diff --git a/docs/pt-BR/AspNetCore/Theming.md b/docs/pt-BR/AspNetCore/Theming.md deleted file mode 100644 index 59127bed3d..0000000000 --- a/docs/pt-BR/AspNetCore/Theming.md +++ /dev/null @@ -1,3 +0,0 @@ -Este documento foi movido. - -[Clique para navegar até o documento de Temas](../UI/AspNetCore/Theming.md) \ No newline at end of file diff --git a/docs/pt-BR/AspNetCore/Widgets.md b/docs/pt-BR/AspNetCore/Widgets.md deleted file mode 100644 index 6d2e611c9b..0000000000 --- a/docs/pt-BR/AspNetCore/Widgets.md +++ /dev/null @@ -1,3 +0,0 @@ -Este documento foi movido. - -[Clique para navegar até o documento Widgets](../UI/AspNetCore/Widgets.md) \ No newline at end of file diff --git a/docs/pt-BR/Aspect-Oriented-Programming.md b/docs/pt-BR/Aspect-Oriented-Programming.md deleted file mode 100644 index bfc7b0f705..0000000000 --- a/docs/pt-BR/Aspect-Oriented-Programming.md +++ /dev/null @@ -1,3 +0,0 @@ -## Dynamic Proxying / Interceptors - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Audit-Logging.md b/docs/pt-BR/Audit-Logging.md deleted file mode 100644 index 65e1271012..0000000000 --- a/docs/pt-BR/Audit-Logging.md +++ /dev/null @@ -1,390 +0,0 @@ -# Registro de Auditoria - -[Wikipedia](https://en.wikipedia.org/wiki/Audit_trail): "*Um rastro de auditoria (também chamado de **log de auditoria**) é um registro cronológico relevante para a segurança, conjunto de registros e/ou destino e origem de registros que fornecem evidências documentais da sequência de atividades que afetaram a qualquer momento uma operação, procedimento ou evento específico*". - -O ABP Framework fornece um **sistema de registro de auditoria extensível** que automatiza o registro de auditoria por **convenção** e fornece **pontos de configuração** para controlar o nível dos logs de auditoria. - -Um **objeto de log de auditoria** (consulte a seção Objeto de Log de Auditoria abaixo) é tipicamente criado e salvo por solicitação da web. Ele inclui; - -* Detalhes da **solicitação e resposta** (como URL, método Http, informações do navegador, código de status HTTP... etc.). -* **Ações realizadas** (ações do controlador e chamadas de métodos de serviço de aplicação com seus parâmetros). -* **Mudanças de entidade** ocorridas na solicitação da web. -* Informações de **exceção** (se houve um erro durante a execução da solicitação). -* **Duração da solicitação** (para medir o desempenho da aplicação). - -> Os [modelos de inicialização](Startup-Templates/Index.md) são configurados para o sistema de registro de auditoria, o que é adequado para a maioria das aplicações. Use este documento para um controle detalhado sobre o sistema de log de auditoria. - -### Suporte do Provedor de Banco de Dados - -* Totalmente suportado pelo provedor [Entity Framework Core](Entity-Framework-Core.md). -* O log de alterações de entidade não é suportado pelo provedor [MongoDB](MongoDB.md). Outros recursos funcionam conforme o esperado. - -## UseAuditing() - -O middleware `UseAuditing()` deve ser adicionado ao pipeline de solicitações do ASP.NET Core para criar e salvar os logs de auditoria. Se você criou suas aplicações usando [os modelos de inicialização](Startup-Templates/Index.md), ele já está adicionado. - -## AbpAuditingOptions - -`AbpAuditingOptions` é o principal [objeto de opções](Options.md) para configurar o sistema de log de auditoria. Você pode configurá-lo no método `ConfigureServices` do seu [módulo](Module-Development-Basics.md): - -````csharp -Configure(options => -{ - options.IsEnabled = false; //Desativa o sistema de auditoria -}); -```` - -Aqui, uma lista das opções que você pode configurar: - -* `IsEnabled` (padrão: `true`): Uma chave raiz para habilitar ou desabilitar o sistema de auditoria. Outras opções não são usadas se esse valor for `false`. -* `HideErrors` (padrão: `true`): O sistema de log de auditoria oculta e escreve [logs](Logging.md) regulares se ocorrer algum erro ao salvar os objetos de log de auditoria. Se salvar os logs de auditoria for crítico para o seu sistema, defina isso como `false` para lançar uma exceção em caso de ocultação de erros. -* `IsEnabledForAnonymousUsers` (padrão: `true`): Se você deseja escrever logs de auditoria apenas para os usuários autenticados, defina isso como `false`. Se você salvar logs de auditoria para usuários anônimos, verá `null` para os valores de `UserId` desses usuários. -* `AlwaysLogOnException` (padrão: `true`): Se definido como verdadeiro, sempre salva o log de auditoria em caso de exceção/erro sem verificar outras opções (exceto `IsEnabled`, que desativa completamente o registro de auditoria). -* `IsEnabledForIntegrationService` (padrão: `false`): O Registro de Auditoria é desativado para [serviços de integração](Integration-Services.md) por padrão. Defina essa propriedade como `true` para habilitá-la. -* `IsEnabledForGetRequests` (padrão: `false`): As solicitações HTTP GET normalmente não devem fazer nenhuma alteração no banco de dados e o sistema de log de auditoria não salva objetos de log de auditoria para solicitações GET. Defina isso como `true` para habilitá-lo também para as solicitações GET. -* `DisableLogActionInfo` (padrão: `false`): Se definido como verdadeiro, não registrará mais `AuditLogActionInfo`. -* `ApplicationName`: Se várias aplicações estiverem salvando logs de auditoria em um único banco de dados, defina essa propriedade com o nome da sua aplicação, para que você possa distinguir os logs de diferentes aplicações. Se você não definir, ele será definido a partir do valor `IApplicationInfoAccessor.ApplicationName`, que é o nome da assembly de entrada por padrão. -* `IgnoredTypes`: Uma lista de `Type`s a serem ignorados para o registro de auditoria. Se for um tipo de entidade, as alterações para esse tipo de entidades não serão salvas. Esta lista também é usada ao serializar os parâmetros de ação. -* `EntityHistorySelectors`: Uma lista de seletores usados para determinar se um tipo de entidade é selecionado para salvar a alteração da entidade. Consulte a seção abaixo para detalhes. -* `SaveEntityHistoryWhenNavigationChanges` (padrão: `true`): Se definido como verdadeiro, salvará as alterações da entidade no log de auditoria quando houver alterações em propriedades de navegação. -* `Contributors`: Uma lista de implementações de `AuditLogContributor`. Um contribuidor é uma forma de estender o sistema de log de auditoria. Consulte a seção "Contribuidores de Log de Auditoria" abaixo. -* `AlwaysLogSelectors`: Uma lista de seletores para salvar os logs de auditoria para os critérios correspondentes. - -### Seletores de Histórico de Entidade - -Salvar todas as alterações de todas as suas entidades exigiria muito espaço no banco de dados. Por esse motivo, **o sistema de log de auditoria não salva nenhuma alteração para as entidades a menos que você configure explicitamente**. - -Para salvar todas as alterações de todas as entidades, simplesmente use o método de extensão `AddAllEntities()`. - -````csharp -Configure(options => -{ - options.EntityHistorySelectors.AddAllEntities(); -}); -```` - -`options.EntityHistorySelectors` na verdade é uma lista de predicados de tipo. Você pode escrever uma expressão lambda para definir seu filtro. - -O seletor de exemplo abaixo faz o mesmo do método de extensão `AddAllEntities()` definido acima: - -````csharp -Configure(options => -{ - options.EntityHistorySelectors.Add( - new NamedTypeSelector( - "MeuSeletorNome", - type => - { - if (typeof(IEntity).IsAssignableFrom(type)) - { - return true; - } - else - { - return false; - } - } - ) - ); -}); -```` - -A condição `typeof(IEntity).IsAssignableFrom(type)` será `true` para qualquer classe que implemente a interface `IEntity` (tecnicamente, todas as entidades em sua aplicação). Você pode verificar condicionalmente e retornar `true` ou `false` com base em sua preferência. - -`options.EntityHistorySelectors` é uma forma flexível e dinâmica de selecionar as entidades para o registro de auditoria. Outra forma é usar os atributos `Audited` e `DisableAuditing` por entidade. - -## AbpAspNetCoreAuditingOptions - -`AbpAspNetCoreAuditingOptions` é o [objeto de opções](Options.md) para configurar o registro de auditoria na camada ASP.NET Core. Você pode configurá-lo no método `ConfigureServices` do seu [módulo](Module-Development-Basics.md): - -````csharp -Configure(options => -{ - options.IgnoredUrls.Add("/produtos"); -}); -```` - -`IgnoredUrls` é a única opção. É uma lista de prefixos de URLs ignorados. No exemplo anterior, todas as URLs que começam com `/produtos` serão ignoradas para o registro de auditoria. - -## Habilitando/Desabilitando o Registro de Auditoria para Serviços - -### Habilitar/Desabilitar para Controladores e Ações - -Todas as ações do controlador são registradas por padrão (consulte `IsEnabledForGetRequests` acima para solicitações GET). - -Você pode usar o `[DisableAuditing]` para desativá-lo para um tipo de controlador específico: - -````csharp -[DisableAuditing] -public class HomeController : AbpController -{ - //... -} -```` - -Use `[DisableAuditing]` para qualquer ação para controlá-la no nível da ação: - -````csharp -public class HomeController : AbpController -{ - [DisableAuditing] - public async Task Home() - { - //... - } - - public async Task OutraAcaoRegistrada() - { - //... - } -} -```` - -### Habilitar/Desabilitar para Serviços de Aplicação e Métodos - -As chamadas de métodos de [serviço de aplicação](Application-Services.md) também são incluídas no log de auditoria por padrão. Você pode usar o `[DisableAuditing]` no nível do serviço ou do método. - -#### Habilitar/Desabilitar para Outros Serviços - -O registro de auditoria de ação pode ser habilitado para qualquer tipo de classe (registrado e resolvido da [injeção de dependência](Dependency-Injection.md)) enquanto é habilitado apenas para os controladores e os serviços de aplicação por padrão. - -Use `[Audited]` e `[DisableAuditing]` para qualquer classe ou método que precisa ser registrado no log de auditoria. Além disso, sua classe pode (direta ou implicitamente) implementar a interface `IAuditingEnabled` para habilitar o registro de auditoria para essa classe por padrão. - -### Habilitar/Desabilitar para Entidades e Propriedades - -Uma entidade é ignorada no registro de alteração de entidade nos seguintes casos; - -* Se você adicionar um tipo de entidade às `AbpAuditingOptions.IgnoredTypes` (como explicado anteriormente), ele é completamente ignorado no sistema de registro de auditoria. -* Se o objeto não for uma [entidade](Entities.md) (não implementa `IEntity` diretamente ou implicitamente - Todas as entidades implementam essa interface por padrão). -* Se o tipo de entidade não for público. - -Caso contrário, você pode usar `Audited` para habilitar o registro de alteração de entidade para uma entidade: - -````csharp -[Audited] -public class MinhaEntidade : Entity -{ - //... -} -```` - -Ou desativá-lo para uma entidade: - -````csharp -[DisableAuditing] -public class MinhaEntidade : Entity -{ - //... -} -```` - -Desativar o registro de auditoria pode ser necessário apenas se a entidade estiver sendo selecionada pelos `AbpAuditingOptions.EntityHistorySelectors` que foram explicados anteriormente. - -Você pode desativar o registro de auditoria apenas para algumas propriedades de suas entidades para um controle detalhado sobre o registro de auditoria: - -````csharp -[Audited] -public class MeuUsuario : Entity -{ - public string Nome { get; set; } - - public string Email { get; set; } - - [DisableAuditing] //Ignora a Senha no registro de auditoria - public string Senha { get; set; } -} -```` - -O sistema de log de auditoria salvará as alterações para a entidade `MeuUsuario` enquanto ignora a propriedade `Senha`, que pode ser perigosa de salvar por motivos de segurança. - -Em alguns casos, você pode querer salvar apenas algumas propriedades de suas entidades e ignorar todas as outras. Escrever `[DisableAuditing]` para todas as outras propriedades seria tedioso. Em tais casos, use `[Audited]` apenas para as propriedades desejadas e marque a entidade com o atributo `[DisableAuditing]`: - -````csharp -[DisableAuditing] -public class MeuUsuario : Entity -{ - [Audited] //Apenas registra a alteração do Nome - public string Nome { get; set; } - - public string Email { get; set; } - - public string Senha { get; set; } -} -```` -## IAuditingStore - -`IAuditingStore` é uma interface usada para salvar os objetos de log de auditoria (explicados abaixo) pelo Framework ABP. Se você precisa salvar os objetos de log de auditoria em um armazenamento de dados personalizado, pode implementar o `IAuditingStore` em sua própria aplicação e substituir usando o [sistema de injeção de dependência](Dependency-Injection.md). - -`SimpleLogAuditingStore` é usado se nenhum armazenamento de auditoria estiver registrado. Ele simplesmente escreve o objeto de auditoria no sistema padrão de [logging](Logging.md). - -[O Módulo de Registro de Auditoria](Modules/Audit-Logging.md) foi configurado nos [modelos de inicialização](Startup-Templates/Index.md) para salvar objetos de log de auditoria em um banco de dados (ele suporta vários provedores de banco de dados). Portanto, na maioria das vezes, você não precisa se preocupar com como o `IAuditingStore` foi implementado e usado. - -## Objeto de Log de Auditoria - -Um **objeto de log de auditoria** é criado para cada **solicitação web** por padrão. Um objeto de log de auditoria pode ser representado pelo seguinte diagrama de relação: - -![**auditlog-object-diagram**](images/auditlog-object-diagram.png) - -* **AuditLogInfo**: O objeto raiz com as seguintes propriedades: - * `ApplicationName`: Quando você salva logs de auditoria de diferentes aplicações no mesmo banco de dados, essa propriedade é usada para distinguir os logs das aplicações. - * `UserId`: Id do usuário atual, se o usuário estiver logado. - * `UserName`: Nome do usuário atual, se o usuário estiver logado (esse valor está aqui para não depender do módulo/sistema de identidade para pesquisa). - * `TenantId`: Id do locatário atual, para uma aplicação multi-locatário. - * `TenantName`: Nome do locatário atual, para uma aplicação multi-locatário. - * `ExecutionTime`: O momento em que este objeto de log de auditoria foi criado. - * `ExecutionDuration`: Duração total da execução da solicitação, em milissegundos. Isso pode ser usado para observar o desempenho da aplicação. - * `ClientId`: Id do cliente atual, se o cliente estiver autenticado. Um cliente é geralmente uma aplicação de terceiros que usa o sistema por meio de uma API HTTP. - * `ClientName`: Nome do cliente atual, se disponível. - * `ClientIpAddress`: Endereço IP do cliente/dispositivo do usuário. - * `CorrelationId`: Id de [Correlação Atual](CorrelationId.md). O Id de correlação é usado para relacionar os logs de auditoria escritos por diferentes aplicações (ou microsserviços) em uma única operação lógica. - * `BrowserInfo`: Informações do nome/versão do navegador do usuário atual, se disponível. - * `HttpMethod`: Método HTTP da solicitação atual (GET, POST, PUT, DELETE... etc.). - * `HttpStatusCode`: Código de status da resposta HTTP para esta solicitação. - * `Url`: URL da solicitação. -* **AuditLogActionInfo**: Um log de auditoria de ação é tipicamente uma ação de controlador ou uma chamada de método de [serviço de aplicação](Application-Services.md) durante a solicitação web. Um log de ação pode conter várias ações. Um objeto de ação tem as seguintes propriedades: - * `ServiceName`: Nome do controlador/serviço executado. - * `MethodName`: Nome do método executado do controlador/serviço. - * `Parameters`: Um texto formatado em JSON representando os parâmetros passados para o método. - * `ExecutionTime`: O momento em que este método foi executado. - * `ExecutionDuration`: Duração da execução do método, em milissegundos. Isso pode ser usado para observar o desempenho do método. -* **EntityChangeInfo**: Representa uma alteração de uma entidade nesta solicitação web. Um log de auditoria pode conter zero ou mais alterações de entidade. Uma alteração de entidade tem as seguintes propriedades: - * `ChangeTime`: O momento em que a entidade foi alterada. - * `ChangeType`: Um enum com os seguintes campos: `Criado` (0), `Atualizado` (1) e `Excluído` (2). - * `EntityId`: Id da entidade que foi alterada. - * `EntityTenantId`: Id do locatário a que esta entidade pertence. - * `EntityTypeFullName`: Nome do tipo (classe) da entidade com namespace completo (como *Acme.BookStore.Book* para a entidade Book). -* **EntityPropertyChangeInfo**: Representa uma alteração de uma propriedade de uma entidade. Uma informação de alteração de entidade (explicada acima) pode conter uma ou mais alterações de propriedade com as seguintes propriedades: - * `NewValue`: Novo valor da propriedade. É `null` se a entidade foi excluída. - * `OriginalValue`: Valor antigo/original antes da alteração. É `null` se a entidade foi recém-criada. - * `PropertyName`: O nome da propriedade na classe da entidade. - * `PropertyTypeFullName`: Nome do tipo (classe) da propriedade com namespace completo. -* **Exception**: Um objeto de log de auditoria pode conter zero ou mais exceções. Dessa forma, você pode obter um relatório das solicitações com falha. -* **Comment**: Um valor de string arbitrário para adicionar mensagens personalizadas à entrada de log de auditoria. Um objeto de log de auditoria pode conter zero ou mais comentários. - -Além das propriedades padrão explicadas acima, os objetos `AuditLogInfo`, `AuditLogActionInfo` e `EntityChangeInfo` implementam a interface `IHasExtraProperties`, para que você possa adicionar propriedades personalizadas a esses objetos. - -## Contribuidores de Log de Auditoria - -Você pode estender o sistema de auditoria criando uma classe derivada da classe `AuditLogContributor`, que define os métodos `PreContribute` e `PostContribute`. - -O único contribuidor pré-construído é a classe `AspNetCoreAuditLogContributor`, que define as propriedades relacionadas a uma solicitação HTTP. - -Um contribuidor pode definir propriedades e coleções da classe `AuditLogInfo` para adicionar mais informações. - -Exemplo: - -````csharp -public class MyAuditLogContributor : AuditLogContributor -{ - public override void PreContribute(AuditLogContributionContext context) - { - var currentUser = context.ServiceProvider.GetRequiredService(); - context.AuditInfo.SetProperty( - "MyCustomClaimValue", - currentUser.FindClaimValue("MyCustomClaim") - ); - } - - public override void PostContribute(AuditLogContributionContext context) - { - context.AuditInfo.Comments.Add("Algum comentário..."); - } -} -```` - -* `context.ServiceProvider` pode ser usado para resolver serviços da [injeção de dependência](Dependency-Injection.md). -* `context.AuditInfo` pode ser usado para acessar o objeto de log de auditoria atual para manipulá-lo. - -Após criar um contribuidor, você deve adicioná-lo à lista `AbpAuditingOptions.Contributors`: - -````csharp -Configure(options => -{ - options.Contributors.Add(new MyAuditLogContributor()); -}); -```` - -## IAuditLogScope & IAuditingManager - -Esta seção explica os serviços `IAuditLogScope` e `IAuditingManager` para casos de uso avançados. - -Um **escopo de log de auditoria** é um [escopo ambiente](Ambient-Context-Pattern.md) que **constrói** e **salva** um objeto de log de auditoria (explicado anteriormente). Por padrão, um escopo de log de auditoria é criado para uma solicitação web pelo Middleware de Log de Auditoria (veja a seção `UseAuditing()` acima). - -### Acesso ao Escopo Atual de Log de Auditoria - -Os contribuidores de log de auditoria, explicados acima, são uma maneira global de manipular o objeto de log de auditoria. É bom se você puder obter um valor de um serviço. - -Se você precisar manipular o objeto de log de auditoria em um ponto arbitrário de sua aplicação, pode acessar o escopo de log de auditoria atual e obter o objeto de log de auditoria atual (independente de como o escopo é gerenciado). Exemplo: - -````csharp -public class MeuServico : ITransientDependency -{ - private readonly IAuditingManager _auditingManager; - - public MeuServico(IAuditingManager auditingManager) - { - _auditingManager = auditingManager; - } - - public async Task FazerIssoAsync() - { - var escopoAtualDeLogDeAuditoria = _auditingManager.Current; - if (escopoAtualDeLogDeAuditoria != null) - { - escopoAtualDeLogDeAuditoria.Log.Comments.Add( - "Executou o método MeuServico.FazerIssoAsync :)" - ); - - escopoAtualDeLogDeAuditoria.Log.SetProperty("MinhaPropriedadePersonalizada", 42); - } - } -} -```` - -Sempre verifique se `_auditingManager.Current` é nulo ou não, porque é controlado em um escopo externo e você não pode saber se um escopo de log de auditoria foi criado antes de chamar seu método. - -### Criar Manualmente um Escopo de Log de Auditoria - -Raramente você precisa criar manualmente um escopo de log de auditoria, mas se precisar, pode criar um escopo de log de auditoria usando o `IAuditingManager` como no exemplo a seguir: - -````csharp -public class MeuServico : ITransientDependency -{ - private readonly IAuditingManager _auditingManager; - - public MeuServico(IAuditingManager auditingManager) - { - _auditingManager = auditingManager; - } - - public async Task FazerIssoAsync() - { - using (var escopoDeAuditoria = _auditingManager.BeginScope()) - { - try - { - //Chame outros serviços... - } - catch (Exception ex) - { - //Adicione exceções - _auditingManager.Current.Log.Exceptions.Add(ex); - throw; - } - finally - { - //Sempre salve o log - await escopoDeAuditoria.SaveAsync(); - } - } - } -} -```` - -Você pode chamar outros serviços, que podem chamar outros, que podem alterar entidades e assim por diante. Todas essas interações são salvas como um único objeto de log de auditoria no bloco finally. - -## O Módulo de Registro de Auditoria - -O Módulo de Registro de Auditoria basicamente implementa o `IAuditingStore` para salvar os objetos de log de auditoria em um banco de dados. Ele suporta vários provedores de banco de dados. Este módulo é adicionado aos modelos de inicialização por padrão. - -Consulte o documento [Módulo de Registro de Auditoria](Modules/Audit-Logging.md) para mais informações. diff --git a/docs/pt-BR/Authorization.md b/docs/pt-BR/Authorization.md deleted file mode 100644 index 326b596388..0000000000 --- a/docs/pt-BR/Authorization.md +++ /dev/null @@ -1,359 +0,0 @@ -# Autorização - -A autorização é usada para verificar se um usuário tem permissão para realizar operações específicas na aplicação. - -O ABP estende a [Autorização do ASP.NET Core](https://docs.microsoft.com/pt-br/aspnet/core/security/authorization/introduction) adicionando **permissões** como [políticas](https://docs.microsoft.com/pt-br/aspnet/core/security/authorization/policies) automáticas e permitindo que o sistema de autorização seja utilizado nos **[serviços de aplicação](Application-Services.md)** também. - -Portanto, todos os recursos de autorização do ASP.NET Core e a documentação são válidos em uma aplicação baseada no ABP. Este documento se concentra nos recursos adicionados ao sistema de autorização do ASP.NET Core. - -## Atributo Authorize - -O ASP.NET Core define o atributo [**Authorize**](https://docs.microsoft.com/pt-br/aspnet/core/security/authorization/simple) que pode ser usado para uma ação, um controlador ou uma página. O ABP permite que você use o mesmo atributo para um [serviço de aplicação](Application-Services.md). - -Exemplo: - -```csharp -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authorization; -using Volo.Abp.Application.Services; - -namespace Acme.BookStore -{ - [Authorize] - public class AuthorAppService : ApplicationService, IAuthorAppService - { - public Task> GetListAsync() - { - ... - } - - [AllowAnonymous] - public Task GetAsync(Guid id) - { - ... - } - - [Authorize("BookStore_Author_Create")] - public Task CreateAsync(CreateAuthorDto input) - { - ... - } - } -} - -``` - -- O atributo `Authorize` obriga o usuário a fazer login na aplicação para usar os métodos do `AuthorAppService`. Portanto, o método `GetListAsync` está disponível apenas para usuários autenticados. -- `AllowAnonymous` suprime a autenticação. Portanto, o método `GetAsync` está disponível para todos, incluindo usuários não autorizados. -- `[Authorize("BookStore_Author_Create")]` define uma política (consulte [autorização baseada em políticas](https://docs.microsoft.com/pt-br/aspnet/core/security/authorization/policies)) que é verificada para autorizar o usuário atual. - -"BookStore_Author_Create" é um nome de política arbitrário. Se você declarar um atributo como esse, o sistema de autorização do ASP.NET Core espera que uma política seja definida anteriormente. - -Você pode, é claro, implementar suas próprias políticas conforme descrito na documentação do ASP.NET Core. Mas para condições simples de verdadeiro/falso, como se uma política foi concedida a um usuário ou não, o ABP define o sistema de permissões, que será explicado na próxima seção. - -## Sistema de Permissões - -Uma permissão é uma política simples que é concedida ou proibida para um usuário, função ou cliente específico. - -### Definindo Permissões - -Para definir permissões, crie uma classe que herde de `PermissionDefinitionProvider`, conforme mostrado abaixo: - -```csharp -using Volo.Abp.Authorization.Permissions; - -namespace Acme.BookStore.Permissions -{ - public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvider - { - public override void Define(IPermissionDefinitionContext context) - { - var myGroup = context.AddGroup("BookStore"); - - myGroup.AddPermission("BookStore_Author_Create"); - } - } -} -``` - -> O ABP descobre automaticamente essa classe. Nenhuma configuração adicional é necessária! - -> Normalmente, você define essa classe dentro do projeto `Application.Contracts` da sua [aplicação](Startup-Templates/Application.md). O modelo de inicialização já vem com uma classe vazia chamada *YourProjectNamePermissionDefinitionProvider* com a qual você pode começar. - -No método `Define`, você precisa adicionar um **grupo de permissões** ou obter um grupo existente e adicionar **permissões** a esse grupo. - -Quando você define uma permissão, ela se torna utilizável no sistema de autorização do ASP.NET Core como um nome de **política**. Ela também se torna visível na interface do usuário. Veja o diálogo de permissões para uma função: - -![authorization-new-permission-ui](images/authorization-new-permission-ui.png) - -- O grupo "BookStore" é mostrado como uma nova guia no lado esquerdo. -- "BookStore_Author_Create" no lado direito é o nome da permissão. Você pode concedê-la ou proibi-la para a função. - -Quando você salva o diálogo, ele é salvo no banco de dados e usado no sistema de autorização. - -> A tela acima está disponível quando você instalou o módulo de identidade, que é usado principalmente para gerenciamento de usuários e funções. Os modelos de inicialização já vêm com o módulo de identidade pré-instalado. - -#### Localizando o Nome da Permissão - -"BookStore_Author_Create" não é um bom nome de permissão para a interface do usuário. Felizmente, os métodos `AddPermission` e `AddGroup` podem receber um `LocalizableString` como segundo parâmetro: - -```csharp -var myGroup = context.AddGroup( - "BookStore", - LocalizableString.Create("BookStore") -); - -myGroup.AddPermission( - "BookStore_Author_Create", - LocalizableString.Create("Permission:BookStore_Author_Create") -); -``` - -Em seguida, você pode definir os textos para as chaves "BookStore" e "Permission:BookStore_Author_Create" no arquivo de localização: - -```json -"BookStore": "Livraria", -"Permission:BookStore_Author_Create": "Criar um novo autor" -``` - -> Para mais informações, consulte a [documentação de localização](Localization.md) sobre o sistema de localização. - -A interface do usuário localizada será como mostrado abaixo: - -![authorization-new-permission-ui-localized](images/authorization-new-permission-ui-localized.png) - -#### Multi-Tenancy - -O ABP suporta [multi-tenancy](Multi-Tenancy.md) como um recurso de primeira classe. Você pode definir a opção de lado de multi-tenancy ao definir uma nova permissão. Ela pode ter um dos três valores definidos abaixo: - -- **Host**: A permissão está disponível apenas para o lado do host. -- **Tenant**: A permissão está disponível apenas para o lado do tenant. -- **Ambos** (padrão): A permissão está disponível tanto para o lado do tenant quanto para o lado do host. - -> Se sua aplicação não é multi-tenant, você pode ignorar essa opção. - -Para definir a opção de lado de multi-tenancy, passe para o terceiro parâmetro do método `AddPermission`: - -```csharp -myGroup.AddPermission( - "BookStore_Author_Create", - LocalizableString.Create("Permission:BookStore_Author_Create"), - multiTenancySide: MultiTenancySides.Tenant //defina o lado de multi-tenancy! -); -``` - -#### Habilitar/Desabilitar Permissões - -Uma permissão está habilitada por padrão. É possível desabilitar uma permissão. Uma permissão desabilitada será proibida para todos. Você ainda pode verificar a permissão, mas ela sempre retornará proibida. - -Exemplo de definição: - -````csharp -myGroup.AddPermission("Author_Management", isEnabled: false); -```` - -Normalmente, você não precisa definir uma permissão desabilitada (a menos que queira desabilitar temporariamente um recurso da sua aplicação). No entanto, você pode querer desabilitar uma permissão definida em um módulo dependente. Dessa forma, você pode desabilitar a funcionalidade relacionada à aplicação. Consulte a seção "*Alterando as Definições de Permissão de um Módulo Dependente*" abaixo para um exemplo de uso. - -> Observação: Verificar uma permissão não definida lançará uma exceção, enquanto verificar uma permissão desabilitada simplesmente retornará proibida (falso). - -#### Permissões Filhas - -Uma permissão pode ter permissões filhas. Isso é especialmente útil quando você deseja criar uma árvore de permissões hierárquica, onde uma permissão pode ter permissões secundárias adicionais que estão disponíveis apenas se a permissão pai for concedida. - -Exemplo de definição: - -```csharp -var authorManagement = myGroup.AddPermission("Author_Management"); -authorManagement.AddChild("Author_Management_Create_Books"); -authorManagement.AddChild("Author_Management_Edit_Books"); -authorManagement.AddChild("Author_Management_Delete_Books"); -``` - -O resultado na interface do usuário é mostrado abaixo (provavelmente você desejará localizar as permissões para sua aplicação): - -![authorization-new-permission-ui-hierarcy](images/authorization-new-permission-ui-hierarcy.png) - -Para o código de exemplo, é assumido que uma função/usuário com a permissão "Author_Management" concedida pode ter permissões adicionais. Em seguida, um serviço de aplicação típico que verifica permissões pode ser definido como mostrado abaixo: - -```csharp -[Authorize("Author_Management")] -public class AuthorAppService : ApplicationService, IAuthorAppService -{ - public Task> GetListAsync() - { - ... - } - - public Task GetAsync(Guid id) - { - ... - } - - [Authorize("Author_Management_Create_Books")] - public Task CreateAsync(CreateAuthorDto input) - { - ... - } - - [Authorize("Author_Management_Edit_Books")] - public Task UpdateAsync(CreateAuthorDto input) - { - ... - } - - [Authorize("Author_Management_Delete_Books")] - public Task DeleteAsync(CreateAuthorDto input) - { - ... - } -} -``` - -- `GetListAsync` e `GetAsync` estarão disponíveis para usuários se a permissão `Author_Management` for concedida. -- Outros métodos requerem permissões adicionais. - -### Substituindo uma Permissão por uma Política Personalizada - -Se você definir e registrar uma política no sistema de autorização do ASP.NET Core com o mesmo nome de uma permissão, sua política substituirá a permissão existente. Isso é uma maneira poderosa de estender a autorização para um módulo pré-construído que você está usando em sua aplicação. - -Consulte o documento [autorização baseada em políticas](https://docs.microsoft.com/pt-br/aspnet/core/security/authorization/policies) para aprender como definir uma política personalizada. - -### Alterando as Definições de Permissão de um Módulo Dependente - -Uma classe derivada de `PermissionDefinitionProvider` (assim como o exemplo acima) também pode obter definições de permissão existentes (definidas pelos [módulos](Module-Development-Basics.md) dependentes) e alterar suas definições. - -Exemplo: - -````csharp -context - .GetPermissionOrNull(IdentityPermissions.Roles.Delete) - .IsEnabled = false; -```` - -Quando você escreve esse código dentro do seu provedor de definição de permissão, ele encontra a permissão de "exclusão de função" do [Módulo de Identidade](Modules/Identity.md) e desabilita a permissão, para que ninguém possa excluir uma função na aplicação. - -> Dica: É melhor verificar o valor retornado pelo método `GetPermissionOrNull`, pois ele pode retornar nulo se a permissão fornecida não foi definida. - -### Provedores de Valor de Permissão - -O sistema de verificação de permissões é extensível. Qualquer classe derivada de `PermissionValueProvider` (ou que implemente `IPermissionValueProvider`) pode contribuir para a verificação de permissões. Existem três provedores de valor predefinidos: - -- `UserPermissionValueProvider` verifica se o usuário atual tem a permissão concedida. Ele obtém o ID do usuário das reivindicações atuais. O nome da reivindicação do usuário é definido pela propriedade estática `AbpClaimTypes.UserId`. -- `RolePermissionValueProvider` verifica se algum dos papéis do usuário atual tem a permissão concedida. Ele obtém os nomes dos papéis das reivindicações atuais. O nome das reivindicações de papéis é definido pela propriedade estática `AbpClaimTypes.Role`. -- `ClientPermissionValueProvider` verifica se o cliente atual tem a permissão concedida. Isso é especialmente útil em uma interação máquina a máquina, onde não há usuário atual. Ele obtém o ID do cliente das reivindicações atuais. O nome da reivindicação do cliente é definido pela propriedade estática `AbpClaimTypes.ClientId`. - -Você pode estender o sistema de verificação de permissões definindo seu próprio provedor de valor de permissão. - -Exemplo: - -```csharp -public class SystemAdminPermissionValueProvider : PermissionValueProvider -{ - public SystemAdminPermissionValueProvider(IPermissionStore permissionStore) - : base(permissionStore) - { - } - - public override string Name => "SystemAdmin"; - - public async override Task - CheckAsync(PermissionValueCheckContext context) - { - if (context.Principal?.FindFirst("User_Type")?.Value == "SystemAdmin") - { - return PermissionGrantResult.Granted; - } - - return PermissionGrantResult.Undefined; - } -} -``` - -Esse provedor permite que todas as permissões sejam concedidas a um usuário com uma reivindicação `User_Type` que tenha o valor `SystemAdmin`. É comum usar as reivindicações atuais e o `IPermissionStore` em um provedor de valor de permissão. - -Um provedor de valor de permissão deve retornar um dos seguintes valores do método `CheckAsync`: - -- `PermissionGrantResult.Granted` é retornado para conceder a permissão ao usuário. Se qualquer um dos provedores retornar `Granted`, o resultado será `Granted`, se nenhum outro provedor retornar `Prohibited`. -- `PermissionGrantResult.Prohibited` é retornado para proibir a permissão ao usuário. Se qualquer um dos provedores retornar `Prohibited`, o resultado será sempre `Prohibited`. Não importa o que os outros provedores retornem. -- `PermissionGrantResult.Undefined` é retornado se esse provedor de valor de permissão não puder decidir sobre o valor da permissão. Retorne isso para permitir que outros provedores verifiquem a permissão. - -Uma vez que um provedor é definido, ele deve ser adicionado às `AbpPermissionOptions`, como mostrado abaixo: - -```csharp -Configure(options => -{ - options.ValueProviders.Add(); -}); -``` - -### Armazenamento de Permissões - -`IPermissionStore` é a única interface que precisa ser implementada para ler o valor das permissões de uma fonte de persistência, geralmente um sistema de banco de dados. O módulo de gerenciamento de permissões a implementa e é pré-instalado no modelo de inicialização da aplicação. Consulte a [documentação do módulo de gerenciamento de permissões](Modules/Permission-Management.md) para obter mais informações. - -### AlwaysAllowAuthorizationService - -`AlwaysAllowAuthorizationService` é uma classe usada para ignorar o serviço de autorização. Geralmente é usado em testes de integração, onde você pode querer desabilitar o sistema de autorização. - -Use o método de extensão `IServiceCollection.AddAlwaysAllowAuthorization()` para registrar o `AlwaysAllowAuthorizationService` no sistema de [injeção de dependência](Dependency-Injection.md): - -```csharp -public override void ConfigureServices(ServiceConfigurationContext context) -{ - context.Services.AddAlwaysAllowAuthorization(); -} -``` - -Isso já é feito para testes de integração do modelo de inicialização. - -### Fábrica de Claims Principal - -As reivindicações são elementos importantes da autenticação e autorização. O ABP usa o serviço `IAbpClaimsPrincipalFactory` para criar reivindicações na autenticação. Esse serviço foi projetado para ser extensível. Se você precisar adicionar suas próprias reivindicações ao ticket de autenticação, poderá implementar `IAbpClaimsPrincipalContributor` em sua aplicação. - -**Exemplo: Adicionar uma reivindicação `SocialSecurityNumber` e obtê-la:** - -```csharp -public class SocialSecurityNumberClaimsPrincipalContributor : IAbpClaimsPrincipalContributor, ITransientDependency -{ - public async Task ContributeAsync(AbpClaimsPrincipalContributorContext context) - { - var identity = context.ClaimsPrincipal.Identities.FirstOrDefault(); - var userId = identity?.FindUserId(); - if (userId.HasValue) - { - var userService = context.ServiceProvider.GetRequiredService(); //Seu serviço personalizado - var socialSecurityNumber = await userService.GetSocialSecurityNumberAsync(userId.Value); - if (socialSecurityNumber != null) - { - identity.AddClaim(new Claim("SocialSecurityNumber", socialSecurityNumber)); - } - } - } -} - - -public static class CurrentUserExtensions -{ - public static string GetSocialSecurityNumber(this ICurrentUser currentUser) - { - return currentUser.FindClaimValue("SocialSecurityNumber"); - } -} -``` - -> Se você estiver usando o Identity Server, adicione suas reivindicações a `RequestedClaims` de `AbpClaimsServiceOptions`. - -```csharp -Configure(options => -{ - options.RequestedClaims.AddRange(new[]{ "SocialSecurityNumber" }); -}); -``` - -## Veja também - -* [Módulo de Gerenciamento de Permissões](Modules/Permission-Management.md) -* [API de Autenticação JavaScript do ASP.NET Core MVC / Razor Pages](UI/AspNetCore/JavaScript-API/Auth.md) -* [Gerenciamento de Permissões na Interface do Usuário Angular](UI/Angular/Permission-Management.md) -* [Tutorial em vídeo](https://abp.io/video-courses/essentials/authorization) \ No newline at end of file diff --git a/docs/pt-BR/AutoMapper-Integration.md b/docs/pt-BR/AutoMapper-Integration.md deleted file mode 100644 index 24dd8ebfc4..0000000000 --- a/docs/pt-BR/AutoMapper-Integration.md +++ /dev/null @@ -1,3 +0,0 @@ -## AutoMapper Integration - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Background-Jobs-Hangfire.md b/docs/pt-BR/Background-Jobs-Hangfire.md deleted file mode 100644 index 66e6944e88..0000000000 --- a/docs/pt-BR/Background-Jobs-Hangfire.md +++ /dev/null @@ -1,3 +0,0 @@ -# Hangfire Background Job Manager - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Background-Jobs-Quartz.md b/docs/pt-BR/Background-Jobs-Quartz.md deleted file mode 100644 index 9f556c7626..0000000000 --- a/docs/pt-BR/Background-Jobs-Quartz.md +++ /dev/null @@ -1,159 +0,0 @@ -# Gerenciador de Tarefas em Segundo Plano Quartz - -[Quartz](https://www.quartz-scheduler.net/) é um avançado gerenciador de tarefas em segundo plano. Você pode integrar o Quartz com o ABP Framework para usá-lo em vez do [gerenciador de tarefas em segundo plano padrão](Background-Jobs.md). Dessa forma, você pode usar a mesma API de tarefas em segundo plano para o Quartz e seu código será independente do Quartz. Se preferir, você também pode usar diretamente a API do Quartz. - -> Consulte o [documento de tarefas em segundo plano](Background-Jobs.md) para aprender como usar o sistema de tarefas em segundo plano. Este documento mostra apenas como instalar e configurar a integração com o Quartz. - -## Instalação - -É sugerido usar o [ABP CLI](CLI.md) para instalar este pacote. - -### Usando o ABP CLI - -Abra uma janela de linha de comando na pasta do projeto (arquivo .csproj) e digite o seguinte comando: - -````bash -abp add-package Volo.Abp.BackgroundJobs.Quartz -```` - -> Se você ainda não o fez, primeiro precisa instalar o [ABP CLI](CLI.md). Para outras opções de instalação, consulte [a página de descrição do pacote](https://abp.io/package-detail/Volo.Abp.BackgroundJobs.Quartz). - -### Instalação Manual - -Se você deseja instalar manualmente: - -1. Adicione o pacote NuGet [Volo.Abp.BackgroundJobs.Quartz](https://www.nuget.org/packages/Volo.Abp.BackgroundJobs.Quartz) ao seu projeto: - - ```` - Install-Package Volo.Abp.BackgroundJobs.Quartz - ```` - -2. Adicione o `AbpBackgroundJobsQuartzModule` à lista de dependências do seu módulo: - -````csharp -[DependsOn( - //...outras dependências - typeof(AbpBackgroundJobsQuartzModule) //Adicione a nova dependência do módulo - )] -public class SeuModulo : AbpModule -{ -} -```` - -## Configuração - -O Quartz é uma biblioteca muito configurável e o framework ABP fornece `AbpQuartzOptions` para isso. Você pode usar o método `PreConfigure` na classe do seu módulo para pré-configurar essa opção. O ABP a usará ao inicializar o módulo Quartz. Por exemplo: - -````csharp -[DependsOn( - //...outras dependências - typeof(AbpBackgroundJobsQuartzModule) //Adicione a nova dependência do módulo - )] -public class SeuModulo : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - var configuration = context.Services.GetConfiguration(); - - PreConfigure(options => - { - options.Properties = new NameValueCollection - { - ["quartz.jobStore.dataSource"] = "BackgroundJobsDemoApp", - ["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz", - ["quartz.jobStore.tablePrefix"] = "QRTZ_", - ["quartz.serializer.type"] = "json", - ["quartz.dataSource.BackgroundJobsDemoApp.connectionString"] = configuration.GetConnectionString("Quartz"), - ["quartz.dataSource.BackgroundJobsDemoApp.provider"] = "SqlServer", - ["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz", - }; - }); - } -} -```` - -A partir da versão 3.1 do ABP, adicionamos o `Configurator` ao `AbpQuartzOptions` para configurar o Quartz. Por exemplo: - -````csharp -[DependsOn( - //...outras dependências - typeof(AbpBackgroundJobsQuartzModule) //Adicione a nova dependência do módulo - )] -public class SeuModulo : AbpModule -{ - public override void PreConfigureServices(ServiceConfigurationContext context) - { - var configuration = context.Services.GetConfiguration(); - - PreConfigure(options => - { - options.Configurator = configure => - { - configure.UsePersistentStore(storeOptions => - { - storeOptions.UseProperties = true; - storeOptions.UseJsonSerializer(); - storeOptions.UseSqlServer(configuration.GetConnectionString("Quartz")); - storeOptions.UseClustering(c => - { - c.CheckinMisfireThreshold = TimeSpan.FromSeconds(20); - c.CheckinInterval = TimeSpan.FromSeconds(10); - }); - }); - }; - }); - } -} -```` - -> Você pode escolher a maneira que preferir para configurar o Quartz. - -O Quartz armazena informações de tarefas e agendamento **em memória por padrão**. No exemplo, usamos a pré-configuração do [padrão de opções](Options.md) para alterá-lo para o banco de dados. Para mais configurações do Quartz, consulte a [documentação do Quartz](https://www.quartz-scheduler.net/). - -## Tratamento de Exceções - -### Estratégia de tratamento de exceções padrão - -Quando ocorre uma exceção na tarefa em segundo plano, o ABP fornece a **estratégia de tratamento padrão** que tenta novamente a cada 3 segundos, até 3 vezes. Você pode alterar a contagem de tentativas e o intervalo de tentativa por meio das opções `AbpBackgroundJobQuartzOptions`: - -```csharp -[DependsOn( - //...outras dependências - typeof(AbpBackgroundJobsQuartzModule) //Adicione a nova dependência do módulo - )] -public class SeuModulo : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.RetryCount = 1; - options.RetryIntervalMillisecond = 1000; - }); - } -} -``` - -### Personalizar a estratégia de tratamento de exceções - -Você pode personalizar a estratégia de tratamento de exceções por meio das opções `AbpBackgroundJobQuartzOptions`: - -```csharp -[DependsOn( - //...outras dependências - typeof(AbpBackgroundJobsQuartzModule) //Adicione a nova dependência do módulo - )] -public class SeuModulo : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.RetryStrategy = async (retryIndex, executionContext, exception) => - { - // personalizar o tratamento de exceções - }; - }); - } -} -``` \ No newline at end of file diff --git a/docs/pt-BR/Background-Jobs-RabbitMq.md b/docs/pt-BR/Background-Jobs-RabbitMq.md deleted file mode 100644 index a984a2a3ab..0000000000 --- a/docs/pt-BR/Background-Jobs-RabbitMq.md +++ /dev/null @@ -1,3 +0,0 @@ -# RabbitMQ Background Job Manager - -TODO \ No newline at end of file diff --git a/docs/pt-BR/Background-Workers-Quartz.md b/docs/pt-BR/Background-Workers-Quartz.md deleted file mode 100644 index 857de2e469..0000000000 --- a/docs/pt-BR/Background-Workers-Quartz.md +++ /dev/null @@ -1,146 +0,0 @@ -# Gerenciador de Trabalhadores em Segundo Plano Quartz - -[Quartz](https://www.quartz-scheduler.net/) é um avançado gerenciador de trabalhadores em segundo plano. Você pode integrar o Quartz com o ABP Framework para usá-lo em vez do [gerenciador de trabalhadores em segundo plano padrão](Background-Workers.md). O ABP simplesmente integra o Quartz. - -## Instalação - -É sugerido usar o [ABP CLI](CLI.md) para instalar este pacote. - -### Usando o ABP CLI - -Abra uma janela de linha de comando na pasta do projeto (arquivo .csproj) e digite o seguinte comando: - -````bash -abp add-package Volo.Abp.BackgroundWorkers.Quartz -```` - -### Instalação Manual - -Se você deseja instalar manualmente: - -1. Adicione o pacote NuGet [Volo.Abp.BackgroundWorkers.Quartz](https://www.nuget.org/packages/Volo.Abp.BackgroundWorkers.Quartz) ao seu projeto: - - ```` - Install-Package Volo.Abp.BackgroundWorkers.Quartz - ```` - -2. Adicione o módulo `AbpBackgroundWorkersQuartzModule` à lista de dependências do seu módulo: - -````csharp -[DependsOn( - //...outras dependências - typeof(AbpBackgroundWorkersQuartzModule) //Adicione a nova dependência do módulo - )] -public class SeuModulo : AbpModule -{ -} -```` - -> A integração do trabalhador em segundo plano do Quartz fornece o adaptador `QuartzPeriodicBackgroundWorkerAdapter` para adaptar as classes derivadas `PeriodicBackgroundWorkerBase` e `AsyncPeriodicBackgroundWorkerBase`. Portanto, você ainda pode seguir o [documento de trabalhadores em segundo plano](Background-Workers.md) para definir o trabalhador em segundo plano. - -## Configuração - -Veja [Configuração](Background-Jobs-Quartz#Configuração). - -## Criar um Trabalhador em Segundo Plano - -Um trabalho em segundo plano é uma classe que deriva da classe base `QuartzBackgroundWorkerBase`. Por exemplo, uma classe de trabalhador simples é mostrada abaixo: - -```` csharp -public class MeuTrabalhadorDeLog : QuartzBackgroundWorkerBase -{ - public MeuTrabalhadorDeLog() - { - JobDetail = JobBuilder.Create().WithIdentity(nameof(MeuTrabalhadorDeLog)).Build(); - Trigger = TriggerBuilder.Create().WithIdentity(nameof(MeuTrabalhadorDeLog)).StartNow().Build(); - } - - public override Task Execute(IJobExecutionContext context) - { - Logger.LogInformation("Executando MeuTrabalhadorDeLog..!"); - return Task.CompletedTask; - } -} -```` - -Nós simplesmente implementamos o método Execute para escrever um log. O trabalhador em segundo plano é um **singleton por padrão**. Se desejar, você também pode implementar uma [interface de dependência](Dependency-Injection#Interfaces-de-Dependência) para registrá-lo com outro ciclo de vida. - -> Dica: Adicionar identidade aos trabalhadores em segundo plano é uma boa prática, pois o Quartz distingue trabalhos diferentes com base na identidade. - -## Adicionar ao BackgroundWorkerManager - -Os trabalhadores em segundo plano padrão são **adicionados automaticamente** ao BackgroundWorkerManager quando a aplicação é **inicializada**. Você pode definir o valor da propriedade `AutoRegister` como `false`, se desejar adicioná-lo manualmente: - -```` csharp -public class MeuTrabalhadorDeLog : QuartzBackgroundWorkerBase -{ - public MeuTrabalhadorDeLog() - { - AutoRegister = false; - JobDetail = JobBuilder.Create().WithIdentity(nameof(MeuTrabalhadorDeLog)).Build(); - Trigger = TriggerBuilder.Create().WithIdentity(nameof(MeuTrabalhadorDeLog)).StartNow().Build(); - } - - public override Task Execute(IJobExecutionContext context) - { - Logger.LogInformation("Executando MeuTrabalhadorDeLog..!"); - return Task.CompletedTask; - } -} -```` - -Se você deseja desabilitar globalmente a adição automática de trabalhadores, você pode desabilitá-la globalmente através das opções `AbpBackgroundWorkerQuartzOptions`: - -```csharp -[DependsOn( - //...outras dependências - typeof(AbpBackgroundWorkersQuartzModule) //Adicione a nova dependência do módulo - )] -public class SeuModulo : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.IsAutoRegisterEnabled = false; - }); - } -} -``` - -## Tópicos Avançados - -### Personalizar o ScheduleJob - -Suponha que você tenha um trabalhador que é executado a cada 10 minutos, mas devido a um servidor indisponível por 30 minutos, 3 execuções são perdidas. Você deseja executar todas as execuções perdidas quando o servidor estiver disponível novamente. Você deve definir seu trabalhador em segundo plano da seguinte forma: - -```csharp -public class MeuTrabalhadorDeLog : QuartzBackgroundWorkerBase -{ - public MeuTrabalhadorDeLog() - { - JobDetail = JobBuilder.Create().WithIdentity(nameof(MeuTrabalhadorDeLog)).Build(); - Trigger = TriggerBuilder.Create().WithIdentity(nameof(MeuTrabalhadorDeLog)).WithSimpleSchedule(s=>s.WithIntervalInMinutes(1).RepeatForever().WithMisfireHandlingInstructionIgnoreMisfires()).Build(); - - ScheduleJob = async scheduler => - { - if (!await scheduler.CheckExists(JobDetail.Key)) - { - await scheduler.ScheduleJob(JobDetail, Trigger); - } - }; - } - - public override Task Execute(IJobExecutionContext context) - { - Logger.LogInformation("Executando MeuTrabalhadorDeLog..!"); - return Task.CompletedTask; - } -} -``` - -No exemplo, definimos o intervalo de execução do trabalhador como 10 minutos e definimos `WithMisfireHandlingInstructionIgnoreMisfires`. Personalizamos o `ScheduleJob` e adicionamos o trabalhador ao Quartz somente quando o trabalhador em segundo plano não existe. - -### Mais - -Consulte a [documentação](https://www.quartz-scheduler.net/documentation/index.html) do Quartz para obter mais informações. diff --git a/docs/pt-BR/Background-Workers.md b/docs/pt-BR/Background-Workers.md deleted file mode 100644 index 7ee7f3afd2..0000000000 --- a/docs/pt-BR/Background-Workers.md +++ /dev/null @@ -1,144 +0,0 @@ -# Background Workers - -## Introdução - -Background workers são threads independentes simples na aplicação que são executadas em segundo plano. Geralmente, eles são executados periodicamente para realizar algumas tarefas. Exemplos: - -* Um background worker pode ser executado periodicamente para **excluir logs antigos**. -* Um background worker pode ser executado periodicamente para **identificar usuários inativos** e **enviar e-mails** para fazer com que os usuários retornem à sua aplicação. - -## Criando um Background Worker - -Um background worker deve implementar diretamente ou indiretamente a interface `IBackgroundWorker`. - -> Um background worker é inerentemente [singleton](Dependency-Injection.md). Portanto, apenas uma única instância da sua classe de worker é instanciada e executada. - -### BackgroundWorkerBase - -`BackgroundWorkerBase` é uma maneira fácil de criar um background worker. - -````csharp -public class MyWorker : BackgroundWorkerBase -{ - public override Task StartAsync(CancellationToken cancellationToken = default) - { - //... - } - - public override Task StopAsync(CancellationToken cancellationToken = default) - { - //... - } -} -```` - -Inicie o seu worker no método `StartAsync` (que é chamado quando a aplicação é iniciada) e pare no método `StopAsync` (que é chamado quando a aplicação é encerrada). - -> Você pode implementar diretamente a interface `IBackgroundWorker`, mas `BackgroundWorkerBase` fornece algumas propriedades úteis, como `Logger`. - -### AsyncPeriodicBackgroundWorkerBase - -Vamos supor que queremos tornar um usuário inativo se ele não tiver feito login na aplicação nos últimos 30 dias. A classe `AsyncPeriodicBackgroundWorkerBase` simplifica a criação de workers periódicos, então vamos usá-la no exemplo abaixo: - -````csharp -public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase -{ - public PassiveUserCheckerWorker( - AbpAsyncTimer timer, - IServiceScopeFactory serviceScopeFactory - ) : base( - timer, - serviceScopeFactory) - { - Timer.Period = 600000; //10 minutos - } - - protected async override Task DoWorkAsync( - PeriodicBackgroundWorkerContext workerContext) - { - Logger.LogInformation("Iniciando: Definindo status de usuários inativos..."); - - //Resolver dependências - var userRepository = workerContext - .ServiceProvider - .GetRequiredService(); - - //Realizar o trabalho - await userRepository.UpdateInactiveUserStatusesAsync(); - - Logger.LogInformation("Concluído: Definindo status de usuários inativos..."); - } -} -```` - -* `AsyncPeriodicBackgroundWorkerBase` usa o objeto `AbpAsyncTimer` (um timer thread-safe) para determinar **o período**. Podemos definir a propriedade `Period` no construtor. -* É necessário implementar o método `DoWorkAsync` para **executar** o trabalho periódico. -* É uma boa prática **resolver as dependências** a partir do `PeriodicBackgroundWorkerContext` em vez de usar injeção de dependência no construtor. Isso ocorre porque `AsyncPeriodicBackgroundWorkerBase` usa um `IServiceScope` que é **descartado** quando o trabalho é concluído. -* `AsyncPeriodicBackgroundWorkerBase` **captura e registra exceções** lançadas pelo método `DoWorkAsync`. - -## Registrando o Background Worker - -Após criar a classe do background worker, você deve adicioná-la ao `IBackgroundWorkerManager`. O local mais comum é o método `OnApplicationInitializationAsync` da sua classe de módulo: - -````csharp -[DependsOn(typeof(AbpBackgroundWorkersModule))] -public class MyModule : AbpModule -{ - public override async Task OnApplicationInitializationAsync( - ApplicationInitializationContext context) - { - await context.AddBackgroundWorkerAsync(); - } -} -```` - -`context.AddBackgroundWorkerAsync(...)` é um método de extensão que simplifica a expressão abaixo: - -````csharp -await context.ServiceProvider - .GetRequiredService() - .AddAsync( - context - .ServiceProvider - .GetRequiredService() - ); -```` - -Dessa forma, ele resolve o background worker fornecido e o adiciona ao `IBackgroundWorkerManager`. - -Embora geralmente adicionemos workers no método `OnApplicationInitializationAsync`, não há restrições quanto a isso. Você pode injetar o `IBackgroundWorkerManager` em qualquer lugar e adicionar workers em tempo de execução. O gerenciador de background workers irá parar e liberar todos os workers registrados quando a aplicação for encerrada. - -## Opções - -A classe `AbpBackgroundWorkerOptions` é usada para [definir opções](Options.md) para os background workers. Atualmente, há apenas uma opção: - -* `IsEnabled` (padrão: true): Usado para **habilitar/desabilitar** o sistema de background workers para a sua aplicação. - -> Consulte o documento [Options](Options.md) para aprender como definir opções. - -## Mantendo a Aplicação Sempre em Execução - -Os background workers só funcionam se a sua aplicação estiver em execução. Se você hospedar a execução do job em segundo plano na sua aplicação web (esse é o comportamento padrão), você deve garantir que a sua aplicação web esteja configurada para sempre estar em execução. Caso contrário, os jobs em segundo plano só funcionarão enquanto a sua aplicação estiver em uso. - -## Executando em um Cluster - -Tenha cuidado se você executar várias instâncias da sua aplicação simultaneamente em um ambiente de cluster. Nesse caso, cada aplicação executa o mesmo worker, o que pode criar conflitos se os workers estiverem executando em recursos compartilhados (processando os mesmos dados, por exemplo). - -Se isso for um problema para os seus workers, você tem as seguintes opções: - -* Implemente os seus background workers de forma que eles funcionem em um ambiente de cluster sem problemas. Usar o [lock distribuído](Distributed-Locking.md) para garantir o controle de concorrência é uma forma de fazer isso. Um background worker em uma instância da aplicação pode manipular um lock distribuído, então os workers em outras instâncias da aplicação aguardarão pelo lock. Dessa forma, apenas um worker realiza o trabalho real, enquanto os outros esperam ociosos. Se você implementar isso, os seus workers serão executados com segurança, independentemente de como a aplicação estiver implantada. -* Pare os background workers (defina `AbpBackgroundWorkerOptions.IsEnabled` como `false`) em todas as instâncias da aplicação, exceto em uma delas, para que apenas a instância única execute os workers. -* Pare os background workers (defina `AbpBackgroundWorkerOptions.IsEnabled` como `false`) em todas as instâncias da aplicação e crie uma aplicação dedicada (talvez uma aplicação console executando em seu próprio contêiner ou um serviço do Windows em execução em segundo plano) para executar todas as tarefas em segundo plano. Essa pode ser uma boa opção se os seus background workers consumirem muitos recursos do sistema (CPU, RAM ou Disco), para que você possa implantar essa aplicação de background em um servidor dedicado e suas tarefas em segundo plano não afetem o desempenho da sua aplicação. - -## Integrações - -O sistema de background workers é extensível e você pode alterar o gerenciador de background workers padrão com a sua própria implementação ou com uma das integrações pré-construídas. - -Veja as alternativas de gerenciador de workers pré-construídas: - -* [Quartz Background Worker Manager](Background-Workers-Quartz.md) -* [Hangfire Background Worker Manager](Background-Workers-Hangfire.md) - -## Veja Também - -* [Background Jobs](Background-Jobs.md) diff --git a/docs/pt-BR/CLI.md b/docs/pt-BR/CLI.md deleted file mode 100644 index 87ddfc9942..0000000000 --- a/docs/pt-BR/CLI.md +++ /dev/null @@ -1,149 +0,0 @@ -# ABP CLI - -O ABP CLI (Command Line Interface) é uma ferramenta de linha de comando para executar algumas operações comuns para soluções baseadas em ABP. - -## Instalação - -O ABP CLI é uma [ferramenta global dotnet](https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools) . Instale-o usando uma janela de linha de comando: - -````bash -dotnet tool install -g Volo.Abp.Cli -```` - -Para atualizar uma instalação existente: - -````bash -dotnet tool update -g Volo.Abp.Cli -```` - -## Comandos - -### Novo - -Gera uma nova solução baseada nos [modelos de inicialização](Startup-Templates/Index.md) do ABP . - -Uso básico: - -````bash -abp new [options] -```` - -Examplo: - -````bash -abp new Acme.BookStore -```` - -* `Acme.BookStore` é o nome da solução aqui. -* A convenção comum é nomear uma solução como *YourCompany.YourProject* . No entanto, você pode usar nomes diferentes, como *YourProject* (namespacing de nível único) ou *YourCompany.YourProduct.YourModule* (namespacing de três níveis). - -#### Opções - -* `--template`ou `-t`: especifica o nome do modelo. O nome do modelo padrão é `app`, que gera um aplicativo da web. Modelos disponíveis: - * `app`(padrão): [modelo de aplicativo](https://docs.abp.io/en/abp/latest/Startup-Templates/Application) . Opções adicionais: - * `--ui`ou `-u`: Especifica a UI framework. Framework padrão é `mvc`. Framework disponíveis: - * `mvc`: ASP.NET Core MVC. Existem algumas opções adicionais para este modelo: - * `--tiered`: Cria uma solução em camadas em que as camadas da Web e da API HTTP são fisicamente separadas. Se não especificado, ele cria uma solução em camadas que é menos complexa e adequada para a maioria dos cenários. - * `angular`: Angular. Existem algumas opções adicionais para este modelo: - * `--separate-auth-server`: Separa o aplicativo do servidor de identidade do aplicativo host da API. Se não especificado, você terá um único ponto de extremidade no lado do servidor. - * `--database-provider` Ou `-d`: especifica o provedor de banco de dados. O provedor padrão é `ef`. Fornecedores disponíveis: - * `ef`: Entity Framework Core. - * `mongodb`: MongoDB. - * `module`: [Exemplo de Módulo](Startup-Templates/Module.md). Opções adicionais: - * `--no-ui`: Especifica para não incluir a UI. Isso possibilita a criação de módulos somente de serviço (também conhecidos como microsserviços - sem interface do usuário). -* `--output-folder` ou `-o`: especifica a pasta de saída. O valor padrão é o diretório atual. -* `--version` ou `-v`: Especifica a ABP & versão de exemplo . Pode ser uma [release tag](https://github.com/abpframework/abp/releases) ou um [branch name](https://github.com/abpframework/abp/branches). Usa a versão mais recente, se não especificado. Na maioria das vezes, você desejará usar a versão mais recente. - -### add-package - -Adiciona um pacote ABP a um projeto por, - -- Adicionando pacote de nuget relacionado como uma dependência ao projeto. -- Adicionando `[DependsOn(...)]`atributo à classe de módulo no projeto (consulte o [documento de desenvolvimento](https://docs.abp.io/en/abp/latest/Module-Development-Basics) do [módulo](https://docs.abp.io/en/abp/latest/Module-Development-Basics) ). - -> Observe que o módulo adicionado pode exigir uma configuração adicional, geralmente indicada na documentação do pacote relacionado. - -Uso básico: - -```bash -abp add-package [options] -``` - -Bater - -cópia de - -Exemplo: - -``` -abp add-package Volo.Abp.MongoDB -``` - -- Este exemplo adiciona o pacote Volo.Abp.MongoDB ao projeto. - -#### Opções - -- `--project`ou `-p`: especifica o caminho do arquivo do projeto (.csproj). Se não especificado, a CLI tenta encontrar um arquivo .csproj no diretório atual. - -### add-module - -Adiciona um [módulo de aplicativo com vários pacotes](Modules/Index.md) a uma solução, localizando todos os pacotes do módulo, localizando projetos relacionados na solução e adicionando cada pacote ao projeto correspondente na solução. - -> Um módulo de negócios geralmente consiste em vários pacotes (devido a camadas, diferentes opções de provedor de banco de dados ou outros motivos). O uso do `add-module`comando simplifica drasticamente a adição de um módulo a uma solução. No entanto, cada módulo pode exigir algumas configurações adicionais, geralmente indicadas na documentação do módulo relacionado. - -Uso básico: - -```bash -abp add-module [options] -``` - -Exemplo: - -```bash -abp add-module Volo.Blogging -``` - -- Este exemplo adiciona o módulo Volo.Blogging à solução. - -#### Opções - -- `--solution`ou `-s`: especifica o caminho do arquivo da solução (.sln). Se não especificado, a CLI tenta encontrar um arquivo .sln no diretório atual. -- `--skip-db-migrations`: Para o provedor de banco de dados EF Core, ele adiciona automaticamente um novo código à primeira migração ( `Add-Migration`) e atualiza o banco de dados ( `Update-Database`), se necessário. Especifique esta opção para pular esta operação. -- `-sp`ou `--startup-project`: caminho relativo para a pasta do projeto de inicialização. O valor padrão é a pasta atual. - -### atualizar - -A atualização de todos os pacotes relacionados ao ABP pode ser entediante, pois existem muitos pacotes da estrutura e dos módulos. Este comando atualiza automaticamente todos os pacotes NuGet e NPM relacionados ao ABP em uma solução ou projeto para as versões mais recentes. - -Uso: - -```bash -abp update [options] -``` - -- Se você executar em um diretório com um arquivo .sln, ele atualizará todos os pacotes relacionados ao ABP de todos os projetos da solução para as versões mais recentes. -- Se você executar em um diretório com um arquivo .csproj, ele atualizará todos os pacotes relacionados ao ABP do projeto para as versões mais recentes. - -#### Opções - -- `--include-previews`ou `-p`: inclui pacotes de visualização, beta e rc enquanto verifica as versões mais recentes. - -### Socorro - -Grava informações básicas de uso da CLI. - -Uso: - -```bash -abp help [command-name] -``` - -Exemplos: - -```bash -abp help # Shows a general help. -abp help new # Shows help about the "new" command. -``` - - - \ No newline at end of file diff --git a/docs/pt-BR/Caching.md b/docs/pt-BR/Caching.md deleted file mode 100644 index cc28531e90..0000000000 --- a/docs/pt-BR/Caching.md +++ /dev/null @@ -1,3 +0,0 @@ -# Caching - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Contribution/Index.md b/docs/pt-BR/Contribution/Index.md deleted file mode 100644 index e51ff4646c..0000000000 --- a/docs/pt-BR/Contribution/Index.md +++ /dev/null @@ -1,60 +0,0 @@ -## Guia de Contribuição - -O ABP é um projeto de [código aberto](https://github.com/abpframework) e orientado à comunidade. Este guia tem como objetivo ajudar alguém que queira contribuir com o projeto. - -### Contribuição de código - -Você sempre pode enviar solicitações pull ao repositório do Github. - -- Clone o [repositório ABP](https://github.com/abpframework/abp/) do Github. -- Faça as alterações necessárias. -- Envie uma solicitação de recebimento. - -Antes de fazer qualquer alteração, discuta-a sobre os [problemas](https://github.com/abpframework/abp/issues) do [Github](https://github.com/abpframework/abp/issues) . Dessa forma, nenhum outro desenvolvedor trabalhará no mesmo problema e seu PR terá uma chance melhor de ser aceito. - -#### Correções de bugs e aprimoramentos - -Você pode corrigir um bug conhecido ou trabalhar em uma melhoria planejada. Veja [a lista de problemas](https://github.com/abpframework/abp/issues) no Github. - -#### Solicitações de recursos - -Se você tem uma ideia de recurso para a estrutura ou módulos, [crie um problema](https://github.com/abpframework/abp/issues/new) no Github ou participe de uma discussão existente. Então você pode implementá-lo se for adotado pela comunidade. - -### Tradução de documentos - -Você pode traduzir a [documentação](https://abp.io/documents/) completa (incluindo esta) para o idioma materno. Nesse caso, siga estas etapas: - -- Clone o [repositório ABP](https://github.com/abpframework/abp/) do Github. -- Para adicionar um novo idioma, crie uma nova pasta dentro da pasta [docs](https://github.com/abpframework/abp/tree/master/docs) . Os nomes das pastas podem ser "en", "es", "fr", "tr" e assim por diante, com base no idioma (consulte [todos os códigos de cultura](https://msdn.microsoft.com/en-us/library/hh441729.aspx) ). -- Obtenha a [pasta "en"](https://github.com/abpframework/abp/tree/master/docs/en) como uma referência para os nomes de arquivos e a estrutura de pastas. Mantenha o mesmo nome se estiver traduzindo a mesma documentação. -- Envie uma solicitação de recebimento (PR) depois de traduzir qualquer documento. Traduza documentos e envie PRs um por um. Não espere para terminar as traduções de todos os documentos. - -Alguns documentos fundamentais precisam ser traduzidos antes da publicação de um idioma no [site de documentação](https://docs.abp.io/) da [ABP](https://docs.abp.io/) : - -- Documentos de introdução -- Tutoriais -- CLI - -Um novo idioma é publicado após a conclusão dessas traduções mínimas. - -### Localização de Recursos - -A estrutura ABP possui um [sistema de localização](../Localization.md) flexível . Você pode criar interfaces de usuário localizadas para seu próprio aplicativo. - -Além disso, os módulos de estrutura e pré-construção já localizaram textos. Como exemplo, veja [os textos de localização para o pacote Volo.Abp.UI](https://github.com/abpframework/abp/blob/master/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi/en.json) . Você pode criar um novo arquivo na [mesma pasta](https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.UI/Localization/Resources/AbpUi) para traduzi-lo. - -- Clone o [repositório ABP](https://github.com/abpframework/abp/) do Github. -- Crie um novo arquivo para o idioma de destino para um arquivo de texto de localização (json) (próximo ao arquivo en.json). -- Copie todos os textos do arquivo en.json. -- Traduzir os textos. -- Enviar solicitação de recebimento no Github. - -ABP é uma estrutura modular. Portanto, existem muitos recursos de texto de localização, um por módulo. Para encontrar todos os arquivos .json, você pode procurar por "en.json" após clonar o repositório. Você também pode verificar [esta lista](https://docs.abp.io/en/abp/latest/Contribution/Localization-Text-Files) para obter uma lista de arquivos de texto de localização. - -### Posts e tutoriais do blog - -Se você decidir criar alguns tutoriais ou postagens de blog no ABP, informe-nos (criando um [problema no Github](https://github.com/abpframework/abp/issues) ), para que possamos adicionar um link ao seu tutorial / publicação na documentação oficial e podemos anunciá-lo em nossa [conta do Twitter](https://twitter.com/abpframework) . - -### Relatório de erro - -Se você encontrar algum erro, [crie um problema no repositório do Github](https://github.com/abpframework/abp/issues/new) . \ No newline at end of file diff --git a/docs/pt-BR/CorrelationId.md b/docs/pt-BR/CorrelationId.md deleted file mode 100644 index 97b18c5099..0000000000 --- a/docs/pt-BR/CorrelationId.md +++ /dev/null @@ -1,3 +0,0 @@ -# Correlation ID - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Data-Filtering.md b/docs/pt-BR/Data-Filtering.md deleted file mode 100644 index 58b1431f2c..0000000000 --- a/docs/pt-BR/Data-Filtering.md +++ /dev/null @@ -1,3 +0,0 @@ -# Data Filtering - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Data-Seeding.md b/docs/pt-BR/Data-Seeding.md deleted file mode 100644 index 75eea2bcb9..0000000000 --- a/docs/pt-BR/Data-Seeding.md +++ /dev/null @@ -1,3 +0,0 @@ -# Data Seeding - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Data-Transfer-Objects.md b/docs/pt-BR/Data-Transfer-Objects.md deleted file mode 100644 index a29865a13c..0000000000 --- a/docs/pt-BR/Data-Transfer-Objects.md +++ /dev/null @@ -1,3 +0,0 @@ -## Data Transfer Objects - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Distributed-Event-Bus.md b/docs/pt-BR/Distributed-Event-Bus.md deleted file mode 100644 index da8e2ff516..0000000000 --- a/docs/pt-BR/Distributed-Event-Bus.md +++ /dev/null @@ -1,3 +0,0 @@ -# Distributed Event Bus - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Domain-Services.md b/docs/pt-BR/Domain-Services.md deleted file mode 100644 index 2a211453fa..0000000000 --- a/docs/pt-BR/Domain-Services.md +++ /dev/null @@ -1,3 +0,0 @@ -# ABP Documentation - -Façam! \ No newline at end of file diff --git a/docs/pt-BR/Dynamic-Proxying-Interceptors.md b/docs/pt-BR/Dynamic-Proxying-Interceptors.md deleted file mode 100644 index bfc7b0f705..0000000000 --- a/docs/pt-BR/Dynamic-Proxying-Interceptors.md +++ /dev/null @@ -1,3 +0,0 @@ -## Dynamic Proxying / Interceptors - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Emailing.md b/docs/pt-BR/Emailing.md deleted file mode 100644 index ca704cad19..0000000000 --- a/docs/pt-BR/Emailing.md +++ /dev/null @@ -1,3 +0,0 @@ -# Emailing - -Façam! \ No newline at end of file diff --git a/docs/pt-BR/Event-Bus.md b/docs/pt-BR/Event-Bus.md deleted file mode 100644 index d95792bbb7..0000000000 --- a/docs/pt-BR/Event-Bus.md +++ /dev/null @@ -1,3 +0,0 @@ -# Event Bus - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Exception-Handling.md b/docs/pt-BR/Exception-Handling.md deleted file mode 100644 index 288badbdff..0000000000 --- a/docs/pt-BR/Exception-Handling.md +++ /dev/null @@ -1,343 +0,0 @@ -# Tratamento de Exceções - -O ABP fornece uma infraestrutura integrada e oferece um modelo padrão para lidar com exceções. - -* **Lida automaticamente com todas as exceções** e envia uma **mensagem de erro formatada padrão** para o cliente em uma solicitação de API/AJAX. -* Oculta automaticamente os **erros internos de infraestrutura** e retorna uma mensagem de erro padrão. -* Fornece uma maneira fácil e configurável de **localizar** mensagens de exceção. -* Mapeia automaticamente exceções padrão para **códigos de status HTTP** e fornece uma opção configurável para mapear exceções personalizadas. - -## Tratamento Automático de Exceções - -O `AbpExceptionFilter` lida com uma exceção se **qualquer uma das seguintes condições** forem atendidas: - -* A exceção é lançada por uma **ação do controlador** que retorna um **resultado de objeto** (não um resultado de visualização). -* A solicitação é uma solicitação AJAX (o valor do cabeçalho HTTP `X-Requested-With` é `XMLHttpRequest`). -* O cliente aceita explicitamente o tipo de conteúdo `application/json` (por meio do cabeçalho HTTP `accept`). - -Se a exceção for tratada, ela é automaticamente **registrada** e uma **mensagem JSON formatada** é retornada ao cliente. - -### Formato da Mensagem de Erro - -A mensagem de erro é uma instância da classe `RemoteServiceErrorResponse`. O JSON de erro mais simples tem uma propriedade **message** conforme mostrado abaixo: - -````json -{ - "error": { - "message": "Este tópico está bloqueado e não é possível adicionar uma nova mensagem" - } -} -```` - -Existem **campos opcionais** que podem ser preenchidos com base na exceção que ocorreu. - -##### Código de Erro - -O **código de erro** é um valor de string opcional e único para a exceção. A exceção lançada deve implementar a interface `IHasErrorCode` para preencher este campo. Exemplo de valor JSON: - -````json -{ - "error": { - "code": "App:010042", - "message": "Este tópico está bloqueado e não é possível adicionar uma nova mensagem" - } -} -```` - -O código de erro também pode ser usado para localizar a exceção e personalizar o código de status HTTP (consulte as seções relacionadas abaixo). - -##### Detalhes do Erro - -Os **detalhes do erro** são um campo opcional da mensagem de erro JSON. A exceção lançada deve implementar a interface `IHasErrorDetails` para preencher este campo. Exemplo de valor JSON: - -```json -{ - "error": { - "code": "App:010042", - "message": "Este tópico está bloqueado e não é possível adicionar uma nova mensagem", - "details": "Informações mais detalhadas sobre o erro..." - } -} -``` - -##### Erros de Validação - -**validationErrors** é um campo padrão que é preenchido se a exceção lançada implementar a interface `IHasValidationErrors`. - -````json -{ - "error": { - "code": "App:010046", - "message": "Sua solicitação não é válida, corrija e tente novamente!", - "validationErrors": [{ - "message": "O nome de usuário deve ter no mínimo 3 caracteres.", - "members": ["userName"] - }, - { - "message": "A senha é obrigatória", - "members": ["password"] - }] - } -} -```` - -`AbpValidationException` implementa a interface `IHasValidationErrors` e é automaticamente lançada pelo framework quando a entrada de uma solicitação não é válida. Portanto, geralmente você não precisa lidar com erros de validação, a menos que tenha lógica de validação altamente personalizada. - -### Registro - -As exceções capturadas são automaticamente registradas. - -#### Nível de Registro - -As exceções são registradas com o nível `Error` por padrão. O nível de log pode ser determinado pela exceção se ela implementar a interface `IHasLogLevel`. Exemplo: - -````C# -public class MinhaExcecao : Exception, IHasLogLevel -{ - public LogLevel LogLevel { get; set; } = LogLevel.Warning; - - //... -} -```` - -#### Exceções de Registro Próprio - -Alguns tipos de exceção podem precisar escrever logs adicionais. Eles podem implementar a interface `IExceptionWithSelfLogging` se necessário. Exemplo: - -````C# -public class MinhaExcecao : Exception, IExceptionWithSelfLogging -{ - public void Log(ILogger logger) - { - //...log informações adicionais - } -} -```` - -> Os métodos de extensão `ILogger.LogException` são usados para escrever logs de exceção. Você pode usar o mesmo método de extensão quando necessário. - -## Exceções de Negócios - -A maioria de suas próprias exceções será exceções de negócios. A interface `IBusinessException` é usada para marcar uma exceção como uma exceção de negócios. - -`BusinessException` implementa a interface `IBusinessException` além das interfaces `IHasErrorCode`, `IHasErrorDetails` e `IHasLogLevel`. O nível de log padrão é `Warning`. - -Normalmente, você tem um código de erro relacionado a uma exceção de negócios específica. Por exemplo: - -````C# -throw new BusinessException(QaErrorCodes.CanNotVoteYourOwnAnswer); -```` - -`QaErrorCodes.CanNotVoteYourOwnAnswer` é apenas uma `const string`. O seguinte formato de código de erro é recomendado: - -```` -: -```` - -**namespace-do-código** é um **valor único** específico para o seu módulo/aplicação. Exemplo: - -```` -Volo.Qa:010002 -```` - -`Volo.Qa` é o namespace do código aqui. O namespace do código será então usado ao **localizar** mensagens de exceção. - -* Você pode **lançar diretamente** uma `BusinessException` ou **derivar** seus próprios tipos de exceção dela quando necessário. -* Todas as propriedades são opcionais para a classe `BusinessException`. Mas geralmente você define a propriedade `ErrorCode` ou `Message`. - -## Localização de Exceções - -Um problema ao lançar exceções é como localizar mensagens de erro ao enviá-las para o cliente. O ABP oferece dois modelos e suas variantes. - -### Exceção Amigável ao Usuário - -Se uma exceção implementa a interface `IUserFriendlyException`, então o ABP não altera suas propriedades `Message` e `Details` e a envia diretamente para o cliente. - -A classe `UserFriendlyException` é a implementação integrada da interface `IUserFriendlyException`. Exemplo de uso: - -````C# -throw new UserFriendlyException( - "O nome de usuário deve ser único!" -); -```` - -Dessa forma, **não há necessidade de localização**. Se você deseja localizar a mensagem, pode injetar e usar o **localizador de strings padrão** (consulte o [documento de localização](Localization.md)). Exemplo: - -````C# -throw new UserFriendlyException(_stringLocalizer["UserNameShouldBeUniqueMessage"]); -```` - -Em seguida, defina no **recurso de localização** para cada idioma. Exemplo: - -````json -{ - "culture": "pt", - "texts": { - "UserNameShouldBeUniqueMessage": "O nome de usuário deve ser único!" - } -} -```` - -O localizador de strings já suporta **mensagens parametrizadas**. Por exemplo: - -````C# -throw new UserFriendlyException(_stringLocalizer["UserNameShouldBeUniqueMessage", "john"]); -```` - -Em seguida, o texto de localização pode ser: - -````json -"UserNameShouldBeUniqueMessage": "O nome de usuário deve ser único! '{0}' já está em uso!" -```` - -* A interface `IUserFriendlyException` é derivada da `IBusinessException` e a classe `UserFriendlyException` é derivada da classe `BusinessException`. - -### Usando Códigos de Erro - -`UserFriendlyException` é bom, mas tem alguns problemas em usos avançados: - -* Requer que você **injete o localizador de strings** em todos os lugares e sempre o use ao lançar exceções. -* No entanto, em alguns casos, pode **não ser possível** injetar o localizador de strings (em um contexto estático ou em um método de entidade). - -Em vez de localizar a mensagem ao lançar a exceção, você pode separar o processo usando **códigos de erro**. - -Primeiro, defina o mapeamento do **namespace-do-código** para o **recurso de localização** na configuração do módulo: - -````C# -services.Configure(options => -{ - options.MapCodeNamespace("Volo.Qa", typeof(QaResource)); -}); -```` - -Então, qualquer uma das exceções com o namespace `Volo.Qa` será localizada usando seu recurso de localização fornecido. O recurso de localização deve sempre ter uma entrada com a chave do código de erro. Exemplo: - -````json -{ - "culture": "pt", - "texts": { - "Volo.Qa:010002": "Você não pode votar em sua própria resposta!" - } -} -```` - -Então uma exceção de negócios pode ser lançada com o código de erro: - -````C# -throw new BusinessException(QaDomainErrorCodes.CanNotVoteYourOwnAnswer); -```` - -* Lançar qualquer exceção que implemente a interface `IHasErrorCode` se comporta da mesma maneira. Portanto, a abordagem de localização de código de erro não é exclusiva para a classe `BusinessException`. -* Não é necessário definir uma string localizada para uma mensagem de erro. Se não estiver definido, o ABP envia a mensagem de erro padrão para o cliente. Ele não usa a propriedade `Message` da exceção! se você deseja isso, use a `UserFriendlyException` (ou use um tipo de exceção que implemente a interface `IUserFriendlyException`). - -#### Usando Parâmetros de Mensagem - -Se você tiver uma mensagem de erro parametrizada, poderá defini-la com a propriedade `Data` da exceção. Por exemplo: - -````C# -throw new BusinessException("App:010046") -{ - Data = - { - {"UserName", "john"} - } -}; - -```` - -Felizmente, há uma maneira mais simples de codificar isso: - -````C# -throw new BusinessException("App:010046") - .WithData("UserName", "john"); -```` - -Em seguida, o texto localizado pode conter o parâmetro `UserName`: - -````json -{ - "culture": "pt", - "texts": { - "App:010046": "O nome de usuário deve ser único. '{UserName}' já está em uso!" - } -} -```` - -* `WithData` pode ser encadeado com mais de um parâmetro (como `.WithData(...).WithData(...)`). - -## Mapeamento de Códigos de Status HTTP - -O ABP tenta determinar automaticamente o código de status HTTP mais adequado para tipos comuns de exceção seguindo estas regras: - -* Para a `AbpAuthorizationException`: - * Retorna `401` (não autorizado) se o usuário não estiver logado. - * Retorna `403` (proibido) se o usuário estiver logado. -* Retorna `400` (requisição inválida) para a `AbpValidationException`. -* Retorna `404` (não encontrado) para a `EntityNotFoundException`. -* Retorna `403` (proibido) para a `IBusinessException` (e `IUserFriendlyException` já que estende a `IBusinessException`). -* Retorna `501` (não implementado) para a `NotImplementedException`. -* Retorna `500` (erro interno do servidor) para outras exceções (que são assumidas como exceções de infraestrutura). - -O `IHttpExceptionStatusCodeFinder` é usado para determinar automaticamente o código de status HTTP. A implementação padrão é a classe `DefaultHttpExceptionStatusCodeFinder`. Pode ser substituída ou estendida conforme necessário. - -### Mapeamentos Personalizados - -A determinação automática do código de status HTTP pode ser substituída por mapeamentos personalizados. Por exemplo: - -````C# -services.Configure(options => -{ - options.Map("Volo.Qa:010002", HttpStatusCode.Conflict); -}); -```` - -## Inscrevendo-se nas Exceções - -É possível ser informado quando o Framework ABP **manipula uma exceção**. Ele registra automaticamente todas as exceções no [logger padrão](Logging.md), mas você pode querer fazer mais. - -Nesse caso, crie uma classe derivada da classe `ExceptionSubscriber` em sua aplicação: - -````csharp -public class MeuAssinanteDeExcecao : ExceptionSubscriber -{ - public async override Task HandleAsync(ExceptionNotificationContext context) - { - //TODO... - } -} -```` - -O objeto `context` contém informações necessárias sobre a exceção ocorrida. - -> Você pode ter vários assinantes, cada um recebe uma cópia da exceção. As exceções lançadas pelo seu assinante são ignoradas (mas ainda registradas). - -## Exceções Integradas - -Alguns tipos de exceção são automaticamente lançados pelo framework: - -- `AbpAuthorizationException` é lançada se o usuário atual não tiver permissão para realizar a operação solicitada. Consulte [autorização](Authorization.md) para mais informações. -- `AbpValidationException` é lançada se a entrada da solicitação atual não for válida. Consulte [validação](Validation.md) para mais informações. -- `EntityNotFoundException` é lançada se a entidade solicitada não estiver disponível. Isso é lançado principalmente por [repositórios](Repositories.md). - -Você também pode lançar esses tipos de exceção em seu código (embora raramente seja necessário). - -## AbpExceptionHandlingOptions - -`AbpExceptionHandlingOptions` é o principal [objeto de opções](Options.md) para configurar o sistema de tratamento de exceções. Você pode configurá-lo no método `ConfigureServices` do seu [módulo](Module-Development-Basics.md): - -````csharp -Configure(options => -{ - options.SendExceptionsDetailsToClients = true; - options.SendStackTraceToClients = false; -}); -```` - -Aqui está uma lista das opções que você pode configurar: - -* `SendExceptionsDetailsToClients` (padrão: `false`): Você pode habilitar ou desabilitar o envio de detalhes da exceção para o cliente. -* `SendStackTraceToClients` (padrão: `true`): Você pode habilitar ou desabilitar o envio da pilha de chamadas da exceção para o cliente. Se você deseja enviar a pilha de chamadas para o cliente, deve definir tanto as opções `SendStackTraceToClients` quanto `SendExceptionsDetailsToClients` como `true`, caso contrário, a pilha de chamadas não será enviada para o cliente. - -## Veja Também - -* [Tutorial em vídeo](https://abp.io/video-courses/essentials/exception-handling) diff --git a/docs/pt-BR/Extension-Methods-And-Helpers.md b/docs/pt-BR/Extension-Methods-And-Helpers.md deleted file mode 100644 index fb4d33c7e7..0000000000 --- a/docs/pt-BR/Extension-Methods-And-Helpers.md +++ /dev/null @@ -1,3 +0,0 @@ -# Extension Methods & Helpers - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Getting-Started-Angular-Template.md b/docs/pt-BR/Getting-Started-Angular-Template.md deleted file mode 100644 index f1b3abe790..0000000000 --- a/docs/pt-BR/Getting-Started-Angular-Template.md +++ /dev/null @@ -1,126 +0,0 @@ -## Introdução ao modelo de aplicativo Angular - -Este tutorial explica como criar um novo aplicativo Angular usando o modelo de inicialização, configurar e executá-lo. - -### Criando um novo projeto - -Este tutorial usa o **ABP CLI** para criar um novo projeto. Consulte a página [Introdução](https://abp.io/get-started) para outras opções. - -Instale a CLI ABP usando uma janela de linha de comando, se você não tiver instalado antes: - -```bash -dotnet tool install -g Volo.Abp.Cli -``` - -Use o `abp new`comando em uma pasta vazia para criar seu projeto: - -```bash -abp new Acme.BookStore -u angular -``` - -> Você pode usar diferentes níveis de namespaces; por exemplo, BookStore, Acme.BookStore ou Acme.Retail.BookStore. - -`-u angular`A opção especifica que a estrutura da interface do usuário seja Angular. O provedor de banco de dados padrão é o EF Core. Consulte a [documentação](CLI.md) da [CLI](CLI.md) para todas as opções disponíveis. - -#### Pré requisitos - -A solução criada requer; - -* [Visual Studio 2019 (v16.4+)](https://visualstudio.microsoft.com/vs/) -* [.NET Core 3.0+](https://www.microsoft.com/net/download/dotnet-core/) -* [Node v12+](https://nodejs.org) -* [Yarn v1.19+](https://classic.yarnpkg.com/) - -### A Estrutura da Solução - -Abra a solução no **Visual Studio** : - -![livraria-visual-studio-solução](images/bookstore-visual-studio-solution-for-spa.png) - -A solução possui uma estrutura em camadas (baseada no [Domain Driven Design](Domain-Driven-Design.md) ) e contém projetos de teste de unidade e integração adequadamente configurados para trabalhar com o **banco de dados** **EF Core** & **SQLite in-memory**. - -> Consulte o [documento do modelo do aplicativo](Startup-Templates/Application.md) para entender a estrutura da solução em detalhes. - -### String de Conexão de Banco de Dados - -Verifique o **connection string** no `appsettings.json`arquivo no `.HttpApi.Host`projeto: - -```json -{ - "ConnectionStrings": { - "Default": "Server=localhost;Database=BookStore;Trusted_Connection=True" - } -} -``` - -A solução está configurada para usar o **Entity Framework Core** com o **MS SQL Server** . O EF Core suporta [vários](https://docs.microsoft.com/en-us/ef/core/providers/) provedores de banco de dados, para que você possa usar outro DBMS, se desejar. Mude a cadeia de conexão, se necessário. - -### Criar banco de dados e aplicar migrações de banco de dados - -Você tem duas opções para criar o banco de dados. - -#### Usando o aplicativo DbMigrator - -A solução contém um aplicativo de console (nomeado `Acme.BookStore.DbMigrator`nesta amostra) que pode criar banco de dados, aplicar migrações e propagar dados iniciais. É útil no desenvolvimento e no ambiente de produção. - -> `.DbMigrator`projeto tem o seu próprio `appsettings.json`. Portanto, se você alterou a cadeia de conexão acima, também deve alterar esta. - -Clique com o botão direito do mouse no `.DbMigrator`projeto e selecione **Definir como Projeto de Inicialização** : - -![definir como projeto de inicialização](images/set-as-startup-project.png) - -Pressione F5 (ou Ctrl + F5) para executar o aplicativo. Terá uma saída como mostrado abaixo: - -![definir como projeto de inicialização](images/db-migrator-app.png) - -#### Usando o comando EF Core Update-Database - -O Ef Core possui um `Update-Database`comando que cria banco de dados, se necessário, e aplica migrações pendentes. Clique com o botão direito do mouse no `.Web`projeto e selecione **Definir como Projeto de Inicialização** : - -![definir como projeto de inicialização](images/set-as-startup-project.png) - -Abra o **Console do Gerenciador de Pacotes** , selecione o `.EntityFrameworkCore.DbMigrations`projeto como **Projeto Padrão** e execute o `Update-Database`comando: - -![pcm-update-database](images/pcm-update-database-v2.png) - -Isso criará um novo banco de dados com base na cadeia de conexão configurada. - -> O uso da `.Migrator`ferramenta é a maneira sugerida, porque também semeia os dados iniciais para poder executar corretamente o aplicativo Web. - -### Executando o aplicativo - -#### Execute o host da API (lado do servidor) - -Verifique se o `.HttpApi.Host`projeto é o projeto de inicialização e o aplicativo que abrirá uma interface do usuário do Swagger: - -![livraria-homepage](images/bookstore-swagger-ui-host.png) - -Você pode ver as APIs do aplicativo e testá-las aqui. Obtenha [mais informações](https://swagger.io/tools/swagger-ui/) sobre a interface do usuário do Swagger. - -##### Autorização para a interface do usuário do Swagger - -A maioria das APIs de aplicativos requer autenticação e autorização. Se você deseja testar APIs autorizadas, vá manualmente para a `/Account/Login`página, digite `admin`como o nome de usuário e `1q2w3E*`a senha para efetuar login no aplicativo. Você também poderá executar APIs autorizadas. - -#### Execute o aplicativo angular (lado do cliente) - -Vá para a `angular`pasta, abra um terminal de linha de comando, digite o `yarn`comando (sugerimos ao gerenciador de pacotes do [yarn](https://classic.yarnpkg.com/) enquanto o npm install também funcionará na maioria dos casos): - -```bash -yarn -``` - -Depois que todos os módulos do nó estiverem carregados, execute `yarn start`ou `npm start`comando: - -```bash -yarn start -``` - -Abra seu navegador favorito e vá para `localhost:4200`URL. Nome de usuário inicial é `admin`e senha é `1q2w3E*`. - -O modelo de inicialização inclui os módulos de **gerenciamento de** **identidade** e **gerenciamento de inquilino** . Após o login, o menu Administração estará disponível, onde você poderá gerenciar **inquilinos** , **funções** , **usuários** e suas **permissões** . - -> Recomendamos o [Visual Studio Code](https://code.visualstudio.com/) como editor do projeto Angular, mas você pode usar seu editor favorito. - -### Qual é o próximo? - -- [Tutorial de desenvolvimento de aplicativos](Tutorials/Angular/Part-I.md) \ No newline at end of file diff --git a/docs/pt-BR/Getting-Started-AspNetCore-Application.md b/docs/pt-BR/Getting-Started-AspNetCore-Application.md deleted file mode 100644 index 4c5fb40ce1..0000000000 --- a/docs/pt-BR/Getting-Started-AspNetCore-Application.md +++ /dev/null @@ -1,183 +0,0 @@ -# Introdução ao ABP com o AspNet Core MVC Web Application - -Este tutorial explica como iniciar o ABP do zero com dependências mínimas. Você geralmente deseja começar com o **modelo de inicialização** . - -## Criar um novo projeto - -1. Crie um novo aplicativo da Web vazio AspNet Core Web Application no Visual Studio: - -![img](images/create-new-aspnet-core-application.png) - -1. Selecionar modelo vazio - -![img](images/select-empty-web-application.png) - -Você pode selecionar outro modelo, mas quero mostrá-lo em um projeto claro. - -## Instale o pacote Volo.Abp.AspNetCore.Mvc - -Volo.Abp.AspNetCore.Mvc é um pacote de integração do AspNet Core MVC para ABP. Então, instale-o no seu projeto: - -``` -Install-Package Volo.Abp.AspNetCore.Mvc -``` - -## Criar o primeiro módulo ABP - -O ABP é uma estrutura modular e requer uma classe de **módulo de inicialização (raiz)** derivada de `AbpModule`: - -```csharp -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; -using Volo.Abp.AspNetCore.Modularity; -using Volo.Abp.AspNetCore.Mvc; -using Volo.Abp.Modularity; - -namespace BasicAspNetCoreApplication -{ - [DependsOn(typeof(AbpAspNetCoreMvcModule))] - public class AppModule : AbpModule - { - public override void OnApplicationInitialization(ApplicationInitializationContext context) - { - var app = context.GetApplicationBuilder(); - var env = context.GetEnvironment(); - - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseMvcWithDefaultRoute(); - } - } -} -``` - -`AppModule` é um bom nome para o módulo de inicialização de um aplicativo. - -Os pacotes ABP definem as classes do módulo e um módulo pode depender de outro módulo. No código acima, nosso `AppModule` depende `AbpAspNetCoreMvcModule`(definido pelo pacote Volo.Abp.AspNetCore.Mvc). É comum adicionar um `DependsOn`atributo após a instalação de um novo pacote de nuget ABP. - -Em vez da classe Startup, estamos configurando o pipeline do ASP.NET Core nesta classe de módulo. - -## A classe de inicialização - -O próximo passo é modificar a classe Startup para integrar ao sistema do módulo ABP: - -```csharp -using System; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; - -namespace BasicAspNetCoreApplication -{ - public class Startup - { - public IServiceProvider ConfigureServices(IServiceCollection services) - { - services.AddApplication(); - - return services.BuildServiceProviderFromFactory(); - } - - public void Configure(IApplicationBuilder app) - { - app.InitializeApplication(); - } - } -} -``` - -`ConfigureServices` Método alterado para retornar em `IServiceProvider` vez de `void`. Essa alteração nos permite substituir a injeção de dependência do AspNet Core por outra estrutura (consulte a seção de integração com Autofac abaixo). `services.AddApplication()` adiciona todos os serviços definidos em todos os módulos a partir do `AppModule`. - -`app.InitializeApplication()`O `Configure`método call in inicializa e inicia o aplicativo. - -## Olá Mundo! - -O aplicativo acima não faz nada. Vamos criar um controlador MVC que faz algo: - -```csharp -using Microsoft.AspNetCore.Mvc; -using Volo.Abp.AspNetCore.Mvc; - -namespace BasicAspNetCoreApplication.Controllers -{ - public class HomeController : AbpController - { - public IActionResult Index() - { - return Content("Hello World!"); - } - } -} -``` - -Se você executar o aplicativo, verá um "Olá, mundo!" mensagem na página. - -Derivado `HomeController`de em `AbpController`vez de `Controller`classe padrão . Isso não é necessário, mas a `AbpController`classe possui propriedades e métodos base úteis para facilitar seu desenvolvimento. - -## Usando Autofac como framework de injeção de dependência - -Embora o sistema de Injeção de Dependência (DI) do AspNet Core seja adequado para requisitos básicos, o Autofac fornece recursos avançados, como Injeção de Propriedade e Interceptação de Método, exigidos pela ABP para executar recursos avançados da estrutura de aplicativos. - -Substituir o sistema DI do AspNet Core pelo Autofac e integrar ao ABP é bastante fácil. - -1. Instale o pacote [Volo.Abp.Autofac](https://www.nuget.org/packages/Volo.Abp.Autofac) - -``` -Install-Package Volo.Abp.Autofac -``` - -1. Adicionar `AbpAutofacModule` dependência - -```csharp -[DependsOn(typeof(AbpAspNetCoreMvcModule))] -[DependsOn(typeof(AbpAutofacModule))] //Add dependency to ABP Autofac module -public class AppModule : AbpModule -{ - ... -} -``` - -1. Altere a `services.AddApplication();` linha na `Startup`classe, como mostrado abaixo: - -```csharp -services.AddApplication(options => -{ - options.UseAutofac(); //Integrate to Autofac -}); -``` - -1. Atualize `Program.cs` para não usar o `WebHost.CreateDefaultBuilder()` método, pois ele usa o contêiner DI padrão: - -```csharp -public class Program -{ - public static void Main(string[] args) - { - /* - https://github.com/aspnet/AspNetCore/issues/4206#issuecomment-445612167 - CurrentDirectoryHelpers exists in: \framework\src\Volo.Abp.AspNetCore.Mvc\Microsoft\AspNetCore\InProcess\CurrentDirectoryHelpers.cs - Will remove CurrentDirectoryHelpers.cs when upgrade to ASP.NET Core 3.0. - */ - CurrentDirectoryHelpers.SetCurrentDirectory(); - - BuildWebHostInternal(args).Run(); - } - - public static IWebHost BuildWebHostInternal(string[] args) => - new WebHostBuilder() - .UseKestrel() - .UseContentRoot(Directory.GetCurrentDirectory()) - .UseIIS() - .UseIISIntegration() - .UseStartup() - .Build(); -} -``` - -## Código fonte - -Obter código-fonte do projeto de exemplo criada neste tutorial a partir de [aqui](https://github.com/abpframework/abp/tree/master/samples/BasicAspNetCoreApplication) . \ No newline at end of file diff --git a/docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md b/docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md deleted file mode 100644 index 808c0bd94d..0000000000 --- a/docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md +++ /dev/null @@ -1,104 +0,0 @@ -## Introdução ao modelo ASP.NET Core MVC - -Este tutorial explica como criar um novo aplicativo Web ASP.NET Core MVC usando o modelo de inicialização, configurá-lo e executá-lo. - -### Criando um novo projeto - -Este tutorial usa o **ABP CLI** para criar um novo projeto. Consulte a página [Introdução](https://abp.io/get-started) para outras opções. - -Instale a CLI ABP usando uma janela de linha de comando, se você não tiver instalado antes: - -```bash -dotnet tool install -g Volo.Abp.Cli -``` - -Use o `abp new`comando em uma pasta vazia para criar seu projeto: - -```bash -abp new Acme.BookStore -``` - -> Você pode usar diferentes níveis de namespaces; por exemplo, BookStore, Acme.BookStore ou Acme.Retail.BookStore. - -`new` O comando cria um **aplicativo MVC em camadas** com o **Entity Framework Core** como o provedor de banco de dados. No entanto, possui opções adicionais. Consulte a [documentação](CLI.md) da [CLI](CLI.md) para todas as opções disponíveis. - -#### Pré requisitos - -A solução criada requer; - -* [Visual Studio 2019 (v16.4+)](https://visualstudio.microsoft.com/vs/) -* [.NET Core 3.0+](https://www.microsoft.com/net/download/dotnet-core/) -* [Node v12+](https://nodejs.org) -* [Yarn v1.19+](https://classic.yarnpkg.com/) - -### A Estrutura da Solução - -Abra a solução no **Visual Studio** : - -![livraria-visual-studio-solução](images/bookstore-visual-studio-solution-v3.png) - -A solução possui uma estrutura em camadas (baseada no [Domain Driven Design](Domain-Driven-Design.md) ) e contém projetos de teste de unidade e integração adequadamente configurados para trabalhar com o **banco de** dados de **memória** **EF Core** e **SQLite** . - -> Consulte o [documento do modelo de aplicativo](Startup-Templates/Application.md) para entender a estrutura da solução em detalhes. - -### Cadeia de Conexão de Banco de Dados - -Verifique a **connection string** no `appsettings.json`arquivo no `.Web`projeto: - -```json -{ - "ConnectionStrings": { - "Default": "Server=localhost;Database=BookStore;Trusted_Connection=True" - } -} -``` - -A solução está configurada para usar o **Entity Framework Core** com o **MS SQL Server** . O EF Core suporta [vários](https://docs.microsoft.com/en-us/ef/core/providers/) provedores de banco de dados, para que você possa usar outro DBMS, se desejar. Mude a cadeia de conexão, se necessário. - -### Criar banco de dados e aplicar migrações de banco de dados - -Você tem duas opções para criar o banco de dados. - -#### Usando o aplicativo DbMigrator - -A solução contém um aplicativo de console (nomeado `Acme.BookStore.DbMigrator`nesta amostra) que pode criar banco de dados, aplicar migrações e propagar dados iniciais. É útil no desenvolvimento e no ambiente de produção. - -> `.DbMigrator`projeto tem o seu próprio `appsettings.json`. Portanto, se você alterou a cadeia de conexão acima, também deve alterar esta. - -Clique com o botão direito do mouse no `.DbMigrator`projeto e selecione **Definir como Projeto de Inicialização** : - -![definir como projeto de inicialização](images/set-as-startup-project.png) - -Pressione F5 (ou Ctrl + F5) para executar o aplicativo. Terá uma saída como mostrado abaixo: - -![definir como projeto de inicialização](images/db-migrator-app.png) - -#### Usando o comando EF Core Update-Database - -O Ef Core possui um `Update-Database`comando que cria banco de dados, se necessário, e aplica migrações pendentes. Clique com o botão direito do mouse no `.Web`projeto e selecione **Definir como Projeto de Inicialização** : - -![definir como projeto de inicialização](images/set-as-startup-project.png) - -Abra o **Console do Gerenciador de Pacotes** , selecione o `.EntityFrameworkCore.DbMigrations`projeto como **Projeto Padrão** e execute o `Update-Database`comando: - -![pcm-update-database](images/pcm-update-database-v2.png) - -Isso criará um novo banco de dados com base na cadeia de conexão configurada. - -> O uso da `.Migrator`ferramenta é a maneira sugerida, porque também semeia os dados iniciais para poder executar corretamente o aplicativo Web. - -### Executando o aplicativo - -Verifique se o `.Web`projeto é o projeto de inicialização. Execute o aplicativo que abrirá a página **inicial** no seu navegador: - -![livraria-homepage](images/bookstore-homepage.png) - -Clique no botão **Login** , insira `admin` como nome de usuário e `1q2w3E*` senha para acessar o aplicativo. - -O modelo de inicialização inclui os módulos de **gerenciamento de** **identidade** e **gerenciamento de inquilino** . Após o login, o menu Administração estará disponível, onde você poderá gerenciar **inquilinos** , **funções** , **usuários** e suas **permissões** . A página de gerenciamento de usuários é mostrada abaixo: - -![livraria-gerenciamento de usuários](images/bookstore-user-management-v2.png) - -### Qual é o próximo? - -- [Tutorial de desenvolvimento de aplicativos](Tutorials/AspNetCore-Mvc/Part-I.md) \ No newline at end of file diff --git a/docs/pt-BR/Getting-Started-Console-Application.md b/docs/pt-BR/Getting-Started-Console-Application.md deleted file mode 100644 index f5a0d5d5d0..0000000000 --- a/docs/pt-BR/Getting-Started-Console-Application.md +++ /dev/null @@ -1,181 +0,0 @@ -# Introdução ao ABP com aplicativo de console - -Este tutorial explica como iniciar o ABP do zero com dependências mínimas. Você geralmente deseja começar com um **modelo de inicialização** . - -## Criar um novo projeto - -Crie um novo aplicativo regular .Net Core Console do Visual Studio: - -![img](images/create-new-net-core-console-application.png) - -## Instale o pacote Volo.Abp - -Volo.Abp.Core é o pacote principal de nuget para criar aplicativos baseados em ABP. Então, instale-o no seu projeto: - -``` -Install-Package Volo.Abp.Core -``` - -## Criar o primeiro módulo ABP - -O ABP é um framework modular e requer uma classe de **módulo de inicialização (raiz)** derivada de `AbpModule`: - -```csharp -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Modularity; - -namespace AbpConsoleDemo -{ - public class AppModule : AbpModule - { - - } -} -``` - -`AppModule` é um bom nome para o módulo de inicialização de um aplicativo. - -## Inicializar o aplicativo - -A próxima etapa é inicializar o aplicativo usando o módulo de inicialização criado acima: - -```csharp -using System; -using Volo.Abp; - -namespace AbpConsoleDemo -{ - class Program - { - static void Main(string[] args) - { - using (var application = AbpApplicationFactory.Create()) - { - application.Initialize(); - - Console.WriteLine("Press ENTER to stop application..."); - Console.ReadLine(); - } - } - } -} -``` - -`AbpApplicationFactory`é usado para criar o aplicativo e carregar todos os módulos que tomam `AppModule`como módulo de inicialização. `Initialize()`O método inicia o aplicativo. - -## Olá Mundo! - -O aplicativo acima não faz nada. Vamos criar um serviço que faça algo: - -```csharp -using System; -using Volo.Abp.DependencyInjection; - -namespace AbpConsoleDemo -{ - public class HelloWorldService : ITransientDependency - { - public void SayHello() - { - Console.WriteLine("Hello World!"); - } - } -} -``` - -`ITransientDependency`é uma interface especial do ABP que registra automaticamente o serviço como transitório (consulte o [documento de injeção de dependência](Dependency-Injection.md) ). - -Agora, podemos resolver o problema `HelloWorldService`e dizer olá. Altere o Program.cs como mostrado abaixo: - -```csharp -using System; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; - -namespace AbpConsoleDemo -{ - class Program - { - static void Main(string[] args) - { - using (var application = AbpApplicationFactory.Create()) - { - application.Initialize(); - - //Resolve a service and use it - var helloWorldService = - application.ServiceProvider.GetService(); - helloWorldService.SayHello(); - - Console.WriteLine("Press ENTER to stop application..."); - Console.ReadLine(); - } - } - } -} -``` - -Embora seja suficiente para este exemplo de código simples, é sempre recomendável criar escopos no caso de resolver diretamente dependências de `IServiceProvider`(consulte a [documentação de Injeção de Dependências](Dependency-Injection.md)). - -## Usando Autofac como framework de injeção de dependência - -Embora o sistema de Injeção de Dependência (DI) do AspNet Core seja adequado para requisitos básicos, o Autofac fornece recursos avançados, como Injeção de Propriedade e Interceptação de Método, exigidos pela ABP para executar recursos avançados do framework de aplicativos. - -Substituir o sistema DI do AspNet Core pelo Autofac e integrar ao ABP é bastante fácil. - -1. Instale o pacote [Volo.Abp.Autofac](https://www.nuget.org/packages/Volo.Abp.Autofac) - -``` -Install-Package Volo.Abp.Autofac -``` - -1. Adicionar `AbpAutofacModule`dependência - -```csharp -[DependsOn(typeof(AbpAutofacModule))] //Add dependency to the AbpAutofacModule -public class AppModule : AbpModule -{ - -} -``` - -1. Mude o `Program.cs`arquivo como mostrado abaixo: - -```csharp -using System; -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp; - -namespace AbpConsoleDemo -{ - class Program - { - static void Main(string[] args) - { - using (var application = AbpApplicationFactory.Create(options => - { - options.UseAutofac(); //Autofac integration - })) - { - application.Initialize(); - - //Resolve a service and use it - var helloWorldService = - application.ServiceProvider.GetService(); - helloWorldService.SayHello(); - - Console.WriteLine("Press ENTER to stop application..."); - Console.ReadLine(); - } - } - } -} -``` - -Apenas chamado `options.UseAutofac()`método nas `AbpApplicationFactory.Create`opções. - -## Código fonte - -Obter código-fonte do projeto de exemplo criada neste tutorial a partir de [aqui](https://github.com/abpframework/abp/tree/master/samples/BasicConsoleApplication) . - - diff --git a/docs/pt-BR/Guid-Generation.md b/docs/pt-BR/Guid-Generation.md deleted file mode 100644 index 68c582348c..0000000000 --- a/docs/pt-BR/Guid-Generation.md +++ /dev/null @@ -1,3 +0,0 @@ -## Guid Generation - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Index.md b/docs/pt-BR/Index.md deleted file mode 100644 index 535db6478a..0000000000 --- a/docs/pt-BR/Index.md +++ /dev/null @@ -1,31 +0,0 @@ -# Documentação ABP - -O ABP é um **framework de aplicativos de código aberto** focada no desenvolvimento de aplicativos da Web baseado no ASP.NET Core, mas também suporta o desenvolvimento de outros tipos de aplicativos. - -Explore o menu de navegação esquerdo para mergulhar fundo na documentação. - -## Status do projeto - -ABP é a **próxima geração** de framework de código aberto [ASP.NET Boilerplate](https://aspnetboilerplate.com/). Atualmente, está em fase de pré-visualização e não está pronto para uso na produção. A documentação ainda está em andamento e está longe de estar completa. - -Para aplicativos de curto prazo e em nível de produção, é sugerido o uso da estrutura do [ASP.NET Boilerplate](https://aspnetboilerplate.com/) , que possui um rico conjunto de recursos, maduro, mantido ativamente e atualizado. - -## Começando - -A maneira mais fácil de iniciar um novo projeto com o ABP é usar os modelos de inicialização: - -- [Modelo de interface do usuário do ASP.NET Core MVC (Razor Pages)](Getting-Started-AspNetCore-MVC-Template.md) -- [Modelo de interface do usuário angular](Getting-Started-Angular-Template.md) - -Se você deseja começar do zero (com um projeto vazio), instale manualmente o ABP Framework e use os seguintes tutoriais: - -- [Aplicação de console](Getting-Started-Console-Application.md) -- [Aplicativo da Web principal do ASP.NET](Getting-Started-AspNetCore-Application.md) - -## Código fonte - -ABP está hospedado no GitHub. Veja [o código fonte](https://github.com/abpframework/abp) . - -## Deseja contribuir? - -O ABP é um projeto de código aberto orientado pela comunidade. Consulte [o guia de contribuição](Contribution/Index.md) se você quiser fazer parte deste projeto. \ No newline at end of file diff --git a/docs/pt-BR/Integration-Tests.md b/docs/pt-BR/Integration-Tests.md deleted file mode 100644 index 9d2f17264c..0000000000 --- a/docs/pt-BR/Integration-Tests.md +++ /dev/null @@ -1,3 +0,0 @@ -# Integration Tests - -Façam! \ No newline at end of file diff --git a/docs/pt-BR/Local-Event-Bus.md b/docs/pt-BR/Local-Event-Bus.md deleted file mode 100644 index ff4d87d210..0000000000 --- a/docs/pt-BR/Local-Event-Bus.md +++ /dev/null @@ -1,3 +0,0 @@ -# Local Event Bus - -Façam \ No newline at end of file diff --git a/docs/pt-BR/Localization.md b/docs/pt-BR/Localization.md deleted file mode 100644 index 35b400b233..0000000000 --- a/docs/pt-BR/Localization.md +++ /dev/null @@ -1,195 +0,0 @@ -# Localização - -O sistema de localização da ABP é perfeitamente integrado ao `Microsoft.Extensions.Localization`pacote e compatível com a [documentação de localização da Microsoft](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) . Ele adiciona alguns recursos e aprimoramentos úteis para facilitar o uso em cenários de aplicativos da vida real. - -## Pacote Volo.Abp.Localization - -> Este pacote já está instalado por padrão com o modelo de inicialização. Portanto, na maioria das vezes, você não precisa instalá-lo manualmente. - -Volo.Abp.Localization é o pacote principal do sistema de localização. Instale-o no seu projeto usando o console do gerenciador de pacotes (PMC): - -``` -Install-Package Volo.Abp.Localization -``` - -Em seguida, você pode adicionar a dependência **AbpLocalizationModule** ao seu módulo: - -```csharp -using Volo.Abp.Modularity; -using Volo.Abp.Localization; - -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpLocalizationModule))] - public class MyModule : AbpModule - { - //... - } -} -``` - -## Criando um recurso de localização - -Um recurso de localização é usado para agrupar cadeias de localização relacionadas e separá-las de outras cadeias de localização do aplicativo. Um [módulo](Module-Development-Basics.md) geralmente define seu próprio recurso de localização. O recurso de localização é apenas uma classe simples. Exemplo: - -```csharp -public class TestResource -{ -} -``` - -Em seguida, deve ser adicionado usando `AbpLocalizationOptions`como mostrado abaixo: - -```csharp -[DependsOn(typeof(AbpLocalizationModule))] -public class MyModule : AbpModule -{ - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.FileSets.AddEmbedded(); - }); - - Configure(options => - { - //Define a new localization resource (TestResource) - options.Resources - .Add("en") - .AddVirtualJson("/Localization/Resources/Test"); - }); - } -} -``` - -Neste exemplo; - -- Adicionado um novo recurso de localização com "en" (inglês) como a cultura padrão. -- Arquivos JSON usados para armazenar as sequências de localização. -- Os arquivos JSON são incorporados ao assembly usando `AbpVirtualFileSystemOptions`(consulte [sistema de arquivos virtual](Virtual-File-System.md) ). - -Os arquivos JSON estão localizados na pasta do projeto "/ Localização / Recursos / Teste", como mostrado abaixo: - -![localization-resource-json-files](images/localization-resource-json-files.png) - -Um conteúdo do arquivo de localização JSON é mostrado abaixo: - -```json -{ - "culture": "en", - "texts": { - "HelloWorld": "Hello World!" - } -} -``` - -- Todo arquivo de localização deve definir o `culture`código para o arquivo (como "en" ou "en-US"). -- `texts` A seção contém apenas a coleção de valores-chave das sequências de localização (as chaves também podem ter espaços). - -### Nome Curto do Recurso de Localização - -Os recursos de localização também estão disponíveis no lado do cliente (JavaScript). Portanto, definir um nome abreviado para o recurso de localização facilita o uso de textos de localização. Exemplo: - -```csharp -[LocalizationResourceName("Test")] -public class TestResource -{ -} -``` - -Consulte a seção Obtendo teste localizado / lado do cliente abaixo. - -### Herdar de outros recursos - -Um recurso pode herdar de outros recursos, o que possibilita reutilizar cadeias de localização existentes sem fazer referência ao recurso existente. Exemplo: - -```csharp -[InheritResource(typeof(AbpValidationResource))] -public class TestResource -{ -} -``` - -Herança alternativa configurando o `AbpLocalizationOptions`: - -```csharp -services.Configure(options => -{ - options.Resources - .Add("en") //Define the resource by "en" default culture - .AddVirtualJson("/Localization/Resources/Test") //Add strings from virtual json files - .AddBaseTypes(typeof(AbpValidationResource)); //Inherit from an existing resource -}); -``` - -- Um recurso pode herdar de vários recursos. -- Se o novo recurso definir a mesma sequência localizada, ele substituirá a sequência. - -### Estendendo o Recurso Existente - -Herdar de um recurso cria um novo recurso sem modificar o existente. Em alguns casos, convém não criar um novo recurso, mas estender diretamente um recurso existente. Exemplo: - -```csharp -services.Configure(options => -{ - options.Resources - .Get() - .AddVirtualJson("/Localization/Resources/Test/Extensions"); -}); -``` - -- Se um arquivo de extensão define a mesma sequência localizada, ele substitui a sequência. - -## Obtendo textos localizados - -### Lado do servidor - -Obter o texto localizado no lado do servidor é bastante padrão. - -#### Uso mais simples de uma classe - -```csharp -public class MyService -{ - private readonly IStringLocalizer _localizer; - - public MyService(IStringLocalizer localizer) - { - _localizer = localizer; - } - - public void Foo() - { - var str = _localizer["HelloWorld"]; - } -} -``` - -#### Uso mais simples em uma vista / página do Razor - -```csharp -@inject IHtmlLocalizer Localizer - -

@Localizer["HelloWorld"]

-``` - -Consulte a [documentação de localização da Microsoft](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) para obter detalhes sobre o uso da localização no lado do servidor. - -### Lado do Cliente - -A ABP fornece serviços JavaScript para usar os mesmos textos localizados no lado do cliente. - -Obtenha um recurso de localização: - -```js -var testResource = abp.localization.getResource('Test'); -``` - -Localize uma sequência: - -```js -var str = testResource('HelloWorld'); -``` - - - \ No newline at end of file diff --git a/docs/pt-BR/Modules/Account.md b/docs/pt-BR/Modules/Account.md deleted file mode 100644 index af1f4962db..0000000000 --- a/docs/pt-BR/Modules/Account.md +++ /dev/null @@ -1,80 +0,0 @@ -# Módulo de Conta - -O módulo de conta implementa recursos básicos de autenticação, como **login**, **registro**, **recuperação de senha** e **gerenciamento de conta**. - -Este módulo é baseado na biblioteca de identidade da Microsoft e no módulo de identidade. Ele possui integração com o IdentityServer (com base no módulo IdentityServer) e com o OpenIddict (com base no módulo OpenIddict) para fornecer autenticação avançada, controle de acesso e outros recursos avançados de autenticação. - -## Como instalar - -Este módulo já vem pré-instalado (como pacotes NuGet/NPM). Você pode continuar a usá-lo como pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando `get-source` da CLI) para desenvolver seu próprio módulo personalizado. - -### O código-fonte - -O código-fonte deste módulo pode ser acessado [aqui](https://github.com/abpframework/abp/tree/dev/modules/account). O código-fonte está licenciado sob a licença MIT, portanto, você pode usá-lo e personalizá-lo livremente. - -## Interface do usuário - -Esta seção apresenta as principais páginas fornecidas por este módulo. - -### Login - -A página `/Account/Login` fornece a funcionalidade de login. - -![account-module-login](../images/account-module-login.png) - -Os botões de login social/externo ficam visíveis se você configurá-los. Consulte a seção *Logins Sociais/Externos* abaixo. Os links de registro e recuperação de senha redirecionam para as páginas explicadas nas próximas seções. - -### Registro - -A página `/Account/Register` fornece a funcionalidade de registro de novo usuário. - -![account-module-register](../images/account-module-register.png) - -### Recuperação de senha e redefinição de senha - -A página `/Account/ForgotPassword` fornece uma maneira de enviar um link de redefinição de senha para o endereço de e-mail do usuário. O usuário então clica no link e define uma nova senha. - -![account-module-forgot-password](../images/account-module-forgot-password.png) - -### Gerenciamento de conta - -A página `/Account/Manage` é usada para alterar a senha e as informações pessoais do usuário. - -![account-module-manage-account](../images/account-module-manage-account.png) - -## Integração com o OpenIddict - -O pacote [Volo.Abp.Account.Web.OpenIddict](https://www.nuget.org/packages/Volo.Abp.Account.Web.OpenIddict) fornece integração com o OpenIddict. Este pacote já vem instalado com o modelo de inicialização do aplicativo. Consulte a documentação do módulo OpenIddict. - -## Integração com o IdentityServer - -O pacote [Volo.Abp.Account.Web.IdentityServer](https://www.nuget.org/packages/Volo.Abp.Account.Web.IdentityServer) fornece integração com o IdentityServer. Este pacote já vem instalado com o modelo de inicialização do aplicativo. Consulte a documentação do módulo IdentityServer. - -## Logins Sociais/Externos - -O módulo de conta já está configurado para lidar com logins sociais ou externos prontamente. Você pode seguir a documentação do ASP.NET Core para adicionar um provedor de login social/externo à sua aplicação. - -### Exemplo: Autenticação do Facebook - -Siga o documento de integração do Facebook do ASP.NET Core para oferecer suporte ao login do Facebook em sua aplicação. - -#### Adicionar o pacote NuGet - -Adicione o pacote [Microsoft.AspNetCore.Authentication.Facebook](https://www.nuget.org/packages/Microsoft.AspNetCore.Authentication.Facebook) ao seu projeto. Com base na sua arquitetura, isso pode ser feito no projeto `.Web`, `.IdentityServer` (para configuração em camadas) ou `.Host`. - -#### Configurar o provedor - -Use o método de extensão `.AddFacebook(...)` no método `ConfigureServices` do seu [módulo](../Module-Development-Basics.md) para configurar o cliente: - -````csharp -context.Services.AddAuthentication() - .AddFacebook(facebook => - { - facebook.AppId = "..."; - facebook.AppSecret = "..."; - facebook.Scope.Add("email"); - facebook.Scope.Add("public_profile"); - }); -```` - -> Seria uma prática melhor usar o `appsettings.json` ou o sistema de segredos do usuário do ASP.NET Core para armazenar suas credenciais, em vez de um valor codificado como esse. Siga o documento da Microsoft para aprender a usar os segredos do usuário. \ No newline at end of file diff --git a/docs/pt-BR/Modules/Audit-Logging.md b/docs/pt-BR/Modules/Audit-Logging.md deleted file mode 100644 index 4f7aedf82d..0000000000 --- a/docs/pt-BR/Modules/Audit-Logging.md +++ /dev/null @@ -1,60 +0,0 @@ -# Módulo de Registro de Auditoria - -O Módulo de Registro de Auditoria basicamente implementa o `IAuditingStore` para salvar os objetos de registro de auditoria em um banco de dados. - -> Este documento abrange apenas o módulo de registro de auditoria que persiste os registros de auditoria em um banco de dados. Consulte o documento [registro de auditoria](../Audit-Logging.md) para obter mais informações sobre o sistema de registro de auditoria. - -## Como Instalar - -Este módulo vem pré-instalado (como pacotes NuGet/NPM). Você pode continuar a usá-lo como pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando `get-source` [CLI](../CLI.md)) para desenvolver seu módulo personalizado. - -### O Código Fonte - -O código fonte deste módulo pode ser acessado [aqui](https://github.com/abpframework/abp/tree/dev/modules/audit-logging). O código fonte é licenciado com [MIT](https://choosealicense.com/licenses/mit/), então você pode usá-lo e personalizá-lo livremente. - -## Internos - -### Camada de Domínio - -#### Agregados - -- `AuditLog` (raiz do agregado): Representa um registro de log de auditoria no sistema. - - `EntityChange` (coleção): Entidades alteradas do registro de auditoria. - - `AuditLogAction` (coleção): Ações executadas do registro de auditoria. - -#### Repositórios - -Os seguintes repositórios personalizados são definidos para este módulo: - -- `IAuditLogRepository` - -### Provedores de Banco de Dados - -#### Comum - -##### Prefixo da tabela / coleção e esquema - -Todas as tabelas/coleções usam o prefixo `Abp` por padrão. Defina propriedades estáticas na classe `AbpAuditLoggingDbProperties` se você precisar alterar o prefixo da tabela ou definir um nome de esquema (se suportado pelo seu provedor de banco de dados). - -##### String de conexão - -Este módulo usa `AbpAuditLogging` como nome da string de conexão. Se você não definir uma string de conexão com esse nome, ela será usada a string de conexão `Default`. Consulte a documentação sobre [strings de conexão](https://docs.abp.io/en/abp/latest/Connection-Strings) para obter mais detalhes. - -#### Entity Framework Core - -##### Tabelas - -- **AbpAuditLogs** - - AbpAuditLogActions - - AbpEntityChanges - - AbpEntityPropertyChanges - -#### MongoDB - -##### Coleções - -- **AbpAuditLogs** - -## Veja Também - -* [Sistema de registro de auditoria](../Audit-Logging.md) \ No newline at end of file diff --git a/docs/pt-BR/Modules/Background-Jobs.md b/docs/pt-BR/Modules/Background-Jobs.md deleted file mode 100644 index 137ea84d7e..0000000000 --- a/docs/pt-BR/Modules/Background-Jobs.md +++ /dev/null @@ -1,55 +0,0 @@ -# Módulo de Tarefas em Segundo Plano - -O módulo de Tarefas em Segundo Plano implementa a interface `IBackgroundJobStore` e torna possível usar o gerenciador de tarefas em segundo plano padrão do ABP Framework. Se você não deseja usar este módulo, então você deve implementar a interface `IBackgroundJobStore` por conta própria. - -> Este documento aborda apenas o módulo de tarefas em segundo plano que persiste as tarefas em segundo plano em um banco de dados. Consulte o documento [tarefas em segundo plano](../Background-Jobs.md) para obter mais informações sobre o sistema de tarefas em segundo plano. - -## Como Instalar - -Este módulo vem pré-instalado (como pacotes NuGet/NPM). Você pode continuar a usá-lo como pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando `get-source` [CLI](../CLI.md)) para desenvolver seu próprio módulo personalizado. - -### O Código Fonte - -O código-fonte deste módulo pode ser acessado [aqui](https://github.com/abpframework/abp/tree/dev/modules/background-jobs). O código-fonte é licenciado com [MIT](https://choosealicense.com/licenses/mit/), então você pode usá-lo e personalizá-lo livremente. - -## Internos - -### Camada de Domínio - -#### Agregados - -- `BackgroundJobRecord` (raiz do agregado): Representa um registro de tarefa em segundo plano. - -#### Repositórios - -Os seguintes repositórios personalizados são definidos para este módulo: - -- `IBackgroundJobRepository` - -### Provedores de Banco de Dados - -#### Comum - -##### Prefixo da tabela / coleção e esquema - -Todas as tabelas/coleções usam o prefixo `Abp` por padrão. Defina propriedades estáticas na classe `BackgroundJobsDbProperties` se você precisar alterar o prefixo da tabela ou definir um nome de esquema (se suportado pelo seu provedor de banco de dados). - -##### String de conexão - -Este módulo usa `AbpBackgroundJobs` como nome da string de conexão. Se você não definir uma string de conexão com esse nome, ela será usada a string de conexão `Default`. Consulte a documentação sobre [strings de conexão](https://docs.abp.io/en/abp/latest/Connection-Strings) para obter mais detalhes. - -#### Entity Framework Core - -##### Tabelas - -- **AbpBackgroundJobs** - -#### MongoDB - -##### Coleções - -- **AbpBackgroundJobs** - -## Veja Também - -* [Sistema de tarefas em segundo plano](../Background-Jobs.md) \ No newline at end of file diff --git a/docs/pt-BR/Modules/Cms-Kit/Blogging.md b/docs/pt-BR/Modules/Cms-Kit/Blogging.md deleted file mode 100644 index 075222e1d9..0000000000 --- a/docs/pt-BR/Modules/Cms-Kit/Blogging.md +++ /dev/null @@ -1,135 +0,0 @@ -# Kit CMS: Blogging - -A funcionalidade de blogging fornece a interface necessária para gerenciar e renderizar blogs e postagens de blog. - -## Habilitando a funcionalidade de blogging - -Por padrão, as funcionalidades do Kit CMS estão desabilitadas. Portanto, você precisa habilitar as funcionalidades que deseja antes de começar a usá-lo. Você pode usar o sistema de [Global Feature](../../Global-Features.md) para habilitar/desabilitar as funcionalidades do Kit CMS durante o desenvolvimento. Alternativamente, você pode usar o [Sistema de Funcionalidades](https://docs.abp.io/en/abp/latest/Features) do ABP Framework para desabilitar uma funcionalidade do Kit CMS em tempo de execução. - -> Verifique a seção "Como instalar" da documentação do módulo Kit CMS (Index.md#how-to-install) para saber como habilitar/desabilitar as funcionalidades do Kit CMS durante o desenvolvimento. - -## Interface do usuário - -### Itens do menu - -Os seguintes itens de menu são adicionados pela funcionalidade de blogging à aplicação de administração: - -* **Blogs**: Página de gerenciamento de blogs. -* **Postagens de blog**: Página de gerenciamento de postagens de blog. - -## Páginas - -### Blogs - -A página de blogs é usada para criar e gerenciar blogs no seu sistema. - -![página-de-blogs](../../images/cmskit-module-blogs-page.png) - -Uma captura de tela do modal de criação de novo blog: - -![edição-de-blogs](../../images/cmskit-module-blogs-edit.png) - -**Slug** é a parte da URL do blog. Para este exemplo, a URL raiz do blog se torna `seu-domínio.com/blogs/blog-técnico/`. - -- Você pode alterar o slug padrão usando a constante `CmsBlogsWebConsts.BlogRoutePrefix`. Por exemplo, se você definir como `foo`, a URL raiz do blog se torna `seu-domínio.com/foo/blog-técnico/`. - - ```csharp - public override void PreConfigureServices(ServiceConfigurationContext context) - { - CmsBlogsWebConsts.BlogsRoutePrefix = "foo"; - } - ``` - -#### Funcionalidades do blog - -A funcionalidade de blog usa algumas das outras funcionalidades do Kit CMS. Você pode habilitar ou desabilitar as funcionalidades clicando na ação de funcionalidades para um blog. - -![ação-de-funcionalidades-de-blogs](../../images/cmskit-module-blogs-feature-action.png) - -Você pode selecionar/deselecionar as funcionalidades desejadas para as postagens de blog. - -![diálogo-de-funcionalidades](../../images/cmskit-module-features-dialog-2.png) - -##### Barra de navegação rápida na postagem de blog - -Se você habilitar "Barra de navegação rápida nas postagens de blog", será habilitado o índice de rolagem conforme mostrado abaixo. - -![índice-de-rolagem](../../images/cmskit-module-features-scroll-index.png) - -### Gerenciamento de postagens de blog - -Ao criar blogs, você pode gerenciar as postagens de blog nesta página. - -![página-de-postagens-de-blog](../../images/cmskit-module-blog-posts-page.png) - -Você pode criar e editar uma postagem de blog existente nesta página. Se você habilitar funcionalidades específicas, como tags, poderá definir tags para a postagem de blog nesta página. - -![edição-de-postagem-de-blog](../../images/cmskit-module-blog-post-edit.png) - -## Internos - -### Camada de domínio - -#### Agregados - -Este módulo segue o guia de [Melhores Práticas e Convenções de Entidades](https://docs.abp.io/en/abp/latest/Best-Practices/Entities). - -- `Blog` _(raiz do agregado)_: Apresenta blogs da aplicação. -- `BlogPost` _(raiz do agregado)_: Apresenta postagens de blog nos blogs. -- `BlogFeature` _(raiz do agregado)_: Apresenta o estado de habilitação/desabilitação das funcionalidades do blog, como reações, avaliações, comentários, etc. - -#### Repositórios - -Este módulo segue o guia de [Melhores Práticas e Convenções de Repositórios](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories). Os seguintes repositórios são definidos para esta funcionalidade: - -- `IBlogRepository` -- `IBlogPostRepository` -- `IBlogFeatureRepository` - -#### Serviços de domínio - -Este módulo segue o guia de [Melhores Práticas e Convenções de Serviços de Domínio](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services). - -- `BlogManager` -- `BlogPostManager` -- `BlogFeatureManager` - -### Camada de aplicação - -#### Serviços de aplicação - -##### Comum - -- `BlogFeatureAppService` _(implementa `IBlogFeatureAppService`)_ - -##### Administração - -- `BlogAdminAppService` _(implementa `IBlogAdminAppService`)_ -- `BlogFeatureAdminAppService` _(implementa `IBlogFeatureAdminAppService`)_ -- `BlogPostAdminAppService` _(implementa `IBlogPostAdminAppService`)_ - -##### Público - -- `BlogPostPublicAppService` _(implementa `IBlogPostPublicAppService`)_ - -### Provedores de banco de dados - -#### Entity Framework Core - -##### Tabelas - -- CmsBlogs -- CmsBlogPosts -- CmsBlogFeatures - -#### MongoDB - -##### Coleções - -- CmsBlogs -- CmsBlogPosts -- CmsBlogFeatures - -## Extensões de entidade - -Verifique a seção "Extensões de Entidade" da documentação do módulo Kit CMS (Index.md#entity-extensions) para saber como estender as entidades da funcionalidade de Blogging do módulo Kit CMS. \ No newline at end of file diff --git a/docs/pt-BR/Modules/Cms-Kit/Comments.md b/docs/pt-BR/Modules/Cms-Kit/Comments.md deleted file mode 100644 index b2bd1ad573..0000000000 --- a/docs/pt-BR/Modules/Cms-Kit/Comments.md +++ /dev/null @@ -1,144 +0,0 @@ -# Kit CMS: Comentários - -O Kit CMS fornece um sistema de **comentários** para adicionar a funcionalidade de comentários a qualquer tipo de recurso, como postagens de blog, produtos, etc. - -## Habilitando a funcionalidade de comentários - -Por padrão, as funcionalidades do Kit CMS estão desabilitadas. Portanto, você precisa habilitar as funcionalidades desejadas antes de começar a usá-lo. Você pode usar o sistema de [Funcionalidades Globais](../../Global-Features.md) para habilitar/desabilitar as funcionalidades do Kit CMS durante o desenvolvimento. Alternativamente, você pode usar o [Sistema de Funcionalidades](https://docs.abp.io/pt-BR/abp/latest/Features) do ABP Framework para desabilitar uma funcionalidade do Kit CMS em tempo de execução. - -> Verifique a seção ["Como instalar" da documentação do módulo Kit CMS](Index.md#como-instalar) para saber como habilitar/desabilitar as funcionalidades do Kit CMS durante o desenvolvimento. - -## Opções - -O sistema de comentários fornece um mecanismo para agrupar definições de comentários por tipos de entidade. Por exemplo, se você deseja usar o sistema de comentários para postagens de blog e produtos, você precisa definir dois tipos de entidade chamados `BlogPosts` e `Product` e adicionar comentários sob esses tipos de entidade. - -`CmsKitCommentOptions` pode ser configurado na camada de domínio, no método `ConfigureServices` do seu [módulo](https://docs.abp.io/pt-BR/abp/latest/Module-Development-Basics). Exemplo: - -```csharp -Configure(options => -{ - options.EntityTypes.Add(new CommentEntityTypeDefinition("Product")); - options.IsRecaptchaEnabled = true; //false por padrão - options.AllowedExternalUrls = new Dictionary> - { - { - "Product", - new List - { - "https://abp.io/" - } - } - }; -}); -``` - -> Se você estiver usando a [Funcionalidade de Blog](Blogging.md), o ABP Framework define automaticamente um tipo de entidade para a funcionalidade de blog. Você pode facilmente substituir ou remover os tipos de entidade predefinidos no método `Configure` como mostrado acima. - -Propriedades de `CmsKitCommentOptions`: - -- `EntityTypes`: Lista de tipos de entidade (`CmsKitCommentOptions`) definidos no sistema de comentários. -- `IsRecaptchaEnabled`: Esta flag habilita ou desabilita o reCaptcha para o sistema de comentários. Você pode defini-la como **true** se quiser usar o reCaptcha em seu sistema de comentários. -- `AllowedExternalUrls`: Indica as URLs externas permitidas por tipos de entidade, que podem ser incluídas em um comentário. Se for especificado para um determinado tipo de entidade, apenas as URLs externas especificadas serão permitidas nos comentários. - -Propriedades de `CommentEntityTypeDefinition`: - -- `EntityType`: Nome do tipo de entidade. - -## O Widget de Comentários - -O sistema de comentários fornece um [widget](../../UI/AspNetCore/Widgets.md) de comentários para permitir que os usuários enviem comentários para recursos em sites públicos. Você pode simplesmente colocar o widget em uma página como abaixo. - -```csharp -@await Component.InvokeAsync(typeof(CommentingViewComponent), new -{ - entityType = "Product", - entityId = "...", - isReadOnly = false, - referralLinks = new [] {"nofollow"} -}) -``` - -`entityType` foi explicado na seção anterior. `entityId` deve ser o id único do produto, neste exemplo. Se você tiver uma entidade Produto, você pode usar seu Id aqui. `referralLinks` é um parâmetro opcional. Você pode usar este parâmetro para adicionar valores (como "nofollow", "noreferrer" ou qualquer outro valor) aos atributos [rel](https://developer.mozilla.org/pt-BR/docs/Web/HTML/Attributes/rel) dos links. - -## Interface do Usuário - -### Itens de Menu - -Os seguintes itens de menu são adicionados pela funcionalidade de comentários à aplicação de administração: - -* **Comentários**: Abre a página de gerenciamento de comentários. - -### Páginas - -#### Gerenciamento de Comentários - -Você pode visualizar e gerenciar comentários nesta página. - -![comment-page](../../images/cmskit-module-comment-page.png) - -Você também pode visualizar e gerenciar respostas nesta página. - -![comments-detail](../../images/cmskit-module-comments-detail.png) - -## Internos - -### Camada de Domínio - -#### Agregados - -Este módulo segue o guia de [Melhores Práticas e Convenções de Entidades](https://docs.abp.io/pt-BR/abp/latest/Best-Practices/Entities). - -##### Comentário - -Um comentário representa um comentário escrito por um usuário. - -- `Comment` (raiz do agregado): Representa um comentário escrito no sistema. - -#### Repositórios - -Este módulo segue o guia de [Melhores Práticas e Convenções de Repositórios](https://docs.abp.io/pt-BR/abp/latest/Best-Practices/Repositories). - -Os seguintes repositórios personalizados são definidos para esta funcionalidade: - -- `ICommentRepository` - -#### Serviços de Domínio - -Este módulo segue o guia de [Melhores Práticas e Convenções de Serviços de Domínio](https://docs.abp.io/pt-BR/abp/latest/Best-Practices/Domain-Services). - -##### Gerenciador de Comentários - -`CommentManager` é usado para realizar algumas operações para a raiz do agregado `Comment`. - -### Camada de Aplicação - -#### Serviços de Aplicação - -- `CommentAdminAppService` (implementa `ICommentAdminAppService`): Implementa os casos de uso do sistema de gerenciamento de comentários, como listar ou remover comentários, etc. -- `CommentPublicAppService` (implementa `ICommentPublicAppService`): Implementa os casos de uso do sistema de gerenciamento de comentários em sites públicos, como listar comentários, adicionar comentários, etc. - -### Provedores de Banco de Dados - -#### Comum - -##### Prefixo de tabela / coleção e esquema - -Todas as tabelas/coleções usam o prefixo `Cms` por padrão. Defina propriedades estáticas na classe `CmsKitDbProperties` se você precisar alterar o prefixo da tabela ou definir um nome de esquema (se suportado pelo seu provedor de banco de dados). - -##### String de conexão - -Este módulo usa `CmsKit` como nome da string de conexão. Se você não definir uma string de conexão com esse nome, ela será usada a string de conexão `Default`. - -Consulte a documentação de [strings de conexão](https://docs.abp.io/pt-BR/abp/latest/Connection-Strings) para obter detalhes. - -#### Entity Framework Core - -##### Tabelas - -- CmsComments - -#### MongoDB - -##### Coleções - -- **CmsComments** \ No newline at end of file diff --git a/docs/pt-BR/Modules/Cms-Kit/Dynamic-Widget.md b/docs/pt-BR/Modules/Cms-Kit/Dynamic-Widget.md deleted file mode 100644 index 1bcb87346d..0000000000 --- a/docs/pt-BR/Modules/Cms-Kit/Dynamic-Widget.md +++ /dev/null @@ -1,137 +0,0 @@ -# Widget Dinâmico - -O kit CMS fornece um [widget](https://docs.abp.io/en/abp/latest/UI/AspNetCore/Widgets) dinâmico usado para renderizar os componentes previamente desenvolvidos pelo software no conteúdo das páginas e postagens de blog. Isso significa que você pode usar conteúdo dinâmico em conteúdo estático. Vamos mencionar como você pode fazer isso. Você tem duas opções para definir o widget no sistema: escrevendo e usando a interface do usuário. - -### Adicionando o widget -Primeiramente, mostraremos como usar o sistema de widgets escrevendo manualmente no conteúdo das páginas e postagens de blog. - -Vamos definir o componente de visualização - -```csharp -[Widget] -[ViewComponent(Name = "CmsToday")] -public class TodayViewComponent : AbpViewComponent -{ - public IViewComponentResult Invoke() - { - return View("~/ViewComponents/Today.cshtml", - new TodayViewComponent()); - } -} -``` - -```html -@model Volo.CmsKit.ViewComponents.TodayViewComponent - -

Bem-vindo ao componente de hoje

-

@DateTime.Now.ToString()

- -``` - -Agora é hora de configurar no arquivo YourModule.cs -```csharp -Configure(options => - { - options.AddWidget("Today","CmsToday"); - }); -``` - -Agora você está pronto para adicionar seu widget escrevendo. -[Widget Type="Today"] - -Após concluir as etapas acima, você pode ver a saída à direita da captura de tela abaixo. -![cmskit-without-parameter.png](../../images/cmskit-without-parameter.png) - -### Adicionando usando a interface do usuário -Agora mencionaremos a segunda opção, usando a interface do usuário. -Uma vez que escrever essas definições pode resultar em alguns erros, adicionamos um novo recurso para usar o sistema de widgets facilmente. À direita do editor, você verá o botão `W` personalizado para adicionar um widget dinâmico, como na imagem abaixo. Não se esqueça, por favor, que este é o modo de design e você precisa visualizar sua página no modo de visualização após salvar. Além disso, a guia `Preview` no editor estará pronta para verificar sua saída facilmente para configurações de widget nos recursos seguintes. - -![cms-kit-page-editor](../../images/cms-kit-page-editor.png) - -### Adicionando usando a interface do usuário com parâmetros -Vamos melhorar o exemplo acima adicionando um novo parâmetro chamado formato. Com esse recurso, podemos usar o sistema de widgets com muitos cenários diferentes, mas sem prolongar o documento. Além disso, esses exemplos podem ser expandidos com injeção de dependência e obtenção de valores do banco de dados, mas usaremos um exemplo básico. Vamos adicionar o parâmetro de formato para personalizar a data. - -```csharp -[Widget] -[ViewComponent(Name = "CmsToday")] -public class TodayViewComponent : AbpViewComponent -{ - public string Format { get; set; } - - public IViewComponentResult Invoke(string format) - { - return View("~/ViewComponents/Today.cshtml", - new TodayViewComponent() { Format = format }); - } -} -``` - -```html -@model Volo.CmsKit.ViewComponents.TodayViewComponent - -

Bem-vindo ao componente de hoje

-

@DateTime.Now.ToString(Format)

- -``` - -Vamos definir o componente de formato. -```csharp -[Widget] -[ViewComponent(Name = "Format")] -public class FormatViewComponent : AbpViewComponent -{ - public IViewComponentResult Invoke() - { - return View("~/ViewComponents/Format.cshtml", - new FormatViewModel()); - } -} - -public class FormatViewModel -{ - [DisplayName("Formate sua data no componente")] - public string Format { get; set; } -} -``` -> Nota importante: Para obter as propriedades corretamente, você deve definir a propriedade `name` na página razor ou pode usar o componente ABP. O ABP lida com isso automaticamente. - -```html -@using Volo.CmsKit.ViewComponents -@model FormatViewModel - -
- -
-``` - -```csharp -Configure(options => - { - options.AddWidget("Today", "CmsToday", "Format"); - }); -``` - -![cmskit-module-editor-parameter](../../images/cmskit-module-editor-parameter.png) - -Nesta imagem, após escolher seu widget (em outro caso, ele muda automaticamente de acordo com sua configuração, o meu é `Today`. Seu nome de parâmetro é `parameterWidgetName` e seu valor é `Format`) você verá o próximo widget. Insira valores de entrada ou escolha-os e clique em `Add`. Você verá a saída sublinhada no editor. À direita da imagem, você também pode ver sua saída pré-visualizada. - -Você pode editar essa saída manualmente se fizer algum código errado para isso (valor incorreto ou erro de digitação), você não verá o widget, mesmo assim, sua página será visualizada com sucesso. - -## Opções -Para configurar o widget, você deve definir o código abaixo no arquivo YourModule.cs - -```csharp -Configure(options => - { - options.AddWidget(widgetType: "Today", widgetName: "CmsToday", parameterWidgetName: "Format"); - }); -``` - -Vamos analisar esses parâmetros em detalhes -* `widgetType` é usado para o usuário final e nomes mais legíveis. A palavra em negrito a seguir representa o widgetType. -[Widget Type="**Today**" Format="yyyy-dd-mm HH:mm:ss"]. - -* `widgetName` é usado para o nome do seu widget usado no código para o nome do `ViewComponent`. - -* `parameterWidgetName` é usado no lado do componente do editor para ver no modal `Add Widget`. -Após escolher o tipo de widget na lista suspensa (agora apenas definido `Format`) e renderizar este widget automaticamente. É necessário apenas para ver a interface do usuário uma vez usando parâmetros. \ No newline at end of file diff --git a/docs/pt-BR/Modules/Cms-Kit/Global-Resources.md b/docs/pt-BR/Modules/Cms-Kit/Global-Resources.md deleted file mode 100644 index 299d00e420..0000000000 --- a/docs/pt-BR/Modules/Cms-Kit/Global-Resources.md +++ /dev/null @@ -1,72 +0,0 @@ -# CMS Kit: Recursos Globais - -O sistema de Recursos Globais do CMS Kit permite adicionar estilos e scripts globais dinamicamente. - -## Habilitando o Recurso de Recursos Globais - -Por padrão, os recursos do CMS Kit estão desabilitados. Portanto, você precisa habilitar os recursos que deseja antes de começar a usá-lo. Você pode usar o sistema de [Recursos Globais](../../Global-Features.md) para habilitar/desabilitar os recursos do CMS Kit durante o desenvolvimento. Alternativamente, você pode usar o [Sistema de Recursos](https://docs.abp.io/en/abp/latest/Features) do ABP Framework para desabilitar um recurso do CMS Kit em tempo de execução. - -> Verifique a seção "Como Instalar" da documentação do Módulo CMS Kit para saber como habilitar/desabilitar os recursos do CMS Kit durante o desenvolvimento. - -## A Interface do Usuário - -### Itens do Menu - -O módulo CMS Kit adiciona os seguintes itens ao menu principal, sob o item de menu *Recursos Globais*: - -* **Recursos Globais**: Página de gerenciamento de recursos globais. - -A classe `CmsKitAdminMenus` possui as constantes para os nomes dos itens do menu. - -### Página de Recursos Globais - -A página de Recursos Globais é usada para gerenciar estilos e scripts globais no sistema. - -![cms-kit-global-resources-page](../../images/cmskit-module-global-resources-page.png) - -# Internos - -## Camada de Domínio - -#### Agregados - -Este módulo segue o guia de [Melhores Práticas e Convenções de Entidades](https://docs.abp.io/en/abp/latest/Best-Practices/Entities). - -- `GlobalResource` (raiz do agregado): Armazena um recurso. - -#### Repositórios - -Este módulo segue o guia de [Melhores Práticas e Convenções de Repositórios](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories). - -Os seguintes repositórios personalizados são definidos para este recurso: - -- `IGlobalResourceRepository` - -#### Serviços de Domínio - -Este módulo segue o guia de [Melhores Práticas e Convenções de Serviços de Domínio](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services). - -##### Gerenciador de Recursos Globais - -`GlobalResourceManager` é usado para realizar operações para a raiz do agregado `GlobalResource`. - -### Camada de Aplicação - -#### Serviços de Aplicação - -- `GlobalResourceAdminAppService` (implementa `IGlobalResourceAdminAppService`): Implementa as operações de gerenciamento do sistema de recursos globais. -- `GlobalResourcePublicAppService` (implementa `IGlobalResourcePublicAppService`): Implementa os casos de uso públicos do sistema de recursos globais. - -#### Banco de Dados - -#### Entity Framework Core - -##### Tabelas - -- CmsGlobalResources - -#### MongoDB - -##### Coleções - -- CmsGlobalResources \ No newline at end of file diff --git a/docs/pt-BR/Modules/Cms-Kit/Index.md b/docs/pt-BR/Modules/Cms-Kit/Index.md deleted file mode 100644 index cd6908b317..0000000000 --- a/docs/pt-BR/Modules/Cms-Kit/Index.md +++ /dev/null @@ -1,143 +0,0 @@ -# Módulo CMS Kit - -Este módulo fornece recursos de CMS (Sistema de Gerenciamento de Conteúdo) para sua aplicação. Ele fornece **blocos de construção principais** e **sub-sistemas** totalmente funcionais para criar seu próprio site com recursos de CMS habilitados, ou usar os blocos de construção em seus sites com qualquer finalidade. - -> **Este módulo está atualmente disponível apenas para a interface MVC / Razor Pages**. Embora não haja um pacote oficial do Blazor, ele também pode funcionar em uma interface Blazor Server, pois uma interface Blazor Server é na verdade um aplicativo híbrido que é executado em um aplicativo ASP.NET Core MVC / Razor Pages. - -Os seguintes recursos estão atualmente disponíveis: - -* Fornece um sistema de gerenciamento de [**páginas**](Pages.md) para gerenciar páginas dinâmicas com URLs dinâmicos. -* Fornece um sistema de [**blog**](Blogging.md) para criar e publicar postagens de blog com suporte a vários blogs. -* Fornece um sistema de [**marcação**](Tags.md) para marcar qualquer tipo de recurso, como uma postagem de blog. -* Fornece um sistema de [**comentários**](Comments.md) para adicionar recursos de comentários a qualquer tipo de recurso, como postagem de blog ou uma página de avaliação de produto. -* Fornece um sistema de [**reações**](Reactions.md) para adicionar recursos de reações (emojis) a qualquer tipo de recurso, como uma postagem de blog ou um comentário. -* Fornece um sistema de [**classificação**](Ratings.md) para adicionar recursos de classificação a qualquer tipo de recurso. -* Fornece um sistema de [**menu**](Menus.md) para gerenciar menus públicos dinamicamente. -* Fornece um sistema de [**recursos globais**](Global-Resources.md) para adicionar estilos e scripts globais dinamicamente. -* Fornece um sistema de [**widget dinâmico**](Dynamic-Widget.md) para criar widgets dinâmicos para páginas e postagens de blog. - -> Você pode clicar nos links de recursos acima para entender e aprender como usá-los. - -Todos os recursos podem ser usados individualmente. Se você desabilitar um recurso, ele desaparecerá completamente de sua aplicação, inclusive das tabelas do banco de dados, com a ajuda do sistema [Recursos Globais](../../Global-Features.md). - -## Pré-requisitos - -- Este módulo depende do módulo [BlobStoring](../../Blob-Storing.md) para armazenar conteúdo de mídia. -> Certifique-se de que o módulo `BlobStoring` esteja instalado e que pelo menos um provedor esteja configurado corretamente. Para obter mais informações, consulte a [documentação](../../Blob-Storing.md). - -- O CMS Kit usa o [cache distribuído](../../Caching.md) para responder mais rapidamente. -> É altamente recomendado usar um cache distribuído, como o [Redis](../../Redis-Cache.md), para garantir a consistência dos dados em implantações distribuídas/clusterizadas. - -## Como instalar - -O [ABP CLI](../../CLI.md) permite instalar um módulo em uma solução usando o comando `add-module`. Você pode instalar o módulo CMS Kit em um terminal de linha de comando com o seguinte comando: - -```bash -abp add-module Volo.CmsKit --skip-db-migrations -``` - -> Por padrão, o Cms-Kit está desabilitado pelo `GlobalFeature`. Por causa disso, a migração inicial estará vazia. Portanto, você pode pular a migração adicionando `--skip-db-migrations` ao comando de instalação se estiver usando o Entity Framework Core. Após habilitar o recurso global Cms-Kit, adicione uma nova migração. - -Após o processo de instalação, abra a classe `GlobalFeatureConfigurator` no projeto `Domain.Shared` de sua solução e coloque o seguinte código no método `Configure` para habilitar todos os recursos no módulo CMS Kit. - -```csharp -GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => -{ - cmsKit.EnableAll(); -}); -``` - -Em vez de habilitar todos, você pode preferir habilitar os recursos um por um. O exemplo a seguir habilita apenas os recursos de [marcadores](Tags.md) e [comentários](Comments.md): - -````csharp -GlobalFeatureManager.Instance.Modules.CmsKit(cmsKit => -{ - cmsKit.Tags.Enable(); - cmsKit.Comments.Enable(); -}); -```` - -> Se você estiver usando o Entity Framework Core, não se esqueça de adicionar uma nova migração e atualizar seu banco de dados. - -## Os Pacotes - -Este módulo segue o [guia de melhores práticas para desenvolvimento de módulos](https://docs.abp.io/en/abp/latest/Best-Practices/Index) e consiste em vários pacotes NuGet e NPM. Consulte o guia se você quiser entender os pacotes e as relações entre eles. - -Os pacotes do CMS kit são projetados para vários cenários de uso. Se você verificar os [pacotes do CMS kit](https://www.nuget.org/packages?q=Volo.CmsKit), verá que alguns pacotes têm sufixos `Admin` e `Public`. A razão é que o módulo possui duas camadas de aplicação, considerando que eles podem ser usados em diferentes tipos de aplicativos. Essas camadas de aplicação usam uma única camada de domínio: - - - Os pacotes `Volo.CmsKit.Admin.*` contêm as funcionalidades necessárias para aplicativos de administração (back office). - - Os pacotes `Volo.CmsKit.Public.*` contêm as funcionalidades usadas em sites públicos onde os usuários leem postagens de blog ou deixam comentários. - - Os pacotes `Volo.CmsKit.*` (sem sufixo Admin/Public) são chamados de pacotes unificados. Os pacotes unificados são atalhos para adicionar pacotes Admin e Public (da camada relacionada) separadamente. Se você tiver um único aplicativo para administração e site público, você pode usar esses pacotes. - -## Internos - -### Prefixo de tabela / coleção e esquema - -Todas as tabelas/coleções usam o prefixo `Cms` por padrão. Defina propriedades estáticas na classe `CmsKitDbProperties` se você precisar alterar o prefixo da tabela ou definir um nome de esquema (se suportado pelo provedor de banco de dados). - -### String de conexão - -Este módulo usa `CmsKit` como nome da string de conexão. Se você não definir uma string de conexão com esse nome, ela será substituída pela string de conexão `Default`. - -Consulte a documentação sobre [strings de conexão](https://docs.abp.io/en/abp/latest/Connection-Strings) para obter mais detalhes. - -## Extensões de Entidade - -O sistema de extensão de entidade do módulo (https://docs.abp.io/en/abp/latest/Module-Entity-Extensions) é um sistema de extensão **de alto nível** que permite **definir novas propriedades** para entidades existentes dos módulos dependentes. Ele automaticamente **adiciona propriedades à entidade**, **banco de dados**, **API HTTP** e **interface do usuário** em um único ponto. - -Para estender as entidades do módulo CMS Kit, abra a classe `YourProjectNameModuleExtensionConfigurator` dentro do projeto `DomainShared` e altere o método `ConfigureExtraProperties` conforme mostrado abaixo. - -```csharp -public static void ConfigureExtraProperties() -{ - OneTimeRunner.Run(() => - { - ObjectExtensionManager.Instance.Modules() - .ConfigureCmsKit(cmsKit => - { - cmsKit.ConfigureBlog(plan => // estende a entidade Blog - { - plan.AddOrUpdateProperty( //tipo de propriedade: string - "BlogDescription", //nome da propriedade - property => { - //regras de validação - property.Attributes.Add(new RequiredAttribute()); //adiciona o atributo obrigatório à propriedade definida - - //...outras configurações para esta propriedade - } - ); - }); - - cmsKit.ConfigureBlogPost(blogPost => // estende a entidade BlogPost - { - blogPost.AddOrUpdateProperty( //tipo de propriedade: string - "BlogPostDescription", //nome da propriedade - property => { - //regras de validação - property.Attributes.Add(new RequiredAttribute()); //adiciona o atributo obrigatório à propriedade definida - property.Attributes.Add( - new StringLengthAttribute(MyConsts.MaximumDescriptionLength) { - MinimumLength = MyConsts.MinimumDescriptionLength - } - ); - - //...outras configurações para esta propriedade - } - ); - }); - }); - }); -} -``` - -* O método `ConfigureCmsKit(...)` é usado para configurar as entidades do módulo CMS Kit. - -* `cmsKit.ConfigureBlog(...)` é usado para configurar a entidade **Blog** do módulo CMS Kit. Você pode adicionar ou atualizar suas propriedades extras na entidade **Blog**. - -* `cmsKit.ConfigureBlogPost(...)` é usado para configurar a entidade **BlogPost** do módulo CMS Kit. Você pode adicionar ou atualizar suas propriedades extras na entidade **BlogPost**. - -* Você também pode definir algumas regras de validação para a propriedade que você definiu. No exemplo acima, foram adicionados `RequiredAttribute` e `StringLengthAttribute` para a propriedade chamada **"BlogPostDescription"**. - -* Quando você define a nova propriedade, ela será automaticamente adicionada à **Entidade**, **API HTTP** e **UI** para você. - * Depois de definir uma propriedade, ela aparece nos formulários de criação e atualização da entidade relacionada. - * As novas propriedades também aparecem na tabela de dados da página relacionada. \ No newline at end of file diff --git a/docs/pt-BR/Modules/Cms-Kit/Menus.md b/docs/pt-BR/Modules/Cms-Kit/Menus.md deleted file mode 100644 index 297a9ea2ff..0000000000 --- a/docs/pt-BR/Modules/Cms-Kit/Menus.md +++ /dev/null @@ -1,90 +0,0 @@ -# CMS Kit: Menus - -O sistema de menus do CMS Kit permite gerenciar menus públicos de forma dinâmica. - -## Habilitando o recurso de menu - -Por padrão, os recursos do CMS Kit estão desabilitados. Portanto, é necessário habilitar os recursos desejados antes de começar a usá-lo. Você pode usar o sistema de [Recursos Globais](../../Global-Features.md) para habilitar/desabilitar os recursos do CMS Kit durante o desenvolvimento. Alternativamente, você pode usar o [Sistema de Recursos](https://docs.abp.io/en/abp/latest/Features) do ABP Framework para desabilitar um recurso do CMS Kit em tempo de execução. - -> Verifique a seção "Como instalar" da documentação do módulo CMS Kit (Index.md#how-to-install) para saber como habilitar/desabilitar os recursos do CMS Kit durante o desenvolvimento. - -## A interface do usuário - -### Itens de menu - -O módulo CMS Kit adiciona os seguintes itens ao menu principal, sob o item de menu *CMS*: - -* **Menus**: Página de gerenciamento de menus. - -A classe `CmsKitAdminMenus` possui as constantes para os nomes dos itens de menu. - -### Menus - -#### Gerenciamento de menus - -A página de menus é usada para gerenciar menus públicos dinâmicos no sistema. - -![cms-kit-menus-page](../../images/cmskit-module-menus-page.png) - -Os itens de menu criados serão visíveis no lado público do site, como mostrado abaixo: - -![cms-kit-public-menus](../../images//cmskit-module-menus-public.png) - -## Internos - -### Camada de domínio - -#### Agregados - -Este módulo segue o guia de [Melhores Práticas e Convenções de Entidades](https://docs.abp.io/en/abp/latest/Best-Practices/Entities). - -- `MenuItem` (raiz do agregado): Um item de menu representa um único nó na árvore de menus. - -#### Repositórios - -Este módulo segue o guia de [Melhores Práticas e Convenções de Repositórios](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories). - -Os seguintes repositórios personalizados são definidos para este recurso: - -- `IMenuItemRepository` - -#### Serviços de domínio - -Este módulo segue o guia de [Melhores Práticas e Convenções de Serviços de Domínio](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services). - -##### Gerenciador de itens de menu - -`MenuItemManager` é usado para realizar algumas operações para a raiz do agregado `MenuItemManager`. - -### Camada de aplicação - -#### Serviços de aplicação - -- `MenuItemAdminAppService` (implementa `IMenuItemAdminAppService`): Implementa as operações de gerenciamento do sistema de menus. -- `MenuItemPublicAppService` (implementa `IMenuItemPublicAppService`): Implementa os casos de uso públicos do sistema de menus. - -### Provedores de banco de dados - -#### Comum - -##### Prefixo de tabela / coleção e esquema - -Todas as tabelas/coleções usam o prefixo `Cms` por padrão. Defina propriedades estáticas na classe `CmsKitDbProperties` se você precisar alterar o prefixo da tabela ou definir um nome de esquema (se suportado pelo seu provedor de banco de dados). - -##### String de conexão - -Este módulo usa `CmsKit` como nome da string de conexão. Se você não definir uma string de conexão com esse nome, ela será substituída pela string de conexão `Default`. - -Consulte a documentação sobre [strings de conexão](https://docs.abp.io/en/abp/latest/Connection-Strings) para obter mais detalhes. - -#### Entity Framework Core - -##### Tabelas - -- CmsMenuItems - -#### MongoDB - -##### Coleções - -- CmsMenuItems \ No newline at end of file diff --git a/docs/pt-BR/Modules/Cms-Kit/Pages.md b/docs/pt-BR/Modules/Cms-Kit/Pages.md deleted file mode 100644 index 1d99a9a611..0000000000 --- a/docs/pt-BR/Modules/Cms-Kit/Pages.md +++ /dev/null @@ -1,33 +0,0 @@ -# Kit CMS: Páginas - -O sistema de páginas do Kit CMS permite que você crie páginas dinâmicas especificando URLs, que é a funcionalidade fundamental de um CMS. - -## Habilitando a Funcionalidade de Páginas - -Por padrão, as funcionalidades do Kit CMS estão desabilitadas. Portanto, você precisa habilitar as funcionalidades que deseja antes de começar a usá-lo. Você pode usar o sistema de [Funcionalidades Globais](../../Global-Features.md) para habilitar/desabilitar as funcionalidades do Kit CMS durante o desenvolvimento. Alternativamente, você pode usar o [Sistema de Funcionalidades](https://docs.abp.io/en/abp/latest/Features) do ABP Framework para desabilitar uma funcionalidade do Kit CMS em tempo de execução. - -> Verifique a seção "Como Instalar" da documentação do Módulo Kit CMS (Index.md#how-to-install) para saber como habilitar/desabilitar as funcionalidades do Kit CMS durante o desenvolvimento. - -## A Interface do Usuário - -### Itens do Menu - -O módulo Kit CMS adiciona os seguintes itens ao menu principal, sob o item de menu *CMS*: - -* **Páginas**: Página de gerenciamento de páginas. - -A classe `CmsKitAdminMenus` possui as constantes para os nomes dos itens do menu. - -### Páginas - -#### Gerenciamento de Páginas - -A página **Páginas** é usada para gerenciar páginas dinâmicas no sistema. Você pode criar/editar páginas com rotas e conteúdos dinâmicos nesta página: - -![pages-edit](../../images/cmskit-module-pages-edit.png) - -Depois de criar páginas, você pode definir uma delas como página inicial. Então, sempre que alguém navegar para a página inicial do seu aplicativo, eles verão o conteúdo dinâmico da página que você definiu nesta página. - -![pages-page](../../images/cmskit-module-pages-page.png) - -Além disso, quando você cria uma página, você pode acessá-la através da URL `/{slug}`. \ No newline at end of file diff --git a/docs/pt-BR/Modules/Cms-Kit/Ratings.md b/docs/pt-BR/Modules/Cms-Kit/Ratings.md deleted file mode 100644 index 421a4c3051..0000000000 --- a/docs/pt-BR/Modules/Cms-Kit/Ratings.md +++ /dev/null @@ -1,111 +0,0 @@ -# Sistema de Avaliação - -O kit CMS fornece um sistema de **avaliação** para adicionar recursos de avaliação a qualquer tipo de recurso, como postagens de blog, comentários, etc. Aqui está como o componente de avaliação se parece em uma página de exemplo: - -![avaliações](../../images/cmskit-module-ratings.png) - -## Habilitando o Recurso de Avaliação - -Por padrão, os recursos do CMS Kit estão desabilitados. Portanto, você precisa habilitar os recursos que deseja antes de começar a usá-lo. Você pode usar o sistema de [Recurso Global](../../Global-Features.md) para habilitar/desabilitar os recursos do CMS Kit durante o desenvolvimento. Alternativamente, você pode usar o [Sistema de Recursos](https://docs.abp.io/en/abp/latest/Features) do ABP Framework para desabilitar um recurso do CMS Kit em tempo de execução. - -> Verifique a seção ["Como Instalar" da documentação do Módulo CMS Kit](Index.md#how-to-install) para ver como habilitar/desabilitar os recursos do CMS Kit durante o desenvolvimento. - -## Opções - -O sistema de avaliação fornece um mecanismo para agrupar avaliações por tipos de entidade. Por exemplo, se você deseja usar o sistema de avaliação para produtos, você precisa definir um tipo de entidade chamado `Produto` e, em seguida, adicionar avaliações sob o tipo de entidade definido. - -`CmsKitRatingOptions` pode ser configurado na camada de domínio, no método `ConfigureServices` do seu [módulo](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Exemplo: - -```csharp -Configure(options => -{ - options.EntityTypes.Add(new RatingEntityTypeDefinition("Produto")); -}); -``` - -> Se você estiver usando o [Recurso de Blog](Blogging.md), o framework ABP define automaticamente um tipo de entidade para o recurso de blog. Você pode facilmente substituir ou remover os tipos de entidade predefinidos no método `Configure` como mostrado acima. - -Propriedades de `CmsKitRatingOptions`: - -- `EntityTypes`: Lista de tipos de entidade definidos (`RatingEntityTypeDefinition`) no sistema de avaliação. - -Propriedades de `RatingEntityTypeDefinition`: - -- `EntityType`: Nome do tipo de entidade. - -## O Widget de Avaliação - -O sistema de avaliação fornece um widget de avaliação para permitir que os usuários enviem avaliações para recursos em sites públicos. Você pode simplesmente colocar o widget em uma página como abaixo. - -```csharp -@await Component.InvokeAsync(typeof(RatingViewComponent), new -{ - entityType = "Produto", - entityId = "entityId", - isReadOnly = false -}) -``` - -`entityType` foi explicado na seção anterior. `entityId` deve ser o id único do produto, neste exemplo. Se você tiver uma entidade Produto, você pode usar seu Id aqui. - -# Internos - -## Camada de Domínio - -#### Agregados - -Este módulo segue o guia de [Melhores Práticas e Convenções de Entidades](https://docs.abp.io/en/abp/latest/Best-Practices/Entities). - -##### Avaliação - -Uma avaliação representa uma avaliação dada por um usuário. - -- `Avaliação` (raiz do agregado): Representa uma avaliação dada no sistema. - -#### Repositórios - -Este módulo segue o guia de [Melhores Práticas e Convenções de Repositórios](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories). - -Os seguintes repositórios personalizados são definidos para este recurso: - -- `IRatingRepository` - -#### Serviços de Domínio - -Este módulo segue o guia de [Melhores Práticas e Convenções de Serviços de Domínio](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services). - -##### Gerenciador de Reações - -`RatingManager` é usado para realizar algumas operações para a raiz do agregado `Avaliação`. - -### Camada de Aplicação - -#### Serviços de Aplicação - -- `RatingPublicAppService` (implementa `IRatingPublicAppService`): Implementa os casos de uso do sistema de avaliação. - -### Provedores de Banco de Dados - -#### Comum - -##### Prefixo da tabela / coleção e esquema - -Todas as tabelas/coleções usam o prefixo `Cms` por padrão. Defina propriedades estáticas na classe `CmsKitDbProperties` se você precisar alterar o prefixo da tabela ou definir um nome de esquema (se suportado pelo seu provedor de banco de dados). - -##### String de conexão - -Este módulo usa `CmsKit` como nome da string de conexão. Se você não definir uma string de conexão com esse nome, ela será usada a string de conexão `Default`. - -Consulte a documentação de [strings de conexão](https://docs.abp.io/en/abp/latest/Connection-Strings) para obter detalhes. - -#### Entity Framework Core - -##### Tabelas - -- CmsRatings - -#### MongoDB - -##### Coleções - -- **CmsRatings** \ No newline at end of file diff --git a/docs/pt-BR/Modules/Cms-Kit/Reactions.md b/docs/pt-BR/Modules/Cms-Kit/Reactions.md deleted file mode 100644 index 5aeedf6df0..0000000000 --- a/docs/pt-BR/Modules/Cms-Kit/Reactions.md +++ /dev/null @@ -1,126 +0,0 @@ -# Sistema de Reações - -O kit CMS fornece um sistema de **reações** para adicionar recursos de reações a qualquer tipo de recurso, como postagens de blog ou comentários. - -O componente de reação permite que os usuários reajam ao seu conteúdo por meio de ícones/emojis pré-definidos. Aqui está como o componente de reações pode parecer: - -![reactions](../../images/cmskit-module-reactions.png) - -Você também pode personalizar os ícones de reação mostrados no componente de reação. - -## Habilitando o Recurso de Reação - -Por padrão, os recursos do CMS Kit estão desabilitados. Portanto, você precisa habilitar os recursos que deseja antes de começar a usá-lo. Você pode usar o sistema de [Recurso Global](../../Global-Features.md) para habilitar/desabilitar recursos do CMS Kit durante o desenvolvimento. Alternativamente, você pode usar o [Sistema de Recursos](https://docs.abp.io/en/abp/latest/Features) do ABP Framework para desabilitar um recurso do CMS Kit em tempo de execução. - -> Verifique a seção ["Como Instalar" da documentação do Módulo CMS Kit](Index.md#how-to-install) para ver como habilitar/desabilitar recursos do CMS Kit durante o desenvolvimento. - -## Opções - -O sistema de reação fornece um mecanismo para agrupar reações por tipos de entidade. Por exemplo, se você deseja usar o sistema de reação para produtos, você precisa definir um tipo de entidade chamado `Produto` e, em seguida, adicionar reações sob o tipo de entidade definido. - -`CmsKitReactionOptions` pode ser configurado na camada de domínio, no método `ConfigureServices` do seu [módulo](https://docs.abp.io/en/abp/latest/Module-Development-Basics). Exemplo: - -```csharp -Configure(options => -{ - options.EntityTypes.Add( - new ReactionEntityTypeDefinition( - "Produto", - reactions: new[] - { - new ReactionDefinition(StandardReactions.Smile), - new ReactionDefinition(StandardReactions.ThumbsUp), - new ReactionDefinition(StandardReactions.ThumbsDown), - new ReactionDefinition(StandardReactions.Confused), - new ReactionDefinition(StandardReactions.Eyes), - new ReactionDefinition(StandardReactions.Heart) - })); -}); -``` - -> Se você estiver usando os recursos [Comentário](Comments.md) ou [Blogging](Blogging.md), o framework ABP define reações predefinidas para esses recursos automaticamente. - -Propriedades de `CmsKitReactionOptions`: - -- `EntityTypes`: Lista de tipos de entidade definidos (`CmsKitReactionOptions`) no sistema de reação. - -Propriedades de `ReactionEntityTypeDefinition`: - -- `EntityType`: Nome do tipo de entidade. -- `Reactions`: Lista de reações definidas (`ReactionDefinition`) no tipo de entidade. - -## O Widget de Reações - -O sistema de reação fornece um widget de reação para permitir que os usuários enviem reações para recursos. Você pode colocar o widget em uma página da seguinte forma: - -```csharp -@await Component.InvokeAsync(typeof(ReactionSelectionViewComponent), new -{ - entityType = "Produto", - entityId = "..." -}) -``` - -`entityType` foi explicado na seção anterior. `entityId` deve ser o id único do produto, neste exemplo. Se você tiver uma entidade Produto, pode usar seu Id aqui. - -# Internos - -## Camada de Domínio - -#### Agregados - -Este módulo segue o guia de [Melhores Práticas e Convenções de Entidades](https://docs.abp.io/en/abp/latest/Best-Practices/Entities). - -##### UserReaction - -Uma reação do usuário representa uma reação específica de um usuário. - -- `UserReaction` (raiz do agregado): Representa uma reação específica no sistema. - -#### Repositórios - -Este módulo segue o guia de [Melhores Práticas e Convenções de Repositórios](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories). - -Os seguintes repositórios personalizados são definidos para este recurso: - -- `IUserReactionRepository` - -#### Serviços de Domínio - -Este módulo segue o guia de [Melhores Práticas e Convenções de Serviços de Domínio](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services). - -##### Reaction Manager - -`ReactionManager` é usado para realizar algumas operações para a raiz do agregado `UserReaction`. - -### Camada de Aplicação - -#### Serviços de Aplicação - -- `ReactionPublicAppService` (implementa `IReactionPublicAppService`): Implementa os casos de uso do sistema de reação. - -### Provedores de Banco de Dados - -#### Comum - -##### Prefixo da tabela/collection e esquema - -Todas as tabelas/collections usam o prefixo `Cms` por padrão. Defina propriedades estáticas na classe `CmsKitDbProperties` se você precisar alterar o prefixo da tabela ou definir um nome de esquema (se suportado pelo seu provedor de banco de dados). - -##### String de conexão - -Este módulo usa `CmsKit` como nome da string de conexão. Se você não definir uma string de conexão com esse nome, ela será usada a string de conexão `Default`. - -Consulte a documentação de [strings de conexão](https://docs.abp.io/en/abp/latest/Connection-Strings) para obter detalhes. - -#### Entity Framework Core - -##### Tabelas - -- CmsUserReactions - -#### MongoDB - -##### Coleções - -- **CmsUserReactions** \ No newline at end of file diff --git a/docs/pt-BR/Modules/Cms-Kit/Tags.md b/docs/pt-BR/Modules/Cms-Kit/Tags.md deleted file mode 100644 index e4d04cc89a..0000000000 --- a/docs/pt-BR/Modules/Cms-Kit/Tags.md +++ /dev/null @@ -1,165 +0,0 @@ -# Gerenciamento de Tags - -O CMS Kit fornece um sistema de **tag** para marcar qualquer tipo de recurso, como uma postagem de blog. - -## Habilitando o recurso de Gerenciamento de Tags - -Por padrão, os recursos do CMS Kit estão desabilitados. Portanto, você precisa habilitar os recursos que deseja antes de começar a usá-lo. Você pode usar o sistema de [Recursos Globais](../../Global-Features.md) para habilitar/desabilitar os recursos do CMS Kit durante o desenvolvimento. Alternativamente, você pode usar o [Sistema de Recursos](https://docs.abp.io/en/abp/latest/Features) do ABP Framework para desabilitar um recurso do CMS Kit em tempo de execução. - -> Verifique a seção ["Como instalar" da documentação do Módulo CMS Kit](Index.md#how-to-install) para saber como habilitar/desabilitar os recursos do CMS Kit durante o desenvolvimento. - -## Opções - -O sistema de tags fornece um mecanismo para agrupar tags por tipos de entidade. Por exemplo, se você deseja usar o sistema de tags para postagens de blog e produtos, você precisa definir dois tipos de entidade chamados `BlogPosts` e `Product` e adicionar tags sob esses tipos de entidade. - -`CmsKitTagOptions` pode ser configurado na camada de domínio, no método `ConfigureServices` da sua classe [módulo](https://docs.abp.io/en/abp/latest/Module-Development-Basics). - -**Exemplo: Adicionando suporte a tags para produtos** - -```csharp -Configure(options => -{ - options.EntityTypes.Add(new TagEntityTypeDefiniton("Product")); -}); -``` - -> Se você estiver usando o [Recurso de Blogging](Blogging.md), o framework ABP define automaticamente um tipo de entidade para o recurso de blog. - -Propriedades de `CmsKitTagOptions`: - -- `EntityTypes`: Lista de tipos de entidade definidos (`TagEntityTypeDefiniton`) no sistema de tags. - -Propriedades de `TagEntityTypeDefiniton`: - -- `EntityType`: Nome do tipo de entidade. -- `DisplayName`: O nome de exibição do tipo de entidade. Você pode usar um nome de exibição amigável para mostrar a definição do tipo de entidade no site de administração. -- `CreatePolicies`: Lista de nomes de políticas/permissões que permitem aos usuários criar tags sob o tipo de entidade. -- `UpdatePolicies`: Lista de nomes de políticas/permissões que permitem aos usuários atualizar tags sob o tipo de entidade. -- `DeletePolicies`: Lista de nomes de políticas/permissões que permitem aos usuários excluir tags sob o tipo de entidade. - -## O Widget de Tag - -O sistema de tags fornece um widget de tag [widget](../../UI/AspNetCore/Widgets.md) para exibir as tags associadas a um recurso que foi configurado para tags. Você pode simplesmente colocar o widget em uma página como a abaixo: - -```csharp -@await Component.InvokeAsync(typeof(TagViewComponent), new -{ - entityType = "Product", - entityId = "...", - urlFormat = "/products?tagId={TagId}&tagName={TagName}" -}) -``` - -`entityType` foi explicado na seção anterior. Neste exemplo, o `entityId` deve ser o id único do produto. Se você tiver uma entidade `Product`, você pode usar seu Id aqui. `urlFormat` é o formato de string do URL que será gerado para cada tag. Você pode usar os espaços reservados `{TagId}` e `{TagName}` para preencher o URL. Por exemplo, o formato de URL acima preencherá URLs como `/products?tagId=1&tagName=tag1`. - -## O Widget de Tags Populares - -O sistema de tags fornece um widget de tags populares [widget](../../UI/AspNetCore/Widgets.md) para exibir tags populares de um recurso que foi configurado para tags. Você pode simplesmente colocar o widget em uma página como abaixo: - -```csharp -@await Component.InvokeAsync(typeof(PopularTagsViewComponent), new -{ - entityType = "Product", - urlFormat = "/products?tagId={TagId}&tagName={TagName}", - maxCount = 10 -}) -``` - -`entityType` foi explicado na seção anterior. `urlFormat` foi explicado na seção anterior. `maxCount` é o número máximo de tags a serem exibidas. - -## Interface do Usuário - -### Itens de Menu - -Os seguintes itens de menu são adicionados pelo recurso de tags à aplicação de administração: - -* **Tags**: Abre a página de gerenciamento de tags. - -### Páginas - -#### Gerenciamento de Tags - -Esta página pode ser usada para criar, editar e excluir tags para os tipos de entidade. - -![tags-page](../../images/cmskit-module-tags-page.png) - -Você pode criar ou editar uma tag existente nesta página. - -![tag-edit](../../images/cmskit-module-tag-edit.png) - -## Internos - -### Camada de Domínio - -#### Agregados - -Este módulo segue o guia de [Melhores Práticas e Convenções de Entidades](https://docs.abp.io/en/abp/latest/Best-Practices/Entities). - -##### Tag - -Uma tag representa uma tag sob o tipo de entidade. - -- `Tag` (raiz do agregado): Representa uma tag no sistema. - -##### EntityTag - -Uma entidade tag representa uma conexão entre a tag e a entidade marcada. - -- `EntityTag`(entidade): Representa uma conexão entre a tag e a entidade marcada. - -#### Repositórios - -Este módulo segue o guia de [Melhores Práticas e Convenções de Repositórios](https://docs.abp.io/en/abp/latest/Best-Practices/Repositories). - -Os seguintes repositórios personalizados são definidos para este recurso: - -- `ITagRepository` -- `IEntityTagRepository` - -#### Serviços de Domínio - -Este módulo segue o guia de [Melhores Práticas e Convenções de Serviços de Domínio](https://docs.abp.io/en/abp/latest/Best-Practices/Domain-Services). - -##### Gerenciador de Tags - -`TagManager` realiza algumas operações para a raiz do agregado `Tag`. - -##### Gerenciador de Entidade Tag - -`EntityTagManager` realiza algumas operações para a entidade `EntityTag`. - -### Camada de Aplicação - -#### Serviços de Aplicação - -- `TagAdminAppService` (implementa `ITagAdminAppService`). -- `EntityTagAdminAppService` (implementa `IEntityTagAdminAppService`). -- `TagAppService` (implementa `ITagAppService`). - -### Provedores de Banco de Dados - -#### Comum - -##### Prefixo de Tabela / Coleção e esquema - -Todas as tabelas/coleções usam o prefixo `Cms` por padrão. Defina propriedades estáticas na classe `CmsKitDbProperties` se você precisar alterar o prefixo da tabela ou definir um nome de esquema (se suportado pelo seu provedor de banco de dados). - -##### String de conexão - -Este módulo usa `CmsKit` como nome da string de conexão. Se você não definir uma string de conexão com esse nome, ela será usada a string de conexão `Default`. - -Consulte a documentação de [strings de conexão](https://docs.abp.io/en/abp/latest/Connection-Strings) para obter detalhes. - -#### Entity Framework Core - -##### Tabelas - -- CmsTags -- CmsEntityTags - -#### MongoDB - -##### Coleções - -- **CmsTags** -- **CmsEntityTags** \ No newline at end of file diff --git a/docs/pt-BR/Modules/Database-Tables.md b/docs/pt-BR/Modules/Database-Tables.md deleted file mode 100644 index be00f95247..0000000000 --- a/docs/pt-BR/Modules/Database-Tables.md +++ /dev/null @@ -1,577 +0,0 @@ -# Tabelas do Banco de Dados - -Esta documentação descreve todas as tabelas do banco de dados e seus propósitos. Você pode ler esta documentação para obter conhecimento geral das tabelas do banco de dados que vêm de cada módulo. - -## [Módulo de Registro de Auditoria](Audit-Logging.md) - -### AbpAuditLogs - -Esta tabela armazena informações sobre os registros de auditoria no aplicativo. Cada registro representa um log de auditoria e rastreia as ações realizadas no aplicativo. - -### AbpAuditLogActions - -Esta tabela armazena informações sobre as ações realizadas no aplicativo, que são registradas para fins de auditoria. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpAuditLogs](#abpauditlogs) | Id | Vincula cada ação a um log de auditoria específico. | - -### AbpEntityChanges - -Esta tabela armazena informações sobre as alterações de entidade no aplicativo, que são registradas para fins de auditoria. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpAuditLogs](#abpauditlogs) | Id | Vincula cada alteração de entidade a um log de auditoria específico. | - -### AbpEntityPropertyChanges - -Esta tabela armazena informações sobre as alterações de propriedade em entidades no aplicativo, que são registradas para fins de auditoria. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpEntityChanges](#abpentitychanges) | Id | Vincula cada alteração de propriedade a uma alteração de entidade específica. | - -## [Módulo de Tarefas em Segundo Plano](Background-Jobs.md) - -### AbpBackgroundJobs - -Esta tabela armazena informações sobre as tarefas em segundo plano no aplicativo e facilita seu gerenciamento e rastreamento eficientes. Cada entrada na tabela contém detalhes de uma tarefa em segundo plano, incluindo o nome da tarefa, argumentos, contagem de tentativas, próxima tentativa, última tentativa, status abandonado e prioridade. - -## [Módulo de Gerenciamento de Inquilinos](Tenant-Management.md) - -### AbpTenants - -Esta tabela armazena informações sobre os inquilinos. Cada registro representa um inquilino e contém informações sobre o inquilino, como nome e outros detalhes. - -### AbpTenantConnectionStrings - -Esta tabela armazena informações sobre as strings de conexão do banco de dados do inquilino. Quando você define uma string de conexão para um inquilino, um novo registro será adicionado a esta tabela. Você pode consultar este banco de dados para obter strings de conexão por inquilinos. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpTenants](#abptenants) | Id | A coluna `Id` na tabela `AbpTenants` é usada para associar a string de conexão do inquilino ao inquilino correspondente. | - -## Módulo de Blogging - -### BlgUsers - -Esta tabela armazena informações sobre os usuários do blog. Quando um novo usuário de identidade é criado, um novo registro será adicionado a esta tabela. - -### BlgBlogs - -Esta tabela serve para armazenar informações do blog e separar semanticamente as postagens de cada blog. - -### BlgPosts - -Esta tabela armazena informações sobre as postagens do blog. Você pode consultar esta tabela para obter postagens de blog por blogs. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [BlgBlogs](#blgblogs) | Id | Para associar a postagem do blog ao blog correspondente. | - -### BlgComments - -Esta tabela armazena informações sobre os comentários feitos nas postagens do blog. Você pode consultar esta tabela para obter comentários por postagens. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [BlgPosts](#blgposts) | Id | Vincula o comentário à postagem do blog correspondente. | -| [BlgComments](#blgcomments) | Id | Vincula o comentário ao comentário pai. | - -### BlgTags - -Esta tabela armazena informações sobre as tags. Quando uma nova tag é usada, um novo registro será adicionado a esta tabela. Você pode consultar esta tabela para obter tags por blogs. - -### BlgPostTags - -Esta tabela é usada para associar tags a postagens de blog, a fim de categorizar e organizar o conteúdo. Você pode consultar esta tabela para obter tags de postagens por postagens. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [BlgTags](#blgtags) | Id | Vincula a tag da postagem à tag correspondente. | -| [BlgPosts](#blgposts) | Id | Vincula a tag da postagem à postagem do blog correspondente. | - -## [Módulo CMS Kit](Cms-Kit/Index.md) - -### CmsUsers - -Esta tabela armazena informações sobre os usuários do módulo CMS Kit. Quando um novo usuário de identidade é criado, um novo registro será adicionado a esta tabela. - -### CmsBlogs - -Esta tabela serve para armazenar informações do blog e separar semanticamente as postagens de cada blog. - -### CmsBlogPosts - -Esta tabela armazena informações sobre as postagens do blog. Você pode consultar esta tabela para obter postagens de blog por blogs. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [CmsUsers](#cmsusers) | Id | Vincula a postagem do blog ao autor correspondente. | - -### CmsBlogFeatures - -Esta tabela armazena informações sobre os recursos do blog. Você pode consultar esta tabela para obter recursos do blog por blogs. - -### CmsComments - -Esta tabela é utilizada pelo sistema de comentários do CMS Kit para armazenar comentários feitos nas postagens do blog. Você pode consultar esta tabela para obter comentários por postagens. - -### CmsTags - -Esta tabela armazena informações sobre as tags. Quando uma nova tag é usada, um novo registro será adicionado a esta tabela. Você pode consultar esta tabela para obter tags por blogs. - -### CmsEntityTags - -Esta tabela é utilizada pelo sistema de gerenciamento de tags para armazenar tags e sua relação com várias entidades, permitindo assim a categorização e organização eficiente do conteúdo. Você pode consultar esta tabela para obter tags de entidades por entidades. - -### CmsGlobalResources - -Esta tabela é uma tabela de banco de dados para o sistema de recursos globais do CMS Kit, permitindo a adição dinâmica de estilos e scripts globais. - -### CmsMediaDescriptors - -Esta tabela é utilizada pelo módulo CMS Kit para gerenciar arquivos de mídia usando o módulo [BlobStoring](../Blob-Storing.md). - -### CmsMenuItems - -Esta tabela é usada pelo sistema de menu do CMS Kit para gerenciar e armazenar informações sobre menus públicos dinâmicos, incluindo detalhes como nomes de exibição de itens de menu, URLs e relacionamentos hierárquicos. - -### CmsPages - -Esta tabela é utilizada pelo sistema de páginas do CMS Kit para armazenar páginas dinâmicas dentro do aplicativo, incluindo informações como URLs de página, títulos e conteúdo. - -### CmsRatings - -Esta tabela é utilizada pelo sistema de classificação do CMS Kit para armazenar classificações feitas em postagens de blog. Você pode consultar esta tabela para obter classificações por postagens. - -### CmsUserReactions - -Esta tabela é utilizada pelo sistema de reações do CMS Kit para armazenar reações feitas em postagens de blog. Você pode consultar esta tabela para obter reações por postagens. - -## [Módulo de Documentação](Docs.md) - -### DocsProjects - -Esta tabela armazena informações do projeto para categorizar documentos de acordo com diferentes projetos. - -### DocsDocuments - -Esta tabela recupera o documento se ele não for encontrado no cache. A documentação está sendo atualizada quando o conteúdo é recuperado do banco de dados. - -### DocsDocumentContributors - -Esta tabela armazena informações sobre os contribuidores dos documentos. Você pode consultar esta tabela para obter contribuidores de documentos por documentos. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [DocsDocuments](#docsdocuments) | Id | Vincula o contribuidor do documento ao documento correspondente. | - -## [Módulo de Gerenciamento de Recursos](Feature-Management.md) - -### AbpFeatureGroups - -Esta tabela armazena informações sobre os grupos de recursos no aplicativo. Por exemplo, você pode agrupar todos os recursos na tabela [`AbpFeatures`](#abpfeatures) relacionados ao módulo `Identity` sob o grupo `Identity`. - -### AbpFeatures - -Esta tabela armazena informações sobre os recursos no aplicativo. Você pode usar a coluna `Name` para vincular cada recurso com seu valor de recurso correspondente na tabela [`AbpFeatureValues`](#abpfeaturevalues), para que você possa gerenciar e organizar facilmente os recursos. - -### AbpFeatureValues - -Esta tabela armazena os valores dos recursos para diferentes provedores. Você pode usar a coluna `Name` para vincular cada valor de recurso com seu recurso correspondente na tabela [`AbpFeatures`](#abpfeatures), para que você possa gerenciar e organizar facilmente os recursos. - -## [Módulo de Identidade](Identity.md) - -### AbpUsers - -Esta tabela armazena informações sobre os usuários de identidade no aplicativo. - -### AbpRoles - -Esta tabela armazena informações sobre os papéis no aplicativo. Os papéis são usados para gerenciar e controlar o acesso a diferentes partes do aplicativo, atribuindo permissões e reivindicações aos papéis e, em seguida, atribuindo esses papéis aos usuários. Esta tabela é importante para gerenciar e organizar os papéis no aplicativo e para definir os direitos de acesso dos usuários. - -### AbpClaimTypes - -Esta tabela armazena informações sobre os tipos de reivindicação usados no aplicativo. Você pode usar as colunas `Name` e `Regex` para filtrar os tipos de reivindicação por nome e padrão regex, respectivamente, para que você possa gerenciar e rastrear facilmente os tipos de reivindicação no aplicativo. - -### AbpLinkUsers - -Esta tabela é útil para vincular várias contas de usuário em diferentes inquilinos ou aplicativos a um único usuário, permitindo que eles alternem facilmente entre suas contas. - -### AbpUserClaims - -Esta tabela pode gerenciar o controle de acesso baseado em usuário, permitindo atribuir reivindicações aos usuários, que descrevem os direitos de acesso do usuário individual. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpUsers](#abpusers) | Id | Vincula a reivindicação do usuário ao usuário correspondente. | - -### AbpUserLogins - -Esta tabela pode armazenar informações sobre os logins externos do usuário, como login com Facebook, Google, etc., e também pode ser usada para rastrear o histórico de login dos usuários. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpUsers](#abpusers) | Id | Vincula o login do usuário ao usuário correspondente. | - -### AbpUserRoles - -Esta tabela pode gerenciar o controle de acesso baseado em usuário, permitindo atribuir papéis aos usuários, que descrevem os direitos de acesso do usuário individual. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpUsers](#abpusers) | Id | Vincula o papel do usuário ao usuário correspondente. | -| [AbpRoles](#abproles) | Id | Vincula o papel do usuário ao papel correspondente. | - -### AbpUserTokens - -Esta tabela pode armazenar informações sobre tokens de atualização, tokens de acesso e outros tokens usados no aplicativo. Também pode ser usado para invalidar ou revogar tokens de usuário. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpUsers](#abpusers) | Id | Vincula o token do usuário ao usuário correspondente. | - -### AbpOrganizationUnits - -Esta tabela é útil para criar e gerenciar uma estrutura hierárquica da organização, permitindo agrupar usuários e atribuir papéis com base na estrutura da organização. Você pode usar as colunas `Code` e `ParentId` para filtrar as unidades organizacionais por código e ID do pai, respectivamente, para que você possa gerenciar e rastrear facilmente as unidades organizacionais no aplicativo. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpOrganizationUnits](#abporganizationunits) | ParentId | Vincula a unidade organizacional à sua unidade organizacional pai. | - -### AbpOrganizationUnitRoles - -Esta tabela é útil para gerenciar o controle de acesso baseado em função no nível das unidades organizacionais, permitindo atribuir diferentes papéis a diferentes partes da estrutura da organização. Você pode usar as colunas `OrganizationUnitId` e `RoleId` para filtrar os papéis por ID da unidade organizacional e ID do papel, respectivamente, para que você possa gerenciar e rastrear facilmente os papéis atribuídos às unidades organizacionais no aplicativo. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpOrganizationUnits](#abporganizationunits) | Id | Vincula o papel da unidade organizacional à unidade organizacional correspondente. | -| [AbpRoles](#abproles) | Id | Vincula o papel da unidade organizacional ao papel correspondente. | - -### AbpUserOrganizationUnits - -Esta tabela armazena informações sobre as unidades organizacionais atribuídas aos usuários no aplicativo. Esta tabela pode gerenciar relacionamentos entre usuário e unidade organizacional e agrupar usuários com base na estrutura da organização. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpUsers](#abpusers) | Id | Vincula a unidade organizacional do usuário ao usuário correspondente. | -| [AbpOrganizationUnits](#abporganizationunits) | Id | Vincula a unidade organizacional do usuário à unidade organizacional correspondente. | - -### AbpRoleClaims - -Esta tabela é útil para gerenciar o controle de acesso baseado em função, permitindo atribuir reivindicações aos papéis, que descrevem os direitos de acesso dos usuários que pertencem a esse papel. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpRoles](#abproles) | Id | Vincula a reivindicação do papel ao papel correspondente. | - -### AbpSecurityLogs - -Esta tabela registra operações e alterações importantes relacionadas às contas de usuário, permitindo que os usuários salvem os logs de segurança para referência futura. - -## [Gerenciamento de Permissões](Permission-Management.md) - -### AbpPermissionGroups - -Esta tabela é importante para gerenciar e organizar as permissões no aplicativo, agrupando-as em categorias lógicas. - -### AbpPermissions - -Esta tabela é importante para gerenciar e controlar o acesso a diferentes partes do aplicativo e para definir as permissões granulares que compõem as permissões ou papéis maiores. - -### AbpPermissionGrants - -A tabela armazena e gerencia as permissões no aplicativo e mantém o controle das permissões concedidas, para quem e quando. Colunas como `Name`, `ProviderName`, `ProviderKey`, `TenantId` podem ser usadas para filtrar as permissões concedidas por nome, nome do provedor, chave do provedor e ID do inquilino, respectivamente, para que você possa gerenciar e rastrear facilmente as permissões concedidas no aplicativo. - -## [Gerenciamento de Configurações](Setting-Management.md) - -### AbpSettings - -Esta tabela armazena pares de chave-valor de configurações para o aplicativo e permite a configuração dinâmica do aplicativo sem a necessidade de recompilação. - -## [OpenIddict](OpenIddict.md) - -### OpenIddictApplications - -Esta tabela pode armazenar informações sobre as aplicações OpenID Connect, incluindo o ID do cliente, segredo do cliente, URI de redirecionamento e outras informações relevantes. Também pode ser usado para autenticar e autorizar clientes usando o protocolo OpenID Connect. - -### OpenIddictAuthorizations - -Esta tabela armazena os dados de autorização do OpenID Connect no aplicativo. Também pode ser usado para gerenciar e validar as concessões de autorização emitidas para clientes e usuários. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [OpenIddictApplications](#openiddictapplications) | Id | Vincula a autorização à aplicação correspondente. | - -### OpenIddictTokens - -Esta tabela pode armazenar informações sobre os tokens OpenID Connect, incluindo o payload do token, expiração, tipo e outras informações relevantes. Também pode ser usado para gerenciar e validar os tokens emitidos para clientes e usuários, como tokens de acesso e tokens de atualização, e controlar o acesso a recursos protegidos. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [OpenIddictApplications](#openiddictapplications) | Id | Vincula o token à aplicação correspondente. | -| [OpenIddictAuthorizations](#openiddictauthorizations) | Id | Vincula o token à autorização correspondente. | - -### OpenIddictScopes - -Esta tabela pode armazenar informações sobre os escopos OpenID Connect, incluindo o nome e a descrição do escopo. Também pode ser usado para definir as permissões ou direitos de acesso associados aos escopos, que são então usados para controlar o acesso a recursos protegidos. - -## [IdentityServer](IdentityServer.md) - -### IdentityServerApiResources - -Esta tabela pode armazenar informações sobre os recursos da API, incluindo o nome do recurso, nome de exibição, descrição e outras informações relevantes. Também pode ser usado para definir os escopos, reivindicações e propriedades associadas aos recursos da API, que são então usados para controlar o acesso a recursos protegidos. - -### IdentityServerIdentityResources - -Esta tabela pode armazenar informações sobre os recursos de identidade, incluindo o nome, nome de exibição, descrição e status habilitado. - -### IdentityServerClients - -Esta tabela pode armazenar informações sobre os clientes, incluindo o ID do cliente, nome do cliente, URI do cliente e outras informações relevantes. Também pode ser usado para definir os escopos, reivindicações e propriedades associadas aos clientes, que são então usados para controlar o acesso a recursos protegidos. - -### IdentityServerApiScopes - -Esta tabela pode armazenar informações sobre os escopos da API, incluindo o nome do escopo, nome de exibição, descrição e outras informações relevantes. Também pode ser usado para definir as reivindicações e propriedades associadas aos escopos da API, que são então usados para controlar o acesso a recursos protegidos. - -### IdentityServerApiResourceClaims - -Esta tabela pode armazenar informações sobre as reivindicações de um recurso da API, incluindo o tipo de reivindicação e o ID do recurso da API. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerApiResources](#identityserverapiresources) | Id | Vincula a reivindicação ao recurso da API correspondente. | - -### IdentityServerIdentityResourceClaims - -Esta tabela pode armazenar informações sobre as reivindicações de um recurso de identidade, incluindo o tipo de reivindicação e o ID do recurso de identidade. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerIdentityResources](#identityserveridentityresources) | Id | Vincula a reivindicação ao recurso de identidade correspondente. | - -### IdentityServerClientClaims - -Esta tabela pode armazenar informações sobre as reivindicações de um cliente, incluindo o tipo de reivindicação, valor da reivindicação e ID do cliente. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerClients](#identityserverclients) | Id | Vincula a reivindicação ao cliente correspondente. | - -### IdentityServerApiScopeClaims - -Esta tabela pode armazenar informações sobre as reivindicações de um escopo da API, incluindo o tipo de reivindicação e o ID do escopo da API. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerApiScopes](#identityserverapiscopes) | Id | Vincula a reivindicação ao escopo da API correspondente. | - -### IdentityServerApiResourceProperties - -Esta tabela pode armazenar informações sobre propriedades, incluindo a chave da propriedade e o valor, e o recurso da API associado. Essas propriedades podem armazenar metadados adicionais ou informações de configuração relacionadas aos recursos da API. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerApiResources](#identityserverapiresources) | Id | Vincula a propriedade ao recurso da API correspondente. | - -### IdentityServerIdentityResourceProperties - -Esta tabela pode armazenar informações sobre propriedades, incluindo a chave da propriedade e o valor, e o recurso de identidade associado. Essas propriedades podem armazenar metadados adicionais ou informações de configuração relacionadas aos recursos de identidade. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerIdentityResources](#identityserveridentityresources) | Id | Vincula a propriedade ao recurso de identidade correspondente. | - -### IdentityServerClientProperties - -Esta tabela pode armazenar informações sobre as propriedades de um cliente, incluindo a chave, valor e ID do cliente. Essas propriedades podem armazenar metadados adicionais ou informações de configuração relacionadas aos clientes. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerClients](#identityserverclients) | Id | Vincula a propriedade ao cliente correspondente. | - -### IdentityServerApiScopeProperties - -Esta tabela pode armazenar informações sobre as propriedades de um escopo da API, incluindo a chave, valor e ID do escopo da API. Essas propriedades podem armazenar metadados adicionais ou informações de configuração relacionadas aos escopos da API. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerApiScopes](#identityserverapiscopes) | Id | Vincula a propriedade ao escopo da API correspondente. | - -### IdentityServerApiResourceScopes - -Esta tabela pode armazenar informações sobre os escopos de um recurso da API, incluindo o nome do escopo e o ID do recurso da API. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerApiResources](#identityserverapiresources) | Id | Vincula o escopo ao recurso da API correspondente. | - -### IdentityServerClientScopes - -Esta tabela pode armazenar informações sobre os escopos de um cliente, incluindo o escopo e o ID do cliente. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerClients](#identityserverclients) | Id | Vincula o escopo ao cliente correspondente. | - -### IdentityServerApiResourceSecrets - -Esta tabela pode armazenar informações sobre os segredos de um recurso da API, incluindo o valor do segredo, data de expiração e ID do recurso da API. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerApiResources](#identityserverapiresources) | Id | Vincula o segredo ao recurso da API correspondente. | - -### IdentityServerClientSecrets - -Esta tabela pode armazenar informações sobre os segredos de um cliente, incluindo o valor do segredo, data de expiração e ID do cliente. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerClients](#identityserverclients) | Id | Vincula o segredo ao cliente correspondente. | - -### IdentityServerClientCorsOrigins - -Esta tabela pode armazenar informações sobre as origens CORS de um cliente, incluindo a origem e o ID do cliente. Também pode ser usado para gerenciar e validar as origens CORS de um cliente. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerClients](#identityserverclients) | Id | Vincula a origem CORS ao cliente correspondente. | - -### IdentityServerClientGrantTypes - -Esta tabela pode armazenar informações sobre os tipos de concessão de um cliente, incluindo o tipo de concessão e o ID do cliente. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerClients](#identityserverclients) | Id | Vincula o tipo de concessão ao cliente correspondente. | - -### IdentityServerClientIdPRestrictions - -Esta tabela pode armazenar informações sobre as restrições do provedor de identidade de um cliente, incluindo o provedor de identidade e o ID do cliente. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerClients](#identityserverclients) | Id | Vincula a restrição do provedor de identidade ao cliente correspondente. | - -### IdentityServerClientPostLogoutRedirectUris - -Esta tabela pode armazenar informações sobre os URIs de redirecionamento pós logout de um cliente, incluindo o URI de redirecionamento pós logout e o ID do cliente. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerClients](#identityserverclients) | Id | Vincula o URI de redirecionamento pós logout ao cliente correspondente. | - -### IdentityServerClientRedirectUris - -Esta tabela pode armazenar informações sobre os URIs de redirecionamento de um cliente, incluindo o URI de redirecionamento e o ID do cliente. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [IdentityServerClients](#identityserverclients) | Id | Vincula o URI de redirecionamento ao cliente correspondente. | - -### IdentityServerDeviceFlowCodes - -Esta tabela pode armazenar informações sobre os códigos de fluxo de dispositivo, incluindo o código do usuário, código do dispositivo, ID do assunto, ID do cliente, data de criação, expiração, dados e ID da sessão. - -### IdentityServerPersistedGrants - -Esta tabela pode armazenar informações sobre as concessões persistidas, incluindo a chave, tipo, ID do assunto, ID do cliente, data de criação, expiração e dados. - -## Outros - -### AbpBlobContainers - -Esta tabela é importante para fornecer uma melhor experiência do usuário, permitindo que o aplicativo suporte vários contêineres e forneça recursos específicos de BLOB. - -### AbpBlobs - -Esta tabela armazena os dados binários de BLOBs (objetos binários grandes) no aplicativo. Cada BLOB está relacionado a um contêiner na tabela [AbpBlobContainers](#abpblobcontainers), onde o nome do contêiner, ID do inquilino e outras propriedades do contêiner podem ser encontrados. - -#### Chaves Estrangeiras - -| Tabela | Coluna | Descrição | -| --- | --- | --- | -| [AbpBlobContainers](#abpblobcontainers) | Id | Vincula o BLOB ao contêiner correspondente. | - -### AbpLocalizationResources - -Esta tabela armazena os recursos de localização para o aplicativo. Esta tabela é importante para fornecer uma melhor experiência do usuário, permitindo que o aplicativo suporte vários recursos e forneça texto localizado e outros recursos específicos de localização. - -### AbpLocalizationTexts - -A tabela contém o nome do recurso, nome da cultura e um valor codificado em JSON que contém o par chave-valor do texto de localização. Ele permite o armazenamento e gerenciamento eficiente de textos de localização e permite a atualização fácil ou adição de novas traduções para recursos e culturas específicas. \ No newline at end of file diff --git a/docs/pt-BR/Modules/Docs.md b/docs/pt-BR/Modules/Docs.md deleted file mode 100644 index 32a8093ede..0000000000 --- a/docs/pt-BR/Modules/Docs.md +++ /dev/null @@ -1,675 +0,0 @@ -# Módulo de Documentação - -## O que é o Módulo de Documentação? - -O módulo de documentação é um módulo de aplicação para o framework ABP. Ele simplifica a documentação de software. Este módulo é gratuito e de código aberto. - -### Integração - -Atualmente, o módulo de documentação permite que você armazene sua documentação tanto no GitHub quanto no sistema de arquivos. - -### Hospedagem - -O módulo de documentação é um módulo de aplicação e não oferece nenhuma solução de hospedagem. Você pode hospedar sua documentação localmente ou na nuvem. - -### Versionamento - -Quando você usa o GitHub para armazenar sua documentação, o módulo de documentação suporta o versionamento. Se você tiver várias versões para sua documentação, haverá uma caixa de seleção na interface do usuário para alternar entre as versões. Se você escolher o sistema de arquivos para armazenar sua documentação, ele não suportará várias versões. - -[Os documentos](https://docs.abp.io/) para o framework ABP também estão usando este módulo. - -> O módulo de documentação segue as melhores práticas de arquitetura de módulos. - -## Instalação - -Este documento aborda o provedor `Entity Framework Core`, mas você também pode selecionar o `MongoDB` como seu provedor de banco de dados. - -### 1- Criando uma aplicação - -Se você não tiver um projeto ABP existente, você pode gerar um comando CLI a partir da página de início do site abp.io e executá-lo ou executar o comando abaixo: - -```bash -abp new Acme.MyProject -``` - -### 2- Executando a aplicação vazia - -Após baixar o projeto, extraia o arquivo ZIP e abra `Acme.MyProject.sln`. Você verá que a solução consiste nos projetos `Application`, `Application.Contracts`, `DbMigrator`, `Domain`, `Domain.Shared`, `EntityFrameworkCore`, `HttpApi`, `HttpApi.Client` e `Web`. Clique com o botão direito no projeto `Acme.MyProject.Web` e selecione **Definir como Projeto de Inicialização**. - -![Criar um novo projeto](../images/docs-module_solution-explorer.png) - -A string de conexão do banco de dados está localizada em `appsettings.json` do seu projeto `Acme.MyProject.Web`. Se você tiver uma configuração de banco de dados diferente, altere a string de conexão. - -```json -{ - "ConnectionStrings": { - "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=MyProject;Trusted_Connection=True" - } -} -``` - -Execute o projeto `Acme.MyProject.DbMigrator`, ele será responsável por aplicar a migração do banco de dados e os dados iniciais. O banco de dados `MyProject` será criado em seu servidor de banco de dados. - -Agora um projeto ABP vazio foi criado! Agora você pode executar seu projeto e ver o site vazio. - -Para fazer login no seu site, digite `admin` como nome de usuário e `1q2w3E*` como senha. - -### 3- Instalação do Módulo - -Os pacotes do módulo de documentação estão hospedados no NuGet. Existem 4 pacotes que precisam ser instalados em sua aplicação. Cada pacote deve ser instalado no projeto relevante. - -#### 3.1- Usando o ABP CLI - -É recomendado usar o ABP CLI para instalar o módulo. Abra a janela do CMD no diretório do arquivo de solução (`.sln`) e execute o seguinte comando: - -```bash -abp add-module Volo.Docs -``` - -#### 3.2- Instalação manual - -Ou você também pode instalar manualmente o pacote NuGet em cada projeto: - -* Instale o pacote NuGet [Volo.Docs.Domain](https://www.nuget.org/packages/Volo.Docs.Domain/) no projeto `Acme.MyProject.Domain`. - - ```bash - Install-Package Volo.Docs.Domain - ``` - -* Instale o pacote NuGet [Volo.Docs.EntityFrameworkCore](https://www.nuget.org/packages/Volo.Docs.EntityFrameworkCore/) no projeto `Acme.MyProject.EntityFrameworkCore`. - - ```bash - Install-Package Volo.Docs.EntityFrameworkCore - ``` - -* Instale o pacote NuGet [Volo.Docs.Application](https://www.nuget.org/packages/Volo.Docs.Application/) no projeto `Acme.MyProject.Application`. - - ```bash - Install-Package Volo.Docs.Application - ``` - -* Instale o pacote NuGet [Volo.Docs.Web](https://www.nuget.org/packages/Volo.Docs.Domain/) no projeto `Acme.MyProject.Web`. - - ```bash - Install-Package Volo.Docs.Web - ``` - -##### 3.2.1- Adicionando Dependências de Módulo - -Um módulo ABP deve declarar o atributo `[DependsOn]` se tiver uma dependência de outro módulo. Cada módulo deve ser adicionado no atributo `[DependsOn]` do projeto relevante. - -* Abra `MyProjectDomainModule.cs` e adicione `typeof(DocsDomainModule)` como mostrado abaixo; - - ```csharp - [DependsOn( - typeof(DocsDomainModule), - typeof(AbpIdentityDomainModule), - typeof(AbpAuditingModule), - typeof(BackgroundJobsDomainModule), - typeof(AbpAuditLoggingDomainModule) - )] - public class MyProjectDomainModule : AbpModule - { - //... - } - ``` - -* Abra `MyProjectEntityFrameworkCoreModule.cs` e adicione `typeof(DocsEntityFrameworkCoreModule)` como mostrado abaixo; - - ```csharp - [DependsOn( - typeof(DocsEntityFrameworkCoreModule), - typeof(MyProjectDomainModule), - typeof(AbpIdentityEntityFrameworkCoreModule), - typeof(AbpPermissionManagementEntityFrameworkCoreModule), - typeof(AbpSettingManagementEntityFrameworkCoreModule), - typeof(AbpEntityFrameworkCoreSqlServerModule), - typeof(BackgroundJobsEntityFrameworkCoreModule), - typeof(AbpAuditLoggingEntityFrameworkCoreModule) - )] - public class MyProjectEntityFrameworkCoreModule : AbpModule - { - //... - } - ``` - -* Abra `MyProjectApplicationModule.cs` e adicione `typeof(DocsApplicationModule)` como mostrado abaixo; - - ```csharp - [DependsOn( - typeof(DocsApplicationModule), - typeof(MyProjectDomainModule), - typeof(AbpIdentityApplicationModule))] - public class MyProjectApplicationModule : AbpModule - { - public override void ConfigureServices(ServiceConfigurationContext context) - { - Configure(options => - { - options.DefinitionProviders.Add(); - }); - - Configure(options => - { - options.AddProfile(); - }); - } - } - ``` - -* Abra `MyProjectWebModule.cs` e adicione `typeof(DocsWebModule)` como mostrado abaixo; - - ```csharp - [DependsOn( - typeof(DocsWebModule), - typeof(MyProjectApplicationModule), - typeof(MyProjectEntityFrameworkCoreModule), - typeof(AbpAutofacModule), - typeof(AbpIdentityWebModule), - typeof(AbpAccountWebModule), - typeof(AbpAspNetCoreMvcUiBasicThemeModule) - )] - public class MyProjectWebModule : AbpModule - { - //... - } - ``` - -##### 3.2.2- Adicionando Pacote NPM - -Abra `package.json` e adicione `@abp/docs": "^5.0.0` como mostrado abaixo: - - ```json - { - "version": "1.0.0", - "name": "my-app", - "private": true, - "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^5.0.0", - "@abp/docs": "^5.0.0" - } - } - ``` - -Em seguida, abra o terminal de linha de comando na pasta do projeto `Acme.MyProject.Web` e execute o seguinte comando: - -````bash -abp install-libs -```` - -### 4- Integração com o Banco de Dados - -#### 4.1- Integração com o Entity Framework - -Se você escolher o Entity Framework como seu provedor de banco de dados, precisará configurar o módulo de documentação. Para fazer isso; - -- Abra `MyProjectMigrationsDbContext.cs` e adicione `builder.ConfigureDocs()` ao `OnModelCreating()`. - - ```csharp - public class MyProjectMigrationsDbContext : AbpDbContext - { - public MyProjectMigrationsDbContext(DbContextOptions options) - : base(options) - { - - } - - protected override void OnModelCreating(ModelBuilder builder) - { - base.OnModelCreating(builder); - - /* Inclua módulos no contexto de migração do banco de dados */ - - builder.ConfigurePermissionManagement(); - builder.ConfigureSettingManagement(); - builder.ConfigureBackgroundJobs(); - builder.ConfigureAuditLogging(); - builder.ConfigureIdentity(); - builder.ConfigureIdentityServer(); - builder.ConfigureFeatureManagement(); - builder.ConfigureTenantManagement(); - builder.ConfigureDocs(); //Adicione esta linha para configurar o módulo de documentação - - /* Configure personalizações para entidades dos módulos incluídos */ - - builder.Entity(b => - { - b.ConfigureCustomUserProperties(); - }); - - /* Configure suas próprias tabelas/entidades dentro do método ConfigureMyProject */ - - builder.ConfigureMyProject(); - } - } - ``` - -* Abra o `Console do Gerenciador de Pacotes` no `Visual Studio` e escolha `Acme.MyProject.EntityFrameworkCore` como projeto padrão. Em seguida, escreva o comando abaixo para adicionar a migração para o módulo de documentação. - - ```csharp - add-migration Added_Docs_Module - ``` - - Quando o comando for executado com sucesso, você verá um novo arquivo de migração chamado `20181221111621_Added_Docs_Module` na pasta `Acme.MyProject.EntityFrameworkCore\Migrations`. - - Agora, atualize o banco de dados para as alterações do módulo de documentação. Para fazer isso, execute o código abaixo no `Console do Gerenciador de Pacotes` no `Visual Studio`. Certifique-se de que `Acme.MyProject.EntityFrameworkCore` ainda é o projeto padrão. - - ```csharp - update-database - ``` - - Por fim, você pode verificar seu banco de dados para ver as tabelas recém-criadas. Por exemplo, você pode ver a tabela `DocsProjects` adicionada ao seu banco de dados. - -### 5- Vinculando o Módulo de Documentação - -A rota padrão para o módulo de documentação é; - -```txt -/Documents -``` - -Para adicionar o link do módulo de documentação ao menu de sua aplicação; - -* Abra `MyProjectMenuContributor.cs` e adicione a linha abaixo ao método `ConfigureMainMenuAsync()`. - - ```csharp - context.Menu.Items.Add(new ApplicationMenuItem("MyProject.Docs", l["Menu:Docs"], "/Documents")); - ``` - - A aparência final de **MyProjectMenuContributor.cs** - - ```csharp - private async Task ConfigureMainMenuAsync(MenuConfigurationContext context) - { - var l = context.ServiceProvider.GetRequiredService>(); - - context.Menu.Items.Insert(0, new ApplicationMenuItem("MyProject.Home", l["Menu:Home"], "/")); - - context.Menu.Items.Add(new ApplicationMenuItem("MyProject.Docs", l["Menu:Docs"], "/Documents")); - } - ``` - -A palavra-chave `Menu:Docs` é uma chave de localização. Para localizar o texto do menu, abra `Localization\MyProject\en.json` no projeto `Acme.MyProject.Domain`. E adicione a linha abaixo - -```json -"Menu:Docs": "Documentos" -``` - -A aparência final de **en.json** - -```json -{ - "culture": "en", - "texts": { - "Menu:Home": "Início", - "Welcome": "Bem-vindo", - "LongWelcomeMessage": "Bem-vindo à aplicação. Este é um projeto inicial baseado no framework ABP. Para obter mais informações, visite abp.io.", - "Menu:Docs": "Documentos" - } -} -``` - -O novo item de menu para o Módulo de Documentação foi adicionado ao menu. Execute sua aplicação web e acesse a URL `http://localhost:YOUR_PORT_NUMBER/documents`. - -Você verá um aviso que diz; - -```txt -Ainda não há projetos! -``` - -Como ainda não adicionamos nenhum projeto, este aviso é normal. - -### 6- Adicionando um Novo Projeto de Documentação - -Abra `DocsProjects` em seu banco de dados e insira um novo registro com as seguintes informações de campo; - -* **Name**: O nome de exibição do nome do documento que será mostrado na página da web. -* **ShortName**: Um nome curto e amigável para URL que será usado na URL de seus documentos. -* **Format**: O formato do documento (para Markdown: `md`, para HTML: `html`) -* **DefaultDocumentName**: O documento para a página inicial. -* **NavigationDocumentName**: O documento a ser usado para o menu de navegação (Índice). -* **MinimumVersion**: A versão mínima para mostrar os documentos. As versões abaixo não serão listadas. -* **DocumentStoreType**: A fonte dos documentos (para GitHub:`GitHub`, para sistema de arquivos`FileSystem`) -* **ExtraProperties**: Um JSON serializado que armazena configurações especiais para o `DocumentStoreType` selecionado. -* **MainWebsiteUrl**: A URL para quando o usuário clicar no logotipo da página do módulo de documentação. Você pode simplesmente definir como `/` para vincular ao endereço raiz do seu site. -* **LatestVersionBranchName**: Esta é uma configuração para o GitHub. É o nome do branch que será usado para recuperar os documentos. Você pode definir como `master`. - -#### Exemplo de Registro de Projeto para "GitHub" - -Você pode usar a documentação do [ABP Framework](https://github.com/abpframework/abp/) no GitHub para configurar seu repositório de documentos do GitHub. - -- Name: `ABP framework (GitHub)` - -- ShortName: `abp` - -- Format: `md` - -- DefaultDocumentName: `Index` - -- NavigationDocumentName: `docs-nav.json` - -- MinimumVersion: `` (sem versão mínima) - -- DocumentStoreType: `GitHub` - -- ExtraProperties: - - ```json - {"GitHubRootUrl":"https://github.com/abpframework/abp/tree/{version}/docs","GitHubAccessToken":"***","GitHubUserAgent":""} - ``` - - Observe que `GitHubAccessToken` está mascarado com `***`. É um token privado que você deve obter do GitHub. Consulte https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/ - -- MainWebsiteUrl: `/` - -- LatestVersionBranchName: `dev` - -Para bancos de dados `SQL`, você pode usar o comando `T-SQL` abaixo para inserir o exemplo especificado em sua tabela `DocsProjects`: - -```mssql -INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName], [ConcurrencyStamp]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP framework (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'', N'12f21123e08e4f15bedbae0b2d939659') -``` - -Esteja ciente de que `GitHubAccessToken` está mascarado. É um token privado e você deve obter seu próprio token e substituir a string `***`. - -Agora você pode executar a aplicação e navegar até `/Documents`. - -#### Exemplo de Registro de Projeto para "FileSystem" - -Você pode usar a documentação do [ABP Framework](https://github.com/abpframework/abp/) no GitHub para configurar seu repositório de documentos do GitHub. - -- Name: `ABP framework (FileSystem)` - -- ShortName: `abp` - -- Format: `md` - -- DefaultDocumentName: `Index` - -- NavigationDocumentName: `docs-nav.json` - -- MinimumVersion: `` (sem versão mínima) - -- DocumentStoreType: `FileSystem` - -- ExtraProperties: - - ```json - {"Path":"C:\\Github\\abp\\docs"} - ``` - - Observe que `Path` deve ser substituído pelo diretório de documentos local. Você pode obter a documentação do ABP Framework em https://github.com/abpframework/abp/tree/master/docs e copiar para o diretório `C:\\Github\\abp\\docs` para que funcione. - -- MainWebsiteUrl: `/` - -- LatestVersionBranchName: `` - -Para bancos de dados `SQL`, você pode usar o comando `T-SQL` abaixo para inserir o exemplo especificado em sua tabela `DocsProjects`: - -```mssql -INSERT [dbo].[DocsProjects] ([Id], [Name], [ShortName], [Format], [DefaultDocumentName], [NavigationDocumentName], [MinimumVersion], [DocumentStoreType], [ExtraProperties], [MainWebsiteUrl], [LatestVersionBranchName], [ParametersDocumentName]) VALUES (N'12f21123-e08e-4f15-bedb-ae0b2d939659', N'ABP framework (FileSystem)', N'abp', N'md', N'Index', N'docs-nav.json', NULL, N'FileSystem', N'{"Path":"C:\\Github\\abp\\docs"}', N'/', NULL, N'') -``` - -Adicione um dos projetos de exemplo acima e execute a aplicação. No menu, você verá o link `Documentos`, clique no link do menu para abrir a página de documentos. - -Até agora, criamos um novo aplicativo a partir do site abp.io e o preparamos para o módulo de documentação. - -### 7- Criando um Novo Documento - -No exemplo de registros de projeto, você vê que o `Format` é especificado como `md`, que se refere ao [Mark Down](https://en.wikipedia.org/wiki/Markdown). Você pode ver o guia de referência do mark down seguindo o link abaixo; - -https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet - -O módulo de documentação do ABP pode renderizar mark down para HTML. - -Agora vamos dar uma olhada em um exemplo de documento em formato mark down. - -~~~markdown -# Este é um cabeçalho - -Bem-vindo ao Módulo de Documentação. - -## Este é um subcabeçalho - - [Este é um link](https://abp.io) - -![Esta é uma imagem](https://abp.io/assets/my-image.png) - -## Este é um bloco de código - -```csharp -public class Person -{ - public string Name { get; set; } - - public string Address { get; set; } -} -``` -~~~ - -Como exemplo, você pode ver a documentação do ABP Framework: - -[https://github.com/abpframework/abp/blob/master/docs/en/](https://github.com/abpframework/abp/blob/master/docs/en/) - -#### Recurso de seções condicionais (Usando Scriban) - -O módulo de documentação usa o [Scriban](https://github.com/lunet-io/scriban/tree/master/doc) para mostrar ou ocultar algumas partes de um documento de forma condicional. Para usar esse recurso, você deve criar um arquivo JSON como **documento de parâmetros** para cada idioma. Ele conterá todas as chaves-valores, bem como seus nomes de exibição. - -Por exemplo, [en/docs-params.json](https://github.com/abpio/abp-commercial-docs/blob/master/en/docs-params.json): - -```json -{ - "parameters": [{ - "name": "UI", - "displayName": "UI", - "values": { - "MVC": "MVC / Razor Pages", - "NG": "Angular" - } - }, - { - "name": "DB", - "displayName": "Database", - "values": { - "EF": "Entity Framework Core", - "Mongo": "MongoDB" - } - }, - { - "name": "Tiered", - "displayName": "Tiered", - "values": { - "No": "Not Tiered", - "Yes": "Tiered" - } - }] -} -``` - -Como nem todos os documentos de seus projetos podem ter seções ou precisar de todos esses parâmetros, você deve declarar quais desses parâmetros serão usados para dividir o documento, como um bloco JSON em qualquer lugar do documento. - -Por exemplo [Getting-Started.md](https://github.com/abpio/abp-commercial-docs/blob/master/en/getting-started.md): - -``` -..... - -​```json -//[doc-params] -{ - "UI": ["MVC","NG"], - "DB": ["EF", "Mongo"], - "Tiered": ["Yes", "No"] -} -​``` - -........ -``` - -Esta seção será excluída automaticamente durante a renderização. E, é claro, essas chaves de valores devem corresponder às do **documento de parâmetros**. - -![Interface](../images/docs-section-ui.png) - -Agora você pode usar a sintaxe do **Scriban** para criar seções em seu documento. - -Por exemplo: - -```` -{{ if UI == "NG" }} - -* O argumento `-u` especifica o framework de IU, `angular` neste caso. - -{{ end }} - -{{ if DB == "Mongo" }} - -* O argumento `-d` especifica o provedor de banco de dados, `mongodb` neste caso. - -{{ end }} - -{{ if Tiered == "Yes" }} - -* O argumento `--tiered` é usado para criar uma solução em camadas em que o servidor de autenticação, as camadas de IU e API são fisicamente separadas. - -{{ end }} - -```` - -Você também pode usar variáveis em um texto, adicionando o sufixo **_Value** à sua chave: - -```txt -Este documento pressupõe que você prefere usar **{{ UI_Value }}** como o framework de IU e **{{ DB_Value }}** como o provedor de banco de dados. -``` - -Além disso, as chaves **Document_Language_Code** e **Document_Version** são predefinidas se você quiser obter o código do idioma ou a versão do documento atual (isso pode ser útil para criar links que redirecionam para outro sistema de documentação em outro domínio). - ------- - -**AVISO IMPORTANTE**: O Scriban usa "{{" e "}}" para a sintaxe. Portanto, você deve usar blocos de escape se for usá-los em seu documento (um documento Angular, por exemplo). Consulte a [documentação do Scriban](https://github.com/lunet-io/scriban/blob/master/doc/language.md#13-escape-block) para obter mais informações. - -### 8- Criando o Documento de Navegação - -O documento de navegação é o menu principal da página de documentos. Ele está localizado no lado esquerdo da página. É um arquivo `JSON`. Dê uma olhada no exemplo de documento de navegação abaixo para entender a estrutura. - -```json -{ - "items":[ - { - "text":"Item de Menu de Exemplo - 1", - "items":[ - { - "text":"Item de Menu de Exemplo - 1.1", - "items":[ - { - "text":"Item de Menu de Exemplo - 1.1.1", - "path":"SampleMenuItem_1_1_1.md" - } - ] - }, - { - "text":"Item de Menu de Exemplo - 1.2", - "items":[ - { - "text":"Item de Menu de Exemplo - 1.2.1", - "path":"SampleMenuItem_1_2_1.md" - }, - { - "text":"Item de Menu de Exemplo - 1.2.2", - "path":"SampleMenuItem_1_2_2.md" - } - ] - } - ] - }, - { - "text":"Item de Menu de Exemplo - 2", - "items":[ - { - "text":"Item de Menu de Exemplo - 2.1", - "items":[ - { - "text":"Item de Menu de Exemplo - 2.1.1", - "path":"SampleMenuItem_2_1_1.md" - } - ] - } - ] - } - ] -} -``` - -O exemplo acima de arquivo `JSON` renderiza o menu de navegação abaixo como `HTML`. - -![Menu de navegação](../images/docs-module_download-sample-navigation-menu.png) - -Finalmente, um novo Módulo de Documentação é adicionado ao seu projeto, que é alimentado pelo GitHub. - - -## Pesquisa de Texto Completo (Elastic Search) - -O módulo de documentação suporta pesquisa de texto completo usando o Elastic Search. Ele não está habilitado por padrão. Você pode configurar `DocsElasticSearchOptions` para habilitá-lo. - -```csharp -Configure(options => -{ - options.Enable = true; - options.IndexName = "your_index_name"; //o nome do índice padrão é abp_documents -}); -``` - -O `Índice` é criado automaticamente após o início da aplicação se o `Índice` não existir. - -`DefaultElasticClientProvider` é responsável por criar `IElasticClient`. Por padrão, ele lê a `Url` do Elastic Search da `IConfiguration`. -Se o seu `IElasticClient` precisar de configurações adicionais, use a substituição do serviço `IElasticClientProvider` e substitua-o no sistema de [injeção de dependência](../Dependency-Injection.md). - -```json -{ - "ElasticSearch": { - "Url": "http://localhost:9200" - } -} -``` - - -## Destacando Linhas - -Você pode aplicar destaque a linhas de código específicas ou a um intervalo de linhas sequenciais. -Veja os exemplos a seguir: - -``` - ```C# {3, 5} - public class Book : Entity - { - public string Name { get; set; } - public string Surname { get; set; } - } - ``` -``` - -``` - ```C# {2-4} - public class Book : Entity - { - public string Name { get; set; } - public string Surname { get; set; } - } - ``` -``` - -``` - ```C# {1, 2-4} - public class Book : Entity - { - public string Name { get; set; } - public string Surname { get; set; } - } - ``` -``` - ---- - - - -## Próximo - -O Módulo de Documentação também está disponível como um aplicativo independente. Confira [VoloDocs](../Apps/VoloDocs). \ No newline at end of file diff --git a/docs/pt-BR/Modules/Feature-Management.md b/docs/pt-BR/Modules/Feature-Management.md deleted file mode 100644 index 1928b09a77..0000000000 --- a/docs/pt-BR/Modules/Feature-Management.md +++ /dev/null @@ -1,105 +0,0 @@ -# Módulo de Gerenciamento de Recursos - -O módulo de Gerenciamento de Recursos implementa a interface `IFeatureManagementStore` definida pelo [Sistema de Recursos](../Features.md). - -> Este documento aborda apenas o módulo de gerenciamento de recursos que persiste os valores dos recursos em um banco de dados. Consulte o documento [recursos](../Features.md) para obter mais informações sobre o sistema de recursos. - -## Como Instalar - -Este módulo vem pré-instalado (como pacotes NuGet/NPM). Você pode continuar a usá-lo como pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando `get-source` [CLI](../CLI.md)) para desenvolver seu próprio módulo personalizado. - -### O Código Fonte - -O código-fonte deste módulo pode ser acessado [aqui](https://github.com/abpframework/abp/tree/dev/modules/feature-management). O código-fonte é licenciado com [MIT](https://choosealicense.com/licenses/mit/), portanto, você pode usá-lo e personalizá-lo livremente. - -## Interface do Usuário - -### Diálogo de Gerenciamento de Recursos - -O módulo de gerenciamento de recursos fornece um diálogo reutilizável para gerenciar recursos relacionados a um objeto. Por exemplo, o [Módulo de Gerenciamento de Inquilinos](Tenant-Management.md) o utiliza para gerenciar os recursos dos inquilinos na página de Gerenciamento de Inquilinos. - -![features-module-opening](../images/features-module-opening.png) - -Quando você clica em *Ações* -> *Recursos* para um inquilino, o diálogo de gerenciamento de recursos é aberto. Uma captura de tela de exemplo deste diálogo com dois recursos definidos: - -![features-modal](../images/features-modal.png) - -Neste diálogo, você pode habilitar, desabilitar ou definir valores para os recursos de um inquilino. - -## IFeatureManager - -`IFeatureManager` é o serviço principal fornecido por este módulo. Ele é usado para ler e alterar os valores de configuração para os inquilinos em um aplicativo multi-inquilino. `IFeatureManager` é normalmente usado pelo *Diálogo de Gerenciamento de Recursos*. No entanto, você pode injetá-lo se precisar definir um valor de recurso. - -> Se você apenas deseja ler os valores dos recursos, use o `IFeatureChecker` conforme explicado no documento [Recursos](../Features.md). - -**Exemplo: Obter/definir o valor de um recurso para um inquilino** - -````csharp -using System; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.FeatureManagement; - -namespace Demo -{ - public class MyService : ITransientDependency - { - private readonly IFeatureManager _featureManager; - - public MyService(IFeatureManager featureManager) - { - _featureManager = featureManager; - } - - public async Task SetFeatureDemoAsync(Guid tenantId, string value) - { - await _featureManager - .SetForTenantAsync(tenantId, "Recurso1", value); - - var currentValue = await _featureManager - .GetOrNullForTenantAsync("Recurso1", tenantId); - } - } -} -```` - -## Provedores de Gerenciamento de Recursos - -O Módulo de Gerenciamento de Recursos é extensível, assim como o [sistema de recursos](../Features.md). Você pode estendê-lo definindo provedores de gerenciamento de recursos. Existem 3 provedores de gerenciamento de recursos pré-construídos registrados na seguinte ordem: - -* `DefaultValueFeatureManagementProvider`: Obtém o valor do valor padrão da definição do recurso. Ele não pode definir o valor padrão, pois os valores padrão são codificados na definição do recurso. -* `EditionFeatureManagementProvider`: Obtém ou define os valores dos recursos para uma edição. A edição é um grupo de recursos atribuídos a inquilinos. O sistema de edição não foi implementado pelo módulo de Gerenciamento de Inquilinos. Você pode implementá-lo por conta própria ou adquirir o [Módulo SaaS](https://commercial.abp.io/modules/Volo.Saas) do ABP Commercial, que o implementa e também fornece mais recursos SaaS, como assinatura e pagamento. -* `TenantFeatureManagementProvider`: Obtém ou define os valores dos recursos para inquilinos. - -`IFeatureManager` usa esses provedores nos métodos de obtenção/definição. Normalmente, cada provedor de gerenciamento de recursos define métodos de extensão no serviço `IFeatureManager` (como `SetForTenantAsync` definido pelo provedor de gerenciamento de recursos de inquilinos). - -Se você deseja criar seu próprio provedor, implemente a interface `IFeatureManagementProvider` ou herde da classe base `FeatureManagementProvider`: - -````csharp -public class CustomFeatureProvider : FeatureManagementProvider -{ - public override string Name => "Custom"; - - public CustomFeatureProvider(IFeatureManagementStore store) - : base(store) - { - } -} -```` - -A classe base `FeatureManagementProvider` faz a implementação padrão (usando o `IFeatureManagementStore`) para você. Você pode substituir os métodos base conforme necessário. Todo provedor deve ter um nome exclusivo, que é `Custom` neste exemplo (mantenha-o curto, pois ele é salvo no banco de dados para cada registro de valor de recurso). - -Depois de criar sua classe de provedor, você deve registrá-la usando a classe de opções `FeatureManagementOptions` [options class](../Options.md): - -````csharp -Configure(options => -{ - options.Providers.Add(); -}); -```` - -A ordem dos provedores é importante. Os provedores são executados na ordem inversa. Isso significa que o `CustomFeatureProvider` é executado primeiro neste exemplo. Você pode inserir seu provedor em qualquer ordem na lista `Providers`. - -## Veja também - -* [Recursos](../Features.md) \ No newline at end of file diff --git a/docs/pt-BR/Modules/Identity.md b/docs/pt-BR/Modules/Identity.md deleted file mode 100644 index 8c50fee03b..0000000000 --- a/docs/pt-BR/Modules/Identity.md +++ /dev/null @@ -1,321 +0,0 @@ -# Módulo de Gerenciamento de Identidade - -O módulo de identidade é usado para gerenciar funções, usuários e suas permissões, com base na biblioteca de identidade da Microsoft. - -## Como instalar - -Este módulo já vem pré-instalado (como pacotes NuGet/NPM). Você pode continuar a usá-lo como pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando `get-source` [CLI](../CLI.md)) para desenvolver seu próprio módulo personalizado. - -### O Código-fonte - -O código-fonte deste módulo pode ser acessado [aqui](https://github.com/abpframework/abp/tree/dev/modules/identity). O código-fonte é licenciado com [MIT](https://choosealicense.com/licenses/mit/), então você pode usá-lo e personalizá-lo livremente. - -## Interface do Usuário - -Este módulo fornece opções de interface do usuário [Blazor](../UI/Blazor/Overall.md), [Angular](../UI/Angular/Quick-Start.md) e [MVC / Razor Pages](../UI/AspNetCore/Overall.md). - -### Itens do Menu - -Este módulo adiciona um item de menu *Gerenciamento de Identidade* no menu *Administração*: - -![identity-module-menu](../images/identity-module-menu.png) - -Os itens do menu e as páginas relacionadas são autorizados. Isso significa que o usuário atual deve ter as permissões relacionadas para torná-los visíveis. A função `admin` (e os usuários com essa função - como o usuário `admin`) já possui essas permissões. Se você deseja habilitar permissões para outras funções/usuários, abra a caixa de diálogo *Permissões* na página *Funções* ou *Usuários* e marque as permissões conforme mostrado abaixo: - -![identity-module-permissions](../images/identity-module-permissions.png) - -Consulte o documento de [Autorização](../Authorization.md) para entender o sistema de permissões. - -### Páginas - -Esta seção apresenta as principais páginas fornecidas por este módulo. - -#### Usuários - -Esta página é usada para ver a lista de usuários. Você pode criar/editar e excluir usuários, atribuir usuários a funções. - -![identity-module-users](../images/identity-module-users.png) - -Um usuário pode ter zero ou mais funções. Os usuários herdam permissões de suas funções. Além disso, você pode atribuir permissões diretamente aos usuários (clicando no botão *Ações*, em seguida, selecionando *Permissões*). - -#### Funções - -As funções são usadas para agrupar permissões e atribuí-las aos usuários. - -![identity-module-roles](../images/identity-module-roles.png) - -Além do nome da função, existem duas propriedades de uma função: - -* `Padrão`: Se uma função for marcada como "padrão", essa função será atribuída aos novos usuários por padrão quando eles se registrarem na aplicação (usando o [Módulo de Conta](Account.md)). -* `Público`: Uma função pública de um usuário pode ser vista por outros usuários na aplicação. Essa funcionalidade não tem uso no módulo de identidade, mas é fornecida como uma funcionalidade que você pode querer usar em sua própria aplicação. - -## Outras Funcionalidades - -Esta seção abrange algumas outras funcionalidades fornecidas por este módulo que não possuem páginas de interface do usuário. - -### Unidades Organizacionais - -As unidades organizacionais (OU) podem ser usadas para agrupar usuários e entidades de forma hierárquica. - -#### Entidade Unidade Organizacional - -Uma OU é representada pela entidade **UnidadeOrganizacional**. As propriedades fundamentais desta entidade são: - -- **TenantId**: Id do locatário desta OU. Pode ser nulo para OUs do host. -- **ParentId**: Id da OU pai. Pode ser nulo se esta for uma OU raiz. -- **Código**: Um código de string hierárquico que é único para um locatário. -- **DisplayName**: Nome exibido da OU. - -#### Árvore de Organização - -Como uma OU pode ter um pai, todas as OUs de um locatário estão em uma estrutura de **árvore**. Existem algumas regras para esta árvore: - -- Pode haver mais de uma raiz (onde o `ParentId` é `null`). -- Há um limite para a contagem de filhos de primeiro nível de uma OU (por causa do comprimento fixo da unidade de código OU explicado abaixo). - -#### Código da OU - -O código da OU é gerado automaticamente e mantido pelo serviço `GerenciadorUnidadeOrganizacional`. É uma string que se parece com isso: - -"**00001.00042.00005**" - -Este código pode ser usado para consultar facilmente o banco de dados para todos os filhos de uma OU (recursivamente). Existem algumas regras para este código (aplicadas automaticamente quando você usa o `GerenciadorUnidadeOrganizacional`): - -- É **único** para um [locatário](../Multi-Tenancy.md). -- Todos os filhos da mesma OU têm códigos que **começam com o código da OU pai**. -- É de **comprimento fixo** e baseado no nível da OU na árvore, conforme mostrado no exemplo. -- Embora o código da OU seja único, ele pode ser **alterado** se você mover a OU relacionada. - -Observe que você deve referenciar uma OU pelo Id, não pelo Código, porque o Código pode ser alterado posteriormente. - -#### Gerenciador de Unidade Organizacional - -A classe `GerenciadorUnidadeOrganizacional` pode ser [injetada](../Dependency-Injection.md) e usada para gerenciar OUs. Casos de uso comuns são: - -- Criar, atualizar ou excluir uma OU -- Mover uma OU na árvore de OUs. -- Obter informações sobre a árvore de OUs e seus itens. - -### Log de Segurança de Identidade - -O sistema de log de segurança registra algumas operações ou alterações importantes em sua conta (como *login* e *alteração de senha*). Você também pode salvar o log de segurança, se necessário. - -Você pode injetar e usar `GerenciadorLogSegurancaIdentidade` ou `IGerenciadorLogSeguranca` para gravar logs de segurança. Ele criará um objeto de log por padrão e preencherá alguns valores comuns, como `CreationTime`, `ClientIpAddress`, `BrowserInfo`, `usuário/locatário atual`, etc. Claro, você pode substituí-los. - -```cs -await GerenciadorLogSegurancaIdentidade.SalvarAsync(new ContextoLogSegurancaIdentidade() -{ - Identidade = "IdentityServer", - Ação = "AlterarSenha" -}); -``` - -Configure `OpcoesLogSegurancaAbp` para fornecer o nome do aplicativo (no caso de você ter várias aplicações e desejar distinguir as aplicações nos logs) para o log ou desativar esse recurso. - -```cs -Configure(opcoes => -{ - opcoes.NomeAplicativo = "AbpSecurityTest"; -}); -``` - -## Opções - -`OpcoesIdentidade` é a classe de [opções](../Options.md) padrão fornecida pela biblioteca de [identidade](https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity) da Microsoft. Portanto, você pode definir essas opções no método `ConfigureServices` da sua classe de [módulo](../Module-Development-Basics.md). - -**Exemplo: Definir o comprimento mínimo necessário das senhas** - -````csharp -Configure(opcoes => -{ - opcoes.Senha.ComprimentoMinimo = 5; -}); -```` - -O ABP leva essas opções um passo adiante e permite que você as altere em tempo de execução usando o [sistema de configurações](../Settings.md). Você pode [injetar](../Dependency-Injection.md) `IGerenciadorConfiguracao` e usar um dos métodos `Set...` para alterar os valores das opções para um usuário, um locatário ou globalmente para todos os usuários. - -**Exemplo: Alterar o comprimento mínimo necessário das senhas para o locatário atual** - -````csharp -public class MeuServico : IDependencyTransient -{ - private readonly IGerenciadorConfiguracao _gerenciadorConfiguracao; - - public MeuServico(IGerenciadorConfiguracao gerenciadorConfiguracao) - { - _gerenciadorConfiguracao = gerenciadorConfiguracao; - } - - public async Task AlterarComprimentoMinSenha(int comprimentoMin) - { - await _gerenciadorConfiguracao.DefinirParaLocatarioAtualAsync( - NomesConfiguracaoIdentidade.Senha.ComprimentoMinimo, - comprimentoMin.ToString() - ); - } -} -```` - -A classe `NomesConfiguracaoIdentidade` (no namespace `Volo.Abp.Identity.Settings`) define constantes para os nomes das configurações. - -## Eventos Distribuídos - -Este módulo define os seguintes ETOs (Event Transfer Objects) para permitir que você se inscreva em alterações nas entidades do módulo; - -* `UserEto` é publicado em alterações feitas em uma entidade `IdentityUser`. -* `IdentityRoleEto` é publicado em alterações feitas em uma entidade `IdentityRole`. -* `IdentityClaimTypeEto` é publicado em alterações feitas em uma entidade `IdentityClaimType`. -* `OrganizationUnitEto` é publicado em alterações feitas em uma entidade `OrganizationUnit`. - -**Exemplo: Ser notificado quando um novo usuário for criado** - -````csharp -public class MeuManipulador : - IManipuladorEventoDistribuido>, - IDependencyTransient -{ - public async Task ManipularEventoAsync(EntityCreatedEto evento) - { - UserEto user = evento.Entity; - // TODO: ... - } -} -```` - -`UserEto` e `IdentityRoleEto` são configurados para publicar automaticamente os eventos. Você deve configurar você mesmo para os outros. Consulte o documento de [Distributed Event Bus](../Distributed-Event-Bus.md) para aprender detalhes dos eventos pré-definidos. - -> A inscrição nos eventos distribuídos é especialmente útil para cenários distribuídos (como arquitetura de microsserviços). Se você está construindo uma aplicação monolítica ou ouvindo eventos no mesmo processo que executa o Módulo de Identidade, então a inscrição nos [eventos locais](../Local-Event-Bus.md) pode ser mais eficiente e fácil. - -## Internos - -Esta seção abrange alguns detalhes internos do módulo que você não precisa muito, mas pode precisar usar em alguns casos. - -### Camada de Domínio - -#### Agregados - -##### Usuário - -Um usuário é geralmente uma pessoa que faz login e usa a aplicação. - -* `IdentityUser` (raiz do agregado): Representa um usuário no sistema. - * `IdentityUserRole` (coleção): Funções do usuário. - * `IdentityUserClaim` (coleção): Reivindicações personalizadas do usuário. - * `IdentityUserLogin` (coleção): Logins externos do usuário. - * `IdentityUserToken` (coleção): Tokens do usuário (usados pelos serviços de identidade da Microsoft). - -##### Função - -Uma função é tipicamente um grupo de permissões para atribuir aos usuários. - -* `IdentityRole` (raiz do agregado): Representa uma função no sistema. - * `IdentityRoleClaim` (coleção): Reivindicações personalizadas da função. - -##### Tipo de Reivindicação - -Um tipo de reivindicação é uma definição de uma reivindicação personalizada que pode ser atribuída a outras entidades (como funções e usuários) no sistema. - -* `IdentityClaimType` (raiz do agregado): Representa uma definição de tipo de reivindicação. Ele contém algumas propriedades (por exemplo, Obrigatório, Regex, Descrição, ValueType) para definir o tipo de reivindicação e as regras de validação. - -##### Log de Segurança de Identidade - -Um objeto `IdentitySecurityLog` representa uma operação relacionada à autenticação (como *login*) no sistema. - -* `IdentitySecurityLog` (raiz do agregado): Representa um log de segurança no sistema. - -##### Unidade Organizacional - -Uma unidade organizacional é uma entidade em uma estrutura hierárquica. - -* ```OrganizationUnit``` (raiz do agregado): Representa uma unidade organizacional no sistema. - * ```Roles``` (coleção): Funções da unidade organizacional. - -#### Repositórios - -Os seguintes repositórios personalizados são definidos para este módulo: - -* `IIdentityUserRepository` -* `IIdentityRoleRepository` -* `IIdentityClaimTypeRepository` -* ```IIdentitySecurityLogRepository``` -* ```IOrganizationUnitRepository``` - -#### Serviços de Domínio - -##### Gerenciador de Usuário - -`IdentityUserManager` é usado para gerenciar usuários, suas funções, reivindicações, senhas, e-mails, etc. Ele é derivado da classe `UserManager` da Microsoft Identity, onde `T` é `IdentityUser`. - -##### Gerenciador de Função - -`IdentityRoleManager` é usado para gerenciar funções e suas reivindicações. Ele é derivado da classe `RoleManager` da Microsoft Identity, onde `T` é `IdentityRole`. - -##### Gerenciador de Tipo de Reivindicação - -`IdenityClaimTypeManager` é usado para realizar algumas operações para a raiz do agregado `IdentityClaimType`. - -##### Gerenciador de Unidade Organizacional - -```OrganizationUnitManager``` é usado para realizar algumas operações para a raiz do agregado ```OrganizationUnit```. - -##### Gerenciador de Log de Segurança - -```IdentitySecurityLogManager``` é usado para salvar logs de segurança. - -### Camada de Aplicação - -#### Serviços de Aplicação - -* `IdentityUserAppService` (implementa `IIdentityUserAppService`): Implementa os casos de uso da interface do usuário de gerenciamento de usuários. -* `IdentityRoleAppService` (implementa `IIdentityRoleAppService`): Implementa os casos de uso da interface do usuário de gerenciamento de funções. -* `IdentityClaimTypeAppService` (implementa `IIdentityClaimTypeAppService`): Implementa os casos de uso da interface do usuário de gerenciamento de tipos de reivindicação. -* `IdentitySettingsAppService` (implementa `IIdentitySettingsAppService`): Usado para obter e atualizar configurações para o módulo de identidade. -* `IdentityUserLookupAppService` (implementa `IIdentityUserLookupAppService`): Usado para obter informações de um usuário por `id` ou `userName`. É destinado a ser usado internamente pelo framework ABP. -* `ProfileAppService` (implementa `IProfileAppService`): Usado para alterar o perfil de um usuário e a senha. -* ```IdentitySecurityLogAppService``` (implementa ```IIdentitySecurityLogAppService```): Implementa os casos de uso da interface do usuário de logs de segurança. -* ```OrganizationUnitAppService``` (implementa ```OrganizationUnitAppService```): Implementa os casos de uso da interface do usuário de gerenciamento de unidades organizacionais. - -### Provedores de Banco de Dados - -Este módulo fornece opções de [Entity Framework Core](../Entity-Framework-Core.md) e [MongoDB](../MongoDB.md) para o banco de dados. - -#### Entity Framework Core - -O pacote NuGet [Volo.Abp.Identity.EntityFrameworkCore](https://www.nuget.org/packages/Volo.Abp.Identity.EntityFrameworkCore) implementa a integração do EF Core. - -##### Tabelas do Banco de Dados - -* **AbpRoles** - * AbpRoleClaims -* **AbpUsers** - * AbpUserClaims - * AbpUserLogins - * AbpUserRoles - * AbpUserTokens -* **AbpClaimTypes** -* **AbpOrganizationUnits** - * AbpOrganizationUnitRoles - * AbpUserOrganizationUnits -* **AbpSecurityLogs** - -#### MongoDB - -O pacote NuGet [Volo.Abp.Identity.MongoDB](https://www.nuget.org/packages/Volo.Abp.Identity.MongoDB) implementa a integração do MongoDB. - -##### Coleções do Banco de Dados - -* **AbpRoles** -* **AbpUsers** -* **AbpClaimTypes** -* **AbpOrganizationUnits** -* **AbpSecurityLogs** - -#### Propriedades Comuns do Banco de Dados - -Você pode definir as seguintes propriedades da classe `AbpIdentityDbProperties` para alterar as opções do banco de dados: - -* `DbTablePrefix` (`Abp` por padrão) é o prefixo para os nomes das tabelas/coleções. -* `DbSchema` (`null` por padrão) é o esquema do banco de dados. -* `ConnectionStringName` (`AbpIdentity` por padrão) é o nome da [string de conexão](../Connection-Strings.md) para este módulo. - -Essas são propriedades estáticas. Se você quiser definir, faça isso no início de sua aplicação (normalmente, em `Program.cs`). \ No newline at end of file diff --git a/docs/pt-BR/Modules/IdentityServer.md b/docs/pt-BR/Modules/IdentityServer.md deleted file mode 100644 index 62e05ceac2..0000000000 --- a/docs/pt-BR/Modules/IdentityServer.md +++ /dev/null @@ -1,175 +0,0 @@ -# Módulo IdentityServer - -O módulo IdentityServer fornece uma integração completa com o framework [IdentityServer4](https://github.com/IdentityServer/IdentityServer4) (IDS), que oferece recursos avançados de autenticação, como logon único e controle de acesso a API. Este módulo persiste clientes, recursos e outros objetos relacionados ao IDS no banco de dados. **Este módulo foi substituído pelo** [módulo OpenIddict](https://docs.abp.io/en/abp/latest/Modules/OpenIddict) após o ABP v6.0 nos modelos de inicialização. - -> Observação: Você não pode usar os módulos IdentityServer e OpenIddict juntos. Eles são bibliotecas separadas de provedor OpenID para a mesma função. - -## Como instalar - -Você não precisa deste módulo quando estiver usando o módulo OpenIddict. No entanto, se você deseja continuar usando o IdentityServer4 para suas aplicações, você pode instalar este módulo e remover o módulo OpenIddict. Você pode continuar a usá-lo como pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando `get-source` [CLI](../CLI.md)) para desenvolver seu módulo personalizado. - -### O código-fonte - -O código-fonte deste módulo pode ser acessado [aqui](https://github.com/abpframework/abp/tree/dev/modules/identityserver). O código-fonte é licenciado com [MIT](https://choosealicense.com/licenses/mit/), então você pode usá-lo e personalizá-lo livremente. - -## Interface do usuário - -Este módulo implementa a lógica de domínio e as integrações com o banco de dados, mas não fornece nenhuma interface do usuário. A interface de gerenciamento é útil se você precisar adicionar clientes e recursos dinamicamente. Nesse caso, você pode construir a interface de gerenciamento por conta própria ou considerar a compra do [ABP Commercial](https://commercial.abp.io/), que fornece a interface de gerenciamento para este módulo. - -## Relações com outros módulos - -Este módulo é baseado no [módulo Identity](Identity.md) e possui um [pacote de integração](https://www.nuget.org/packages/Volo.Abp.Account.Web.IdentityServer) com o [módulo Account](Account.md). - -## Opções - -### AbpIdentityServerBuilderOptions - -`AbpIdentityServerBuilderOptions` pode ser configurado no método `PreConfigureServices` do seu [módulo](https://docs.abp.io/en/abp/latest/Module-Development-Basics) do Identity Server. Exemplo: - -````csharp -public override void PreConfigureServices(ServiceConfigurationContext context) -{ - PreConfigure(builder => - { - // Defina as opções aqui... - }); -} -```` - -Propriedades de `AbpIdentityServerBuilderOptions`: - -* `UpdateJwtSecurityTokenHandlerDefaultInboundClaimTypeMap` (padrão: true): Atualiza `JwtSecurityTokenHandler.DefaultInboundClaimTypeMap` para ser compatível com as reivindicações do Identity Server. -* `UpdateAbpClaimTypes` (padrão: true): Atualiza `AbpClaimTypes` para ser compatível com as reivindicações do Identity Server. -* `IntegrateToAspNetIdentity` (padrão: true): Integra ao ASP.NET Identity. -* `AddDeveloperSigningCredential` (padrão: true): Defina como false para suprimir a chamada AddDeveloperSigningCredential() no IIdentityServerBuilder. - -`IIdentityServerBuilder` pode ser configurado no método `PreConfigureServices` do seu [módulo](https://docs.abp.io/en/abp/latest/Module-Development-Basics) do Identity Server. Exemplo: - -````csharp -public override void PreConfigureServices(ServiceConfigurationContext context) -{ - PreConfigure(builder => - { - builder.AddSigningCredential(...); - }); -} -```` - -## Internos - -### Camada de Domínio - -#### Agregados - -##### ApiResource - -Os recursos da API são necessários para permitir que os clientes solicitem tokens de acesso. - -* `ApiResource` (raiz do agregado): Representa um recurso da API no sistema. - * `ApiSecret` (coleção): segredos do recurso da API. - * `ApiScope` (coleção): escopos do recurso da API. - * `ApiResourceClaim` (coleção): reivindicações do recurso da API. - -##### Client - -Os clientes representam aplicativos que podem solicitar tokens do seu Identity Server. - -* `Client` (raiz do agregado): Representa um aplicativo cliente do Identity Server. - * `ClientScope` (coleção): Escopos do cliente. - * `ClientSecret` (coleção): Segredos do cliente. - * `ClientGrantType` (coleção): Tipos de concessão do cliente. - * `ClientCorsOrigin` (coleção): Origens CORS do cliente. - * `ClientRedirectUri` (coleção): URIs de redirecionamento do cliente. - * `ClientPostLogoutRedirectUri` (coleção): URIs de redirecionamento de logout do cliente. - * `ClientIdPRestriction` (coleção): Restrições de provedor do cliente. - * `ClientClaim` (coleção): Reivindicações do cliente. - * `ClientProperty` (coleção): Propriedades personalizadas do cliente. - -##### PersistedGrant - -Persisted Grants armazena AuthorizationCodes, RefreshTokens e UserConsent. - -* `PersistedGrant` (raiz do agregado): Representa um PersistedGrant para o servidor de identidade. - -##### IdentityResource - -Os recursos de identidade são dados como ID do usuário, nome ou endereço de e-mail de um usuário. - -* `IdentityResource` (raiz do agregado): Representa um recurso de identidade do Identity Server. - * `IdentityClaim` (coleção): Reivindicações do recurso de identidade. - -#### Repositórios - -Os seguintes repositórios personalizados são definidos para este módulo: - -* `IApiResourceRepository` -* `IClientRepository` -* `IPersistentGrantRepository` -* `IIdentityResourceRepository` - -#### Serviços de Domínio - -Este módulo não contém nenhum serviço de domínio, mas substitui os serviços abaixo; - -* `AbpProfileService` (Usado quando `AbpIdentityServerBuilderOptions.IntegrateToAspNetIdentity` é true) -* `AbpClaimsService` -* `AbpCorsPolicyService` - -### Configurações - -Este módulo não define nenhuma configuração. - -### Camada de Aplicação - -#### Serviços de Aplicação - -* `ApiResourceAppService` (implementa `IApiResourceAppService`): Implementa os casos de uso da interface de gerenciamento de recursos da API. -* `IdentityServerClaimTypeAppService` (implementa `IIdentityServerClaimTypeAppService`): Usado para obter a lista de reivindicações. -* `ApiResourceAppService` (implementa `IApiResourceAppService`): Implementa os casos de uso da interface de gerenciamento de recursos da API. -* `IdentityResourceAppService` (implementa `IIdentityResourceAppService`): Implementa os casos de uso da interface de gerenciamento de recursos de identidade. - -### Provedores de Banco de Dados - -#### Comum - -##### Prefixo de Tabela/Collection e Esquema - -Todas as tabelas/collections usam o prefixo `IdentityServer` por padrão. Defina as propriedades estáticas na classe `AbpIdentityServerDbProperties` se você precisar alterar o prefixo da tabela ou definir um nome de esquema (se suportado pelo seu provedor de banco de dados). - -##### String de Conexão - -Este módulo usa `AbpIdentityServer` como nome da string de conexão. Se você não definir uma string de conexão com esse nome, ela será usada a string de conexão `Default`. - -Consulte a documentação sobre [strings de conexão](https://docs.abp.io/en/abp/latest/Connection-Strings) para obter mais detalhes. - -#### Entity Framework Core - -##### Tabelas - -* **IdentityServerApiResources** - * IdentityServerApiSecrets - * IdentityServerApiScopes - * IdentityServerApiScopeClaims - * IdentityServerApiClaims -* **IdentityServerClients** - * IdentityServerClientScopes - * IdentityServerClientSecrets - * IdentityServerClientGrantTypes - * IdentityServerClientCorsOrigins - * IdentityServerClientRedirectUris - * IdentityServerClientPostLogoutRedirectUris - * IdentityServerClientIdPRestrictions - * IdentityServerClientClaims - * IdentityServerClientProperties -* **IdentityServerPersistedGrants** -* **IdentityServerIdentityResources** - * IdentityServerIdentityClaims - -#### MongoDB - -##### Coleções - -* **IdentityServerApiResources** -* **IdentityServerClients** -* **IdentityServerPersistedGrants** -* **IdentityServerIdentityResources** \ No newline at end of file diff --git a/docs/pt-BR/Modules/Index.md b/docs/pt-BR/Modules/Index.md deleted file mode 100644 index 24a7c01169..0000000000 --- a/docs/pt-BR/Modules/Index.md +++ /dev/null @@ -1,32 +0,0 @@ -# Módulos de Aplicação - -ABP é um **framework de aplicação modular** que consiste em dezenas de **pacotes NuGet & NPM**. Ele também fornece uma infraestrutura completa para construir seus próprios módulos de aplicação, que podem ter entidades, serviços, integração de banco de dados, APIs, componentes de interface do usuário, entre outros. - -Existem **dois tipos de módulos**. Eles não têm nenhuma diferença estrutural, mas são categorizados por funcionalidade e propósito: - -* [**Módulos do framework**](https://github.com/abpframework/abp/tree/dev/framework/src): Estes são **módulos principais do framework** como cache, envio de e-mails, temas, segurança, serialização, validação, integração com o EF Core, integração com o MongoDB... etc. Eles não possuem funcionalidades de aplicação/negócio, mas facilitam o desenvolvimento diário fornecendo infraestrutura comum, integração e abstrações. -* [**Módulos de aplicação**](https://github.com/abpframework/abp/tree/dev/modules): Esses módulos implementam funcionalidades específicas de aplicação/negócio, como blogs, gerenciamento de documentos, gerenciamento de identidade, gerenciamento de locatários... etc. Eles geralmente possuem suas próprias entidades, serviços, APIs e componentes de interface do usuário. - -## Módulos de Aplicação de Código Aberto - -Existem alguns módulos de aplicação **gratuitos e de código aberto** desenvolvidos e mantidos como parte do ABP Framework. - -* [**Conta**](Account.md): Fornece uma interface de usuário para o gerenciamento de contas e permite que o usuário faça login/registo na aplicação. -* [**Registro de Auditoria**](Audit-Logging.md): Persiste registros de auditoria em um banco de dados. -* [**Trabalhos em Segundo Plano**](Background-Jobs.md): Persiste trabalhos em segundo plano ao usar o gerenciador de trabalhos em segundo plano padrão. -* [**Kit CMS**](Cms-Kit/Index.md): Um conjunto de recursos reutilizáveis de *Sistema de Gerenciamento de Conteúdo*. -* [**Documentação**](Docs.md): Usado para criar um site de documentação técnica. A própria documentação do ABP já utiliza este módulo. -* [**Gerenciamento de Recursos**](Feature-Management.md): Usado para persistir e gerenciar os [recursos](../Features.md). -* **[Identidade](Identity.md)**: Gerencia unidades organizacionais, funções, usuários e suas permissões, com base na biblioteca Microsoft Identity. -* [**IdentityServer**](IdentityServer.md): Integra-se ao IdentityServer4. -* [**OpenIddict**](OpenIddict.md): Integra-se ao OpenIddict. -* [**Gerenciamento de Permissões**](Permission-Management.md): Usado para persistir permissões. -* **[Gerenciamento de Configurações](Setting-Management.md)**: Usado para persistir e gerenciar as [configurações](../Settings.md). -* [**Gerenciamento de Locatários**](Tenant-Management.md): Gerencia locatários para uma aplicação [multi-locatário](../Multi-Tenancy.md). -* [**Explorador de Arquivos Virtuais**](Virtual-File-Explorer.md): Fornece uma interface de usuário simples para visualizar arquivos em um [sistema de arquivos virtual](../Virtual-File-System.md). - -Veja [o repositório do GitHub](https://github.com/abpframework/abp/tree/dev/modules) para o código-fonte de todos os módulos. - -## Módulos de Aplicação Comerciais - -A licença [ABP Commercial](https://commercial.abp.io/) fornece **módulos de aplicação pré-construídos adicionais** em cima do framework ABP. Veja a [lista de módulos](https://commercial.abp.io/modules) fornecida pelo ABP Commercial. \ No newline at end of file diff --git a/docs/pt-BR/Modules/OpenIddict.md b/docs/pt-BR/Modules/OpenIddict.md deleted file mode 100644 index f19b77db5e..0000000000 --- a/docs/pt-BR/Modules/OpenIddict.md +++ /dev/null @@ -1,514 +0,0 @@ -## Módulo ABP OpenIddict - -O módulo OpenIddict fornece uma integração com o [OpenIddict](https://github.com/openiddict/openiddict-core), que oferece recursos avançados de autenticação, como logon único, logoff único e controle de acesso à API. Este módulo persiste aplicativos, escopos e outros objetos relacionados ao OpenIddict no banco de dados. - -## Como instalar - -Este módulo já vem pré-instalado (como pacotes NuGet/NPM). Você pode continuar a usá-lo como um pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando `get-source` [CLI](../CLI.md)) para desenvolver seu próprio módulo personalizado. - -### O código-fonte - -O código-fonte deste módulo pode ser acessado [aqui](https://github.com/abpframework/abp/tree/dev/modules/openiddict). O código-fonte é licenciado pela [MIT](https://choosealicense.com/licenses/mit/), portanto, você pode usá-lo e personalizá-lo livremente. - -## Interface do usuário - -Este módulo implementa a lógica de domínio e as integrações com o banco de dados, mas não fornece nenhuma interface do usuário. A interface de gerenciamento é útil se você precisar adicionar aplicativos e escopos dinamicamente. Nesse caso, você pode construir a interface de gerenciamento por conta própria ou considerar a compra do [ABP Commercial](https://commercial.abp.io/), que fornece a interface de gerenciamento para este módulo. - -## Relações com outros módulos - -Este módulo é baseado no [Módulo de Identidade](Identity.md) e possui um [pacote de integração](https://www.nuget.org/packages/Volo.Abp.Account.Web.OpenIddict) com o [Módulo de Conta](Account.md). - -## Opções - -### OpenIddictBuilder - -O `OpenIddictBuilder` pode ser configurado no método `PreConfigureServices` do seu [módulo](https://docs.abp.io/en/abp/latest/Module-Development-Basics) OpenIddict. - -Exemplo: - -```csharp -public override void PreConfigureServices(ServiceConfigurationContext context) -{ - PreConfigure(builder => - { - // Defina as opções aqui... - }); -} -``` - -O `OpenIddictBuilder` contém vários métodos de extensão para configurar os serviços do OpenIddict: - -- `AddServer()` registra os serviços do servidor de token OpenIddict no contêiner de DI. Contém as configurações do `OpenIddictServerBuilder`. -- `AddCore()` registra os serviços principais do OpenIddict no contêiner de DI. Contém as configurações do `OpenIddictCoreBuilder`. -- `AddValidation()` registra os serviços de validação de token OpenIddict no contêiner de DI. Contém as configurações do `OpenIddictValidationBuilder`. - -### OpenIddictCoreBuilder - -O `OpenIddictCoreBuilder` contém métodos de extensão para configurar os serviços principais do OpenIddict. - -Exemplo: - -```csharp -public override void PreConfigureServices(ServiceConfigurationContext context) -{ - PreConfigure(builder => - { - // Defina as opções aqui... - }); -} -``` - -Esses serviços contêm: - -- Adição de `ApplicationStore`, `AuthorizationStore`, `ScopeStore`, `TokenStore`. -- Substituição de `ApplicationManager`, `AuthorizationManager`, `ScopeManager`, `TokenManager`. -- Substituição de `ApplicationStoreResolver`, `AuthorizationStoreResolver`, `ScopeStoreResolver`, `TokenStoreResolver`. -- Definição de `DefaultApplicationEntity`, `DefaultAuthorizationEntity`, `DefaultScopeEntity`, `DefaultTokenEntity`. - -### OpenIddictServerBuilder - -O `OpenIddictServerBuilder` contém métodos de extensão para configurar os serviços do servidor OpenIddict. - -Exemplo: - -```csharp -public override void PreConfigureServices(ServiceConfigurationContext context) -{ - PreConfigure(builder => - { - // Defina as opções aqui... - }); -} -``` - -Esses serviços contêm: - -- Registro de claims, escopos. -- Definição do URI `Issuer` que é usado como endereço base para os URIs de endpoint retornados pelo endpoint de descoberta. -- Adição de chaves de assinatura de desenvolvimento, chaves de criptografia/assinatura, credenciais e certificados. -- Adição/remoção de manipuladores de eventos. -- Habilitação/desabilitação de tipos de concessão. -- Definição de URIs de endpoint do servidor de autenticação. - -### OpenIddictValidationBuilder - -O `OpenIddictValidationBuilder` contém métodos de extensão para configurar os serviços de validação do OpenIddict. - -Exemplo: - -```csharp -public override void PreConfigureServices(ServiceConfigurationContext context) -{ - PreConfigure(builder => - { - // Defina as opções aqui... - }); -} -``` - -Esses serviços contêm: - -- `AddAudiences()` para servidores de recursos. -- `SetIssuer()` define o URI usado para determinar a localização real do documento de configuração do OAuth 2.0/OpenID Connect ao usar a descoberta do provedor. -- `SetConfiguration()` para configurar `OpenIdConnectConfiguration`. -- `UseIntrospection()` para usar a introspecção em vez da validação local/direta. -- Adição de chave de criptografia, credenciais e certificados. -- Adição/remoção de manipuladores de eventos. -- `SetClientId()` para definir o identificador do cliente `client_id` ao se comunicar com o servidor de autorização remoto (por exemplo, para introspecção). -- `SetClientSecret()` para definir o identificador `client_secret` ao se comunicar com o servidor de autorização remoto (por exemplo, para introspecção). -- `EnableAuthorizationEntryValidation()` para habilitar a validação de autorização para garantir que o `access token` ainda seja válido fazendo uma chamada ao banco de dados para cada solicitação da API. *Observação:* Isso pode ter um impacto negativo no desempenho e só pode ser usado com um servidor de autorização baseado no OpenIddict. -- `EnableTokenEntryValidation()` para habilitar a validação de autorização para garantir que o `access token` ainda seja válido fazendo uma chamada ao banco de dados para cada solicitação da API. *Observação:* Isso pode ter um impacto negativo no desempenho e é necessário quando o servidor OpenIddict está configurado para usar tokens de referência. -- `UseLocalServer()` para registrar os serviços de integração de validação/servidor OpenIddict. -- `UseAspNetCore()` para registrar os serviços de validação do OpenIddict para o ASP.NET Core no contêiner de DI. - -## Internos - -### Camada de Domínio - -#### Agregados - -##### OpenIddictApplication - -OpenIddictApplications representam os aplicativos que podem solicitar tokens do seu servidor OpenIddict. - -- `OpenIddictApplications` (raiz do agregado): Representa um aplicativo OpenIddict. - - `ClientId` (string): O identificador do cliente associado ao aplicativo atual. - - `ClientSecret` (string): O segredo do cliente associado ao aplicativo atual. Pode ser criptografado ou hash para fins de segurança. - - `ConsentType` (string): O tipo de consentimento associado ao aplicativo atual. - - `DisplayName` (string): O nome de exibição associado ao aplicativo atual. - - `DisplayNames` (string): Os nomes de exibição localizados associados ao aplicativo atual serializados como um objeto JSON. - - `Permissions` (string): As permissões associadas ao aplicativo atual, serializadas como um array JSON. - - `PostLogoutRedirectUris` (string): As URLs de retorno de chamada de logoff associadas ao aplicativo atual, serializadas como um array JSON. - - `Properties` (string): As propriedades adicionais associadas ao aplicativo atual serializadas como um objeto JSON ou nulo. - - `RedirectUris` (string): As URLs de retorno de chamada associadas ao aplicativo atual, serializadas como um array JSON. - - `Requirements` (string): Os requisitos associados ao aplicativo atual. - - `Type` (string): O tipo de aplicativo associado ao aplicativo atual. - - `ClientUri` (string): URI para obter mais informações sobre o cliente. - - `LogoUri` (string): URI para o logotipo do cliente. - -##### OpenIddictAuthorization - -OpenIddictAuthorizations são usadas para manter os escopos permitidos e os tipos de fluxo de autorização. - -- `OpenIddictAuthorization` (raiz do agregado): Representa uma autorização OpenIddict. - - - `ApplicationId` (Guid?): O aplicativo associado à autorização atual. - - - `Properties` (string): As propriedades adicionais associadas à autorização atual serializadas como um objeto JSON ou nulo. - - - `Scopes` (string): Os escopos associados à autorização atual, serializados como um array JSON. - - - `Status` (string): O status da autorização atual. - - - `Subject` (string): O assunto associado à autorização atual. - - - `Type` (string): O tipo da autorização atual. - -##### OpenIddictScope - -OpenIddictScopes são usados para manter os escopos dos recursos. - -- `OpenIddictScope` (raiz do agregado): Representa um escopo OpenIddict. - - - `Description` (string): A descrição pública associada ao escopo atual. - - - `Descriptions` (string): As descrições públicas localizadas associadas ao escopo atual, serializadas como um objeto JSON. - - - `DisplayName` (string): O nome de exibição associado ao escopo atual. - - - `DisplayNames` (string): Os nomes de exibição localizados associados ao escopo atual serializados como um objeto JSON. - - - `Name` (string): O nome único associado ao escopo atual. - - `Properties` (string): As propriedades adicionais associadas ao escopo atual serializadas como um objeto JSON ou nulo. - - `Resources` (string): Os recursos associados ao escopo atual, serializados como um array JSON. - -##### OpenIddictToken - -OpenIddictTokens são usados para persistir os tokens do aplicativo. - -- `OpenIddictToken` (raiz do agregado): Representa um token OpenIddict. - - - `ApplicationId` (Guid?): O aplicativo associado ao token atual. - - `AuthorizationId` (Guid?): A autorização associada ao token atual. - - `CreationDate` (DateTime?): A data de criação UTC do token atual. - - `ExpirationDate` (DateTime?): A data de expiração UTC do token atual. - - `Payload` (string): O payload do token atual, se aplicável. Usado apenas para tokens de referência e pode ser criptografado por motivos de segurança. - - - `Properties` (string): As propriedades adicionais associadas ao token atual serializadas como um objeto JSON ou nulo. - - `RedemptionDate` (DateTime?): A data de resgate UTC do token atual. - - `Status` (string): O status da autorização atual. - - - `ReferenceId` (string): O identificador de referência associado ao token atual, se aplicável. Usado apenas para tokens de referência e pode ser criptografado ou hash por motivos de segurança. - - - `Status` (string): O status do token atual. - - - `Subject` (string): O assunto associado ao token atual. - - - `Type` (string): O tipo do token atual. - -#### Armazenamentos - -Este módulo implementa os armazenamentos do OpenIddict: - -- `IAbpOpenIdApplicationStore` -- `IOpenIddictAuthorizationStore` -- `IOpenIddictScopeStore` -- `IOpenIddictTokenStore` - -#### AbpOpenIddictStoreOptions - -Você pode configurar o `PruneIsolationLevel/DeleteIsolationLevel` do `AbpOpenIddictStoreOptions` para definir o nível de isolamento para as operações de armazenamento, pois diferentes bancos de dados têm diferentes níveis de isolamento. - -##### Repositórios - -Os seguintes repositórios personalizados são definidos neste módulo: - -- `IOpenIddictApplicationRepository` -- `IOpenIddictAuthorizationRepository` -- `IOpenIddictScopeRepository` -- `IOpenIddictTokenRepository` - -##### Serviços de Domínio - -Este módulo não contém nenhum serviço de domínio, mas substitui o serviço abaixo: - -- `AbpApplicationManager` usado para popular/obter informações do `AbpApplicationDescriptor` que contém `ClientUri` e `LogoUri`. - -### Provedores de Banco de Dados - -#### Comum - -##### Prefixo de Tabela/Collection e Esquema - -Todas as tabelas/collections usam o prefixo `OpenIddict` por padrão. Defina as propriedades estáticas na classe `AbpOpenIddictDbProperties` se você precisar alterar o prefixo da tabela ou definir um nome de esquema (se suportado pelo seu provedor de banco de dados). - -##### String de Conexão - -Este módulo usa `AbpOpenIddict` como nome da string de conexão. Se você não definir uma string de conexão com esse nome, ela será usada a string de conexão `Default`. - -Consulte a documentação sobre [strings de conexão](https://docs.abp.io/en/abp/latest/Connection-Strings) para obter detalhes. - -#### Entity Framework Core - -##### Tabelas - -- **OpenIddictApplications** -- **OpenIddictAuthorizations** -- **OpenIddictScopes** -- **OpenIddictTokens** - -#### MongoDB - -##### Coleções - -- **OpenIddictApplications** -- **OpenIddictAuthorizations** -- **OpenIddictScopes** -- **OpenIddictTokens** - -## Módulo ASP.NET Core - -Este módulo integra o ASP.NET Core, com controladores MVC embutidos para quatro protocolos. Ele usa o modo de passagem do OpenIddict [Pass-through mode](https://documentation.openiddict.com/guides/index.html#pass-through-mode). - -```cs -AuthorizeController -> connect/authorize -TokenController -> connect/token -LogoutController -> connect/logout -UserInfoController -> connect/userinfo -``` - -> A implementação do **fluxo de dispositivo** será feita no módulo comercial. - -#### AbpOpenIddictAspNetCoreOptions - -`AbpOpenIddictAspNetCoreOptions` pode ser configurado no método `PreConfigureServices` do seu [módulo](https://docs.abp.io/en/abp/latest/Module-Development-Basics) OpenIddict. - -Exemplo: - -```csharp -PreConfigure(options => -{ - // Defina as opções aqui... -}); -``` - -Propriedades do `AbpOpenIddictAspNetCoreOptions`: - -- `UpdateAbpClaimTypes(default: true)`: Atualiza `AbpClaimTypes` para ser compatível com as reivindicações do Openiddict. -- `AddDevelopmentEncryptionAndSigningCertificate(default: true)`: Registra (e gera, se necessário) um certificado de criptografia/assinatura de desenvolvimento específico do usuário. Este é um certificado usado para assinar e criptografar os tokens e apenas para **ambiente de desenvolvimento**. Você deve defini-lo como **false** para ambientes não de desenvolvimento. - -> `AddDevelopmentEncryptionAndSigningCertificate` não pode ser usado em aplicativos implantados no IIS ou no Azure App Service: tentar usá-los no IIS ou no Azure App Service resultará em uma exceção lançada em tempo de execução (a menos que o pool de aplicativos esteja configurado para carregar um perfil de usuário). Para evitar isso, considere criar certificados autoassinados e armazená-los no repositório de certificados X.509 da(s) máquina(s) host. Consulte: https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html#registering-a-development-certificate - -#### Removendo automaticamente Tokens/Autorizações Órfãs - -A tarefa em segundo plano que remove automaticamente tokens/autorizações órfãs pode ser configurada por `TokenCleanupOptions`. - -`TokenCleanupOptions` pode ser configurado no método `ConfigureServices` do seu [módulo](https://docs.abp.io/en/abp/latest/Module-Development-Basics) OpenIddict. - -Exemplo: - -```csharp -Configure(options => -{ - // Defina as opções aqui... -}); -``` - -Propriedades do `TokenCleanupOptions`: - -- `IsCleanupEnabled` (padrão: true): Habilita/desabilita a limpeza de token. -- `CleanupPeriod` (padrão: 3.600.000 ms): Define o período de limpeza. -- `DisableAuthorizationPruning`: Define um booleano indicando se a poda de autorizações deve ser desabilitada. -- `DisableTokenPruning`: Define um booleano indicando se a poda de tokens deve ser desabilitada. -- `MinimumAuthorizationLifespan` (padrão: 14 dias): Define a vida útil mínima que as autorizações devem ter para serem podadas. Não pode ser inferior a 10 minutos. -- `MinimumTokenLifespan` (padrão: 14 dias): Define a vida útil mínima que os tokens devem ter para serem podados. Não pode ser inferior a 10 minutos. - -#### Atualizando Reivindicações em Access_token e Id_token - -[Claims Principal Factory](https://docs.abp.io/en/abp/latest/Authorization#claims-principal-factory) pode ser usado para adicionar/remover reivindicações ao `ClaimsPrincipal`. - -O serviço `AbpDefaultOpenIddictClaimsPrincipalHandler` adicionará tipos de reivindicações `Name`, `Email` e `Role` ao `access_token` e `id_token`, outras reivindicações são adicionadas apenas ao `access_token` por padrão e remove a reivindicação secreta `SecurityStampClaimType` do `Identity`. - -Crie um serviço que herde de `IAbpOpenIddictClaimsPrincipalHandler` e adicione-o ao DI para controlar totalmente os destinos das reivindicações. - -```cs -public class MyClaimDestinationsHandler : IAbpOpenIddictClaimsPrincipalHandler, ITransientDependency -{ - public virtual Task HandleAsync(AbpOpenIddictClaimsPrincipalHandlerContext context) - { - foreach (var claim in context.Principal.Claims) - { - if (claim.Type == MyClaims.MyClaimsType) - { - claim.SetDestinations(OpenIddictConstants.Destinations.AccessToken, OpenIddictConstants.Destinations.IdentityToken); - } - - if (claim.Type == MyClaims.MyClaimsType2) - { - claim.SetDestinations(OpenIddictConstants.Destinations.AccessToken); - } - } - - return Task.CompletedTask; - } -} - -Configure(options => -{ - options.ClaimsPrincipalHandlers.Add(); -}); -``` - -Para obter informações detalhadas, consulte: [OpenIddict claim destinations](https://documentation.openiddict.com/configuration/claim-destinations.html) - -#### Desabilitar a Criptografia do AccessToken - -O ABP desabilita a `criptografia do access token` por padrão para compatibilidade, mas pode ser habilitada manualmente, se necessário. - -```cs -public override void PreConfigureServices(ServiceConfigurationContext context) -{ - PreConfigure(builder => - { - builder.Configure(options => options.DisableAccessTokenEncryption = false); - }); -} -``` - -https://documentation.openiddict.com/configuration/token-formats.html#disabling-jwt-access-token-encryption - -### Processo de Solicitação/Resposta - -O `OpenIddict.Server.AspNetCore` adiciona um esquema de autenticação (`Name: OpenIddict.Server.AspNetCore, handler: OpenIddictServerAspNetCoreHandler`) e implementa a interface `IAuthenticationRequestHandler`. - -Ele será executado primeiro no `AuthenticationMiddleware` e pode interromper o processamento da solicitação atual. Caso contrário, o `DefaultAuthenticateScheme` será chamado e continuará a executar o pipeline. - -O `OpenIddictServerAspNetCoreHandler` chamará vários manipuladores embutidos (manipulando solicitações e respostas) e o manipulador processará de acordo com o contexto ou ignorará a lógica que não tem relação com ele. - -Exemplo de uma solicitação de token: - -``` -POST /connect/token HTTP/1.1 -Content-Type: application/x-www-form-urlencoded - - grant_type=password& - client_id=AbpApp& - client_secret=1q2w3e*& - username=admin& - password=1q2w3E*& - scope=AbpAPI offline_access -``` - -Esta solicitação será processada por vários manipuladores. Eles confirmarão o tipo de endpoint da solicitação, verificarão `HTTP/HTTPS`, verificarão se os parâmetros da solicitação (`client, scope`, etc.) são válidos e existem no banco de dados, etc. Várias verificações de protocolo. E construir um objeto `OpenIddictRequest`, Se houver erros, o conteúdo da resposta pode ser definido e interromper diretamente a solicitação atual. - -Se tudo estiver ok, a solicitação irá para nosso controlador de processamento (por exemplo, `TokenController`), podemos obter um `OpenIddictRequest` da solicitação HTTP neste momento. O restante será baseado neste objeto. - -Verifique o `username` e `password` na solicitação. Se estiver correto, crie um objeto `ClaimsPrincipal` e retorne um `SignInResult`, que usa o nome do esquema de autenticação `OpenIddict.Validation.AspNetCore`, chamará o `OpenIddictServerAspNetCoreHandler` para processamento. - -O `OpenIddictServerAspNetCoreHandler` fará algumas verificações para gerar json e substituir o conteúdo da resposta HTTP. - -O `ForbidResult` `ChallengeResult` são todos os tipos de processamento acima. - -Se você precisar personalizar o OpenIddict, será necessário substituir/excluir/adicionar novos manipuladores e fazer com que ele seja executado na ordem correta. - -Consulte: https://documentation.openiddict.com/guides/index.html#events-model - -### PKCE - -https://documentation.openiddict.com/configuration/proof-key-for-code-exchange.html - -### Definindo o Tempo de Vida dos Tokens - -Atualize o método `PreConfigureServices` do arquivo AuthServerModule (ou HttpApiHostModule se você não tiver um servidor de autenticação separado) : - -```csharp -PreConfigure(builder => -{ - builder.SetAuthorizationCodeLifetime(TimeSpan.FromMinutes(30)); - builder.SetAccessTokenLifetime(TimeSpan.FromMinutes(30)); - builder.SetIdentityTokenLifetime(TimeSpan.FromMinutes(30)); - builder.SetRefreshTokenLifetime(TimeSpan.FromDays(14)); -}); -``` - -### Token de Atualização - -Para usar o token de atualização, ele deve ser suportado pelo OpenIddictServer e o `refresh_token` deve ser solicitado pelo aplicativo. - -> **Observação:** O aplicativo Angular já está configurado para usar o `refresh_token`. - -#### Configurando o OpenIddictServer - -Atualize o **OpenIddictDataSeedContributor**, adicione `OpenIddictConstants.GrantTypes.RefreshToken` aos tipos de concessão no método `CreateApplicationAsync`: - -```csharp -await CreateApplicationAsync( - ... - grantTypes: new List //Fluxo híbrido - { - OpenIddictConstants.GrantTypes.AuthorizationCode, - OpenIddictConstants.GrantTypes.Implicit, - OpenIddictConstants.GrantTypes.RefreshToken, - }, - ... -``` - -> **Observação:** Você precisa recriar esse cliente se já tiver gerado o banco de dados. - -#### Configurando o Aplicativo: - -Você precisa solicitar o escopo **offline_access** para poder receber o `refresh_token`. - -Nos aplicativos **Razor/MVC, Blazor-Server**, adicione `options.Scope.Add("offline_access");` às opções **OpenIdConnect**. Esses modelos de aplicativo usam autenticação por cookie por padrão e têm as opções de expiração do cookie definidas como: - -```csharp -.AddCookie("Cookies", options => -{ - options.ExpireTimeSpan = TimeSpan.FromDays(365); -}) -``` - -[Cookie ExpireTimeSpan ignorará a expiração do access_token](https://learn.microsoft.com/en-us/dotnet/api/Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions.ExpireTimeSpan?view=aspnetcore-7.0&viewFallbackFrom=net-7.0) e o access_token expirado ainda será válido se for definido com um valor maior que o `refresh_token lifetime`. É recomendável manter o **Cookie ExpireTimeSpan** e o **Refresh Token lifetime** iguais, para que o novo token seja persistido no cookie. - -Nos aplicativos **Blazor wasm**, adicione `options.ProviderOptions.DefaultScopes.Add("offline_access");` às opções **AddOidcAuthentication**. - -Nos aplicativos **Angular**, adicione `offline_access` aos escopos **oAuthConfig** no arquivo *environment.ts*. (Os aplicativos Angular já têm essa configuração). - -## Sobre a localização - -Não localizamos nenhuma mensagem de erro no módulo OpenIddict, porque a especificação OAuth 2.0 restringe o conjunto de caracteres que você pode usar para os parâmetros de erro e error_description: - -> A.7. "error" Syntax -> O elemento "error" é definido nas Seções 4.1.2.1, 4.2.2.1, 5.2, 7.2 e 8.5: - -``` -error = 1*NQSCHAR -``` - -> A.8. "error_description" Syntax -> O elemento "error_description" é definido nas Seções 4.1.2.1, 4.2.2.1, 5.2 e 7.2: - -``` -error-description = 1*NQSCHAR -NQSCHAR = %x20-21 / %x23-5B / %x5D-7E -``` - -## Projetos de demonstração - -No diretório `app` do módulo, existem seis projetos (incluindo `angular`) - -* `OpenIddict.Demo.Server`: Um aplicativo abp com módulos integrados (possui dois `clientes` e um `escopo`). -* `OpenIddict.Demo.API`: Aplicativo ASP NET Core API usando autenticação JwtBearer. -* `OpenIddict.Demo.Client.Mvc`: Aplicativo ASP NET Core MVC usando `OpenIdConnect` para autenticação. -* `OpenIddict.Demo.Client.Console`: Use `IdentityModel` para testar os vários endpoints do OpenIddict e chamar a API do `OpenIddict.Demo.API`. -* `OpenIddict.Demo.Client.BlazorWASM:` Aplicativo Blazor ASP NET Core usando `OidcAuthentication` para autenticação. -* `angular`: Um aplicativo angular que integra os módulos abp ng e usa oauth para autenticação. - -#### Como executar? - -Confirme a string de conexão do `appsettings.json` no projeto `OpenIddict.Demo.Server`. A execução do projeto criará automaticamente o banco de dados e inicializará os dados. -Após executar o projeto `OpenIddict.Demo.API`, você pode executar o restante dos projetos para testar. - -## Guia de Migração - -[Guia de Migração Passo a Passo do IdentityServer para o OpenIddict](../Migration-Guides/OpenIddict-Step-by-Step.md) \ No newline at end of file diff --git a/docs/pt-BR/Modules/Permission-Management.md b/docs/pt-BR/Modules/Permission-Management.md deleted file mode 100644 index ff3071c4db..0000000000 --- a/docs/pt-BR/Modules/Permission-Management.md +++ /dev/null @@ -1,109 +0,0 @@ -# Módulo de Gerenciamento de Permissões - -Este módulo implementa o `IPermissionStore` para armazenar e gerenciar valores de permissões em um banco de dados. - -> Este documento aborda apenas o módulo de gerenciamento de permissões que persiste os valores de permissão em um banco de dados. Consulte o documento de [Autorização](../Authorization.md) para entender os sistemas de autorização e permissão. - -## Como Instalar - -Este módulo já vem pré-instalado (como pacotes NuGet/NPM). Você pode continuar a usá-lo como pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando `get-source` da [CLI](../CLI.md)) para desenvolver seu próprio módulo personalizado. - -### O Código-fonte - -O código-fonte deste módulo pode ser acessado [aqui](https://github.com/abpframework/abp/tree/dev/modules/permission-management). O código-fonte é licenciado com a licença [MIT](https://choosealicense.com/licenses/mit/), portanto, você pode usá-lo e personalizá-lo livremente. - -## Interface do Usuário - -### Diálogo de Gerenciamento de Permissões - -O módulo de gerenciamento de permissões fornece um diálogo reutilizável para gerenciar permissões relacionadas a um objeto. Por exemplo, o [Módulo de Identidade](Identity.md) o utiliza para gerenciar as permissões de usuários e funções. A imagem a seguir mostra a página de Gerenciamento de Funções do Módulo de Identidade: - -![permissions-module-open-dialog](../images/permissions-module-open-dialog.png) - -Quando você clica em *Ações* -> *Permissões* para uma função, o diálogo de gerenciamento de permissões é aberto. Uma captura de tela de exemplo deste diálogo: - -![permissions-module-dialog](../images/permissions-module-dialog.png) - -Neste diálogo, você pode conceder permissões para a função selecionada. As abas no lado esquerdo representam os principais grupos de permissões e o lado direito contém as permissões definidas no grupo selecionado. - -## IPermissionManager - -`IPermissionManager` é o serviço principal fornecido por este módulo. Ele é usado para ler e alterar os valores de permissão. `IPermissionManager` é normalmente usado pelo *Diálogo de Gerenciamento de Permissões*. No entanto, você pode injetá-lo se precisar definir um valor de permissão. - -> Se você apenas deseja ler/verificar os valores de permissão para o usuário atual, use o `IAuthorizationService` ou o atributo `[Authorize]`, conforme explicado no documento de [Autorização](../Authorization.md). - -**Exemplo: Conceder permissões para funções e usuários usando o serviço `IPermissionManager`** - -````csharp -public class MeuServico : ITransientDependency -{ - private readonly IPermissionManager _permissionManager; - - public MeuServico(IPermissionManager permissionManager) - { - _permissionManager = permissionManager; - } - - public async Task ConcederPermissaoParaFuncaoDemoAsync( - string nomeFuncao, string permissao) - { - await _permissionManager - .SetForRoleAsync(nomeFuncao, permissao, true); - } - - public async Task ConcederPermissaoParaUsuarioDemoAsync( - Guid idUsuario, string nomeFuncao, string permissao) - { - await _permissionManager - .SetForUserAsync(idUsuario, permissao, true); - } -} -```` - -## Provedores de Gerenciamento de Permissões - -O Módulo de Gerenciamento de Permissões é extensível, assim como o [sistema de permissões](../Authorization.md). Você pode estendê-lo definindo provedores de gerenciamento de permissões. - -O [Módulo de Identidade](Identity.md) define os seguintes provedores de gerenciamento de permissões: - -* `UserPermissionManagementProvider`: Gerencia permissões baseadas em usuários. -* `RolePermissionManagementProvider`: Gerencia permissões baseadas em funções. - -`IPermissionManager` usa esses provedores quando você obtém/define permissões. Você pode definir seu próprio provedor implementando o `IPermissionManagementProvider` ou herdando da classe base `PermissionManagementProvider`. - -**Exemplo:** - -````csharp -public class CustomPermissionManagementProvider : PermissionManagementProvider -{ - public override string Name => "Custom"; - - public CustomPermissionManagementProvider( - IPermissionGrantRepository permissionGrantRepository, - IGuidGenerator guidGenerator, - ICurrentTenant currentTenant) - : base( - permissionGrantRepository, - guidGenerator, - currentTenant) - { - } -} -```` - -A classe base `PermissionManagementProvider` faz a implementação padrão (usando o `IPermissionGrantRepository`) para você. Você pode substituir os métodos base conforme necessário. Cada provedor deve ter um nome exclusivo, que é `Custom` neste exemplo (mantenha-o curto, pois ele é salvo no banco de dados para cada registro de valor de permissão). - -Depois de criar sua classe de provedor, você deve registrá-la usando a classe de opções `PermissionManagementOptions` [options class](../Options.md): - -````csharp -Configure(options => -{ - options.ManagementProviders.Add(); -}); -```` - -A ordem dos provedores é importante. Os provedores são executados na ordem inversa. Isso significa que o `CustomPermissionManagementProvider` é executado primeiro neste exemplo. Você pode inserir seu provedor em qualquer ordem na lista `Providers`. - -## Veja também - -* [Autorização](../Authorization.md) \ No newline at end of file diff --git a/docs/pt-BR/Modules/Setting-Management.md b/docs/pt-BR/Modules/Setting-Management.md deleted file mode 100644 index 5cfde745b9..0000000000 --- a/docs/pt-BR/Modules/Setting-Management.md +++ /dev/null @@ -1,313 +0,0 @@ -# Módulo de Gerenciamento de Configurações - -O Módulo de Gerenciamento de Configurações implementa a interface `ISettingStore` (consulte [o sistema de configurações](../Settings.md)) para armazenar os valores das configurações em um banco de dados e fornece a interface `ISettingManager` para gerenciar (alterar) os valores das configurações no banco de dados. - -> O módulo de Gerenciamento de Configurações já está instalado e configurado nos [modelos de inicialização](../Startup-Templates/Index.md). Portanto, na maioria das vezes, você não precisa adicionar manualmente este módulo à sua aplicação. - -## ISettingManager - -`ISettingManager` é usado para obter e definir os valores das configurações. Exemplos: - -````csharp -using System; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; -using Volo.Abp.SettingManagement; - -namespace Demo -{ - public class MyService : ITransientDependency - { - private readonly ISettingManager _settingManager; - - // Injeta o serviço ISettingManager - public MyService(ISettingManager settingManager) - { - _settingManager = settingManager; - } - - public async Task FooAsync() - { - Guid user1Id = ...; - Guid tenant1Id = ...; - - // Obtém/define um valor de configuração para o usuário atual ou para o usuário especificado - - string layoutType1 = - await _settingManager.GetOrNullForCurrentUserAsync("App.UI.LayoutType"); - string layoutType2 = - await _settingManager.GetOrNullForUserAsync("App.UI.LayoutType", user1Id); - - await _settingManager.SetForCurrentUserAsync("App.UI.LayoutType", "LeftMenu"); - await _settingManager.SetForUserAsync(user1Id, "App.UI.LayoutType", "LeftMenu"); - - // Obtém/define um valor de configuração para o locatário atual ou para o locatário especificado - - string layoutType3 = - await _settingManager.GetOrNullForCurrentTenantAsync("App.UI.LayoutType"); - string layoutType4 = - await _settingManager.GetOrNullForTenantAsync("App.UI.LayoutType", tenant1Id); - - await _settingManager.SetForCurrentTenantAsync("App.UI.LayoutType", "LeftMenu"); - await _settingManager.SetForTenantAsync(tenant1Id, "App.UI.LayoutType", "LeftMenu"); - - // Obtém/define um valor de configuração global e padrão - - string layoutType5 = - await _settingManager.GetOrNullGlobalAsync("App.UI.LayoutType"); - string layoutType6 = - await _settingManager.GetOrNullDefaultAsync("App.UI.LayoutType"); - - await _settingManager.SetGlobalAsync("App.UI.LayoutType", "TopMenu"); - } - } -} - -```` - -Portanto, você pode obter ou definir um valor de configuração para diferentes provedores de valores de configuração (Padrão, Global, Usuário, Locatário... etc). - -> Use a interface `ISettingProvider` em vez da `ISettingManager` se você apenas precisa ler os valores das configurações, pois ela implementa o cache e suporta todos os cenários de implantação. Você pode usar a `ISettingManager` se estiver criando uma interface de gerenciamento de configurações. - -### Cache de Configurações - -Os valores das configurações são armazenados em cache usando o sistema de [cache distribuído](../Caching.md). Sempre use o `ISettingManager` para alterar os valores das configurações, pois ele gerencia o cache para você. - -## Provedores de Gerenciamento de Configurações - -O módulo de Gerenciamento de Configurações é extensível, assim como o [sistema de configurações](../Settings.md). Você pode estendê-lo definindo provedores de gerenciamento de configurações. Existem 5 provedores de gerenciamento de configurações pré-construídos registrados na seguinte ordem: - -* `DefaultValueSettingManagementProvider`: Obtém o valor do valor padrão da definição da configuração. Ele não pode definir o valor padrão, pois os valores padrão são codificados na definição da configuração. -* `ConfigurationSettingManagementProvider`: Obtém o valor do serviço [IConfiguration](../Configuration.md). Ele não pode definir o valor de configuração, pois não é possível alterar os valores de configuração em tempo de execução. -* `GlobalSettingManagementProvider`: Obtém ou define o valor global (em todo o sistema) para uma configuração. -* `TenantSettingManagementProvider`: Obtém ou define o valor da configuração para um locatário. -* `UserSettingManagementProvider`: Obtém o valor da configuração para um usuário. - -O `ISettingManager` usa os provedores de gerenciamento de configurações nos métodos de obtenção/definição. Normalmente, cada provedor de gerenciamento de configurações define métodos de extensão no serviço `ISettingManagement` (como `SetForUserAsync` definido pelo provedor de gerenciamento de configurações de usuário). - -Se você deseja criar seu próprio provedor, implemente a interface `ISettingManagementProvider` ou herde da classe base `SettingManagementProvider`: - -````csharp -public class CustomSettingProvider : SettingManagementProvider, ITransientDependency -{ - public override string Name => "Custom"; - - public CustomSettingProvider(ISettingManagementStore store) - : base(store) - { - } -} -```` - -A classe base `SettingManagementProvider` faz a implementação padrão (usando o `ISettingManagementStore`) para você. Você pode substituir os métodos base conforme necessário. Todo provedor deve ter um nome exclusivo, que é `Custom` neste exemplo (mantenha-o curto, pois ele é salvo no banco de dados para cada registro de valor de configuração). - -Depois de criar sua classe de provedor, você deve registrá-la usando a classe de opções `SettingManagementOptions` [options class](../Options.md): - -````csharp -Configure(options => -{ - options.Providers.Add(); -}); -```` - -A ordem dos provedores é importante. Os provedores são executados na ordem inversa. Isso significa que o `CustomSettingProvider` é executado primeiro neste exemplo. Você pode inserir seu provedor em qualquer ordem na lista `Providers`. - -## Veja também - -* [Configurações](../Settings.md) - -## Interface de Gerenciamento de Configurações - -O módulo de Gerenciamento de Configurações fornece a interface de configuração de e-mail por padrão. - -![Interface de Configuração de E-mail](../images/setting-management-email-ui.png) - -> Você pode clicar no botão Enviar e-mail de teste para enviar um e-mail de teste e verificar suas configurações de e-mail. - -Ele é extensível; você pode adicionar suas guias a esta página para as configurações de sua aplicação. - -### Interface de Usuário MVC - -#### Criar um Componente de Visualização de Configuração - -Crie a pasta `MySettingGroup` dentro da pasta `Components`. Adicione um novo componente de visualização. Nomeie-o como `MySettingGroupViewComponent`: - -![MySettingGroupViewComponent](../images/my-setting-group-view-component.png) - -Abra o arquivo `MySettingGroupViewComponent.cs` e altere todo o conteúdo conforme mostrado abaixo: - -```csharp -public class MySettingGroupViewComponent : AbpViewComponent -{ - public virtual IViewComponentResult Invoke() - { - return View("~/Components/MySettingGroup/Default.cshtml"); - } -} -``` - -> Você também pode usar o método `InvokeAsync`, neste exemplo, usamos o método `Invoke`. - -#### Default.cshtml - -Crie um arquivo `Default.cshtml` dentro da pasta `MySettingGroup`. - -Abra o arquivo `Default.cshtml` e altere todo o conteúdo conforme mostrado abaixo: - -```html -
-

Página do meu grupo de configurações

-
-``` - -#### BookStoreSettingPageContributor - -Crie um arquivo `BookStoreSettingPageContributor.cs` dentro da pasta `Settings`: - -![BookStoreSettingPageContributor](../images/my-setting-group-page-contributor.png) - -O conteúdo do arquivo é mostrado abaixo: - -```csharp -public class BookStoreSettingPageContributor : ISettingPageContributor -{ - public Task ConfigureAsync(SettingPageCreationContext context) - { - context.Groups.Add( - new SettingPageGroup( - "Volo.Abp.MySettingGroup", - "MySettingGroup", - typeof(MySettingGroupViewComponent), - order : 1 - ) - ); - - return Task.CompletedTask; - } - - public Task CheckPermissionsAsync(SettingPageCreationContext context) - { - // Você pode verificar as permissões aqui - return Task.FromResult(true); - } -} -``` - -Abra o arquivo `BookStoreWebModule.cs` e adicione o seguinte código: - -```csharp -Configure(options => -{ - options.Contributors.Add(new BookStoreSettingPageContributor()); -}); -``` - -#### Executar a Aplicação - -Acesse a rota `/SettingManagement` para ver as alterações: - -![Guia de Configurações Personalizadas](../images/my-setting-group-ui.png) - -### Interface de Usuário Blazor - -#### Criar um Componente Razor - -Crie a pasta `MySettingGroup` dentro da pasta `Pages`. Adicione um novo componente Razor. Nomeie-o como `MySettingGroupComponent`: - -![MySettingGroupComponent](../images/my-setting-group-component.png) - -Abra o arquivo `MySettingGroupComponent.razor` e altere todo o conteúdo conforme mostrado abaixo: - -```csharp - -

meu grupo de configurações

-
-``` - -#### BookStoreSettingComponentContributor - -Crie um arquivo `BookStoreSettingComponentContributor.cs` dentro da pasta `Settings`: - -![BookStoreSettingComponentContributor](../images/my-setting-group-component-contributor.png) - -O conteúdo do arquivo é mostrado abaixo: - -```csharp -public class BookStoreSettingComponentContributor : ISettingComponentContributor -{ - public Task ConfigureAsync(SettingComponentCreationContext context) - { - context.Groups.Add( - new SettingComponentGroup( - "Volo.Abp.MySettingGroup", - "MySettingGroup", - typeof(MySettingGroupComponent), - order : 1 - ) - ); - - return Task.CompletedTask; - } - - public Task CheckPermissionsAsync(SettingComponentCreationContext context) - { - // Você pode verificar as permissões aqui - return Task.FromResult(true); - } -} -``` - -Abra o arquivo `BookStoreBlazorModule.cs` e adicione o seguinte código: - -```csharp -Configure(options => -{ - options.Contributors.Add(new BookStoreSettingComponentContributor()); -}); -``` - -#### Executar a Aplicação - -Acesse a rota `/setting-management` para ver as alterações: - -![Guia de Configurações Personalizadas](../images/my-setting-group-blazor.png) - -### Interface de Usuário Angular - -#### Criar um Componente - -Crie um componente com o seguinte comando: - -```bash -yarn ng generate component my-settings -``` - -Abra o arquivo `app.component.ts` e modifique o arquivo conforme mostrado abaixo: - -```js -import { Component } from '@angular/core'; -import { SettingTabsService } from '@abp/ng.setting-management/config'; // importando SettingTabsService -import { MySettingsComponent } from './my-settings/my-settings.component'; // importando MySettingsComponent - -@Component(/* metadados do componente */) -export class AppComponent { - constructor(private settingTabs: SettingTabsService) // injetando MySettingsComponent - { - // adicionado abaixo - settingTabs.add([ - { - name: 'MySettings', - order: 1, - requiredPolicy: 'chave da política aqui', - component: MySettingsComponent, - }, - ]); - } -} -``` - -#### Executar a Aplicação - -Acesse a rota `/setting-management` para ver as alterações: - -![Guia de Configurações Personalizadas](../images/custom-settings.png) \ No newline at end of file diff --git a/docs/pt-BR/Modules/Tenant-Management.md b/docs/pt-BR/Modules/Tenant-Management.md deleted file mode 100644 index 2ff8d3c0a2..0000000000 --- a/docs/pt-BR/Modules/Tenant-Management.md +++ /dev/null @@ -1,134 +0,0 @@ -# Módulo de Gerenciamento de Inquilinos - -O [Multi-Tenancy](../Multi-Tenancy.md) é uma das principais características do ABP Framework. Ele fornece a infraestrutura fundamental para construir sua própria solução SaaS (Software-as-a-Service). O sistema de multi-tenancy do ABP abstrai onde seus inquilinos são armazenados, fornecendo a interface `ITenantStore`. Tudo que você precisa fazer é implementar essa interface. - -**O módulo de gerenciamento de inquilinos é uma implementação da interface `ITenantStore`. Ele armazena inquilinos em um banco de dados. Ele também fornece uma interface de usuário para gerenciar seus inquilinos e suas [funcionalidades](../Features.md).** - -> Por favor, **consulte a documentação do [Multi-Tenancy](../Multi-Tenancy.md)** para entender o sistema de multi-tenancy do ABP Framework. Este documento se concentra no módulo de gerenciamento de inquilinos. - -### Sobre o Módulo SaaS Comercial do ABP - -O [Módulo SaaS](https://commercial.abp.io/modules/Volo.Saas) é uma implementação alternativa deste módulo com mais funcionalidades e possibilidades. Ele é distribuído como parte da assinatura do [ABP Commercial](https://commercial.abp.io/). - -## Como Instalar - -Este módulo vem pré-instalado (como pacotes NuGet/NPM) quando você [cria uma nova solução](https://abp.io/get-started) com o ABP Framework. Você pode continuar a usá-lo como pacote e obter atualizações facilmente, ou pode incluir seu código-fonte em sua solução (consulte o comando `get-source` da [CLI](../CLI.md)) para desenvolver seu próprio módulo personalizado. - -### O Código Fonte - -O código-fonte deste módulo pode ser acessado [aqui](https://github.com/abpframework/abp/tree/dev/modules/tenant-management). O código-fonte é licenciado com [MIT](https://choosealicense.com/licenses/mit/), então você pode usá-lo e personalizá-lo livremente. - -## Interface de Usuário - -Este módulo adiciona o item de menu "*Administração -> Gerenciamento de Inquilinos -> Inquilinos*" ao menu principal do aplicativo, que abre a página mostrada abaixo: - -![module-tenant-management-page](../images/module-tenant-management-page.png) - -Nesta página, você vê todos os inquilinos. Você pode criar um novo inquilino conforme mostrado abaixo: - -![module-tenant-management-new-tenant](../images/module-tenant-management-new-tenant.png) - -Neste modal; - -* **Nome**: O nome único do inquilino. Se você usar subdomínios para seus inquilinos (como https://algum-inquilino.seu-domínio.com), este será o nome do subdomínio. -* **Endereço de E-mail do Administrador**: Endereço de e-mail do usuário administrador para este inquilino. -* **Senha do Administrador**: A senha do usuário administrador para este inquilino. - -Quando você clica no botão *Ações* próximo a um inquilino, você verá as ações que pode realizar: - -![module-tenant-management-actions](../images/module-tenant-management-actions.png) - -### Gerenciando as Funcionalidades do Inquilino - -A ação Funcionalidades abre um modal para habilitar/desabilitar/configurar [funcionalidades](../Features.md) para o inquilino relacionado. Aqui, um exemplo de modal: - -![features-modal](../images/features-modal.png) - -### Gerenciando as Funcionalidades do Host - -O botão *Gerenciar Funcionalidades do Host* é usado para configurar as funcionalidades do lado do host, se você usar as funcionalidades do seu aplicativo também no lado do host. - -## Eventos Distribuídos - -Este módulo define os seguintes ETOs (Event Transfer Objects) para permitir que você se inscreva em alterações nas entidades do módulo; - -- `TenantEto` é publicado em alterações feitas em uma entidade `Tenant`. - -**Exemplo: Receber uma notificação quando um novo inquilino for criado** - -```cs -public class MeuManipulador : - IDistributedEventHandler>, - ITransientDependency -{ - public async Task HandleEventAsync(EntityCreatedEto eventData) - { - TenantEto tenant = eventData.Entity; - // TODO: ... - } -} -``` - - - -`TenantEto` é configurado para publicar automaticamente os eventos. Você deve configurar-se para os outros. Consulte o documento [Distributed Event Bus](https://github.com/abpframework/abp/blob/rel-7.3/docs/en/Distributed-Event-Bus.md) para aprender detalhes dos eventos pré-definidos. - -> A inscrição nos eventos distribuídos é especialmente útil para cenários distribuídos (como arquitetura de microsserviços). Se você estiver construindo um aplicativo monolítico ou ouvindo eventos no mesmo processo que executa o Módulo de Gerenciamento de Inquilinos, então a inscrição nos [eventos locais](https://github.com/abpframework/abp/blob/rel-7.3/docs/en/Local-Event-Bus.md) pode ser mais eficiente e fácil. - -## Internos - -Esta seção pode ser usada como referência se você quiser [personalizar](../Customizing-Application-Modules-Guide.md) este módulo sem alterar [seu código-fonte](https://github.com/abpframework/abp/tree/dev/modules/tenant-management). - -### Camada de Domínio - -#### Agregados - -* `Tenant` - -#### Repositórios - -* `ITenantRepository` - -#### Serviços de Domínio - -* `TenantManager` - -### Camada de Aplicação - -#### Serviços de Aplicação - -* `TenantAppService` - -#### Permissões - -- `AbpTenantManagement.Tenants`: Gerenciamento de inquilinos. -- `AbpTenantManagement.Tenants.Create`: Criar um novo inquilino. -- `AbpTenantManagement.Tenants.Update`: Editar um inquilino existente. -- `AbpTenantManagement.Tenants.Delete`: Excluir um inquilino existente. -- `AbpTenantManagement.Tenants.ManageFeatures`: Gerenciar as funcionalidades dos inquilinos. - -### Integração com o Entity Framework Core - -* `TenantManagementDbContext` (implementa `ITenantManagementDbContext`) - -**Tabelas do Banco de Dados:** - -* `AbpTenants` -* `AbpTenantConnectionStrings` - -### Integração com o MongoDB - -* `TenantManagementMongoDbContext` (implementa `ITenantManagementMongoDbContext`) - -**Coleções do Banco de Dados:** - -* `AbpTenants` (inclui também a string de conexão) - -## Avisos - -O ABP Framework permite usar a abordagem *banco de dados por inquilino*, que permite que um inquilino tenha um banco de dados dedicado. Este módulo possui a infraestrutura fundamental para tornar essa implementação possível (consulte seu código-fonte), no entanto, ele não implementa a camada de aplicação e as funcionalidades de interface do usuário para fornecê-lo como uma implementação pronta para uso. Você pode implementar esses recursos por conta própria ou considerar o uso do [Módulo SaaS Comercial do ABP](https://docs.abp.io/en/commercial/latest/modules/saas), que o implementa completamente e fornece muito mais recursos de negócios. - -## Veja Também - -* [Multi-Tenancy](../Multi-Tenancy.md) -* [Módulo SaaS Comercial do ABP](https://docs.abp.io/en/commercial/latest/modules/saas) \ No newline at end of file diff --git a/docs/pt-BR/Modules/Virtual-File-Explorer.md b/docs/pt-BR/Modules/Virtual-File-Explorer.md deleted file mode 100644 index 42cbd9f044..0000000000 --- a/docs/pt-BR/Modules/Virtual-File-Explorer.md +++ /dev/null @@ -1,87 +0,0 @@ -# Módulo de Explorador de Arquivos Virtual - -## O que é o Módulo de Explorador de Arquivos Virtual? - -O Módulo de Explorador de Arquivos Virtual fornece uma interface de usuário simples para visualizar todos os arquivos no [sistema de arquivos virtual](../Virtual-File-System.md). - -> O Módulo de Explorador de Arquivos Virtual não está instalado nos [modelos de inicialização](../Startup-Templates/Index.md). Portanto, você precisa adicionar manualmente este módulo à sua aplicação. - -### Instalação - -#### 1- Usando o ABP CLI - -Recomenda-se usar o [ABP CLI](../CLI.md) para instalar o módulo. Abra a janela do CMD no diretório do arquivo de solução (`.sln`) e execute o seguinte comando: - -``` -abp add-module Volo.VirtualFileExplorer -``` - -> Se você ainda não o fez, primeiro precisa instalar o [ABP CLI](../CLI.md). Para outras opções de instalação, consulte [a página de descrição do pacote](https://abp.io/package-detail/Volo.Abp.VirtualFileExplorer.Web). - -#### 2- Instalação manual - -Ou você também pode instalar manualmente o pacote nuget no projeto `Acme.MyProject.Web`: - -* Instale o pacote nuget [Volo.Abp.VirtualFileExplorer.Web](https://www.nuget.org/packages/Volo.Abp.VirtualFileExplorer.Web/) no projeto `Acme.MyProject.Web`. - - `Install-Package Volo.Abp.VirtualFileExplorer.Web` - -##### 2.1- Adicionando Dependências do Módulo - - * Abra `MyProjectWebModule.cs` e adicione `typeof(AbpVirtualFileExplorerWebModule)` como mostrado abaixo; - - ```csharp - [DependsOn( - typeof(AbpVirtualFileExplorerWebModule), - typeof(MyProjectApplicationModule), - typeof(MyProjectEntityFrameworkCoreModule), - typeof(AbpAutofacModule), - typeof(AbpIdentityWebModule), - typeof(AbpAccountWebModule), - typeof(AbpAspNetCoreMvcUiBasicThemeModule) - )] - public class MyProjectWebModule : AbpModule - { - //... - } - ``` - -##### 2.2- Adicionando Pacote NPM - - * Abra `package.json` e adicione `@abp/virtual-file-explorer": "^2.9.0` como mostrado abaixo: - - ```json - { - "version": "1.0.0", - "name": "my-app", - "private": true, - "dependencies": { - "@abp/aspnetcore.mvc.ui.theme.basic": "^2.9.0", - "@abp/virtual-file-explorer": "^2.9.0" - } - } - ``` - - Em seguida, abra o terminal de linha de comando na pasta do projeto `Acme.MyProject.Web` e execute o seguinte comando: - -````bash -abp install-libs -```` - -Isso é tudo, agora execute a aplicação e navegue até `/VirtualFileExplorer`. Você verá a página do explorador de arquivos virtual: - -![Virtual-File-Explorer](../images/virtual-file-explorer.png) - -### Opções - -Você pode desativar o módulo de explorador de arquivos virtual através das opções `AbpVirtualFileExplorerOptions`: - -```csharp -public override void PreConfigureServices(ServiceConfigurationContext context) -{ - PreConfigure(options => - { - options.IsEnabled = false; - }); -} -``` \ No newline at end of file diff --git a/docs/pt-BR/MongoDB.md b/docs/pt-BR/MongoDB.md deleted file mode 100644 index c7ad2ef1c3..0000000000 --- a/docs/pt-BR/MongoDB.md +++ /dev/null @@ -1,466 +0,0 @@ -# Integração do MongoDB - -Este documento explica como integrar e configurar o MongoDB como um provedor de banco de dados para aplicações baseadas no ABP. - -## Instalação - -`Volo.Abp.MongoDB` é o pacote nuget principal para a integração do MongoDB. Instale-o em seu projeto (para uma aplicação em camadas, será sua camada de dados ou infraestrutura): - -``` -Install-Package Volo.Abp.MongoDB -``` - -Então adicione a dependência de módulo `AbpMongoDbModule` para o seu [module](Module-Development-Basics.md): - -```c# -using Volo.Abp.MongoDB; -using Volo.Abp.Modularity; - -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpMongoDbModule))] - public class MyModule : AbpModule - { - // ... - } -} -``` - -## Criando um Mongo Db Context - -ABP apresenta o conceito **Mongo Db Context** (que é semelhante ao Entity Framework Core DbContext) para tornar mais fácil usar coleções e configurá-las. Um exemplo é mostrado abaixo: - -```c# -public class MyDbContext : AbpMongoDbContext -{ - public IMongoCollection Questions => Collection(); - - public IMongoCollection Categories => Collection(); - - protected override void CreateModel(IMongoModelBuilder modelBuilder) - { - base.CreateModel(modelBuilder); - - // Personalize a configuração para as suas collections. - } -} -``` - -* É derivado da classe `AbpMongoDbContext`. -* Adiciona uma propriedade pública `IMongoCollection` para cada mongo collection. Por padrão ABP usa essas propriedades para criar repositórios padrão. -* Substituir o método `CreateModel` permite definir a configuração da collection. - -### Configurar o Mapeamento para uma Collection - -ABP registra automaticamente entidades MongoDB client library para todas propriedades `IMongoCollection` em seu DbContext. Para o exemplo acima, as entidades `Question` e `Category` são registradas automaticamente. - -Para cada entidade registrada, chama `AutoMap()` e configura propriedades conhecidas de sua entidade. Por exemplo, se sua entidade implementa uma interface `IHasExtraProperties` (que já está implementada para cada raiz agregada por padrão), ele configura automaticamente `ExtraProperties`. - -Portanto, na maioria das vezes, você não precisa configurar explicitamente o registro de suas entidades. No entanto, se você precisar, pode fazer isso sobrescrevendo o método `CreateModel` em seu DbContext. Exemplo: - -````csharp -protected override void CreateModel(IMongoModelBuilder modelBuilder) -{ - base.CreateModel(modelBuilder); - - modelBuilder.Entity(b => - { - b.CollectionName = "MyQuestions"; // Define o nome da collection - b.BsonMap.UnmapProperty(x => x.MyProperty); // Ignora 'MyProperty' - }); -} -```` - -Este exemplo altera o nome da collection mapeada para 'MyQuestions' no banco de dados e ignora uma propriedade na classe `Question`. - -Se você só precisa configurar o nome da collection, você também pode usar o atributo `[MongoCollection]` para a collection em seu DbContext. Exemplo: - -````csharp -[MongoCollection("MyQuestions")] // Define o nome da collection -public IMongoCollection Questions => Collection(); -```` - -### Configurar a Seleção da String de Conexão - -Se você tiver vários bancos de dados em seu aplicativo, você pode configurar o nome da string de conexão para o seu DbContext usando o atributo `[ConnectionStringName]`. Exemplo: - -````csharp -[ConnectionStringName("MySecondConnString")] -public class MyDbContext : AbpMongoDbContext -{ - -} -```` - -Se você não configurar, a string de conexão `Default` é usada. Se você configurar um nome de string de conexão, mas não definir este nome da string de conexão na configuração da aplicação, então ele retorna para a string de conexão `Default`. - -## Registrando DbContext para Injeção de Dependência - -Use o método `AddAbpDbContext` em seu module para registrar sua classe DbContext para o sistema de [injeção de dependência](Dependency-Injection.md). - -```c# -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.MongoDB; -using Volo.Abp.Modularity; - -namespace MyCompany.MyProject -{ - [DependsOn(typeof(AbpMongoDbModule))] - public class MyModule : AbpModule - { - public override void ConfigureServices(ServiceConfigurationContext context) - { - context.Services.AddMongoDbContext(); - - // ... - } - } -} -``` - -### Adicionar Repositories Padrão - -O ABP pode criar automaticamente [repositories genéricas](Repositories.md) padrão para as entidades em seu DbContext. Basta usar a opção `AddDefaultRepositories()` no registro: - -````C# -services.AddMongoDbContext(options => -{ - options.AddDefaultRepositories(); -}); -```` - -Isso criará uma repository para cada [aggregate root entity](Entities.md) (classes derivadas de `AggregateRoot`) por padrão. Se você quiser criar repositories para outras entidades também, em seguida defina `includeAllEntities` para `true`: - -```c# -services.AddMongoDbContext(options => -{ - options.AddDefaultRepositories(includeAllEntities: true); -}); -``` - -Então você pode injetar e usar `IRepository` nas suas services. Suponha que você tenha uma entidade `Book` com a chave primária `Guid`: - -```csharp -public class Book : AggregateRoot -{ - public string Name { get; set; } - - public BookType Type { get; set; } -} -``` - -(`BookType` é um simples `enum` aqui) E você deseja criar uma nova entidade `Book` em uma [domain service](Domain-Services.md): - -```csharp -public class BookManager : DomainService -{ - private readonly IRepository _bookRepository; - - public BookManager(IRepository bookRepository) // injetar repositório padrão - { - _bookRepository = bookRepository; - } - - public async Task CreateBook(string name, BookType type) - { - Check.NotNullOrWhiteSpace(name, nameof(name)); - - var book = new Book - { - Id = GuidGenerator.Create(), - Name = name, - Type = type - }; - - await _bookRepository.InsertAsync(book); // Use um método de repositório padrão - - return book; - } -} -``` - -Este exemplo usa o método `InsertAsync` para inserir uma nova entity no banco de dados. - -### Adicionar Repositories Personalizadas - -Repositories genéricas padrão são poderosas e suficiente na maioria dos casos (uma vez que implementam `IQueryable`). No entanto, pode ser necessário criar uma repository customizada para adicionar seus próprios métodos de repository. - -Suponha que você deseja excluir todos os books por type. É sugerido definir uma interface para sua repository personalizada: - -```csharp -public interface IBookRepository : IRepository -{ - Task DeleteBooksByType( - BookType type, - CancellationToken cancellationToken = default(CancellationToken) - ); -} -``` - -Você geralmente vai querer derivar de `IRepository` para herdar métodos de repository padrão. No entanto, você não precisa. As interfaces de repository são definidas na camada de domínio de uma aplicação em camadas. Elas são implementadas na camada de dados ou infraestrutura (projeto `MongoDB` em um [startup template](https://abp.io/Templates)). - -Exemplo de implementação da interface `IBookRepository`: - -```csharp -public class BookRepository : - MongoDbRepository, - IBookRepository -{ - public BookRepository(IMongoDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } - - public async Task DeleteBooksByType( - BookType type, - CancellationToken cancellationToken = default(CancellationToken)) - { - var collection = await GetCollectionAsync(cancellationToken); - await collection.DeleteManyAsync( - Builders.Filter.Eq(b => b.Type, type), - cancellationToken - ); - } -} -``` - -Agora é possível [injetar](Dependency-Injection.md) a `IBookRepository` e usar o método `DeleteBooksByType` quando necessário. - -#### Substituir Repository Genérica Padrão - -Mesmo se você criar uma repository personalizada, você ainda pode injetar a repository genérica padrão (`IRepository` para este exemplo). A implementação da repository padrão não usará a classe que você criou. - -Se você querer substituir a implementação da repository padrão pela sua repository personalizada, faça dentro das opções `AddMongoDbContext`: - -```csharp -context.Services.AddMongoDbContext(options => -{ - options.AddDefaultRepositories(); - options.AddRepository(); //Replaces IRepository -}); -``` - -Isso é especialmente importante quando você deseja dar **override em um método da base repository** para customizar. Por exemplo, você pode querer substituir o método `DeleteAsync` para excluir uma entidade de uma forma mais eficiente: - -```csharp -public async override Task DeleteAsync( - Guid id, - bool autoSave = false, - CancellationToken cancellationToken = default) -{ - // TODO: Implementação customizada do método delete -} -``` - -### Acesso à API MongoDB - -Na maioria dos casos, você vai querer ocultar APIs do MongoDB atrás de uma repository (este é o objetivo principal da repository). No entanto, se você quiser acessar a API MongoDB através da Repository, você pode usar os métodos de extensão `GetDatabaseAsync()`, `GetCollectionAsync()` ou `GetAggregateAsync()`. Exemplo: - -```csharp -public class BookService -{ - private readonly IRepository _bookRepository; - - public BookService(IRepository bookRepository) - { - _bookRepository = bookRepository; - } - - public async Task FooAsync() - { - IMongoDatabase database = await _bookRepository.GetDatabaseAsync(); - IMongoCollection books = await _bookRepository.GetCollectionAsync(); - IAggregateFluent bookAggregate = await _bookRepository.GetAggregateAsync(); - } -} -``` - -> Importante: Você deve fazer referência ao pacote `Volo.Abp.MongoDB` do projeto que deseja acessar a API MongoDB. Isso quebra o encapsulamento, mas é o que você deseja nesse caso. - -### Transactions - -O MongoDB oferece suporte multi-document transactions a partir da versão 4.0 e o ABP Framework oferece suporte para isso. No entanto, o [startup template](Startup-Templates/Index.md) **desativa** transactions por padrão. Se o seu **servidor** MongoDB suportar transactions, você pode habilitar esse recurso na classe *YourProjectMongoDbModule*: - -```csharp -Configure(options => -{ - options.TransactionBehavior = UnitOfWorkTransactionBehavior.Auto; -}); -``` - -> Ou você pode excluir este código, pois este já é o comportamento padrão. - -### Tópicos Avançados - -### Controlando o Multi-Tenancy - -Se sua solução for [multi-tenant](Multi-Tenancy.md), os tenants podem ter **bancos de dados separados**, você tem **múltiplas** classes `DbContext` em sua solução e algumas de suas classes `DbContext` devem ser utilizáveis **apenas do lado do host**, é recomendado adicionar o atributo `[IgnoreMultiTenancy]` em sua classe `DbContext`. Nesse caso, a ABP garante que o `DbContext` relacionado sempre usa a [connection string](Connection-Strings.md) do host, mesmo se você estiver em um tenant context. - -**Exemplo:** - -````csharp -[IgnoreMultiTenancy] -public class MyDbContext : AbpMongoDbContext -{ - ... -} -```` - -Não use o atributo `[IgnoreMultiTenancy]` se qualquer uma de suas entidades em seu `DbContext` puder ser persistida em um outro banco de dados de um tenant. - -> When you use repositories, ABP already uses the host database for the entities don't implement the `IMultiTenant` interface. So, most of time you don't need to `[IgnoreMultiTenancy]` attribute if you are using the repositories to work with the database. - -#### Definir Classes Repository Padrão - -Repositories genéricas padrão são implementadas pela classe `MongoDbRepository` por padrão. Você pode criar sua própria implementação e usá-la para implementação da repository padrão. - -Primeiro, defina suas classes de repository assim: - -```csharp -public class MyRepositoryBase - : MongoDbRepository - where TEntity : class, IEntity -{ - public MyRepositoryBase(IMongoDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } -} - -public class MyRepositoryBase - : MongoDbRepository - where TEntity : class, IEntity -{ - public MyRepositoryBase(IMongoDbContextProvider dbContextProvider) - : base(dbContextProvider) - { - } -} -``` - -O primeiro é para [entities com chaves compostas](Entities.md), o segundo é para entities com uma única chave primária. - -É sugerido herdar da classe `MongoDbRepository` e substituir os métodos, se necessário. Caso contrário, você terá que implementar todos os métodos de repository padrão manualmente. - -Agora, você pode usar a opção `SetDefaultRepositoryClasses`: - -```csharp -context.Services.AddMongoDbContext(options => -{ - options.SetDefaultRepositoryClasses( - typeof(MyRepositoryBase<,>), - typeof(MyRepositoryBase<>) - ); - // ... -}); -``` - -#### Definir classe base MongoDbContext ou Interface para Repositories padrão - -Se seu MongoDbContext herda de outro MongoDbContext ou implementa uma interface, você pode usar essa classe base ou interface como o MongoDbContext para repositories padrão. Exemplo: - -```csharp -public interface IBookStoreMongoDbContext : IAbpMongoDbContext -{ - Collection Books { get; } -} -``` - -`IBookStoreMongoDbContext` é implementado pela classe `BookStoreMongoDbContext`. Então você pode usar sobrecarga genérica do `AddDefaultRepositories`: - -```csharp -context.Services.AddMongoDbContext(options => -{ - options.AddDefaultRepositories(); - // ... -}); -``` - -Agora, seu `BookRepository` personalizado também pode usar a interface `IBookStoreMongoDbContext`: - -```csharp -public class BookRepository - : MongoDbRepository, - IBookRepository -{ - // ... -} -``` - -Uma vantagem de usar a interface para um MongoDbContext é que ela pode ser substituída por outra implementação. - -#### Substituir Outros DbContexts - -Depois de definir e usar adequadamente uma interface para um MongoDbContext, qualquer outra implementação pode usar as seguintes maneiras de substituí-lo: - -**ReplaceDbContextAttribute** - -```csharp -[ReplaceDbContext(typeof(IBookStoreMongoDbContext))] -public class OtherMongoDbContext : AbpMongoDbContext, IBookStoreMongoDbContext -{ - // ... -} -``` - -**Opção ReplaceDbContext** - -```csharp -context.Services.AddMongoDbContext(options => -{ - // ... - options.ReplaceDbContext(); -}); -``` - -Neste exemplo, `OtherMongoDbContext` implementa `IBookStoreMongoDbContext`. Este recurso permite que você tenha vários MongoDbContext (um por módulo) no desenvolvimento, mas um único MongoDbContext (implementa todas as interfaces de todos os MongoDbContexts) no tempo de execução. - -### Personalizar Operações em Massa - -Se você tiver uma lógica melhor ou usar uma biblioteca externa para operações em massa, pode substituir a lógica por meio da implementação de `IMongoDbBulkOperationProvider`. - -- Você pode usar o modelo de exemplo abaixo: - -```csharp -public class MyCustomMongoDbBulkOperationProvider - : IMongoDbBulkOperationProvider, ITransientDependency -{ - public async Task DeleteManyAsync( - IMongoDbRepository repository, - IEnumerable entities, - IClientSessionHandle sessionHandle, - bool autoSave, - CancellationToken cancellationToken) - where TEntity : class, IEntity - { - // Sua lógica aqui. - } - - public async Task InsertManyAsync( - IMongoDbRepository repository, - IEnumerable entities, - IClientSessionHandle sessionHandle, - bool autoSave, - CancellationToken cancellationToken) - where TEntity : class, IEntity - { - // Sua lógica aqui. - } - - public async Task UpdateManyAsync( - IMongoDbRepository repository, - IEnumerable entities, - IClientSessionHandle sessionHandle, - bool autoSave, - CancellationToken cancellationToken) - where TEntity : class, IEntity - { - // Sua lógica aqui. - } -} -``` - -## Veja Também - -* [Entities](Entities.md) -* [Repositories](Repositories.md) \ No newline at end of file diff --git a/docs/pt-BR/Nightly-Builds.md b/docs/pt-BR/Nightly-Builds.md deleted file mode 100644 index 9d3e49ccf6..0000000000 --- a/docs/pt-BR/Nightly-Builds.md +++ /dev/null @@ -1,27 +0,0 @@ -# Compilações Noturnas - -Todos os pacotes de estrutura e módulo são implantados no MyGet todas as noites durante a semana. Portanto, você pode usar ou testar o código mais recente sem aguardar o próximo lançamento. - -## Configurar o Visual Studio - -> Requer Visual Studio 2017 ou superior - -1. Vá para `Tools > Options > NuGet Package Manager > Package Source`. -2. Clique no `+` ícone verde . -3. Defina `ABP Nightly`como *Nome* e `https://www.myget.org/F/abp-nightly/api/v3/index.json`como a *Fonte,* como mostrado abaixo: ![noite-compilação-adicionar-pepita-fonte](images/night-build-add-nuget-source.png) -4. Clique no `Update` botão -5. Clique no `OK` botão para salvar as alterações. - -## Instalar pacote - -Agora, você pode instalar pacotes noturnos / de visualização no seu projeto a partir do Nuget Browser ou do Package Manager Console. - -![night-build-add-nuget-package](images/night-build-add-nuget-package.png) - -1. No Nuget Browser, selecione "Incluir pré-lançamentos". -2. Altere a fonte do pacote para "Todos". -3. Pesquise um pacote. Você verá as pré *-liberações* do pacote formatadas como `(VERSION)-preview(DATE)`(como *v0.16.0-preview20190401* neste exemplo). -4. Você pode clicar no `Install`botão para adicionar um pacote ao seu projeto. - - - \ No newline at end of file diff --git a/docs/pt-BR/Object-To-Object-Mapping.md b/docs/pt-BR/Object-To-Object-Mapping.md deleted file mode 100644 index 7d5f74a3fe..0000000000 --- a/docs/pt-BR/Object-To-Object-Mapping.md +++ /dev/null @@ -1,3 +0,0 @@ -## Object To Object Mapping - -Façam \ No newline at end of file diff --git a/docs/pt-BR/SMS-Sending.md b/docs/pt-BR/SMS-Sending.md deleted file mode 100644 index ca704cad19..0000000000 --- a/docs/pt-BR/SMS-Sending.md +++ /dev/null @@ -1,3 +0,0 @@ -# Emailing - -Façam! \ No newline at end of file diff --git a/docs/pt-BR/Settings.md b/docs/pt-BR/Settings.md deleted file mode 100644 index ffc08071a2..0000000000 --- a/docs/pt-BR/Settings.md +++ /dev/null @@ -1,3 +0,0 @@ -# Settings - -Façam! \ No newline at end of file diff --git a/docs/pt-BR/Specifications.md b/docs/pt-BR/Specifications.md deleted file mode 100644 index 19a9db8a27..0000000000 --- a/docs/pt-BR/Specifications.md +++ /dev/null @@ -1,3 +0,0 @@ -# Specifications - -Façam! \ No newline at end of file diff --git a/docs/pt-BR/Startup-Templates/Application.md b/docs/pt-BR/Startup-Templates/Application.md deleted file mode 100644 index 24120a9d1c..0000000000 --- a/docs/pt-BR/Startup-Templates/Application.md +++ /dev/null @@ -1,275 +0,0 @@ -# Modelo de inicialização do aplicativo - -## Introdução - -Este modelo fornece uma estrutura de aplicativo em camadas com base nas práticas DDD ([Domain Driven Design](../Domain-Driven-Design.md)). Este documento explica a estrutura da solução e os projetos em detalhes. Se você deseja iniciar rapidamente, siga os guias abaixo: - -- Consulte [Introdução ao modelo do ASP.NET Core MVC](../Getting-Started-AspNetCore-MVC-Template.md) para criar uma nova solução e executá-la para este modelo (usa o MVC como a estrutura da interface do usuário e o Entity Framework Core como o provedor de banco de dados). -- Consulte o [Tutorial de desenvolvimento de aplicativos do ASP.NET Core MVC](../Tutorials/AspNetCore-Mvc/Part-I.md) para aprender como desenvolver aplicativos usando este modelo (usa o MVC como a estrutura da interface do usuário e o Entity Framework Core como o provedor de banco de dados). -- Consulte o [Tutorial de desenvolvimento de aplicativos Angular](../Tutorials/Angular/Part-I.md) para aprender como desenvolver aplicativos usando este modelo (usa Angular como a estrutura da interface do usuário e MongoDB como o provedor de banco de dados). - -## Como começar? - -Você pode usar a [ABP CLI](../CLI.md) para criar um novo projeto usando este modelo de inicialização. Como alternativa, você pode criar e fazer o download diretamente na página [Introdução](https://abp.io/get-started) . A abordagem CLI é usada aqui. - -Primeiro, instale a ABP CLI se você não tiver instalado antes: - -```bash -dotnet tool install -g Volo.Abp.Cli -``` - -Em seguida, use o `abp new`comando em uma pasta vazia para criar uma nova solução: - -```bash -abp new Acme.BookStore -t app -``` - -- `Acme.BookStore`é o nome da solução, como *YourCompany.YourProduct* . Você pode usar nomes de nível único, dois ou três níveis. -- Este exemplo especificou o nome do modelo ( `-t`ou `--template`opção). No entanto, `app`já é o modelo padrão se você não o especificar. - -### Especifique a estrutura da interface do usuário - -Este modelo fornece várias estruturas de interface do usuário: - -- `mvc`: Interface do usuário do ASP.NET Core MVC com Razor Pages (padrão) -- `angular`: UI angular - -Use `-u`ou `--ui`opção para especificar a estrutura da interface do usuário: - -```bash -abp new Acme.BookStore -u angular -``` - -### Especifique o provedor de banco de dados - -Este modelo suporta os seguintes provedores de banco de dados: - -- `ef`: Entity Framework Core (padrão) -- `mongodb`: MongoDB - -Use a opção `-d`(ou `--database-provider`) para especificar o provedor de banco de dados: - -```bash -abp new Acme.BookStore -d mongodb -``` - -## Estrutura da solução - -Com base nas opções especificadas, você obterá uma estrutura de solução ligeiramente diferente. - -### Estrutura padrão - -Se você não especificar nenhuma opção adicional, terá uma solução como a mostrada abaixo: - -![livraria-visual-studio-solution-v3](../images/bookstore-visual-studio-solution-v3.png) - -Os projetos são organizados em `src`e `test`pastas. `src`A pasta contém o aplicativo real que está em camadas com base nos princípios [DDD](https://docs.abp.io/en/abp/latest/Domain-Driven-Design) , como mencionado anteriormente. - -O diagrama abaixo mostra as camadas e dependências do projeto do aplicativo: - -![dependências de projeto em camadas](../images/layered-project-dependencies.png) - -Cada seção abaixo explicará o projeto relacionado e suas dependências. - -#### Projeto .Domain.Shared - -Este projeto contém constantes, enumerações e outros objetos. Na verdade, eles fazem parte da camada de domínio, mas precisam ser usados por todas as camadas / projetos da solução. - -Um `BookType`enum e uma `BookConsts`classe (que podem ter alguns campos constantes para a `Book`entidade, como `MaxNameLength`) são bons candidatos para este projeto. - -- Este projeto não depende de outros projetos na solução. Todos os outros projetos dependem disso direta ou indiretamente. - -#### .Domain Project - -Essa é a camada de domínio da solução. Ele contém principalmente [entidades, raízes agregadas](../Entities.md) , [serviços de domínio](../Domain-Services.md) , [tipos de valor](../Value-Types.md) , [interfaces de repositório](../Repositories) e outros objetos de domínio. - -Uma `Book`entidade, um `BookManager`serviço de domínio e uma `IBookRepository`interface são bons candidatos para este projeto. - -- Depende do `.Domain.Shared`porque usa constantes, enumerações e outros objetos definidos nesse projeto. - -#### .Application.Contracts Project - -Este projeto contém principalmente **interfaces de** [serviço de aplicativo](../Application-Services.md) e DTO ( [Data Transfer Objects](../Data-Transfer-Objects.md) ) da camada de aplicativo. Existe para separar a interface e a implementação da camada de aplicação. Dessa forma, o projeto de interface pode ser compartilhado com os clientes como um pacote de contrato. - -Uma `IBookAppService`interface e uma `BookCreationDto`classe são boas candidatas para este projeto. - -- Depende do `.Domain.Shared`porque ele pode usar constantes, enumerações e outros objetos compartilhados deste projeto nas interfaces de serviço de aplicativo e DTOs. - -#### Projeto de Aplicação - -Este projeto contém as **implementações** de [serviço de aplicativo](../Application-Services.md) das interfaces definidas no projeto.`.Application.Contracts` - -Uma `BookAppService`turma é uma boa candidata para este projeto. - -- Depende do `.Application.Contracts`projeto para poder implementar as interfaces e usar os DTOs. -- Depende do `.Domain`projeto para poder usar objetos de domínio (entidades, interfaces de repositório ... etc.) para executar a lógica do aplicativo. - -#### Projeto .EntityFrameworkCore - -Este é o projeto de integração para o EF Core. Ele define `DbContext`e implementa as interfaces de repositório definidas no `.Domain`projeto. - -- Depende do `.Domain`projeto para poder fazer referência a entidades e interfaces de repositório. - -> Este projeto está disponível apenas se você estiver usando o EF Core como provedor de banco de dados. Se você selecionar outro provedor de banco de dados, seu nome será diferente. - -#### Projeto .EntityFrameworkCore.DbMigrations - -Contém migrações de banco de dados EF Core para a solução. Ele foi separado `DbContext`para dedicado a gerenciar migrações. - -ABP é uma estrutura modular e com um design ideal, cada módulo tem sua própria `DbContext`classe. É aqui que a migração `DbContext`entra em ação e unifica todas as `DbContext`configurações em um único modelo para manter um único esquema de banco de dados. Para cenários mais avançados, você pode ter vários bancos de dados (cada um contém uma única ou algumas tabelas de módulos) e várias migrações `DbContext`(cada uma mantém um esquema de banco de dados diferente). - -Observe que a migração `DbContext`é usada apenas para migrações de banco de dados e *não em tempo de execução* . - -- Depende do `.EntityFrameworkCore`projeto, pois reutiliza a configuração definida para `DbContext`o aplicativo. - -> Este projeto está disponível apenas se você estiver usando o EF Core como provedor de banco de dados. - -#### Projeto .DbMigrator - -Este é um aplicativo de console que simplifica a execução de migrações de banco de dados em ambientes de desenvolvimento e produção. Quando você executa este aplicativo, ele; - -- Cria o banco de dados, se necessário. -- Aplica as migrações de banco de dados pendentes. -- Semeia os dados iniciais, se necessário. - -> Este projeto possui seu próprio `appsettings.json`arquivo. Portanto, se você deseja alterar a cadeia de conexão do banco de dados, lembre-se de alterar também esse arquivo. - -Especialmente, semear dados iniciais é importante neste momento. A ABP possui uma infraestrutura modular de semente de dados. Consulte [a documentação](../Data-Seeding.md) para obter mais informações sobre a propagação de dados. - -Embora a criação de banco de dados e a aplicação de migrações pareça necessária apenas para bancos de dados relacionais, esse projeto ocorre mesmo que você escolha um provedor de banco de dados NoSQL (como o MongoDB). Nesse caso, ele ainda semeia os dados iniciais necessários para a aplicação. - -- Depende do `.EntityFrameworkCore.DbMigrations`projeto (para EF Core), pois ele precisa acessar as migrações. -- Depende do `.Application.Contracts`projeto para poder acessar as definições de permissão, porque o semeador de dados inicial concede todas as permissões para a função de administrador por padrão. - -#### Projeto .HttpApi - -Este projeto é usado para definir seus controladores de API. - -Na maioria das vezes, você não precisa definir manualmente os controladores de API, pois o recurso de [controladores de API automática](../AspNetCore/Auto-API-Controllers.md) da ABP os cria automaticamente, com base na sua camada de aplicação. No entanto, no caso de você precisar escrever controladores de API, este é o melhor lugar para fazê-lo. - -- Depende do `.Application.Contracts`projeto para poder injetar as interfaces de serviço do aplicativo. - -#### Projeto .HttpApi.Client - -Este é um projeto que define os proxies do cliente C # para usar as APIs HTTP da solução. Você pode compartilhar essa biblioteca com clientes de terceiros, para que eles consumam facilmente suas APIs HTTP em seus aplicativos Dotnet (para outros tipos de aplicativos, eles ainda podem usar suas APIs, manualmente ou usando uma ferramenta em sua própria plataforma) - -Na maioria das vezes, você não precisa criar proxies de clientes C # manualmente, graças ao recurso [Dynamic C # API Clients](../AspNetCore/Dynamic-CSharp-API-Clients.md) da ABP . - -`.HttpApi.Client.ConsoleTestApp` project é um aplicativo de console criado para demonstrar o uso dos proxies do cliente. - -- Depende do `.Application.Contracts`projeto para poder compartilhar as mesmas interfaces de serviço de aplicativo e DTOs com o serviço remoto. - -> Você pode excluir este projeto e dependências se não precisar criar proxies de cliente C # para suas APIs. - -#### Projeto .Web - -Este projeto contém a interface do usuário (UI) do aplicativo se você estiver usando a interface do usuário do ASP.NET Core MVC. Ele contém páginas Razor, arquivos JavaScript, arquivos CSS, imagens e assim por diante ... - -Este projeto contém o `appsettings.json`arquivo principal que contém a cadeia de conexão e outras configurações do aplicativo. - -- Depende da `.HttpApi`camada de interface do usuário que precisa usar APIs e interfaces de serviço de aplicativo da solução. - -> Se você verificar o código fonte do `.Web.csproj`arquivo, verá as referências aos `.Application`e aos `.EntityFrameworkCore.DbMigrations`projetos. -> -> Na verdade, essas referências não são necessárias durante a codificação da camada da interface do usuário, porque a camada da interface do usuário normalmente não depende da implementação do EF Core ou da camada do Aplicativo. Esses modelos de inicialização estão prontos para a implantação em camadas, em que a camada da API está hospedada em um servidor separado da camada da interface do usuário. -> -> No entanto, se você não escolher a opção `--tiered`, essas referências estarão no projeto .Web para poder hospedar as camadas da Web, API e aplicativos em um único ponto de extremidade do aplicativo. -> -> Isso permite que você use entidades e repositórios de domínio em sua camada de apresentação. No entanto, isso é considerado uma má prática de acordo com o DDD. - -#### Projetos de teste - -A solução possui vários projetos de teste, um para cada camada: - -- `.Domain.Tests` é usado para testar a camada de domínio. -- `.Application.Tests` é usado para testar a camada de aplicativo. -- `.EntityFrameworkCore.Tests` é usado para testar a configuração do EF Core e os repositórios personalizados. -- `.Web.Tests` é usado para testar a interface do usuário (se você estiver usando a interface do ASP.NET Core MVC). -- `.TestBase` é um projeto básico (compartilhado) para todos os testes. - -Além disso, `.HttpApi.Client.ConsoleTestApp`é um aplicativo de console (não um projeto de teste automatizado) que demonstra o uso de APIs HTTP de um aplicativo .NET. - -Projetos de teste são preparados para testes de integração; - -- É totalmente integrado à estrutura ABP e a todos os serviços em sua aplicação. -- Ele usa o banco de dados SQLite na memória para o EF Core. Para o MongoDB, ele usa a biblioteca [EphemeralMongo](https://github.com/asimmon/ephemeral-mongo) . -- A autorização está desabilitada, portanto, qualquer serviço de aplicativo pode ser facilmente usado em testes. - -Você ainda pode criar testes de unidade para suas classes, que serão mais difíceis de escrever (porque você precisará preparar objetos simulados / falsos), mas mais rápidos de executar (porque apenas testa uma única classe e ignora todo o processo de inicialização). - -#### Como correr? - -Defina `.Web`como o projeto de inicialização e execute o aplicativo. O nome de usuário padrão é `admin`e a senha é `1q2w3E*`. - -Consulte [Introdução ao modelo ASP.NET Core MVC](../Getting-Started-AspNetCore-MVC-Template.md) para obter mais informações. - -### Estrutura em camadas - -Se você selecionou a interface do usuário do ASP.NET Core e especificou a `--tiered`opção, a solução criada será uma solução em camadas. O objetivo da estrutura em camadas é poder **implantar aplicativos da Web e API HTTP em diferentes servidores** : - -![livraria-visual-studio-solution-v3](../images/tiered-solution-servers.png) - -- O navegador executa sua interface do usuário executando HTML, CSS e JavaScript. -- Os servidores da Web hospedam arquivos de interface do usuário estáticos (CSS, JavaScript, imagem ... etc.) e componentes dinâmicos (por exemplo, páginas Razor). Ele executa solicitações HTTP para o servidor da API para executar a lógica de negócios do aplicativo. -- O API Server hospeda as APIs HTTP que, em seguida, usam as camadas de aplicativo e domínio do aplicativo para executar a lógica de negócios. -- Finalmente, o servidor de banco de dados hospeda seu banco de dados. - -Portanto, a solução resultante permite uma implantação em quatro camadas, comparando com a implantação em três camadas da estrutura padrão explicada anteriormente. - -> A menos que você realmente precise de uma implantação em quatro camadas, é recomendável seguir a estrutura padrão que é mais simples de desenvolver, implantar e manter. - -A estrutura da solução é mostrada abaixo: - -![livraria-visual-studio-solution-v3](../images/bookstore-visual-studio-solution-tiered.png) - -Diferente da estrutura padrão, dois novos projetos entram em jogo: `.IdentityServer`& `.HttpApi.Host`. - -#### Projeto .IdentityServer - -Este projeto é usado como um servidor de autenticação para outros projetos. `.Web`O projeto usa a autenticação do OpenId Connect para obter tokens de identidade e acesso para o usuário atual do IdentityServer. Em seguida, usa o token de acesso para chamar o servidor da API HTTP. O servidor HTTP API usa autenticação de token de portador para obter declarações do token de acesso para autorizar o usuário atual. - -![aplicativos de solução em camadas](../images/tiered-solution-applications.png) - -O ABP usa a estrutura [IdentityServer4 de](https://identityserver.io/) código aberto para a autenticação entre aplicativos. Consulte a [documentação do IdentityServer4](http://docs.identityserver.io/) para obter detalhes sobre o protocolo IdentityServer4 e OpenID Connect. - -Ele possui seu próprio `appsettings.json`que contém conexão com o banco de dados e outras configurações. - -#### Projeto .HttpApi.Host - -Este projeto é um aplicativo que hospeda a API da solução. Ele possui seu próprio `appsettings.json`que contém conexão com o banco de dados e outras configurações. - -#### Projeto .Web - -Assim como a estrutura padrão, este projeto contém a interface do usuário (UI) do aplicativo. Ele contém páginas de barbear, arquivos JavaScript, arquivos de estilo, imagens e assim por diante ... - -Este projeto contém um `appsettings.json`arquivo, mas desta vez não possui uma cadeia de conexão porque nunca se conecta ao banco de dados. Em vez disso, ele contém principalmente o terminal do servidor de API remoto e o servidor de autenticação. - -#### Pré requisitos - -- [Redis](https://redis.io/) : os aplicativos usam Redis como cache distribuído. Então, você precisa ter o Redis instalado e funcionando. - -#### Como correr? - -Você deve executar o aplicativo com a ordem especificada: - -- Primeiro, execute o `.IdentityServer`aplicativo, pois outros aplicativos dependem dele. -- Em seguida, execute o `.HttpApi.Host`que é usado pelo `.Web`aplicativo. -- Por fim, você pode executar o `.Web`projeto e efetuar login no aplicativo (usando `admin`como nome de usuário e `1q2w3E*`senha). - -### UI angular - -Se você escolher Angular como a estrutura da interface do usuário (usando a `-u angular`opção), a solução será separada em duas pastas: - -- `angular` A pasta contém a solução Angular UI, do lado do cliente. -- `aspnet-core` A pasta contém a solução ASP.NET Core, do lado do servidor. - -O lado do servidor é muito semelhante à solução descrita acima. `.HttpApi.Host`projeto serve a API, para que o aplicativo Angular possa consumi-lo. - -Os arquivos na `angular/src/environments`pasta têm a configuração essencial do aplicativo. - -## Qual é o próximo? - -- Consulte [Introdução ao modelo ASP.NET Core MVC](../Getting-Started-AspNetCore-MVC-Template.md) para criar uma nova solução e executá-la para este modelo. -- Consulte o [Tutorial](../Tutorials/AspNetCore-Mvc/Part-I.md) do [ASP.NET Core MVC](../Tutorials/AspNetCore-Mvc/Part-I.md) para aprender como desenvolver aplicativos usando este modelo. - - diff --git a/docs/pt-BR/Startup-Templates/Index.md b/docs/pt-BR/Startup-Templates/Index.md deleted file mode 100644 index 61f2d2d544..0000000000 --- a/docs/pt-BR/Startup-Templates/Index.md +++ /dev/null @@ -1,7 +0,0 @@ -# Modelos de inicialização - -Embora você possa começar com um projeto vazio e adicionar os pacotes necessários manualmente, os modelos de inicialização facilitam e são confortáveis para iniciar uma nova solução com a estrutura ABP. Clique no nome da lista abaixo para ver a documentação do modelo de inicialização relacionado: - -- [**app**](Application.md) : modelo de aplicativo. -- [**módulo**](Module.md) : Módulo / modelo de serviço. - diff --git a/docs/pt-BR/Startup-Templates/Module.md b/docs/pt-BR/Startup-Templates/Module.md deleted file mode 100644 index 262e85c342..0000000000 --- a/docs/pt-BR/Startup-Templates/Module.md +++ /dev/null @@ -1,161 +0,0 @@ -# Modelo de inicialização do módulo MVC - -Este modelo pode ser usado para criar um **módulo de aplicativo** **reutilizável com** base nas [melhores práticas e convenções de desenvolvimento do módulo](../Best-Practices/Index.md). Também é adequado para criar **microsserviços** (com ou sem interface do usuário). - -## Como começar? - -Você pode usar a [ABP CLI](../CLI.md) para criar um novo projeto usando este modelo de inicialização. Como alternativa, você pode criar e fazer o download diretamente na página [Introdução](https://abp.io/get-started) . A abordagem CLI é usada aqui. - -Primeiro, instale a ABP CLI se você não tiver instalado antes: - -```bash -dotnet tool install -g Volo.Abp.Cli -``` - -Em seguida, use o `abp new`comando em uma pasta vazia para criar uma nova solução: - -```bash -abp new Acme.IssueManagement -t module -``` - -- `Acme.IssueManagement`é o nome da solução, como *YourCompany.YourProduct* . Você pode usar nomes de nível único, dois ou três níveis. - -### Sem interface de usuário - -O modelo vem com uma interface do usuário do MVC por padrão. Você pode usar a `--no-ui`opção para não incluir a camada da interface do usuário. - -```bash -abp new Acme.IssueManagement -t mvc-module --no-ui -``` - -## Estrutura da solução - -Com base nas opções especificadas, você obterá uma estrutura de solução ligeiramente diferente. Se você não especificar nenhuma opção, terá uma solução como a mostrada abaixo: - -![issuemanagement-module-solution](../images/issuemanagement-module-solution.png) - -Projetos são organizados como `src`, `test`e `host`pastas: - -- `src`A pasta contém o módulo real, que é estratificado com base nos princípios [DDD](../Domain-Driven-Design.md) . -- `test` pasta contém testes de unidade e integração. -- `host`A pasta contém aplicativos com configurações diferentes para demonstrar como hospedar o módulo em um aplicativo. Isso não faz parte do módulo, mas é útil no desenvolvimento. - -O diagrama abaixo mostra as camadas e dependências do projeto do módulo: - -![módulo de dependências do projeto em camadas](../images/layered-project-dependencies-module.png) - -Cada seção abaixo explicará o projeto relacionado e suas dependências. - -### Projeto .Domain.Shared - -Este projeto contém constantes, enumerações e outros objetos. Na verdade, eles fazem parte da camada de domínio, mas precisam ser usados por todas as camadas / projetos da solução. - -Um `IssueType`enum e uma `IssueConsts`classe (que podem ter alguns campos constantes para a `Issue`entidade, como `MaxTitleLength`) são bons candidatos para este projeto. - -- Este projeto não depende de outros projetos na solução. Todos os outros projetos dependem disso direta ou indiretamente. - -### .Domain Project - -Essa é a camada de domínio da solução. Ele contém principalmente [entidades, raízes agregadas](../Entities.md) , [serviços de domínio](../Domain-Services.md) , [tipos de valor](../Value-Types.md) , [interfaces de repositório](../Repositories.md) e outros objetos de domínio. - -Uma `Issue`entidade, um `IssueManager`serviço de domínio e uma `IIssueRepository`interface são bons candidatos para este projeto. - -- Depende do `.Domain.Shared`porque usa constantes, enumerações e outros objetos definidos nesse projeto. - -### .Application.Contracts Project - -Este projeto contém principalmente **interfaces de** [serviço de aplicativo](../Application-Services.md) e DTO ( [Data Transfer Objects](../Data-Transfer-Objects.md) ) da camada de aplicativo. Existe para separar a interface e a implementação da camada de aplicação. Dessa forma, o projeto de interface pode ser compartilhado com os clientes como um pacote de contrato. - -Uma `IIssueAppService`interface e uma `IssueCreationDto`classe são boas candidatas para este projeto. - -- Depende do `.Domain.Shared`porque ele pode usar constantes, enumerações e outros objetos compartilhados deste projeto nas interfaces de serviço de aplicativo e DTOs. - -### Projeto de Aplicação - -Este projeto contém as **implementações** de [serviço de aplicativo](../Application-Services.md) das interfaces definidas no projeto.`.Application.Contracts` - -Uma `IssueAppService`turma é uma boa candidata para este projeto. - -- Depende do `.Application.Contracts`projeto para poder implementar as interfaces e usar os DTOs. -- Depende do `.Domain`projeto para poder usar objetos de domínio (entidades, interfaces de repositório ... etc.) para executar a lógica do aplicativo. - -### Projeto .EntityFrameworkCore - -Este é o projeto de integração do EF Core. Ele define `DbContext`e implementa as interfaces de repositório definidas no `.Domain`projeto. - -- Depende do `.Domain`projeto para poder fazer referência a entidades e interfaces de repositório. - -> Você pode excluir este projeto se não desejar dar suporte ao EF Core para o seu módulo. - -### Projeto .MongoDB - -Este é o projeto de integração do MongoDB. - -- Depende do `.Domain`projeto para poder fazer referência a entidades e interfaces de repositório. - -> Você pode excluir este projeto se não quiser dar suporte ao MongoDB para o seu módulo. - -### Projetos de teste - -A solução possui vários projetos de teste, um para cada camada: - -- `.Domain.Tests` é usado para testar a camada de domínio. -- `.Application.Tests` é usado para testar a camada de aplicativo. -- `.EntityFrameworkCore.Tests` é usado para testar a configuração do EF Core e os repositórios personalizados. -- `.MongoDB.Tests` é usado para testar a configuração do MongoDB e os repositórios personalizados. -- `.TestBase` é um projeto básico (compartilhado) para todos os testes. - -Além disso, `.HttpApi.Client.ConsoleTestApp`é um aplicativo de console (não um projeto de teste automatizado) que demonstra o uso de APIs HTTP de um aplicativo Dotnet. - -Projetos de teste são preparados para testes de integração; - -- É totalmente integrado à estrutura ABP e a todos os serviços em sua aplicação. -- Ele usa o banco de dados SQLite na memória para o EF Core. Para o MongoDB, ele usa a biblioteca [EphemeralMongo](https://github.com/asimmon/ephemeral-mongo) . -- A autorização está desabilitada, portanto, qualquer serviço de aplicativo pode ser facilmente usado em testes. - -Você ainda pode criar testes de unidade para suas classes, que serão mais difíceis de escrever (porque você precisará preparar objetos simulados / falsos), mas mais rápidos de executar (porque apenas testa uma única classe e ignora todo o processo de inicialização). - -> Os testes de domínio e aplicativos estão usando o EF Core. Se você remover a integração do EF Core ou desejar usar o MongoDB para testar essas camadas, altere manualmente as referências do projeto e as dependências do módulo. - -### Projetos Anfitriões - -A solução possui alguns aplicativos host para executar seu módulo. Aplicativos host são usados para executar seu módulo em um aplicativo totalmente configurado. É útil no desenvolvimento. Os aplicativos host incluem alguns outros módulos além do módulo que está sendo desenvolvido: - -Os aplicativos host oferecem suporte a dois tipos de cenários. - -#### Cenário de aplicativo único (unificado) - -Se o seu módulo tiver uma interface do usuário, o `.Web.Unified`aplicativo será usado para hospedar a interface do usuário e a API em um único ponto. Ele possui seu próprio `appsettings.json`arquivo (que inclui a cadeia de conexão do banco de dados) e as migrações do banco de dados EF Core. - -Para o `.Web.Unified`aplicativo, há um único banco de dados chamado `YourProjectName_Unified`(como *IssueManagement_Unified* para esta amostra). - -> Se você selecionou a `--no-ui`opção, este projeto não estará na sua solução. - -##### Como correr? - -Defina-o como o projeto de inicialização, execute o `Update-Database`comando para o EF Core no Package Manager Console e execute seu aplicativo. O nome de usuário padrão é `admin`e a senha é `1q2w3E*`. - -#### Implantação separada e cenário de bancos de dados - -Nesse cenário, há três aplicativos; - -- `.IdentityServer`application é um servidor de autenticação usado por outros aplicativos. Ele possui seu próprio `appsettings.json`que contém conexão com o banco de dados e outras configurações. -- `.HttpApi.Host`hospeda a API HTTP do módulo. Ele possui seu próprio `appsettings.json`que contém conexões com o banco de dados e outras configurações. -- `.Web.Host`hospedar a interface do usuário do módulo. Este projeto contém um `appsettings.json`arquivo, mas não possui uma cadeia de conexão porque nunca se conecta ao banco de dados. Em vez disso, ele contém principalmente o terminal do servidor de API remoto e o servidor de autenticação. - -O diagrama abaixo mostra a relação dos aplicativos: - -![aplicativos de solução em camadas](../images/tiered-solution-applications.png) - -`.Web.Host`O projeto usa a autenticação OpenId Connect para obter tokens de identidade e acesso para o usuário atual do `.IdentityServer`. Em seguida, usa o token de acesso para chamar o `.HttpApi.Host`. O servidor HTTP API usa autenticação de token de portador para obter declarações do token de acesso para autorizar o usuário atual. - -##### Como correr? - -Você deve executar o aplicativo com a ordem especificada: - -- Primeiro, execute o `.IdentityServer`aplicativo, pois outros aplicativos dependem dele. -- Em seguida, execute o `.HttpApi.Host`que é usado pelo `.Web.Host`aplicativo. -- Por fim, você pode executar o `.Web.Host`projeto e efetuar login no aplicativo usando `admin`como nome de usuário e `1q2w3E*`senha. - - - \ No newline at end of file diff --git a/docs/pt-BR/Testing.md b/docs/pt-BR/Testing.md deleted file mode 100644 index 231db64907..0000000000 --- a/docs/pt-BR/Testing.md +++ /dev/null @@ -1,3 +0,0 @@ -# Testing - -Façam! \ No newline at end of file diff --git a/docs/pt-BR/Tutorials/Angular/Part-I.md b/docs/pt-BR/Tutorials/Angular/Part-I.md deleted file mode 100644 index 3b0b1daf1b..0000000000 --- a/docs/pt-BR/Tutorials/Angular/Part-I.md +++ /dev/null @@ -1,663 +0,0 @@ -## Tutorial Angular - Parte I - -### Sobre este tutorial - -Nesta série de tutoriais, você criará um aplicativo usado para gerenciar uma lista de livros e seus autores. **Angular** será usado como estrutura da interface do usuário e **MongoDB** será usado como provedor de banco de dados. - -Esta é a primeira parte da série de tutoriais angulares. Veja todas as peças: - -- **Parte I: Crie o projeto e uma página de lista de livros (este tutorial)** -- [Parte II: Criar, atualizar e excluir livros](Part-II) -- [Parte III: Testes de Integração](Part-III) - -Você pode acessar o **código fonte** do aplicativo no [repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) . - -### Criando o projeto - -Crie um novo projeto nomeado `Acme.BookStore`selecionando Angular como a estrutura da interface do usuário e MongoDB como o provedor de banco de dados, crie o banco de dados e execute o aplicativo seguindo o [documento Introdução](../../Getting-Started-Angular-Template.md) . - -### Estrutura da solução (back-end) - -É assim que a estrutura da solução em camadas cuida da criação: - -![solução de back-end da livraria](images/bookstore-backend-solution-v2.png) - -> Você pode ver o [documento do modelo de aplicativo](../../Startup-Templates/Application.md) para entender a estrutura da solução em detalhes. No entanto, você entenderá o básico com este tutorial. - -### Criar a entidade do livro - -A camada de domínio no modelo de inicialização é separada em dois projetos: - -- `Acme.BookStore.Domain`contém suas [entidades](../../Entities.md) , [serviços de domínio](../../Domain-Services.md) e outros objetos principais de domínio. -- `Acme.BookStore.Domain.Shared` contém constantes, enumerações ou outros objetos relacionados ao domínio que podem ser compartilhados com os clientes. - -Defina [entidades](../../Entities.md) na **camada de domínio** ( `Acme.BookStore.Domain`projeto) da solução. A entidade principal do aplicativo é a `Book`. Crie uma classe, chamada `Book`, no `Acme.BookStore.Domain`projeto, como mostrado abaixo: - -```csharp -using System; -using Volo.Abp.Domain.Entities.Auditing; - -namespace Acme.BookStore -{ - public class Book : AuditedAggregateRoot - { - public string Name { get; set; } - - public BookType Type { get; set; } - - public DateTime PublishDate { get; set; } - - public float Price { get; set; } - } -} -``` - -- O ABP possui duas classes base fundamentais para entidades: `AggregateRoot`e `Entity`. **A raiz agregada** é um dos conceitos de **DDD (Domain Driven Design)** . Consulte o [documento da entidade](../../Entities.md) para obter detalhes e melhores práticas. -- `Book`entidade herda `AuditedAggregateRoot`que adiciona algumas propriedades de auditoria ( `CreationTime`, `CreatorId`, `LastModificationTime`... etc.) no topo da `AggregateRoot`classe. -- `Guid`é o **tipo** de **chave primária** da `Book`entidade. - -#### BookType Enum - -Defina a `BookType`enumeração no `Acme.BookStore.Domain.Shared`projeto: - -```csharp -namespace Acme.BookStore -{ - public enum BookType - { - Undefined, - Adventure, - Biography, - Dystopia, - Fantastic, - Horror, - Science, - ScienceFiction, - Poetry - } -} -``` - -#### Adicionar entidade de livro ao seu DbContext - -Adicione uma `IMongoCollection`propriedade ao `BookStoreMongoDbContext`interior do `Acme.BookStore.MongoDB`projeto: - -```csharp -public class BookStoreMongoDbContext : AbpMongoDbContext -{ - public IMongoCollection Books => Collection(); - ... -} -``` - -#### Adicionar dados de semente (amostra) - -Esta seção é opcional, mas seria bom ter um dado inicial no banco de dados na primeira execução. O ABP fornece um [sistema de semente de dados](../../Data-Seeding.md) . Crie uma classe derivada de `IDataSeedContributor`no `.Domain`projeto: - -```csharp -using System; -using System.Threading.Tasks; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories; - -namespace Acme.BookStore -{ - public class BookStoreDataSeederContributor - : IDataSeedContributor, ITransientDependency - { - private readonly IRepository _bookRepository; - - public BookStoreDataSeederContributor(IRepository bookRepository) - { - _bookRepository = bookRepository; - } - - public async Task SeedAsync(DataSeedContext context) - { - if (await _bookRepository.GetCountAsync() > 0) - { - return; - } - - await _bookRepository.InsertAsync( - new Book - { - Name = "1984", - Type = BookType.Dystopia, - PublishDate = new DateTime(1949, 6, 8), - Price = 19.84f - } - ); - - await _bookRepository.InsertAsync( - new Book - { - Name = "The Hitchhiker's Guide to the Galaxy", - Type = BookType.ScienceFiction, - PublishDate = new DateTime(1995, 9, 27), - Price = 42.0f - } - ); - } - } -} -``` - -`BookStoreDataSeederContributor`simplesmente insere dois livros no banco de dados se não houver nenhum livro adicionado antes. O ABP descobre e executa automaticamente essa classe quando você propaga o banco de dados executando o `Acme.BookStore.DbMigrator`projeto. - -### Crie o serviço de aplicativo - -O próximo passo é criar um [serviço de aplicativo](../../Application-Services.md) para gerenciar (criar, listar, atualizar, excluir ...) os livros. A camada de aplicativo no modelo de inicialização é separada em dois projetos: - -- `Acme.BookStore.Application.Contracts` contém principalmente seus DTOs e interfaces de serviço de aplicativo. -- `Acme.BookStore.Application` contém as implementações dos seus serviços de aplicativo. - -#### BookDto - -Crie uma classe DTO denominada `BookDto`no `Acme.BookStore.Application.Contracts`projeto: - -```csharp -using System; -using Volo.Abp.Application.Dtos; - -namespace Acme.BookStore -{ - public class BookDto : AuditedEntityDto - { - public string Name { get; set; } - - public BookType Type { get; set; } - - public DateTime PublishDate { get; set; } - - public float Price { get; set; } - } -} -``` - -- **As** classes **DTO** são usadas para **transferir dados** entre a *camada de apresentação* e a *camada de aplicativo* . Consulte o [documento Objetos de transferência de dados](../../Data-Transfer-Objects.md) para obter mais detalhes. -- `BookDto` é usado para transferir dados do livro para a camada de apresentação para mostrar as informações do livro na interface do usuário. -- `BookDto`é derivado do `AuditedEntityDto`que possui propriedades de auditoria exatamente como a `Book`classe definida acima. - -Será necessário converter `Book`entidades em `BookDto`objetos enquanto retorna os livros para a camada de apresentação. A biblioteca do [AutoMapper](https://automapper.org/) pode automatizar essa conversão quando você define o mapeamento adequado. O modelo de inicialização é fornecido com o AutoMapper configurado, para que você possa definir o mapeamento na `BookStoreApplicationAutoMapperProfile`classe no `Acme.BookStore.Application`projeto: - -```csharp -using AutoMapper; - -namespace Acme.BookStore -{ - public class BookStoreApplicationAutoMapperProfile : Profile - { - public BookStoreApplicationAutoMapperProfile() - { - CreateMap(); - } - } -} -``` - -#### CreateUpdateBookDto - -Crie uma classe DTO denominada `CreateUpdateBookDto`no `Acme.BookStore.Application.Contracts`projeto: - -```csharp -using System; -using System.ComponentModel.DataAnnotations; - -namespace Acme.BookStore -{ - public class CreateUpdateBookDto - { - [Required] - [StringLength(128)] - public string Name { get; set; } - - [Required] - public BookType Type { get; set; } = BookType.Undefined; - - [Required] - public DateTime PublishDate { get; set; } - - [Required] - public float Price { get; set; } - } -} -``` - -- Essa classe DTO é usada para obter informações do livro a partir da interface do usuário ao criar ou atualizar um livro. -- Ele define atributos de anotação de dados (como `[Required]`) para definir validações para as propriedades. Os DTOs são [validados automaticamente](../../Validation.md) pela estrutura ABP. - -Em seguida, adicione um mapeamento `BookStoreApplicationAutoMapperProfile`do `CreateUpdateBookDto`objeto à `Book`entidade: - -```csharp -CreateMap(); -``` - -#### IBookAppService - -Defina uma interface nomeada `IBookAppService`no `Acme.BookStore.Application.Contracts`projeto: - -```csharp -using System; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; - -namespace Acme.BookStore -{ - public interface IBookAppService : - ICrudAppService< //Defines CRUD methods - BookDto, //Used to show books - Guid, //Primary key of the book entity - PagedAndSortedResultRequestDto, //Used for paging/sorting on getting a list of books - CreateUpdateBookDto, //Used to create a new book - CreateUpdateBookDto> //Used to update a book - { - - } -} -``` - -- A definição de interfaces para serviços de aplicativos não é requerida pela estrutura. No entanto, é sugerido como uma prática recomendada. -- `ICrudAppService`define comuns **CRUD** métodos: `GetAsync`, `GetListAsync`, `CreateAsync`, `UpdateAsync`e `DeleteAsync`. Não é necessário estendê-lo. Em vez disso, você pode herdar da `IApplicationService`interface vazia e definir seus próprios métodos manualmente. -- Existem algumas variações de `ICrudAppService`onde você pode usar DTOs separados para cada método. - -#### BookAppService - -Implemente `IBookAppService`como nomeado `BookAppService`no `Acme.BookStore.Application`projeto: - -```csharp -using System; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.Domain.Repositories; - -namespace Acme.BookStore -{ - public class BookAppService : - CrudAppService, - IBookAppService - { - public BookAppService(IRepository repository) - : base(repository) - { - - } - } -} -``` - -- `BookAppService`é derivado do `CrudAppService<...>`qual implementa todos os métodos CRUD definidos acima. -- `BookAppService`injeta `IRepository`qual é o repositório padrão da `Book`entidade. O ABP cria automaticamente repositórios padrão para cada raiz (ou entidade) agregada. Veja o [documento do repositório](../../Repositories) . -- `BookAppService`usa `IObjectMapper`para converter `Book`objetos em `BookDto`objetos e `CreateUpdateBookDto`objetos em `Book`objetos. O modelo de inicialização usa a biblioteca [AutoMapper](http://automapper.org/) como o provedor de mapeamento de objetos. Você definiu os mapeamentos antes, para que funcionem conforme o esperado. - -### Controladores de API automática - -Você normalmente cria **controladores** para expor serviços de aplicativos como pontos de extremidade da **API HTTP** . Assim, permite que navegadores ou clientes de terceiros os chamem via AJAX. O ABP pode configurar [**automaticamente**](../../AspNetCore/Auto-API-Controllers.md) seus serviços de aplicativo como controladores de API MVC por convenção. - -#### UI do Swagger - -O modelo de inicialização está configurado para executar a [interface do usuário do swagger](https://swagger.io/tools/swagger-ui/) usando a biblioteca [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) . Execute o `Acme.BookStore.HttpApi.Host`aplicativo e insira `https://localhost:XXXX/swagger/`(substitua XXXX por sua própria porta) como URL no seu navegador. - -Você verá alguns pontos de extremidade de serviço internos, bem como o `Book`serviço e seus pontos de extremidade no estilo REST: - -![livraria-arrogância](images/bookstore-swagger-api.png) - -O Swagger tem uma ótima interface para testar APIs. Você pode tentar executar a `[GET] /api/app/book`API para obter uma lista de livros. - -### Crie a página de livros - -Neste tutorial; - -- [A CLI angular](https://angular.io/cli) será usada para criar módulos, componentes e serviços -- [NGXS](https://ngxs.gitbook.io/ngxs/) será usado como a biblioteca de gerenciamento de estado -- [O Bootstrap](https://ng-bootstrap.github.io/#/home) será usado como a biblioteca de componentes da interface do usuário. -- [O Visual Studio Code](https://code.visualstudio.com/) será usado como editor de código (você pode usar seu editor favorito). - -#### Instalar pacotes NPM - -Abra uma janela do terminal, vá para a `angular`pasta e execute o `yarn` comando para instalar os pacotes NPM: - -``` -yarn -``` - -#### BooksModule - -Execute a seguinte linha de comando para criar um novo módulo, denominado `BooksModule`: - -```bash -yarn ng generate module books --route books --module app.module -``` - -![Creating-Books-Module.terminal](images/bookstore-creating-books-module-terminal.png) - -Execute `yarn start`, aguarde Angular para executar o aplicativo e abra `http://localhost:4200/books`em um navegador: - -![página inicial dos livros](images/bookstore-initial-books-page.png) - -#### Encaminhamento - -Abra `app-routing.module.ts`e substitua `books`conforme mostrado abaixo: - -```js -import { ApplicationLayoutComponent } from '@abp/ng.theme.basic';- - -//... -{ - path: 'books', - component: ApplicationLayoutComponent, - loadChildren: () => import('./books/books.module').then(m => m.BooksModule), - data: { - routes: { - name: 'Books', - } as ABP.Route, - }, -}, -``` - -`ApplicationLayoutComponent`configuração define o layout do aplicativo para a nova página. Se você deseja ver sua rota na barra de navegação (menu principal), também deve adicionar o `data`objeto com `name`propriedade à sua rota. - -![página inicial dos livros](images/bookstore-initial-books-page-with-layout.png) - -#### Componente da lista de livros - -Primeiro, substitua pela `books.component.html`seguinte linha para colocar a saída do roteador: - -```html - -``` - -Em seguida, execute o comando abaixo no terminal na pasta raiz para gerar um novo componente, chamado book-list: - -```bash -yarn ng generate component books/book-list -``` - -![terminal-criando-lista-de-livros](images/bookstore-creating-book-list-terminal.png) - -Importe `SharedModule`para `BooksModule`para reutilizar alguns componentes e serviços definidos em: - -```js -import { SharedModule } from '../shared/shared.module'; - -@NgModule({ - //... - imports: [ - //... - SharedModule, - ], -}) -export class BooksModule {} -``` - -Em seguida, atualize o `routes`no `books-routing.module.ts`para adicionar o novo componente book-list: - -```js -import { BookListComponent } from './book-list/book-list.component'; - -const routes: Routes = [ - { - path: '', - component: BooksComponent, - children: [{ path: '', component: BookListComponent }], - }, -]; - -@NgModule({ - imports: [RouterModule.forChild(routes)], - exports: [RouterModule], -}) -export class BooksRoutingModule {} -``` - -![página inicial da lista de livros](images/bookstore-initial-book-list-page.png) - -#### Criar BooksState - -Execute o seguinte comando no terminal para criar um novo estado, denominado `BooksState`: - -```shell -yarn ng generate ngxs-schematic:state books -``` - -Este comando cria vários novos arquivos e edições `app.modules.ts`para importar o `NgxsModule`com o novo estado: - -```js -// app.module.ts - -import { BooksState } from './store/states/books.state'; - -@NgModule({ - imports: [ - //... - NgxsModule.forRoot([BooksState]), - ], - //... -}) -export class AppModule {} -``` - -#### Obter dados de livros do back-end - -Primeiro, crie tipos de dados para mapear os dados que retornam do back-end (você pode verificar a interface do swagger ou a API do back-end para conhecer o formato dos dados). - -Modifique o `books.ts`como mostrado abaixo: - -```js -export namespace Books { - export interface State { - books: Response; - } - - export interface Response { - items: Book[]; - totalCount: number; - } - - export interface Book { - name: string; - type: BookType; - publishDate: string; - price: number; - lastModificationTime: string; - lastModifierId: string; - creationTime: string; - creatorId: string; - id: string; - } - - export enum BookType { - Undefined, - Adventure, - Biography, - Dystopia, - Fantastic, - Horror, - Science, - ScienceFiction, - Poetry, - } -} -``` - -Adicionada `Book`interface que representa um objeto de livro e `BookType`enum representa uma categoria de livro. - -#### BooksService - -Agora, crie um novo serviço, nomeado `BooksService`para executar chamadas HTTP para o servidor: - -```bash -yarn ng generate service books/shared/books -``` - -![serviço-terminal-saída](images/bookstore-service-terminal-output.png) - -Modifique `books.service.ts`como mostrado abaixo: - -```js -import { Injectable } from '@angular/core'; -import { RestService } from '@abp/ng.core'; -import { Books } from '../../store/models'; -import { Observable } from 'rxjs'; - -@Injectable({ - providedIn: 'root', -}) -export class BooksService { - constructor(private restService: RestService) {} - - get(): Observable { - return this.restService.request({ - method: 'GET', - url: '/api/app/book' - }); - } -} -``` - -Adicionado o `get`método para obter a lista de livros executando uma solicitação HTTP no terminal relacionado. - -Substitua o `books.actions.ts`conteúdo conforme mostrado abaixo: - -```js -export class GetBooks { - static readonly type = '[Books] Get'; -} -``` - -#### Implementar o BooksState - -Abra o `books.state.ts`e altere o arquivo, como mostrado abaixo: - -```js -import { State, Action, StateContext, Selector } from '@ngxs/store'; -import { GetBooks } from '../actions/books.actions'; -import { Books } from '../models/books'; -import { BooksService } from '../../books/shared/books.service'; -import { tap } from 'rxjs/operators'; -import { Injectable } from '@angular/core'; - -@State({ - name: 'BooksState', - defaults: { books: {} } as Books.State, -}) -@Injectable() -export class BooksState { - @Selector() - static getBooks(state: Books.State) { - return state.books.items || []; - } - - constructor(private booksService: BooksService) {} - - @Action(GetBooks) - get(ctx: StateContext) { - return this.booksService.get().pipe( - tap(booksResponse => { - ctx.patchState({ - books: booksResponse, - }); - }), - ); - } -} -``` - -Adicionada a `GetBooks`ação que usa o `BookService`definido acima para obter os livros e corrigir o estado. - -> O NGXS exige retornar o observável sem assiná-lo, conforme feito nesta amostra (na função get). - -#### BookListComponent - -Modifique o `book-list.component.ts`como mostrado abaixo: - -```js -import { Component, OnInit } from '@angular/core'; -import { Store, Select } from '@ngxs/store'; -import { BooksState } from '../../store/states'; -import { Observable } from 'rxjs'; -import { Books } from '../../store/models'; -import { GetBooks } from '../../store/actions'; - -@Component({ - selector: 'app-book-list', - templateUrl: './book-list.component.html', - styleUrls: ['./book-list.component.scss'], -}) -export class BookListComponent implements OnInit { - @Select(BooksState.getBooks) - books$: Observable; - - booksType = Books.BookType; - - loading = false; - - constructor(private store: Store) {} - - ngOnInit() { - this.loading = true; - this.store.dispatch(new GetBooks()).subscribe(() => { - this.loading = false; - }); - } -} -``` - -> Consulte as [ações de despacho](https://ngxs.gitbook.io/ngxs/concepts/store#dispatching-actions) e [selecione](https://ngxs.gitbook.io/ngxs/concepts/select) na documentação do NGXS para obter mais informações sobre esses recursos do NGXS. - -Substitua o `book-list.component.html`conteúdo conforme mostrado abaixo: - -```html -
-
-
-
-
- Books -
-
-
-
-
- - - - Book name - Book type - Publish date - Price - - - - - {%{{{ data.name }}}%} - {%{{{ booksType[data.type] }}}%} - {%{{{ data.publishDate | date }}}%} - {%{{{ data.price }}}%} - - - -
-
-``` - -> Usamos a [tabela PrimeNG](https://www.primefaces.org/primeng/#/table) neste componente. - -A página de livros resultante é mostrada abaixo: - -![livraria-lista-de-livros](images/bookstore-book-list.png) - -E esta é a estrutura de pastas e arquivos no final deste tutorial: - -![img](images/bookstore-angular-file-tree.png) - -> Este tutorial segue o [Guia de estilo angular](https://angular.io/guide/styleguide#file-tree) . - -### Próxima parte - -Veja a [próxima parte](Part-II.md) deste tutorial. - - - \ No newline at end of file diff --git a/docs/pt-BR/Tutorials/Angular/Part-II.md b/docs/pt-BR/Tutorials/Angular/Part-II.md deleted file mode 100644 index f948bca55a..0000000000 --- a/docs/pt-BR/Tutorials/Angular/Part-II.md +++ /dev/null @@ -1,582 +0,0 @@ -## Tutorial Angular - Parte II - -### Sobre este tutorial - -Esta é a segunda parte da série de tutoriais angulares. Veja todas as peças: - -- [Parte I: Crie o projeto e uma página da lista de livros](Part-I.md) -- **Parte II: Criar, atualizar e excluir livros (este tutorial)** -- [Parte III: Testes de Integração](Part-III.md) - -Você pode acessar o **código fonte** do aplicativo no [repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) . - -### Criando um novo livro - -Nesta seção, você aprenderá como criar um novo formulário de diálogo modal para criar um novo livro. - -#### Definição do tipo - -Criar uma interface, com o nome `CreateUpdateBookInput`no `books.ts`como mostrado abaixo: - -```js -export namespace Books { - //... - export interface CreateUpdateBookInput { - name: string; - type: BookType; - publishDate: string; - price: number; - } -} -``` - -`CreateUpdateBookInput`interface corresponde ao `CreateUpdateBookDto`no back-end. - -#### Método de Serviço - -Abra o `books.service.ts`e adicione um novo método, nomeado `create`para executar uma solicitação HTTP POST no servidor: - -```js -create(createBookInput: Books.CreateUpdateBookInput): Observable { - return this.restService.request({ - method: 'POST', - url: '/api/app/book', - body: createBookInput - }); -} -``` - -- `restService.request`A função obtém parâmetros genéricos para os tipos enviados e recebidos do servidor. Este exemplo envia um `CreateUpdateBookInput`objeto e recebe um `Book`objeto (você pode definir o tipo `void`de solicitação ou retorno, se não for usado). - -#### Definições de estado - -Adicione a `CreateUpdateBook`ação ao `books.actions.ts`conforme mostrado abaixo: - -```js -import { Books } from '../models'; - -export class CreateUpdateBook { - static readonly type = '[Books] Create Update Book'; - constructor(public payload: Books.CreateUpdateBookInput) {} -} -``` - -Abra `books.state.ts`e defina o `save`método que ouvirá uma `CreateUpdateBook`ação para criar um livro: - -```js -import { ... , CreateUpdateBook } from '../actions/books.actions'; -import { ... , switchMap } from 'rxjs/operators'; -//... -@Action(CreateUpdateBook) -save(ctx: StateContext, action: CreateUpdateBook) { - return this.booksService - .create(action.payload) - .pipe(switchMap(() => ctx.dispatch(new GetBooks()))); -} -``` - -Quando a `SaveBook`ação é despachada, o método save é executado. Ele chama o `create`método do `BooksService`definido anteriormente. Após a chamada de serviço, `BooksState`despacha a `GetBooks`ação para obter livros novamente do servidor para atualizar a página. - -#### Adicionar um modal ao BookListComponent - -Abra o `book-list.component.html`e adicione o `abp-modal`para mostrar / ocultar o modal para criar um novo livro. - -```html - - -

New Book

-
- - - - - - -
-``` - -`abp-modal`é um componente pré-construído para mostrar os modais. Embora você possa usar outra abordagem para mostrar um modal, `abp-modal`fornece benefícios adicionais. - -Adicione um botão rotulado `New book`para mostrar o modal: - -```html -
-
-
- Books -
-
-
- -
-
-``` - -Abra a variável `book-list.component.ts`e adicione `isModalOpen`e `createBook`método para mostrar / ocultar o modal. - -```js -isModalOpen = false; - -//... - -createBook() { - this.isModalOpen = true; -} -``` - -![modal vazio](images/bookstore-empty-new-book-modal.png) - -#### Criar um formulário reativo - -> [Os formulários reativos](https://angular.io/guide/reactive-forms) fornecem uma abordagem orientada a modelo para lidar com entradas de formulário cujos valores mudam ao longo do tempo. - -Adicione uma `form`variável e injete um `FormBuilder`serviço `book-list.component.ts`como mostrado abaixo (lembre-se de adicionar a instrução de importação). - -```js -import { FormGroup, FormBuilder } from '@angular/forms'; - -form: FormGroup; - -constructor( - //... - private fb: FormBuilder -) {} -``` - -> O serviço [FormBuilder](https://angular.io/api/forms/FormBuilder) fornece métodos convenientes para gerar controles. Reduz a quantidade de clichê necessária para criar formulários complexos. - -Adicione o `buildForm`método para criar um formulário de livro. - -```js -buildForm() { - this.form = this.fb.group({ - name: ['', Validators.required], - type: [null, Validators.required], - publishDate: [null, Validators.required], - price: [null, Validators.required], - }); -} -``` - -- O `group`método de `FormBuilder`( `fb`) cria a `FormGroup`. -- Adicionado `Validators.required`método estático que valida o elemento de formulário relacionado. - -Modifique o `createBook`método como mostrado abaixo: - -```js -createBook() { - this.buildForm(); - this.isModalOpen = true; -} -``` - -#### Crie os elementos DOM do formulário - -Abra `book-list.component.html`e adicione o formulário no modelo de corpo do modal. - -```html - -
-
- * - -
- -
- * - -
- -
- * - -
- -
- * - -
-
-
-``` - -- Este modelo cria um formulário com os campos Nome, Preço, Tipo e Data de publicação. - -> Usamos o [datepicker do NgBootstrap](https://ng-bootstrap.github.io/#/components/datepicker/overview) neste componente. - -Abra o `book-list.component.ts`e crie uma matriz chamada `bookTypes`: - -```js -//... -form: FormGroup; - -bookTypes = Object.keys(Books.BookType).filter( - bookType => typeof this.booksType[bookType] === 'number' -); -``` - -O `bookTypes`contém os campos da `BookType`enumeração. A matriz resultante é mostrada abaixo: - -```js -['Adventure', 'Biography', 'Dystopia', 'Fantastic' ...] -``` - -Essa matriz foi usada no modelo de formulário anterior (no `ngFor`loop). - -#### Requisitos do Datepicker - -Você precisa importar `NgbDatepickerModule`para o `books.module.ts`: - -```js -import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap'; - -@NgModule({ - imports: [ - // ... - NgbDatepickerModule, - ], -}) -export class BooksModule {} -``` - -Abra o `book-list.component.ts`e adicione `providers`como mostrado abaixo: - -```js -import { NgbDateNativeAdapter, NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap'; - -@Component({ - // ... - providers: [{ provide: NgbDateAdapter, useClass: NgbDateNativeAdapter }], -}) -export class BookListComponent implements OnInit { -// ... -``` - -> O `NgbDateAdapter`valor do Datepicker converte em `Date`tipo. Consulte os [adaptadores datepicker](https://ng-bootstrap.github.io/#/components/datepicker/overview) para obter mais detalhes. - -![forma de livro novo](images/bookstore-new-book-form.png) - -#### Salvando o livro - -Abra o `book-list.component.html`e adicione um `abp-button`para salvar o formulário. - -```html - - - - -``` - -Isso adiciona um botão Salvar à área inferior do modal: - -![livraria-novo-livro-formulário-v2](images/bookstore-new-book-form-v2.png) - -Em seguida, defina um `save`método no `BookListComponent`: - -```js -save() { - if (this.form.invalid) { - return; - } - - this.store.dispatch(new CreateUpdateBook(this.form.value)).subscribe(() => { - this.isModalOpen = false; - this.form.reset(); - }); -} -``` - -### Atualizando um livro existente - -#### BooksService - -Abra o `books.service.ts`e adicione os métodos `getById`e `update`. - -```js -getById(id: string): Observable { - return this.restService.request({ - method: 'GET', - url: `/api/app/book/${id}` - }); -} - -update(updateBookInput: Books.CreateUpdateBookInput, id: string): Observable { - return this.restService.request({ - method: 'PUT', - url: `/api/app/book/${id}`, - body: updateBookInput - }); -} -``` - -#### Ação CreateUpdateBook - -Abra o parâmetro `books.actins.ts`e adicione `id`à `CreateUpdateBook`ação: - -```js -export class CreateUpdateBook { - static readonly type = '[Books] Create Update Book'; - constructor(public payload: Books.CreateUpdateBookInput, public id?: string) {} -} -``` - -Abra `books.state.ts`e modifique o `save`método conforme mostrado abaixo: - -```js -@Action(CreateUpdateBook) -save(ctx: StateContext, action: CreateUpdateBook) { - let request; - - if (action.id) { - request = this.booksService.update(action.payload, action.id); - } else { - request = this.booksService.create(action.payload); - } - - return request.pipe(switchMap(() => ctx.dispatch(new GetBooks()))); -} -``` - -#### BookListComponent - -Injectar `BooksService`dependência, adicionando-o ao `book-list.component.ts`construtor e adicione uma variável chamada `selectedBook`. - -```js -import { BooksService } from '../shared/books.service'; -//... -selectedBook = {} as Books.Book; - -constructor( - //... - private booksService: BooksService -) -``` - -`booksService`é usado para obter o livro de edição para preparar o formulário. Modifique o `buildForm`método para reutilizar o mesmo formulário ao editar um livro. - -```js -buildForm() { - this.form = this.fb.group({ - name: [this.selectedBook.name || '', Validators.required], - type: this.selectedBook.type || null, - publishDate: this.selectedBook.publishDate ? new Date(this.selectedBook.publishDate) : null, - price: this.selectedBook.price || null, - }); -} -``` - -Adicione o `editBook`método como mostrado abaixo: - -```js - editBook(id: string) { - this.booksService.getById(id).subscribe(book => { - this.selectedBook = book; - this.buildForm(); - this.isModalOpen = true; - }); - } -``` - -Adicionado `editBook`método para obter o livro de edição, criar o formulário e mostrar o modal. - -Agora, adicione a `selectedBook`definição ao `createBook`método para reutilizar o mesmo formulário ao criar um novo livro: - -```js - createBook() { - this.selectedBook = {} as Books.Book; - //... - } -``` - -Modifique o `save`método para passar o ID do livro selecionado, como mostrado abaixo: - -```js -save() { - if (this.form.invalid) { - return; - } - - this.store.dispatch(new CreateUpdateBook(this.form.value, this.selectedBook.id)) - .subscribe(() => { - this.isModalOpen = false; - this.form.reset(); - }); -} -``` - -#### Adicione o menu suspenso "Ações" à tabela - -Abra o `book-list.component.html` e adicione modifique o `p-table` como mostrado abaixo: - -```html - - - - Actions - Book name - Book type - Publish date - Price - - - - - -
- -
- -
-
- - {%{{{ data.name }}}%} - {%{{{ booksType[data.type] }}}%} - {%{{{ data.publishDate | date }}}%} - {%{{{ data.price }}}%} - -
-
-``` - -- Adicionado um `th`para a coluna "Ações". -- Adicionado `button`com `ngbDropdownToggle`para abrir ações quando clicamos no botão. - -> Nós costumávamos usar o [NgbDropdown](https://ng-bootstrap.github.io/#/components/dropdown/examples) no menu suspenso de ações. - -A interface do usuário final é semelhante a: - -![botões de ações](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/Angular/images/bookstore-actions-buttons.png) - -Atualize o cabeçalho modal para alterar o título com base na operação atual: - -```html - -

{%{{{ selectedBook.id ? 'Edit' : 'New Book' }}}%}

-
-``` - -![botões de ações](images/bookstore-edit-modal.png) - -### Exclusão de um livro existente - -#### BooksService - -Abra `books.service.ts`e inclua um `delete`método para excluir um livro com o `id`, executando uma solicitação HTTP no nó de extremidade relacionado: - -```js -delete(id: string): Observable { - return this.restService.request({ - method: 'DELETE', - url: `/api/app/book/${id}` - }); -} -``` - -#### Ação DeleteBook - -Adicione uma ação chamada `DeleteBook`para `books.actions.ts`: - -```js -export class DeleteBook { - static readonly type = '[Books] Delete'; - constructor(public id: string) {} -} -``` - -Abra o `books.state.ts`e adicione o `delete`método que ouvirá a `DeleteBook`ação para excluir um livro: - -```js -import { ... , DeleteBook } from '../actions/books.actions'; -//... -@Action(DeleteBook) -delete(ctx: StateContext, action: DeleteBook) { - return this.booksService.delete(action.id).pipe(switchMap(() => ctx.dispatch(new GetBooks()))); -} -``` - -- Adicionado `DeleteBook`à lista de importação. -- Usa `bookService`para excluir o livro. - -\#### Adicionar um botão Excluir - -Abra `book-list.component.html`e modifique `ngbDropdownMenu`para adicionar o botão excluir, como mostrado abaixo: - -```html -
- ... - -
-``` - -A interface do usuário suspensa de ações finais é semelhante a abaixo: - -![livraria-final-ações-suspensa](images/bookstore-final-actions-dropdown.png) - -\#### Caixa de diálogo Excluir confirmação - -Abra `book-list.component.ts`e injete o `ConfirmationService`. - -```js -import { ConfirmationService } from '@abp/ng.theme.shared'; -//... -constructor( - //... - private confirmationService: ConfirmationService -) -``` - -> `ConfirmationService` é um serviço simples fornecido pela estrutura ABP que usa internamente o PrimeNG. - -Adicione um método de exclusão ao `BookListComponent`: - -```js -import { ... , DeleteBook } from '../../store/actions'; -import { ... , Toaster } from '@abp/ng.theme.shared'; -//... -delete(id: string, name: string) { - this.confirmationService - .error(`${name} will be deleted. Do you confirm that?`, 'Are you sure?') - .subscribe(status => { - if (status === Toaster.Status.confirm) { - this.store.dispatch(new DeleteBook(id)); - } - }); -} -``` - -O `delete`método mostra um pop-up de confirmação e assina a resposta do usuário. `DeleteBook`ação despachada somente se o usuário clicar no `Yes`botão O pop-up de confirmação é exibido abaixo: - -![livraria-confirmação-pop-up](images/bookstore-confirmation-popup.png) - -### Próxima parte - -Veja a [próxima parte](Part-III.md) deste tutorial. - diff --git a/docs/pt-BR/Tutorials/Angular/Part-III.md b/docs/pt-BR/Tutorials/Angular/Part-III.md deleted file mode 100644 index e51082e176..0000000000 --- a/docs/pt-BR/Tutorials/Angular/Part-III.md +++ /dev/null @@ -1,181 +0,0 @@ -## Tutorial do ASP.NET Core MVC - Parte III - -### Sobre este tutorial - -Esta é a terceira parte da série de tutoriais Angular. Veja todas as peças: - -- [Parte I: Crie o projeto e uma página da lista de livros](Part-I.md) -- [Parte II: Criar, atualizar e excluir livros](Part-II.md) -- **Parte III: Testes de Integração (este tutorial)** - -Esta parte abrange os testes do **lado** do **servidor** . Você pode acessar o **código fonte** do aplicativo no [repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore-Angular-MongoDb) . - -### Testar projetos na solução - -Existem vários projetos de teste na solução: - -![livraria-teste-projetos](images/bookstore-test-projects-v3.png) - -Cada projeto é usado para testar o projeto de aplicativo relacionado. Os projetos de teste usam as seguintes bibliotecas para teste: - -- [xunit](https://xunit.github.io/) como a principal estrutura de teste. -- [Shouldly](http://shouldly.readthedocs.io/en/latest/) como uma biblioteca de asserções. -- [NSubstitute](http://nsubstitute.github.io/) como uma biblioteca de zombaria. - -### Adicionando dados de teste - -O modelo de inicialização contém a `BookStoreTestDataSeedContributor`classe no `Acme.BookStore.TestBase`projeto que cria alguns dados para executar os testes. - -Mude a `BookStoreTestDataSeedContributor`classe como mostrado abaixo: - -```csharp -using System; -using System.Threading.Tasks; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories; -using Volo.Abp.Guids; - -namespace Acme.BookStore -{ - public class BookStoreTestDataSeedContributor - : IDataSeedContributor, ITransientDependency - { - private readonly IRepository _bookRepository; - private readonly IGuidGenerator _guidGenerator; - - public BookStoreTestDataSeedContributor( - IRepository bookRepository, - IGuidGenerator guidGenerator) - { - _bookRepository = bookRepository; - _guidGenerator = guidGenerator; - } - - public async Task SeedAsync(DataSeedContext context) - { - await _bookRepository.InsertAsync( - new Book - { - Id = _guidGenerator.Create(), - Name = "Test book 1", - Type = BookType.Fantastic, - PublishDate = new DateTime(2015, 05, 24), - Price = 21 - } - ); - - await _bookRepository.InsertAsync( - new Book - { - Id = _guidGenerator.Create(), - Name = "Test book 2", - Type = BookType.Science, - PublishDate = new DateTime(2014, 02, 11), - Price = 15 - } - ); - } - } -} -``` - -- Injetado `IRepository`e usado no `SeedAsync`para criar duas entidades de livro como dados de teste. -- `IGuidGenerator`Serviço usado para criar GUIDs. Embora `Guid.NewGuid()`funcionasse perfeitamente para testes, `IGuidGenerator`possui recursos adicionais especialmente importantes ao usar bancos de dados reais (consulte o documento de geração do [Guid](../../Guid-Generation.md) para obter mais informações). - -### Testando o BookAppService - -Crie uma classe de teste denominada `BookAppService_Tests`no `Acme.BookStore.Application.Tests`projeto: - -```csharp -using System.Threading.Tasks; -using Shouldly; -using Volo.Abp.Application.Dtos; -using Xunit; - -namespace Acme.BookStore -{ - public class BookAppService_Tests : BookStoreApplicationTestBase - { - private readonly IBookAppService _bookAppService; - - public BookAppService_Tests() - { - _bookAppService = GetRequiredService(); - } - - [Fact] - public async Task Should_Get_List_Of_Books() - { - //Act - var result = await _bookAppService.GetListAsync( - new PagedAndSortedResultRequestDto() - ); - - //Assert - result.TotalCount.ShouldBeGreaterThan(0); - result.Items.ShouldContain(b => b.Name == "Test book 1"); - } - } -} -``` - -- `Should_Get_List_Of_Books`O teste simplesmente usa o `BookAppService.GetListAsync`método para obter e verificar a lista de usuários. - -Adicione um novo teste que crie um novo livro válido: - -```csharp -[Fact] -public async Task Should_Create_A_Valid_Book() -{ - //Act - var result = await _bookAppService.CreateAsync( - new CreateUpdateBookDto - { - Name = "New test book 42", - Price = 10, - PublishDate = DateTime.Now, - Type = BookType.ScienceFiction - } - ); - - //Assert - result.Id.ShouldNotBe(Guid.Empty); - result.Name.ShouldBe("New test book 42"); -} -``` - -Adicione um novo teste que tente criar um livro inválido e falhe: - -```csharp -[Fact] -public async Task Should_Not_Create_A_Book_Without_Name() -{ - var exception = await Assert.ThrowsAsync(async () => - { - await _bookAppService.CreateAsync( - new CreateUpdateBookDto - { - Name = "", - Price = 10, - PublishDate = DateTime.Now, - Type = BookType.ScienceFiction - } - ); - }); - - exception.ValidationErrors - .ShouldContain(err => err.MemberNames.Any(mem => mem == "Name")); -} -``` - -- Como o `Name`está vazio, o ABP lança um `AbpValidationException`. - -Abra a **janela Test Explorer** (use o menu Test -> Windows -> Test Explorer, se não estiver visível) e **execute Todos os** testes: - -![testes de serviço de livraria](images/bookstore-test-explorer.png) - -Parabéns, ícones verdes mostram que os testes foram aprovados com sucesso! - - - \ No newline at end of file diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-actions-buttons.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-actions-buttons.png deleted file mode 100644 index e09aad6400..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-actions-buttons.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-angular-file-tree.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-angular-file-tree.png deleted file mode 100644 index ec117a46b6..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-angular-file-tree.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-backend-solution-v2.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-backend-solution-v2.png deleted file mode 100644 index 7160300deb..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-backend-solution-v2.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-book-list.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-book-list.png deleted file mode 100644 index b80410a0ef..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-book-list.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-confirmation-popup.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-confirmation-popup.png deleted file mode 100644 index 47c32d9246..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-confirmation-popup.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-creating-book-list-terminal.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-creating-book-list-terminal.png deleted file mode 100644 index 63b3cbaed8..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-creating-book-list-terminal.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-creating-books-module-terminal.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-creating-books-module-terminal.png deleted file mode 100644 index ac11bed270..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-creating-books-module-terminal.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-edit-modal.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-edit-modal.png deleted file mode 100644 index 3a1b37511d..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-edit-modal.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-empty-new-book-modal.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-empty-new-book-modal.png deleted file mode 100644 index 58b34a0bc2..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-empty-new-book-modal.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-final-actions-dropdown.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-final-actions-dropdown.png deleted file mode 100644 index 7d1bdfb006..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-final-actions-dropdown.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-initial-book-list-page.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-initial-book-list-page.png deleted file mode 100644 index c66dad8bf8..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-initial-book-list-page.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-initial-books-page-with-layout.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-initial-books-page-with-layout.png deleted file mode 100644 index 317857f0f0..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-initial-books-page-with-layout.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-initial-books-page.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-initial-books-page.png deleted file mode 100644 index 9044eac641..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-initial-books-page.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-new-book-form-v2.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-new-book-form-v2.png deleted file mode 100644 index 9c06825eea..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-new-book-form-v2.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-new-book-form.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-new-book-form.png deleted file mode 100644 index aecc1d4a1a..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-new-book-form.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-service-terminal-output.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-service-terminal-output.png deleted file mode 100644 index 5bbdb6560b..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-service-terminal-output.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-swagger-api.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-swagger-api.png deleted file mode 100644 index 83c416618a..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-swagger-api.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-test-explorer.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-test-explorer.png deleted file mode 100644 index 004b5bf089..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-test-explorer.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/Angular/images/bookstore-test-projects-v3.png b/docs/pt-BR/Tutorials/Angular/images/bookstore-test-projects-v3.png deleted file mode 100644 index 42cb175da1..0000000000 Binary files a/docs/pt-BR/Tutorials/Angular/images/bookstore-test-projects-v3.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-I.md b/docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-I.md deleted file mode 100644 index f48ac88f37..0000000000 --- a/docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-I.md +++ /dev/null @@ -1,459 +0,0 @@ -## Tutorial do ASP.NET Core MVC - Parte I - -### Sobre este tutorial - -Nesta série de tutoriais, você criará um aplicativo usado para gerenciar uma lista de livros e seus autores. **O Entity Framework Core** (EF Core) será usado como o provedor ORM, pois é o provedor de banco de dados padrão. - -Esta é a primeira parte da série de tutoriais do ASP.NET Core MVC. Veja todas as peças: - -- **Parte I: Crie o projeto e uma página de lista de livros (este tutorial)** -- [Parte II: Criar, atualizar e excluir livros](Part-II.md) -- [Parte III: Testes de Integração](Part-III.md) - -Você pode acessar o **código fonte** do aplicativo [no repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore) . - -> Você também pode assistir a [este curso em vídeo](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) preparado por um membro da comunidade ABP, com base neste tutorial. - -### Criando o projeto - -Crie um novo projeto chamado `Acme.BookStore`, crie o banco de dados e execute o aplicativo seguindo o [documento Introdução](Getting-Started-AspNetCore-MVC-Template.md). - -### Estrutura da solução - -É assim que a estrutura da solução em camadas cuida da criação: - -![livraria-visual-studio-solução](images/bookstore-visual-studio-solution-v3.png) - -> Você pode ver o [documento do modelo de aplicativo](https://docs.abp.io/en/abp/latest/Startup-Templates/Application) para entender a estrutura da solução em detalhes. No entanto, você entenderá o básico com este tutorial. - -### Criar a entidade do livro - -A camada de domínio no modelo de inicialização é separada em dois projetos: - -- `Acme.BookStore.Domain`contém suas [entidades](https://docs.abp.io/en/abp/latest/Entities.md) , [serviços de domínio](https://docs.abp.io/en/abp/latest/Domain-Services) e outros objetos principais de domínio. -- `Acme.BookStore.Domain.Shared` contém constantes, enumerações ou outros objetos relacionados ao domínio que podem ser compartilhados com os clientes. - -Defina [entidades](https://docs.abp.io/en/abp/latest/Entities) na **camada de domínio** ( `Acme.BookStore.Domain`projeto) da solução. A entidade principal do aplicativo é a `Book`. Crie uma classe, chamada `Book`, no `Acme.BookStore.Domain`projeto, como mostrado abaixo: - -```csharp -using System; -using Volo.Abp.Domain.Entities.Auditing; - -namespace Acme.BookStore -{ - public class Book : AuditedAggregateRoot - { - public string Name { get; set; } - - public BookType Type { get; set; } - - public DateTime PublishDate { get; set; } - - public float Price { get; set; } - } -} -``` - -- O ABP possui duas classes base fundamentais para entidades: `AggregateRoot`e `Entity`. **A raiz agregada** é um dos conceitos de **DDD (Domain Driven Design)** . Consulte o [documento da entidade](https://docs.abp.io/en/abp/latest/Entities) para obter detalhes e melhores práticas. -- `Book`entidade herda `AuditedAggregateRoot`que adiciona algumas propriedades de auditoria ( `CreationTime`, `CreatorId`, `LastModificationTime`... etc.) no topo da `AggregateRoot`classe. -- `Guid`é o **tipo** de **chave primária** da `Book`entidade. - -#### BookType Enum - -Defina a `BookType`enumeração no `Acme.BookStore.Domain.Shared`projeto: - -```csharp -namespace Acme.BookStore -{ - public enum BookType - { - Undefined, - Adventure, - Biography, - Dystopia, - Fantastic, - Horror, - Science, - ScienceFiction, - Poetry - } -} -``` - -#### Adicionar entidade de livro ao seu DbContext - -O EF Core exige que você relacione entidades com seu DbContext. A maneira mais fácil de fazer isso é adicionar uma `DbSet`propriedade à `BookStoreDbContext`classe no `Acme.BookStore.EntityFrameworkCore`projeto, conforme mostrado abaixo: - -```csharp - public class BookStoreDbContext : AbpDbContext - { - public DbSet Books { get; set; } - ... - } -``` - -#### Configure sua entidade do livro - -Abra o `BookStoreDbContextModelCreatingExtensions.cs`arquivo no `Acme.BookStore.EntityFrameworkCore`projeto e adicione o seguinte código ao final do `ConfigureBookStore`método para configurar a entidade Livro: - -```csharp -builder.Entity(b => -{ - b.ToTable(BookStoreConsts.DbTablePrefix + "Books", BookStoreConsts.DbSchema); - b.ConfigureByConvention(); //auto configure for the base class props - b.Property(x => x.Name).IsRequired().HasMaxLength(128); -}); -``` - -#### Adicionar nova migração e atualizar o banco de dados - -O modelo de inicialização usa [as primeiras migrações do código principal EF](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/) para criar e manter o esquema do banco de dados. Abra o **Gerenciador de Console Package (PMC)** (sob as *Ferramentas / Gerente Nuget Package* menu), selecione o `Acme.BookStore.EntityFrameworkCore.DbMigrations`como o **projeto padrão** e execute o seguinte comando: - -![livraria-pmc-add-book-migration](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration-v2.png) - -Isso criará uma nova classe de migração dentro da `Migrations`pasta. Em seguida, execute o `Update-Database`comando para atualizar o esquema do banco de dados: - -``` -PM> Update-Database -``` - -#### Adicionar dados de amostra - -`Update-Database`O comando criou a `AppBooks`tabela no banco de dados. Abra seu banco de dados e insira algumas linhas de amostra, para que você possa mostrá-las na página: - -![livraria-livros-mesa](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-books-table.png) - -### Crie o serviço de aplicativo - -O próximo passo é criar um [serviço de aplicativo](https://docs.abp.io/en/abp/latest/Application-Services) para gerenciar (criar, listar, atualizar, excluir ...) os livros. A camada de aplicativo no modelo de inicialização é separada em dois projetos: - -- `Acme.BookStore.Application.Contracts` contém principalmente seus DTOs e interfaces de serviço de aplicativo. -- `Acme.BookStore.Application` contém as implementações dos seus serviços de aplicativo. - -#### BookDto - -Crie uma classe DTO denominada `BookDto`no `Acme.BookStore.Application.Contracts`projeto: - -```csharp -using System; -using Volo.Abp.Application.Dtos; - -namespace Acme.BookStore -{ - public class BookDto : AuditedEntityDto - { - public string Name { get; set; } - - public BookType Type { get; set; } - - public DateTime PublishDate { get; set; } - - public float Price { get; set; } - } -} -``` - -- **As** classes **DTO** são usadas para **transferir dados** entre a *camada de apresentação* e a *camada de aplicativo* . Consulte o [documento Objetos de transferência de dados](https://docs.abp.io/en/abp/latest/Data-Transfer-Objects) para obter mais detalhes. -- `BookDto` é usado para transferir dados do livro para a camada de apresentação para mostrar as informações do livro na interface do usuário. -- `BookDto`é derivado do `AuditedEntityDto`que possui propriedades de auditoria exatamente como a `Book`classe definida acima. - -Será necessário converter `Book`entidades em `BookDto`objetos enquanto retorna os livros para a camada de apresentação. [A](https://automapper.org/) biblioteca do [AutoMapper](https://automapper.org/) pode automatizar essa conversão quando você define o mapeamento adequado. O modelo de inicialização é fornecido com o AutoMapper configurado, para que você possa definir o mapeamento na `BookStoreApplicationAutoMapperProfile`classe no `Acme.BookStore.Application`projeto: - -```csharp -using AutoMapper; - -namespace Acme.BookStore -{ - public class BookStoreApplicationAutoMapperProfile : Profile - { - public BookStoreApplicationAutoMapperProfile() - { - CreateMap(); - } - } -} -``` - -#### CreateUpdateBookDto - -Crie uma classe DTO denominada `CreateUpdateBookDto`no `Acme.BookStore.Application.Contracts`projeto: - -```csharp -using System; -using System.ComponentModel.DataAnnotations; - -namespace Acme.BookStore -{ - public class CreateUpdateBookDto - { - [Required] - [StringLength(128)] - public string Name { get; set; } - - [Required] - public BookType Type { get; set; } = BookType.Undefined; - - [Required] - public DateTime PublishDate { get; set; } - - [Required] - public float Price { get; set; } - } -} -``` - -- Essa classe DTO é usada para obter informações do livro a partir da interface do usuário ao criar ou atualizar um livro. -- Ele define atributos de anotação de dados (como `[Required]`) para definir validações para as propriedades. Os DTOs são [validados automaticamente](https://docs.abp.io/en/abp/latest/Validation) pela estrutura ABP. - -Em seguida, adicione um mapeamento `BookStoreApplicationAutoMapperProfile`do `CreateUpdateBookDto`objeto à `Book`entidade: - -```csharp -CreateMap(); -``` - -#### IBookAppService - -Defina uma interface nomeada `IBookAppService`no `Acme.BookStore.Application.Contracts`projeto: - -```csharp -using System; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; - -namespace Acme.BookStore -{ - public interface IBookAppService : - ICrudAppService< //Defines CRUD methods - BookDto, //Used to show books - Guid, //Primary key of the book entity - PagedAndSortedResultRequestDto, //Used for paging/sorting on getting a list of books - CreateUpdateBookDto, //Used to create a new book - CreateUpdateBookDto> //Used to update a book - { - - } -} -``` - -- A definição de interfaces para serviços de aplicativos não é requerida pela estrutura. No entanto, é sugerido como uma prática recomendada. -- `ICrudAppService`define comuns **CRUD** métodos: `GetAsync`, `GetListAsync`, `CreateAsync`, `UpdateAsync`e `DeleteAsync`. Não é necessário estendê-lo. Em vez disso, você pode herdar da `IApplicationService`interface vazia e definir seus próprios métodos manualmente. -- Existem algumas variações de `ICrudAppService`onde você pode usar DTOs separados para cada método. - -#### BookAppService - -Implemente `IBookAppService`como nomeado `BookAppService`no `Acme.BookStore.Application`projeto: - -```csharp -using System; -using Volo.Abp.Application.Dtos; -using Volo.Abp.Application.Services; -using Volo.Abp.Domain.Repositories; - -namespace Acme.BookStore -{ - public class BookAppService : - CrudAppService, - IBookAppService - { - public BookAppService(IRepository repository) - : base(repository) - { - - } - } -} -``` - -- `BookAppService`é derivado do `CrudAppService<...>`qual implementa todos os métodos CRUD definidos acima. -- `BookAppService`injeta `IRepository`qual é o repositório padrão da `Book`entidade. O ABP cria automaticamente repositórios padrão para cada raiz (ou entidade) agregada. Veja o [documento](https://docs.abp.io/en/abp/latest/Repositories) do [repositório](https://docs.abp.io/en/abp/latest/Repositories) . -- `BookAppService`usa `IObjectMapper`para converter `Book`objetos em `BookDto`objetos e `CreateUpdateBookDto`objetos em `Book`objetos. O modelo de inicialização usa a biblioteca [AutoMapper](http://automapper.org/) como o provedor de mapeamento de objetos. Você definiu os mapeamentos antes, para que funcionem conforme o esperado. - -### Controladores de API automática - -Você normalmente cria **controladores** para expor serviços de aplicativos como pontos de extremidade da **API HTTP** . Assim, permite que navegadores ou clientes de terceiros os chamem via AJAX. O ABP pode configurar [**automaticamente**](https://docs.abp.io/en/abp/latest/AspNetCore/Auto-API-Controllers) seus serviços de aplicativo como controladores de API MVC por convenção. - -#### UI do Swagger - -O modelo de inicialização está configurado para executar a [interface do usuário](https://swagger.io/tools/swagger-ui/) do [swagger](https://swagger.io/tools/swagger-ui/) usando a biblioteca [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) . Execute o aplicativo e insira `https://localhost:XXXX/swagger/`(substitua XXXX por sua própria porta) como URL no seu navegador. - -Você verá alguns pontos de extremidade de serviço internos, bem como o `Book`serviço e seus pontos de extremidade no estilo REST: - -![livraria-arrogância](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-swagger.png) - -O Swagger tem uma ótima interface para testar APIs. Você pode tentar executar a `[GET] /api/app/book`API para obter uma lista de livros. - -### Proxies dinâmicos de JavaScript - -É comum chamar pontos de extremidade da API HTTP via AJAX do lado do **JavaScript** . Você pode usar `$.ajax`ou outra ferramenta para chamar os pontos de extremidade. No entanto, o ABP oferece uma maneira melhor. - -O ABP cria **dinamicamente** **proxies** JavaScript para todos os pontos de extremidade da API. Portanto, você pode usar qualquer **terminal,** assim como chamar uma **função JavaScript** . - -#### Testando no console do desenvolvedor do navegador - -Você pode testar facilmente os proxies JavaScript usando o **Console** do **desenvolvedor** do seu navegador favorito agora. Execute o aplicativo, abra as **ferramentas de desenvolvedor** do navegador (atalho: F12), vá para a guia **Console** , digite o seguinte código e pressione enter: - -```js -acme.bookStore.book.getList({}).done(function (result) { console.log(result); }); -``` - -- `acme.bookStore`é o espaço para nome do `BookAppService`convertido em [camelCase](https://en.wikipedia.org/wiki/Camel_case) . -- `book`é o nome convencional para o `BookAppService`(postfix do AppService removido e convertido em camelCase). -- `getList`é o nome convencional para o `GetListAsync`método definido na `AsyncCrudAppService`classe base (postfix assíncrono removido e convertido em camelCase). -- `{}`O argumento é usado para enviar um objeto vazio ao `GetListAsync`método que normalmente espera um objeto do tipo `PagedAndSortedResultRequestDto`usado para enviar opções de paginação e classificação ao servidor (todas as propriedades são opcionais, para que você possa enviar um objeto vazio). -- `getList`A função retorna a `promise`. Portanto, você pode passar um retorno de chamada para a função `done`(ou `then`) para obter o resultado do servidor. - -A execução desse código produz a seguinte saída: - -![livraria-teste-js-proxy-getlist](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist.png) - -Você pode ver a **lista de livros** retornada do servidor. Você também pode verificar a guia de **rede** das ferramentas do desenvolvedor para ver a comunicação do cliente com o servidor: - -![livraria-teste-js-proxy-getlist-rede](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist-network.png) - -Vamos **criar um novo livro** usando a `create`função: - -```js -acme.bookStore.book.create({ name: 'Foundation', type: 7, publishDate: '1951-05-24', price: 21.5 }).done(function (result) { console.log('successfully created the book with id: ' + result.id); }); -``` - -Você deve ver uma mensagem no console, algo assim: - -``` -successfully created the book with id: f3f03580-c1aa-d6a9-072d-39e75c69f5c7 -``` - -Verifique a `Books`tabela no banco de dados para ver a nova linha do livro. Você pode tentar `get`, `update`e `delete`funciona mesmo. - -### Crie a página de livros - -É hora de criar algo visível e utilizável! Em vez do MVC clássico, usaremos a nova abordagem de [interface do usuário do Razor Pages,](https://docs.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start) recomendada pela Microsoft. - -Crie uma nova `Books`pasta na `Pages`pasta do `Acme.BookStore.Web`projeto e adicione uma nova página Razor denominada `Index.cshtml`: - -![livraria-add-index-page](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png) - -Abra `Index.cshtml`e altere o conteúdo, como mostrado abaixo: - -```html -@page -@using Acme.BookStore.Web.Pages.Books -@model IndexModel - -

Books

-``` - -- Verifique se o `IndexModel`( *Index.cshtml.cs)* possui o `Acme.BookStore.Pages.Books`espaço para nome ou atualize-o no `Index.cshtml`. - -#### Adicionar página de livros ao menu principal - -Abra a `BookStoreMenuContributor`classe na `Menus`pasta e adicione o seguinte código ao final do `ConfigureMainMenuAsync`método: - -```csharp -context.Menu.AddItem( - new ApplicationMenuItem("BooksStore", l["Menu:BookStore"]) - .AddItem(new ApplicationMenuItem("BooksStore.Books", l["Menu:Books"], url: "/Books")) -); -``` - -#### Localizando os itens de menu - -Os textos de localização estão localizados na `Localization/BookStore`pasta do `Acme.BookStore.Domain.Shared`projeto: - -![arquivos de localização de livraria](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-localization-files-v2.png) - -Abra o `en.json`arquivo e adicione textos de localização `Menu:BookStore`e `Menu:Books`chaves ao final do arquivo: - -```json -{ - "culture": "en", - "texts": { - "Menu:BookStore": "Book Store", - "Menu:Books": "Books" - } -} -``` - -- O sistema de localização da ABP é construído no sistema de [localização padrão do ASP.NET Core](https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization) e o estende de várias maneiras. Consulte o [documento de localização](https://docs.abp.io/en/abp/latest/Localization) para obter detalhes. -- Os nomes das chaves de localização são arbitrários. Você pode definir qualquer nome. Preferimos adicionar `Menu:`prefixo aos itens de menu para distinguir de outros textos. Se um texto não estiver definido no arquivo de localização, ele **recuará** para a chave de localização (comportamento padrão do ASP.NET Core). - -Execute o aplicativo e veja se o novo item de menu foi adicionado à barra superior: - -![itens-menu-livraria](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-menu-items.png) - -Quando você clica no item de menu Livros, você é redirecionado para a nova página Livros. - -#### Lista de livros - -Usaremos o plug-in [Datatables.net](https://datatables.net/) JQuery para mostrar a lista de tabelas na página. As tabelas de dados podem funcionar completamente via AJAX, são rápidas e oferecem uma boa experiência ao usuário. O plug-in Datatables está configurado no modelo de inicialização, para que você possa usá-lo diretamente em qualquer página sem incluir nenhum estilo ou arquivo de script em sua página. - -##### Index.cshtml - -Altere o `Pages/Books/Index.cshtml`seguinte: - -```html -@page -@model Acme.BookStore.Web.Pages.Books.IndexModel -@section scripts -{ - -} - - -

@L["Books"]

-
- - - - - @L["Name"] - @L["Type"] - @L["PublishDate"] - @L["Price"] - @L["CreationTime"] - - - - -
-``` - -- `abp-script` [O auxiliar de marca](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro) é usado para adicionar **scripts** externos à página. Possui muitos recursos adicionais em comparação com a `script`tag padrão . Ele lida com **minificação** e **controle** de **versão,** por exemplo. Consulte o [documento de compactação e redução](https://docs.abp.io/en/abp/latest/AspNetCore/Bundling-Minification) para obter detalhes. -- `abp-card`e `abp-table`são **auxiliares de tags** para o [componente de cartão](http://getbootstrap.com/docs/4.1/components/card/) do Twitter Bootstrap . Existem muitos auxiliares de tag no ABP para usar facilmente a maioria dos componentes de [autoinicialização](https://getbootstrap.com/) . Você também pode usar tags HTML regulares em vez desses auxiliares de tag, mas o uso de tag reduz o código HTML e evita erros com a ajuda do intellisense e da verificação do tipo de tempo de compilação. Consulte o [documento auxiliares](https://docs.abp.io/en/abp/latest/AspNetCore/Tag-Helpers) da [tag](https://docs.abp.io/en/abp/latest/AspNetCore/Tag-Helpers) . -- Você pode **localizar** os nomes das colunas no arquivo de localização, como fez nos itens de menu acima. - -##### Adicionar um arquivo de script - -Crie um `index.js`arquivo JavaScript na `Pages/Books/`pasta: - -![arquivo-index-js-bookstore](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png) - -`index.js` o conteúdo é mostrado abaixo: - -```js -$(function () { - var dataTable = $('#BooksTable').DataTable(abp.libs.datatables.normalizeConfiguration({ - ajax: abp.libs.datatables.createAjax(acme.bookStore.book.getList), - columnDefs: [ - { data: "name" }, - { data: "type" }, - { data: "publishDate" }, - { data: "price" }, - { data: "creationTime" } - ] - })); -}); -``` - -- `abp.libs.datatables.createAjax` é uma função auxiliar para adaptar os proxies dinâmicos da API JavaScript da ABP ao formato do Datatable. -- `abp.libs.datatables.normalizeConfiguration`é outra função auxiliar. Não há necessidade de usá-lo, mas simplifica a configuração das tabelas de dados, fornecendo valores convencionais para as opções ausentes. -- `acme.bookStore.book.getList` é a função para obter a lista de livros (você já viu isso antes). -- Consulte [a documentação do Datatable](https://datatables.net/manual/) para obter mais opções de configuração. - -A interface do usuário final é mostrada abaixo: - -![livraria-lista-de-livros](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-book-list-2.png) - -### Próxima parte - -Veja a [próxima parte](https://docs.abp.io/en/abp/latest/Tutorials/AspNetCore-Mvc/Part-II) deste tutorial. diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-II.md b/docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-II.md deleted file mode 100644 index 5ee4531131..0000000000 --- a/docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-II.md +++ /dev/null @@ -1,465 +0,0 @@ -## Tutorial do ASP.NET Core MVC - Parte II - -### Sobre este tutorial - -Esta é a segunda parte da série de tutoriais do ASP.NET Core MVC. Veja todas as peças: - -- [Parte I: Crie o projeto e uma página da lista de livros](https://docs.abp.io/en/abp/latest/Tutorials/AspNetCore-Mvc/Part-I) -- **Parte II: Criar, atualizar e excluir livros (este tutorial)** -- [Parte III: Testes de Integração](https://docs.abp.io/en/abp/latest/Tutorials/AspNetCore-Mvc/Part-III) - -Você pode acessar o **código fonte** do aplicativo [no repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore) . - -> Você também pode assistir a [este curso em vídeo](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) preparado por um membro da comunidade ABP, com base neste tutorial. - -### Criando um novo livro - -Nesta seção, você aprenderá como criar um novo formulário de diálogo modal para criar um novo livro. A caixa de diálogo do resultado será assim: - -![livraria-criar-diálogo](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog-2.png) - -#### Crie o formulário modal - -Crie uma nova página de navalha, nomeada `CreateModal.cshtml`sob a `Pages/Books`pasta do `Acme.BookStore.Web`projeto: - -![livraria-adicionar-criar-diálogo](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png) - -##### CreateModal.cshtml.cs - -Abra o `CreateModal.cshtml.cs`arquivo ( `CreateModalModel`classe) e substitua pelo seguinte código: - -```csharp -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; - -namespace Acme.BookStore.Web.Pages.Books -{ - public class CreateModalModel : BookStorePageModel - { - [BindProperty] - public CreateUpdateBookDto Book { get; set; } - - private readonly IBookAppService _bookAppService; - - public CreateModalModel(IBookAppService bookAppService) - { - _bookAppService = bookAppService; - } - - public async Task OnPostAsync() - { - await _bookAppService.CreateAsync(Book); - return NoContent(); - } - } -} -``` - - - -- Esta classe é derivada do em `BookStorePageModel`vez do padrão `PageModel`. `BookStorePageModel`herda o `PageModel`e adiciona algumas propriedades / métodos comuns que podem ser usados pelas classes de modelo de página. -- `[BindProperty]`O atributo na `Book`propriedade vincula os dados de solicitação posterior a essa propriedade. -- Essa classe simplesmente injeta o `IBookAppService`em seu construtor e chama o `CreateAsync`método no `OnPostAsync`manipulador. - -##### CreateModal.cshtml - -Abra o `CreateModal.cshtml`arquivo e cole o código abaixo: - -```html -@page -@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal -@model Acme.BookStore.Web.Pages.Books.CreateModalModel -@{ - Layout = null; -} - - - - - - - - - -``` - - - -- Este modal usa o - - ``` - abp-dynamic-form - ``` - - auxiliar de marca para criar automaticamente o formulário a partir da - - ``` - CreateBookViewModel - ``` - - classe. - - - `abp-model`O atributo indica o objeto do modelo, a `Book`propriedade neste caso. - - `data-ajaxForm` O atributo faz com que o formulário seja enviado via AJAX, em vez de uma postagem de página clássica. - - `abp-form-content`O auxiliar de marca é um espaço reservado para renderizar os controles do formulário (isso é opcional e necessário apenas se você tiver adicionado outro conteúdo à `abp-dynamic-form`marca, como nesta página). - -#### Adicione o botão "Novo livro" - -Abra `Pages/Books/Index.cshtml`e altere a `abp-card-header`tag, como mostrado abaixo: - -```html - - - -

@L["Books"]

-
- - - -
-
-``` - - - -Acabei de adicionar um botão **Novo livro** no canto **superior direito** da tabela: - -![livraria-novo-livro-botão](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-new-book-button.png) - -Abra o `pages/books/index.js`e adicione o seguinte código logo após a configuração da tabela de dados: - -```js -var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); - -createModal.onResult(function () { - dataTable.ajax.reload(); -}); - -$('#NewBookButton').click(function (e) { - e.preventDefault(); - createModal.open(); -}); -``` - - - -- `abp.ModalManager`é uma classe auxiliar para abrir e gerenciar modais no lado do cliente. Ele usa internamente o modal padrão do Twitter Bootstrap, mas abstrai muitos detalhes, fornecendo uma API simples. - -Agora, você pode **executar o aplicativo** e adicionar novos livros usando o novo formulário modal. - -### Atualizando um livro existente - -Crie uma nova página de navalha, nomeada `EditModal.cshtml`sob a `Pages/Books`pasta do `Acme.BookStore.Web`projeto: - -![livraria-adicionar-editar-diálogo](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-add-edit-dialog.png) - -#### EditModal.cshtml.cs - -Abra o `EditModal.cshtml.cs`arquivo ( `EditModalModel`classe) e substitua pelo seguinte código: - -```csharp -using System; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; - -namespace Acme.BookStore.Web.Pages.Books -{ - public class EditModalModel : BookStorePageModel - { - [HiddenInput] - [BindProperty(SupportsGet = true)] - public Guid Id { get; set; } - - [BindProperty] - public CreateUpdateBookDto Book { get; set; } - - private readonly IBookAppService _bookAppService; - - public EditModalModel(IBookAppService bookAppService) - { - _bookAppService = bookAppService; - } - - public async Task OnGetAsync() - { - var bookDto = await _bookAppService.GetAsync(Id); - Book = ObjectMapper.Map(bookDto); - } - - public async Task OnPostAsync() - { - await _bookAppService.UpdateAsync(Id, Book); - return NoContent(); - } - } -} -``` - - - -- `[HiddenInput]`e `[BindProperty]`são atributos padrão do ASP.NET Core MVC. Utilizado `SupportsGet`para obter o valor do ID a partir do parâmetro da string de consulta da solicitação. -- Mapeado `BookDto`(recebido de `BookAppService.GetAsync`) para `CreateUpdateBookDto`no `GetAsync`método -- O `OnPostAsync`simplesmente usa `BookAppService.UpdateAsync`para atualizar a entidade. - -#### Mapeamento de BookDto para CreateUpdateBookDto - -A fim de executar `BookDto`a `CreateUpdateBookDto`opor mapeamento, abrir o `BookStoreWebAutoMapperProfile.cs`no `Acme.BookStore.Web`projecto e alterá-lo como se mostra abaixo: - -```csharp -using AutoMapper; - -namespace Acme.BookStore.Web -{ - public class BookStoreWebAutoMapperProfile : Profile - { - public BookStoreWebAutoMapperProfile() - { - CreateMap(); - } - } -} -``` - - - -- Apenas adicionado `CreateMap();`como a definição de mapeamento. - -#### EditModal.cshtml - -Substitua o `EditModal.cshtml`conteúdo pelo seguinte: - -```html -@page -@using Acme.BookStore.Web.Pages.Books -@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal -@model EditModalModel -@{ - Layout = null; -} - - - - - - - - - - -``` - - - -Esta página é muito semelhante à `CreateModal.cshtml`exceção; - -- Ele inclui um `abp-input`para a `Id`propriedade armazenar o ID do livro de edição (que é uma entrada oculta). -- Ele usa `Books/EditModal`como URL de postagem e texto de *atualização* como cabeçalho modal. - -#### Adicione o menu suspenso "Ações" à tabela - -Adicionaremos um botão suspenso ("Ações") para cada linha da tabela. A interface do usuário final é assim: - -![livraria-livros-mesa-ações](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-books-table-actions.png) - -Abra a `Pages/Books/Index.cshtml`página e altere a seção da tabela como mostrado abaixo: - -```html - - - - @L["Actions"] - @L["Name"] - @L["Type"] - @L["PublishDate"] - @L["Price"] - @L["CreationTime"] - - - -``` - - - -- Acabei de adicionar uma nova `th`tag para as "Ações". - -Abra `pages/books/index.js`e substitua o conteúdo como abaixo: - -```js -$(function () { - - var l = abp.localization.getResource('BookStore'); - - var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); - var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal'); - - var dataTable = $('#BooksTable').DataTable(abp.libs.datatables.normalizeConfiguration({ - processing: true, - serverSide: true, - paging: true, - searching: false, - autoWidth: false, - scrollCollapse: true, - order: [[1, "asc"]], - ajax: abp.libs.datatables.createAjax(acme.bookStore.book.getList), - columnDefs: [ - { - rowAction: { - items: - [ - { - text: l('Edit'), - action: function (data) { - editModal.open({ id: data.record.id }); - } - } - ] - } - }, - { data: "name" }, - { data: "type" }, - { data: "publishDate" }, - { data: "price" }, - { data: "creationTime" } - ] - })); - - createModal.onResult(function () { - dataTable.ajax.reload(); - }); - - editModal.onResult(function () { - dataTable.ajax.reload(); - }); - - $('#NewBookButton').click(function (e) { - e.preventDefault(); - createModal.open(); - }); -}); -``` - - - -- Utilizado `abp.localization.getResource('BookStore')`para poder usar os mesmos textos de localização definidos no lado do servidor. -- Adicionado um novo `ModalManager`nome `createModal`para abrir a caixa de diálogo criar modal. -- Adicionado um novo `ModalManager`nome `editModal`para abrir a caixa de diálogo modal de edição. -- Adicionada uma nova coluna no início da `columnDefs`seção. Esta coluna é usada para o botão suspenso "Ações". -- A ação "Novo livro" simplesmente chama `createModal.open`para abrir a caixa de diálogo Criar. -- A ação "Editar" simplesmente chama `editModal.open`para abrir a caixa de diálogo de edição. `Você pode executar o aplicativo e editar qualquer livro selecionando a ação de edição. - -### Exclusão de um livro existente - -Abra o `pages/books/index.js`e adicione um novo item ao `rowAction` `items`: - -```js -{ - text: l('Delete'), - confirmMessage: function (data) { - return l('BookDeletionConfirmationMessage', data.record.name); - }, - action: function (data) { - acme.bookStore.book - .delete(data.record.id) - .then(function() { - abp.notify.info(l('SuccessfullyDeleted')); - dataTable.ajax.reload(); - }); - } -} -``` - - - -- `confirmMessage`A opção é usada para fazer uma pergunta de confirmação antes de executar o `action`. -- Utilizou a `acme.bookStore.book.delete`função de proxy javascript para executar uma solicitação AJAX para excluir um livro. -- `abp.notify.info` é usado para mostrar uma notificação toastr logo após a exclusão. - -O `index.js`conteúdo final é mostrado abaixo: - -```js -$(function () { - - var l = abp.localization.getResource('BookStore'); - - var createModal = new abp.ModalManager(abp.appPath + 'Books/CreateModal'); - var editModal = new abp.ModalManager(abp.appPath + 'Books/EditModal'); - - var dataTable = $('#BooksTable').DataTable(abp.libs.datatables.normalizeConfiguration({ - processing: true, - serverSide: true, - paging: true, - searching: false, - autoWidth: false, - scrollCollapse: true, - order: [[1, "asc"]], - ajax: abp.libs.datatables.createAjax(acme.bookStore.book.getList), - columnDefs: [ - { - rowAction: { - items: - [ - { - text: l('Edit'), - action: function (data) { - editModal.open({ id: data.record.id }); - } - }, - { - text: l('Delete'), - confirmMessage: function (data) { - return l('BookDeletionConfirmationMessage', data.record.name); - }, - action: function (data) { - acme.bookStore.book - .delete(data.record.id) - .then(function() { - abp.notify.info(l('SuccessfullyDeleted')); - dataTable.ajax.reload(); - }); - } - } - ] - } - }, - { data: "name" }, - { data: "type" }, - { data: "publishDate" }, - { data: "price" }, - { data: "creationTime" } - ] - })); - - createModal.onResult(function () { - dataTable.ajax.reload(); - }); - - editModal.onResult(function () { - dataTable.ajax.reload(); - }); - - $('#NewBookButton').click(function (e) { - e.preventDefault(); - createModal.open(); - }); -}); -``` - - - -Abra o `en.json`no `Acme.BookStore.Domain.Shared`projeto e adicione a seguinte linha: - -```json -"BookDeletionConfirmationMessage": "Are you sure to delete the book {0}?", -"SuccessfullyDeleted": "Successfully deleted" -``` - - - -Execute o aplicativo e tente excluir um livro. - -### Próxima parte - -Veja a [próxima parte](https://docs.abp.io/en/abp/latest/Tutorials/AspNetCore-Mvc/Part-III) deste tutorial. diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-III.md b/docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-III.md deleted file mode 100644 index 2acc09a87b..0000000000 --- a/docs/pt-BR/Tutorials/AspNetCore-Mvc/Part-III.md +++ /dev/null @@ -1,182 +0,0 @@ -## Tutorial do ASP.NET Core MVC - Parte III - -### Sobre este tutorial - -Esta é a terceira parte da série de tutoriais do ASP.NET Core MVC. Veja todas as peças: - -- [Parte I: Crie o projeto e uma página da lista de livros](https://docs.abp.io/en/abp/latest/Tutorials/AspNetCore-Mvc/Part-I) -- [Parte II: Criar, atualizar e excluir livros](https://docs.abp.io/en/abp/latest/Tutorials/AspNetCore-Mvc/Part-II) -- **Parte III: Testes de Integração (este tutorial)** - -Você pode acessar o **código fonte** do aplicativo [no repositório GitHub](https://github.com/abpframework/abp-samples/tree/master/BookStore). - -> Você também pode assistir a [este curso em vídeo](https://amazingsolutions.teachable.com/p/lets-build-the-bookstore-application) preparado por um membro da comunidade ABP, com base neste tutorial. - -### Testar projetos na solução - -Existem vários projetos de teste na solução: - -![livraria-teste-projetos-v2](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-test-projects-v2.png) - -Cada projeto é usado para testar o projeto de aplicativo relacionado. Os projetos de teste usam as seguintes bibliotecas para teste: - -- [xunit](https://xunit.github.io/) como a principal estrutura de teste. -- [Altamente](http://shouldly.readthedocs.io/en/latest/) como uma biblioteca de asserções. -- [NSubstitute](http://nsubstitute.github.io/) como uma biblioteca de zombaria. - -### Adicionando dados de teste - -O modelo de inicialização contém a `BookStoreTestDataSeedContributor`classe no `Acme.BookStore.TestBase`projeto que cria alguns dados para executar os testes. - -Mude a `BookStoreTestDataSeedContributor`classe como mostrado abaixo: - -```csharp -using System; -using System.Threading.Tasks; -using Volo.Abp.Data; -using Volo.Abp.DependencyInjection; -using Volo.Abp.Domain.Repositories; -using Volo.Abp.Guids; - -namespace Acme.BookStore -{ - public class BookStoreTestDataSeedContributor - : IDataSeedContributor, ITransientDependency - { - private readonly IRepository _bookRepository; - private readonly IGuidGenerator _guidGenerator; - - public BookStoreTestDataSeedContributor( - IRepository bookRepository, - IGuidGenerator guidGenerator) - { - _bookRepository = bookRepository; - _guidGenerator = guidGenerator; - } - - public async Task SeedAsync(DataSeedContext context) - { - await _bookRepository.InsertAsync( - new Book - { - Id = _guidGenerator.Create(), - Name = "Test book 1", - Type = BookType.Fantastic, - PublishDate = new DateTime(2015, 05, 24), - Price = 21 - } - ); - - await _bookRepository.InsertAsync( - new Book - { - Id = _guidGenerator.Create(), - Name = "Test book 2", - Type = BookType.Science, - PublishDate = new DateTime(2014, 02, 11), - Price = 15 - } - ); - } - } -} -``` - -- Injetado `IRepository`e usado no `SeedAsync`para criar duas entidades de livro como dados de teste. -- `IGuidGenerator`Serviço usado para criar GUIDs. Embora `Guid.NewGuid()`funcionasse perfeitamente para testes, `IGuidGenerator`possui recursos adicionais especialmente importantes ao usar bancos de dados reais (consulte o [documento de geração](https://docs.abp.io/en/abp/latest/Guid-Generation) do [Guid](https://docs.abp.io/en/abp/latest/Guid-Generation) para obter mais informações). - -### Testando o BookAppService - -Crie uma classe de teste denominada `BookAppService_Tests`no `Acme.BookStore.Application.Tests`projeto: - -```csharp -using System.Threading.Tasks; -using Shouldly; -using Volo.Abp.Application.Dtos; -using Xunit; - -namespace Acme.BookStore -{ - public class BookAppService_Tests : BookStoreApplicationTestBase - { - private readonly IBookAppService _bookAppService; - - public BookAppService_Tests() - { - _bookAppService = GetRequiredService(); - } - - [Fact] - public async Task Should_Get_List_Of_Books() - { - //Act - var result = await _bookAppService.GetListAsync( - new PagedAndSortedResultRequestDto() - ); - - //Assert - result.TotalCount.ShouldBeGreaterThan(0); - result.Items.ShouldContain(b => b.Name == "Test book 1"); - } - } -} -``` - -- `Should_Get_List_Of_Books`O teste simplesmente usa o `BookAppService.GetListAsync`método para obter e verificar a lista de usuários. - -Adicione um novo teste que crie um novo livro válido: - -```csharp -[Fact] -public async Task Should_Create_A_Valid_Book() -{ - //Act - var result = await _bookAppService.CreateAsync( - new CreateUpdateBookDto - { - Name = "New test book 42", - Price = 10, - PublishDate = DateTime.Now, - Type = BookType.ScienceFiction - } - ); - - //Assert - result.Id.ShouldNotBe(Guid.Empty); - result.Name.ShouldBe("New test book 42"); -} -``` - -Adicione um novo teste que tente criar um livro inválido e falhe: - -```csharp -[Fact] -public async Task Should_Not_Create_A_Book_Without_Name() -{ - var exception = await Assert.ThrowsAsync(async () => - { - await _bookAppService.CreateAsync( - new CreateUpdateBookDto - { - Name = "", - Price = 10, - PublishDate = DateTime.Now, - Type = BookType.ScienceFiction - } - ); - }); - - exception.ValidationErrors - .ShouldContain(err => err.MemberNames.Any(mem => mem == "Name")); -} -``` - - - -- Como o `Name`está vazio, o ABP lança um `AbpValidationException`. - -Abra a **janela Test Explorer** (use o menu Test -> Windows -> Test Explorer, se não estiver visível) e **execute Todos os** testes: - -![testes de serviço de livraria](https://raw.githubusercontent.com/abpframework/abp/master/docs/en/Tutorials/AspNetCore-Mvc/images/bookstore-appservice-tests.png) - -Parabéns, ícones verdes mostram que os testes foram aprovados com sucesso! \ No newline at end of file diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png deleted file mode 100644 index fd06f3e4e5..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-add-edit-dialog.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-add-edit-dialog.png deleted file mode 100644 index adfc036d0b..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-add-edit-dialog.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png deleted file mode 100644 index a4760261c6..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-appservice-tests.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-appservice-tests.png deleted file mode 100644 index 142ef57e22..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-appservice-tests.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-book-list-2.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-book-list-2.png deleted file mode 100644 index 6fb475deab..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-book-list-2.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-book-list.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-book-list.png deleted file mode 100644 index fe2fd38349..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-book-list.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-books-table-actions.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-books-table-actions.png deleted file mode 100644 index 431fb2defc..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-books-table-actions.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-books-table.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-books-table.png deleted file mode 100644 index 7254a97566..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-books-table.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog-2.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog-2.png deleted file mode 100644 index eb84d88065..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog-2.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog.png deleted file mode 100644 index f09f2f394f..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-create-template.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-create-template.png deleted file mode 100644 index bae34a3b64..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-create-template.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-homepage.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-homepage.png deleted file mode 100644 index dc015aa67d..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-homepage.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png deleted file mode 100644 index 2db5ab1a5e..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-localization-files-v2.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-localization-files-v2.png deleted file mode 100644 index a3616088d2..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-localization-files-v2.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-menu-items.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-menu-items.png deleted file mode 100644 index ef3c404855..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-menu-items.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-new-book-button.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-new-book-button.png deleted file mode 100644 index b173926a29..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-new-book-button.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration-v2.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration-v2.png deleted file mode 100644 index ffecdf70c7..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration-v2.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration.png deleted file mode 100644 index cb3b6440c7..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-swagger.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-swagger.png deleted file mode 100644 index 83c416618a..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-swagger.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist-network.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist-network.png deleted file mode 100644 index ffa63dc581..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist-network.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist.png deleted file mode 100644 index 7fe3cead35..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-test-projects-v2.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-test-projects-v2.png deleted file mode 100644 index 45d08ecea3..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-test-projects-v2.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-user-management.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-user-management.png deleted file mode 100644 index d7d3429826..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-user-management.png and /dev/null differ diff --git a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v3.png b/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v3.png deleted file mode 100644 index ce821eba72..0000000000 Binary files a/docs/pt-BR/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v3.png and /dev/null differ diff --git a/docs/pt-BR/UI/AspNetCore/AutoComplete-Select.md b/docs/pt-BR/UI/AspNetCore/AutoComplete-Select.md deleted file mode 100644 index 2fd0da045a..0000000000 --- a/docs/pt-BR/UI/AspNetCore/AutoComplete-Select.md +++ /dev/null @@ -1,74 +0,0 @@ -# ASP.NET Core MVC / Razor Pages: Auto-Complete Select -Um componente de seleção simples às vezes não é útil com uma grande quantidade de dados. O ABP fornece uma implementação de seleção que funciona com paginação e pesquisa no lado do servidor usando o [Select2](https://select2.org/). Ele funciona bem com escolhas únicas ou múltiplas. - -Uma captura de tela pode ser mostrada abaixo. - -| Único | Múltiplo | -| --- | --- | -| ![autocomplete-select-example](../../images/abp-select2-single.png) |![autocomplete-select-example](../../images/abp-select2-multiple.png) | - -## Começando - -Esta é uma funcionalidade central e é usada pelo ABP Framework. Não há instalação personalizada ou pacotes adicionais necessários. - -## Uso - -Um uso simples é apresentado abaixo. - -```html - -``` - -O select deve ter a classe `auto-complete-select` e os seguintes atributos: - -- `data-autocomplete-api-url`: * URL do endpoint da API para obter os itens da seleção. Será enviado uma requisição **GET** para esta URL. -- `data-autocomplete-display-property`: * Nome da propriedade para exibição. _(Por exemplo: `name` ou `title`. Nome da propriedade da entidade/dto.)_. -- `data-autocomplete-value-property`: * Nome da propriedade identificadora. _(Por exemplo: `id`)_. -- `data-autocomplete-items-property`: * Nome da propriedade da coleção no objeto de resposta. _(Por exemplo: `items`)_ -- `data-autocomplete-filter-param-name`: * Nome da propriedade de texto de filtro. _(Por exemplo: `filter`)_. -- `data-autocomplete-selected-item-name`: Texto para exibir como item selecionado. -- `data-autocomplete-parent-selector`: Expressão seletora jQuery para o DOM pai. _(Se estiver em um modal, é sugerido enviar o seletor do modal como este parâmetro)_. -- `data-autocomplete-allow-clear`: Se `true`, permitirá limpar o valor selecionado. Valor padrão: `false`. -- `data-autocomplete-placeholder`: Texto de espaço reservado para exibir quando nenhum valor estiver selecionado. - -Além disso, o(s) valor(es) selecionado(s) deve(m) ser definido(s) com as tags `