mirror of https://github.com/abpframework/abp.git
30 changed files with 1811 additions and 43 deletions
File diff suppressed because it is too large
@ -0,0 +1,38 @@ |
|||||
|
using System; |
||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||
|
|
||||
|
namespace Acme.BookStore.Migrations |
||||
|
{ |
||||
|
public partial class Added_Book_Entity : Migration |
||||
|
{ |
||||
|
protected override void Up(MigrationBuilder migrationBuilder) |
||||
|
{ |
||||
|
migrationBuilder.CreateTable( |
||||
|
name: "BmBooks", |
||||
|
columns: table => new |
||||
|
{ |
||||
|
Id = table.Column<Guid>(nullable: false), |
||||
|
ExtraProperties = table.Column<string>(nullable: true), |
||||
|
ConcurrencyStamp = table.Column<string>(nullable: true), |
||||
|
CreationTime = table.Column<DateTime>(nullable: false), |
||||
|
CreatorId = table.Column<Guid>(nullable: true), |
||||
|
LastModificationTime = table.Column<DateTime>(nullable: true), |
||||
|
LastModifierId = table.Column<Guid>(nullable: true), |
||||
|
Name = table.Column<string>(maxLength: 128, nullable: false), |
||||
|
Type = table.Column<int>(nullable: false), |
||||
|
PublishDate = table.Column<DateTime>(nullable: false), |
||||
|
Price = table.Column<float>(nullable: false) |
||||
|
}, |
||||
|
constraints: table => |
||||
|
{ |
||||
|
table.PrimaryKey("PK_BmBooks", x => x.Id); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
protected override void Down(MigrationBuilder migrationBuilder) |
||||
|
{ |
||||
|
migrationBuilder.DropTable( |
||||
|
name: "BmBooks"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
|
||||
|
namespace Acme.BookStore.BookManagement.Books |
||||
|
{ |
||||
|
public class BookDto : AuditedEntityDto<Guid> |
||||
|
{ |
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public BookType Type { get; set; } |
||||
|
|
||||
|
public DateTime PublishDate { get; set; } |
||||
|
|
||||
|
public float Price { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
using System; |
||||
|
using System.ComponentModel.DataAnnotations; |
||||
|
|
||||
|
namespace Acme.BookStore.BookManagement.Books |
||||
|
{ |
||||
|
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; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
using Volo.Abp.Application.Services; |
||||
|
|
||||
|
namespace Acme.BookStore.BookManagement.Books |
||||
|
{ |
||||
|
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
|
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
using System; |
||||
|
using Acme.BookStore.BookManagement.Books; |
||||
|
using Volo.Abp.Application.Dtos; |
||||
|
using Volo.Abp.Application.Services; |
||||
|
using Volo.Abp.Domain.Repositories; |
||||
|
|
||||
|
namespace Acme.BookStore.BookManagement |
||||
|
{ |
||||
|
public class BookAppService : |
||||
|
CrudAppService<Book, BookDto, Guid, PagedAndSortedResultRequestDto, |
||||
|
CreateUpdateBookDto, CreateUpdateBookDto>, |
||||
|
IBookAppService |
||||
|
{ |
||||
|
public BookAppService(IRepository<Book, Guid> repository) |
||||
|
: base(repository) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
namespace Acme.BookStore.BookManagement.Books |
||||
|
{ |
||||
|
public enum BookType |
||||
|
{ |
||||
|
Undefined, |
||||
|
Adventure, |
||||
|
Biography, |
||||
|
Dystopia, |
||||
|
Fantastic, |
||||
|
Horror, |
||||
|
Science, |
||||
|
ScienceFiction, |
||||
|
Poetry |
||||
|
} |
||||
|
} |
||||
@ -1,6 +1,7 @@ |
|||||
{ |
{ |
||||
"culture": "en", |
"culture": "en", |
||||
"texts": { |
"texts": { |
||||
|
"Menu:BookManagement": "Book Management", |
||||
|
"Menu:Books": "Books" |
||||
} |
} |
||||
} |
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Domain.Entities.Auditing; |
||||
|
|
||||
|
namespace Acme.BookStore.BookManagement.Books |
||||
|
{ |
||||
|
public class Book : AuditedAggregateRoot<Guid> |
||||
|
{ |
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public BookType Type { get; set; } |
||||
|
|
||||
|
public DateTime PublishDate { get; set; } |
||||
|
|
||||
|
public float Price { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,47 @@ |
|||||
|
using System; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
using Volo.Abp.Domain.Repositories; |
||||
|
using Volo.Abp.Guids; |
||||
|
using Volo.Abp.Linq; |
||||
|
|
||||
|
namespace Acme.BookStore.BookManagement.Books |
||||
|
{ |
||||
|
public class BookManagementDataSeedContributor : IDataSeedContributor, ITransientDependency |
||||
|
{ |
||||
|
private readonly IRepository<Book, Guid> _bookRepository; |
||||
|
private readonly IAsyncQueryableExecuter _queryableExecuter; |
||||
|
private readonly IGuidGenerator _guidGenerator; |
||||
|
|
||||
|
public BookManagementDataSeedContributor( |
||||
|
IRepository<Book, Guid> bookRepository, |
||||
|
IAsyncQueryableExecuter queryableExecuter, |
||||
|
IGuidGenerator guidGenerator) |
||||
|
{ |
||||
|
_bookRepository = bookRepository; |
||||
|
_queryableExecuter = queryableExecuter; |
||||
|
_guidGenerator = guidGenerator; |
||||
|
} |
||||
|
|
||||
|
public async Task SeedAsync(DataSeedContext context) |
||||
|
{ |
||||
|
if (await _queryableExecuter.CountAsync(_bookRepository) > 0) |
||||
|
{ |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
await _bookRepository.InsertAsync( |
||||
|
new Book |
||||
|
{ |
||||
|
Id = _guidGenerator.Create(), |
||||
|
Name = "Pet Sematary", |
||||
|
Price = 42, |
||||
|
PublishDate = new DateTime(1995,11,15), |
||||
|
Type = BookType.Horror |
||||
|
} |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,16 @@ |
|||||
|
@page |
||||
|
@model Acme.BookStore.BookManagement.Web.Pages.BookManagement.Books.CreateModalModel |
||||
|
@inherits Acme.BookStore.BookManagement.Web.Pages.BookManagementPage |
||||
|
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal |
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
<abp-dynamic-form abp-model="Book" data-ajaxForm="true" asp-page="/BookManagement/Books/CreateModal"> |
||||
|
<abp-modal> |
||||
|
<abp-modal-header title="@L["NewBook"].Value"></abp-modal-header> |
||||
|
<abp-modal-body> |
||||
|
<abp-form-content /> |
||||
|
</abp-modal-body> |
||||
|
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer> |
||||
|
</abp-modal> |
||||
|
</abp-dynamic-form> |
||||
@ -0,0 +1,29 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Acme.BookStore.BookManagement.Books; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.AspNetCore.Mvc.RazorPages; |
||||
|
|
||||
|
namespace Acme.BookStore.BookManagement.Web.Pages.BookManagement.Books |
||||
|
{ |
||||
|
public class CreateModalModel : BookManagementPageModel |
||||
|
{ |
||||
|
[BindProperty] |
||||
|
public CreateUpdateBookDto Book { get; set; } |
||||
|
|
||||
|
private readonly IBookAppService _bookAppService; |
||||
|
|
||||
|
public CreateModalModel(IBookAppService bookAppService) |
||||
|
{ |
||||
|
_bookAppService = bookAppService; |
||||
|
} |
||||
|
|
||||
|
public async Task<IActionResult> OnPostAsync() |
||||
|
{ |
||||
|
await _bookAppService.CreateAsync(Book); |
||||
|
return NoContent(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,35 @@ |
|||||
|
@page |
||||
|
@model Acme.BookStore.BookManagement.Web.Pages.BookManagement.Books.IndexModel |
||||
|
@inherits Acme.BookStore.BookManagement.Web.Pages.BookManagementPage |
||||
|
@section scripts |
||||
|
{ |
||||
|
<abp-script src="/Pages/BookManagement/Books/index.js" /> |
||||
|
} |
||||
|
<abp-card> |
||||
|
<abp-card-header> |
||||
|
<abp-row> |
||||
|
<abp-column size-md="_6"> |
||||
|
<h2>@L["Books"]</h2> |
||||
|
</abp-column> |
||||
|
<abp-column size-md="_6" class="text-right"> |
||||
|
<abp-button id="NewBookButton" |
||||
|
text="@L["NewBook"].Value" |
||||
|
icon="plus" |
||||
|
button-type="Primary" /> |
||||
|
</abp-column> |
||||
|
</abp-row> |
||||
|
</abp-card-header> |
||||
|
<abp-card-body> |
||||
|
<abp-table striped-rows="true" id="BooksTable"> |
||||
|
<thead> |
||||
|
<tr> |
||||
|
<th>@L["Name"]</th> |
||||
|
<th>@L["Type"]</th> |
||||
|
<th>@L["PublishDate"]</th> |
||||
|
<th>@L["Price"]</th> |
||||
|
<th>@L["CreationTime"]</th> |
||||
|
</tr> |
||||
|
</thead> |
||||
|
</abp-table> |
||||
|
</abp-card-body> |
||||
|
</abp-card> |
||||
@ -0,0 +1,16 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.AspNetCore.Mvc.RazorPages; |
||||
|
|
||||
|
namespace Acme.BookStore.BookManagement.Web.Pages.BookManagement.Books |
||||
|
{ |
||||
|
public class IndexModel : PageModel |
||||
|
{ |
||||
|
public void OnGet() |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,23 @@ |
|||||
|
$(function () { |
||||
|
var dataTable = $('#BooksTable').DataTable(abp.libs.datatables.normalizeConfiguration({ |
||||
|
ajax: abp.libs.datatables.createAjax(acme.bookStore.bookManagement.book.getList), |
||||
|
columnDefs: [ |
||||
|
{ data: "name" }, |
||||
|
{ data: "type" }, |
||||
|
{ data: "publishDate" }, |
||||
|
{ data: "price" }, |
||||
|
{ data: "creationTime" } |
||||
|
] |
||||
|
})); |
||||
|
|
||||
|
var createModal = new abp.ModalManager(abp.appPath + 'BookManagement/Books/CreateModal'); |
||||
|
|
||||
|
createModal.onResult(function () { |
||||
|
dataTable.ajax.reload(); |
||||
|
}); |
||||
|
|
||||
|
$('#NewBookButton').click(function (e) { |
||||
|
e.preventDefault(); |
||||
|
createModal.open(); |
||||
|
}); |
||||
|
}); |
||||
Loading…
Reference in new issue