Gerador de código para o AspNetBoilerPlate v.3.9.0.
Gerador de código para o AspNetBoilerPlate v.3.9.0.
Repositorio | Status |
---|---|
GitHub |
Esta versão é um Fork do CodeGenerator de HisKingdom e trabalha com a versão gratuita do AspNetBoilerPlate para auxiliar na construção telas não modais para visualização e edição de dados.
Nesta página você encontrará:
O executável da aplicação orienta o processo da geração dos arquivos, entretanto, para que ele consiga gerar o código é necessário que sejam adicionadas algumas tags na solução para que sejam incluídos os códigos e ajustado o arquivo de configuração, informando os diretórios que possuem os códigos base.
Comando:
dotnet AbpCodeGenerator.dll
Criar o site/projeto ABP utilizando o template disponível aqui;
Modificar o arquivo de configurações appsettings.json
<Namespace>.Application
<Namespace>.Application
<Namespace>.Core\\Authorization\\PermissionNames.cs
<Namespace>.Core\\Authorization\\
<Namespace>.Core\\Localization\\SourceFiles\\
Em uma versão futura a chave será alterada para LocalizationDictionary_Path
CRUD
chamada <App_Area_Name>AsyncCrudAppServiceBase.cs
namespace
e nomes de classes using Abp.Application.Services;
using Abp.Application.Services.Dto;
using Abp.Domain.Entities;
using Abp.Domain.Repositories;
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Identity;
using Abp.IdentityFramework;
using Abp.Runtime.Session;
using GPSA.ETESystem.Authorization.Users;
using GPSA.ETESystem.MultiTenancy;
namespace GPSA.ETESystem
{
public partial interface IETESystemAsyncCrudAppService<TCreateOrEditInput, TGetAllInputDto> : IAsyncCrudAppService<TCreateOrEditInput, int, TGetAllInputDto>
where TCreateOrEditInput : IEntityDto<int>
where TGetAllInputDto : PagedAndSortedResultRequestDto
{}
public partial class ETESystemAsyncCrudAppServiceBase<TEntity, TCreateOrEditInput, TGetAllInput> : AsyncCrudAppService<TEntity, TCreateOrEditInput, int, TGetAllInput>
, IETESystemAsyncCrudAppService<TCreateOrEditInput, TGetAllInput>
where TEntity : class, IEntity<int>
where TCreateOrEditInput : IEntityDto<int>
where TGetAllInput : PagedAndSortedResultRequestDto
{
public ETESystemAsyncCrudAppServiceBase(IRepository<TEntity, int> repository, string CreatePermission, string EditPermission,
string DeletePermission, string ViewPermission
) : this(repository)
{
this.CreatePermissionName = CreatePermissionName;
this.DeletePermissionName = DeletePermissionName;
this.UpdatePermissionName = UpdatePermissionName;
this.GetPermissionName = ViewPermission;
this.GetAllPermissionName = ViewPermission;
this.LocalizationSourceName = ETESystemConsts.LocalizationSourceName;
}
public ETESystemAsyncCrudAppServiceBase(IRepository<TEntity, int> repository) : base(repository){}
public async Task CreateOrEdit(TCreateOrEditInput input)
{
if (input.Id == 0){ await Create(input); }
else{await Update(input);}
}
public TenantManager TenantManager { get; set; }
public UserManager UserManager { get; set; }
protected virtual Task<User> GetCurrentUserAsync()
{
var user = UserManager.FindByIdAsync(AbpSession.GetUserId().ToString());
if (user == null)
{
throw new Exception("There is no current user!");
}
return user;
}
protected virtual Task<Tenant> GetCurrentTenantAsync()
{
return TenantManager.GetByIdAsync(AbpSession.GetTenantId());
}
protected virtual void CheckErrors(IdentityResult identityResult)
{
identityResult.CheckErrors(LocalizationManager);
}
}
}
Adicionar a chave //
no arquivo <Namespace>.Core\Authorization\PermissionNames.cs
Adicionar a chave //
na classe que implementa NavigationProvider, disponível em <Namespace>.Web\Startup\<Namespace>NavigationProvider.cs
, dentro da função SetNavigation()
, como no exemplo abaixo:
public override void SetNavigation(INavigationProviderContext context)
{
context.Manager.MainMenu
//
//...
}
Adicionar as chaves //
e //
no final do arquivo bundle.config
localizado na pasta raíz do projeto Web, como exibido abaixo.
[
...,
{
"outputFileName": "wwwroot/view-resources/Views/Shared/Components/TenantChange/Default.min.js",
"inputFiles": [
"wwwroot/view-resources/Views/Shared/Components/TenantChange/Default.js"
]
},
//
//
]
//
no arquivo localizado em <Namespace>.Web\Startup\PageNames.cs
No arquivo localizado em <Namespace>.Core\Authorization\<Namespace>AuthorizationProvider.cs
incluir na função SetPermission():
public override void SetPermissions(IPermissionDefinitionContext context)
{
//Código omitido...
var administration = context.CreatePermission("Administration");
//
}
<!--LocalizationDictionary_Here-->
, localizado em <Namespace>.Core\Localization\<Namespace>-pt-BR.xml
. Caso este arquivo não exista, copiar um dos xmls existentes e modificar o seu nomeNo arquivo de contexto adicione o código abaixo para que a validação seja realizada:
public override Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess,
CancellationToken cancellationToken = default(CancellationToken))
{
ValidateEntries();
return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken);
}
public override int SaveChanges(bool acceptAllChangesOnSuccess)
{
ValidateEntries();
return base.SaveChanges(acceptAllChangesOnSuccess);
}
public void ValidateEntries()
{
var serviceProvider = IocManager.Instance.Resolve<IServiceProvider>();
var items = new Dictionary<object, object>();
foreach (var entry in this.ChangeTracker.Entries().Where(
e => (e.State == EntityState.Added) || (e.State == EntityState.Modified)))
{
var entity = entry.Entity;
if (entity is ISoftDelete && ((ISoftDelete)entity).IsNullOrDeleted())
{
var oldValueDeleted = entry.OriginalValues["IsDeleted"];
if (oldValueDeleted.Equals(false))
continue;
}
var context = new ValidationContext(entity, serviceProvider, items);
var results = new List<ValidationResult>();
if (Validator.TryValidateObject(entity, context, results, true) == false)
{
foreach (var result in results)
{
if (result != ValidationResult.Success)
{
throw new AbpValidationException(result.ErrorMessage);
}
}
}
}
}
DbSets
necessários-h
para exibir a ajuda.
NomeEntidade -all
ou NomeEntidade -h
Para cada Entity que foi gerada faça:
<<ChangeThisPropertyField>>
pelo campo de busca@using
do _CreateOrEdit
geradoEntity
para criar as constantes de validação, principalmente em relação ao tamanho do campo.
public const int <Campo>MaxLength = 50;
DefaultPassPhrase
em Application.AppConsts.DefaultPassPhrase
_ViewImports.cshtml
e _ViewStart.cshtml
para a pasta da área, caso não exista.As telas que necessitam de grid
deverão indicar na ViewBag
, através da propriedade HasGrid
, que há necessidade dos arquivos do Jquery DataTable. Assim, nas telas é indicado que a ViewBag.HasGrid = true
seja declarada próxima ao título, como abaixo:
@using GPSA.ETESystem.Authorization
@using GPSA.ETESystem.Web.Startup
@model GPSA.ETESystem.Web.Areas.ETESystem.Models.CaracteristicaMonitoramentos.CaracteristicaMonitoramentoListViewModel
@{
ViewBag.ActiveMenu = PageNames.CaracteristicaMonitoramento.Index;
ViewBag.Title = L("CaracteristicaMonitoramento");
ViewBag.CurrentPageName = PageNames.CaracteristicaMonitoramento.Index; // The menu item will be active for this page.
ViewBag.HasGrid = true;
}
@section scripts{
....
}
O arquivo de layout verifica, então, a necessidade dos scripts
e faz a inclusão dos elementos necessários.
@if (ViewBag.HasGrid != null && ViewBag.HasGrid == true)
{
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css" />
<script type="text/javascript" src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
<script src="~/js/script.js" asp-append-version="true"></script>
}
O conteúdo do arquivo script.js
deve ter o seguinte comando:
(function ($) {
if ($.fn.dataTable != null && $.fn.dataTable.defaults != null) {
$.extend($.fn.dataTable.defaults, {
paging: true,
responsive: true,
serverSide: true,
processing: true,
language: {
url: 'https://cdn.datatables.net/plug-ins/1.10.19/i18n/Portuguese-Brasil.json'
}
});
}
})(jQuery);
Caso sua dúvida ainda persista, consulte nosso FAQ.