Browse Source

Merge branch 'dev' into aspnetcore-3.0

pull/1810/head
Halil İbrahim Kalkan 7 years ago
parent
commit
886e0fa420
  1. 8
      docs/pt-BR/Getting-Started-Angular-Template.md
  2. 16
      docs/pt-BR/Getting-Started-AspNetCore-Application.md
  3. 6
      docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md
  4. 9
      docs/pt-BR/Getting-Started-Console-Application.md
  5. 2
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureDto.cs
  6. 1
      modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs
  7. 8
      modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pt-BR.json
  8. 55
      npm/ng-packs/packages/core/src/lib/directives/visibility.directive.ts
  9. 11
      npm/ng-packs/packages/core/src/lib/services/localization.service.ts
  10. 10
      npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts
  11. 2
      npm/ng-packs/packages/theme-shared/package.json
  12. 2
      npm/ng-packs/packages/theme-shared/src/lib/animations/collapse.animations.ts
  13. 4
      npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts
  14. 2
      samples/BookStore-Angular-MongoDb/angular/src/app/books/shared/books.service.ts

8
docs/pt-BR/Getting-Started-Angular-Template.md

@ -1,4 +1,4 @@
## Introdução ao modelo de aplicativo angular
## 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.
@ -37,13 +37,13 @@ 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 de **memória** **EF Core** e **SQLite** .
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.
### Cadeia de Conexão de Banco de Dados
### String de Conexão de Banco de Dados
Verifique a **cadeia de conexão** no `appsettings.json`arquivo no `.HttpApi.Host`projeto:
Verifique o **connection string** no `appsettings.json`arquivo no `.HttpApi.Host`projeto:
```json
{

16
docs/pt-BR/Getting-Started-AspNetCore-Application.md

@ -1,10 +1,10 @@
# Introdução ao ABP com o aplicativo Web MVC AspNet Core
# 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 do AspNet Core no Visual Studio:
1. Crie um novo aplicativo da Web vazio AspNet Core Web Application no Visual Studio:
![img](images/create-new-aspnet-core-application.png)
@ -58,7 +58,7 @@ namespace BasicAspNetCoreApplication
`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.
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.
@ -90,7 +90,7 @@ namespace BasicAspNetCoreApplication
}
```
`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<AppModule>()`adiciona todos os serviços definidos em todos os módulos a partir do `AppModule`.
`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<AppModule>()` 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.
@ -118,7 +118,7 @@ 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 a estrutura de injeção de dependência
## 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.
@ -130,7 +130,7 @@ Substituir o sistema DI do AspNet Core pelo Autofac e integrar ao ABP é bastant
Install-Package Volo.Abp.Autofac
```
1. Adicionar `AbpAutofacModule`dependência
1. Adicionar `AbpAutofacModule` dependência
```csharp
[DependsOn(typeof(AbpAspNetCoreMvcModule))]
@ -141,7 +141,7 @@ public class AppModule : AbpModule
}
```
1. Altere a `services.AddApplication<AppModule>();`linha na `Startup`classe, como mostrado abaixo:
1. Altere a `services.AddApplication<AppModule>();` linha na `Startup`classe, como mostrado abaixo:
```csharp
services.AddApplication<AppModule>(options =>
@ -150,7 +150,7 @@ services.AddApplication<AppModule>(options =>
});
```
1. Atualize `Program.cs`para não usar o `WebHost.CreateDefaultBuilder()`método, pois ele usa o contêiner DI padrão:
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

6
docs/pt-BR/Getting-Started-AspNetCore-MVC-Template.md

@ -20,7 +20,7 @@ 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.
`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
@ -41,7 +41,7 @@ A solução possui uma estrutura em camadas (baseada no [Domain Driven Design](D
### Cadeia de Conexão de Banco de Dados
Verifique a **cadeia de conexão** no `appsettings.json`arquivo no `.Web`projeto:
Verifique a **connection string** no `appsettings.json`arquivo no `.Web`projeto:
```json
{
@ -91,7 +91,7 @@ Verifique se o `.Web`projeto é o projeto de inicialização. Execute o aplicati
![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.
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:

9
docs/pt-BR/Getting-Started-Console-Application.md

@ -10,7 +10,7 @@ Crie um novo aplicativo regular .Net Core Console do Visual Studio:
## Instale o pacote Volo.Abp
Volo.Abp.Core é o pacote principal de pepitas para criar aplicativos baseados em ABP. Então, instale-o no seu projeto:
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
@ -18,7 +18,7 @@ Install-Package Volo.Abp.Core
## 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`:
O ABP é um framework modular e requer uma classe de **módulo de inicialização (raiz)** derivada de `AbpModule`:
```csharp
using Microsoft.Extensions.DependencyInjection;
@ -117,9 +117,9 @@ namespace AbpConsoleDemo
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 a estrutura de injeção de dependência
## 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.
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.
@ -179,4 +179,3 @@ Apenas chamado `options.UseAutofac()`método nas `AbpApplicationFactory.Create`o
Obter código-fonte do projeto de exemplo criada neste tutorial a partir de [aqui](https://github.com/abpframework/abp/tree/master/samples/BasicConsoleApplication) .

2
modules/feature-management/src/Volo.Abp.FeatureManagement.Application.Contracts/Volo/Abp/FeatureManagement/FeatureDto.cs

@ -7,6 +7,8 @@ namespace Volo.Abp.FeatureManagement
{
public string Name { get; set; }
public string DisplayName { get; set; }
public string Value { get; set; }
public string Description { get; set; }

1
modules/feature-management/src/Volo.Abp.FeatureManagement.Application/Volo/Abp/FeatureManagement/FeatureAppService.cs

@ -44,6 +44,7 @@ namespace Volo.Abp.FeatureManagement
features.Add(new FeatureDto
{
Name = featureDefinition.Name,
DisplayName = featureDefinition.DisplayName?.Localize(_stringLocalizerFactory),
ValueType = featureDefinition.ValueType,
Description = featureDefinition.Description?.Localize(_stringLocalizerFactory),
ParentName = featureDefinition.Parent?.Name,

8
modules/identityserver/src/Volo.Abp.IdentityServer.Domain.Shared/Volo/Abp/IdentityServer/Localization/Resources/pt-BR.json

@ -0,0 +1,8 @@
{
"culture": "pt-BR",
"texts": {
"Volo.IdentityServer:DuplicateIdentityResourceName": "O nome da Identity Resource já existe: {Name}",
"Volo.IdentityServer:DuplicateApiResourceName": "O nome da Api Resource já existe: {Name}",
"Volo.IdentityServer:DuplicateClientId": "ClientId já existe: {ClientId}"
}
}

55
npm/ng-packs/packages/core/src/lib/directives/visibility.directive.ts

@ -9,34 +9,49 @@ export class VisibilityDirective implements AfterViewInit {
@Input('abpVisibility')
focusedElement: HTMLElement;
@Input()
mutationObserverEnabled: boolean = true;
completed$ = new Subject<boolean>();
constructor(@Optional() private elRef: ElementRef, private renderer: Renderer2) {}
ngAfterViewInit() {
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (!mutation.target) return;
let observer: MutationObserver;
if (this.mutationObserverEnabled) {
observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (!mutation.target) return;
const htmlNodes = snq(
() => Array.from(mutation.target.childNodes).filter(node => node instanceof HTMLElement),
[],
);
const htmlNodes = snq(
() => Array.from(mutation.target.childNodes).filter(node => node instanceof HTMLElement),
[],
);
if (!htmlNodes.length) {
this.renderer.removeChild(this.elRef.nativeElement.parentElement, this.elRef.nativeElement);
this.disconnect();
} else {
setTimeout(() => {
if (!htmlNodes.length) {
this.removeFromDOM();
this.disconnect();
}, 0);
}
} else {
setTimeout(() => {
this.disconnect();
}, 0);
}
});
});
});
observer.observe(this.focusedElement, {
childList: true,
});
observer.observe(this.focusedElement, {
childList: true,
});
} else {
setTimeout(() => {
const htmlNodes = snq(
() => Array.from(this.focusedElement.childNodes).filter(node => node instanceof HTMLElement),
[],
);
if (!htmlNodes.length) this.removeFromDOM();
}, 0);
}
this.completed$.subscribe(() => observer.disconnect());
}
@ -45,4 +60,8 @@ export class VisibilityDirective implements AfterViewInit {
this.completed$.next();
this.completed$.complete();
}
removeFromDOM() {
this.renderer.removeChild(this.elRef.nativeElement.parentElement, this.elRef.nativeElement);
}
}

11
npm/ng-packs/packages/core/src/lib/services/localization.service.ts

@ -1,4 +1,4 @@
import { Injectable, Optional, SkipSelf } from '@angular/core';
import { Injectable, Optional, SkipSelf, NgZone } from '@angular/core';
import { ActivatedRouteSnapshot, Router } from '@angular/router';
import { Actions, Store } from '@ngxs/store';
import { noop, Observable } from 'rxjs';
@ -17,6 +17,7 @@ export class LocalizationService {
constructor(
private store: Store,
private router: Router,
private ngZone: NgZone,
private actions: Actions,
@Optional()
@SkipSelf()
@ -35,9 +36,11 @@ export class LocalizationService {
this.setRouteReuse(() => false);
this.router.navigated = false;
return registerLocale(locale).then(async () => {
await this.router.navigateByUrl(this.router.url).catch(noop);
this.setRouteReuse(shouldReuseRoute);
return registerLocale(locale).then(() => {
this.ngZone.run(async () => {
await this.router.navigateByUrl(this.router.url).catch(noop);
this.setRouteReuse(shouldReuseRoute);
});
});
}

10
npm/ng-packs/packages/setting-management/src/lib/services/setting-management.service.ts

@ -1,10 +1,10 @@
import { SettingTab } from '@abp/ng.theme.shared';
import { Injectable } from '@angular/core';
import { RouteConfigLoadEnd, Router } from '@angular/router';
import { Router } from '@angular/router';
import { Navigate } from '@ngxs/router-plugin';
import { Store } from '@ngxs/store';
import { Subject, Subscription, timer } from 'rxjs';
import { filter, takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs';
import { ConfigState } from '@abp/ng.core';
@Injectable({ providedIn: 'root' })
export class SettingManagementService {
@ -27,7 +27,9 @@ export class SettingManagementService {
setSettings() {
setTimeout(() => {
const route = this.router.config.find(r => r.path === 'setting-management');
this.settings = route.data.settings.sort((a, b) => a.order - b.order);
this.settings = (route.data.settings as SettingTab[])
.filter(setting => this.store.selectSnapshot(ConfigState.getGrantedPolicy(setting.requiredPolicy)))
.sort((a, b) => a.order - b.order);
this.checkSelected();
}, 0);
}

2
npm/ng-packs/packages/theme-shared/package.json

@ -5,7 +5,7 @@
"@abp/ng.core": "^0.8.3",
"@angular/cdk": "^8.0.1",
"@ng-bootstrap/ng-bootstrap": "^5.1.0",
"@ngx-validate/core": "^0.0.4",
"@ngx-validate/core": "^0.0.5",
"bootstrap": "^4.3.1",
"chart.js": "^2.8.0",
"font-awesome": "^4.7.0",

2
npm/ng-packs/packages/theme-shared/src/lib/animations/collapse.animations.ts

@ -15,5 +15,5 @@ export const collapse = trigger('collapse', [
overflow: 'hidden',
}),
),
transition('open <=> close', animate('{{duration}}ms')),
transition(`open <=> close`, animate('{{duration}}ms'), { params: { duration: '350' } }),
]);

4
npm/ng-packs/packages/theme-shared/src/lib/contants/styles.ts

@ -150,6 +150,10 @@ export default `
margin-left: 10px !important;
}
.ui-widget-overlay {
z-index: 1000;
}
/* <animations */
.fade-in-top {

2
samples/BookStore-Angular-MongoDb/angular/src/app/books/shared/books.service.ts

@ -12,7 +12,7 @@ export class BooksService {
get(): Observable<Books.Response> {
return this.restService.request<void, Books.Response>({
method: 'GET',
url: '/api/app/book',
url: '/api/app/book?MaxResultCount=100',
});
}

Loading…
Cancel
Save