Add Cart Flow
This commit is contained in:
parent
cbf3310cd1
commit
b079e6ba79
@ -26,7 +26,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers
|
||||
{
|
||||
var vm = new IndexViewModel()
|
||||
{
|
||||
CatalogItems = await _catalogSvc.GetCatalogItems(8 * (page ?? 0), 8),
|
||||
CatalogItems = await _catalogSvc.GetCatalogItems(6 * (page ?? 0), 6),
|
||||
Brands = _catalogSvc.GetTypes(),
|
||||
Types = _catalogSvc.GetBrands(),
|
||||
BrandFilterApplied = BrandFilterApplied ?? 0,
|
||||
@ -34,9 +34,9 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers
|
||||
PaginationInfo = new PaginationInfo()
|
||||
{
|
||||
ActualPage = page ?? 0,
|
||||
ItemsPerPage = 8,
|
||||
ItemsPerPage = 6,
|
||||
TotalItems = _catalogSvc.TotalItems,
|
||||
TotalPages = int.Parse(Math.Round(((decimal)_catalogSvc.TotalItems / 8), MidpointRounding.AwayFromZero).ToString())
|
||||
TotalPages = int.Parse(Math.Round(((decimal)_catalogSvc.TotalItems / 6), MidpointRounding.AwayFromZero).ToString())
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -5,20 +5,41 @@ using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.eShopOnContainers.WebMVC.Services;
|
||||
using Microsoft.eShopOnContainers.WebMVC.Models;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
|
||||
namespace Microsoft.eShopOnContainers.WebMVC.Controllers
|
||||
{
|
||||
[Authorize]
|
||||
public class OrderController : Controller
|
||||
{
|
||||
private IOrderingService _orderSvc;
|
||||
public OrderController(IOrderingService orderSvc)
|
||||
private ICatalogService _catalogSvc;
|
||||
private readonly UserManager<ApplicationUser> _userManager;
|
||||
public OrderController(IOrderingService orderSvc, ICatalogService catalogSvc, UserManager<ApplicationUser> userManager)
|
||||
{
|
||||
_userManager = userManager;
|
||||
_orderSvc = orderSvc;
|
||||
_catalogSvc = catalogSvc;
|
||||
}
|
||||
|
||||
public IActionResult AddToCart()
|
||||
public async Task<IActionResult> AddToCart(string productId)
|
||||
{
|
||||
return View();
|
||||
//CCE: I need product details (price, ...), so I retrieve from Catalog service again.
|
||||
// I don't like POST with a form from the catalog view (I'm avoiding Ajax too),
|
||||
// I prefer Url.Action and http call here to catalog service to retrieve this info.
|
||||
var user = await _userManager.GetUserAsync(HttpContext.User);
|
||||
var productDetails = _catalogSvc.GetCatalogItem(productId);
|
||||
var product = new OrderItem()
|
||||
{
|
||||
ProductId = productId,
|
||||
Quantity = 1,
|
||||
ProductName = productDetails.Name,
|
||||
PicsUrl = productDetails.PicsUrl,
|
||||
UnitPrice = productDetails.Price
|
||||
};
|
||||
_orderSvc.AddToCart(user, product);
|
||||
return RedirectToAction("Index", "Catalog");
|
||||
}
|
||||
|
||||
public IActionResult Cart()
|
||||
@ -31,10 +52,10 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers
|
||||
return View();
|
||||
}
|
||||
|
||||
public IActionResult Index(Order item)
|
||||
public async Task<IActionResult> Index(Order item)
|
||||
{
|
||||
_orderSvc.AddOrder(item);
|
||||
return View(_orderSvc.GetOrders());
|
||||
var user = await _userManager.GetUserAsync(HttpContext.User);
|
||||
return View(_orderSvc.GetMyOrders(user));
|
||||
}
|
||||
}
|
||||
}
|
23
src/Web/WebMVC/Extensions/SessionExtensions.cs
Normal file
23
src/Web/WebMVC/Extensions/SessionExtensions.cs
Normal file
@ -0,0 +1,23 @@
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
||||
public static class SessionExtensions
|
||||
{
|
||||
public static void SetObject(this ISession session, string key, object value)
|
||||
{
|
||||
session.SetString(key, JsonConvert.SerializeObject(value));
|
||||
}
|
||||
|
||||
public static T GetObject<T>(this ISession session, string key)
|
||||
{
|
||||
var value = session.GetString(key);
|
||||
|
||||
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Models
|
||||
{
|
||||
public class CatalogItem
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Id { get; set; }
|
||||
public string Name { get; set; }
|
||||
public string Description { get; set; }
|
||||
public decimal Price { get; set; }
|
||||
|
@ -7,7 +7,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Models
|
||||
{
|
||||
public class Order
|
||||
{
|
||||
Guid Id;
|
||||
public string Id;
|
||||
public List<OrderItem> OrderItems { get; set; }
|
||||
public string OrderNumber
|
||||
{
|
||||
@ -17,12 +17,20 @@ namespace Microsoft.eShopOnContainers.WebMVC.Models
|
||||
}
|
||||
}
|
||||
public int SequenceNumber { get; set; }
|
||||
public virtual Guid BuyerId { get; set; }
|
||||
public virtual string BuyerId { get; set; }
|
||||
public virtual Address ShippingAddress { get; set; }
|
||||
|
||||
public virtual DateTime OrderDate { get; set; }
|
||||
public OrderState State { get; set; }
|
||||
|
||||
//(CCE) public virtual Address BillingAddress { get; set; }
|
||||
//(CDLTLL) public virtual OrderStatus Status { get; set; }
|
||||
}
|
||||
|
||||
public enum OrderState
|
||||
{
|
||||
Active,
|
||||
InProcess,
|
||||
Delivered
|
||||
}
|
||||
}
|
||||
|
@ -7,13 +7,14 @@ namespace Microsoft.eShopOnContainers.WebMVC.Models
|
||||
{
|
||||
public class OrderItem
|
||||
{
|
||||
Guid Id;
|
||||
public Guid ProductId { get; set; }
|
||||
public Guid OrderId { get; set; }
|
||||
public string Id;
|
||||
public string ProductId { get; set; }
|
||||
public string OrderId { get; set; }
|
||||
public string ProductName { get; set; }
|
||||
public decimal UnitPrice { get; set; }
|
||||
public int Quantity { get; set; }
|
||||
public decimal Discount { get; set; }
|
||||
public string PicsUrl { get; set; }
|
||||
public override string ToString()
|
||||
{
|
||||
return String.Format("Product Id: {0}, Quantity: {1}", this.Id, this.Quantity);
|
||||
|
@ -1,41 +0,0 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.eShopOnContainers.WebMVC.Models;
|
||||
|
||||
namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
{
|
||||
public class CartService : ICartService
|
||||
{
|
||||
Order _order;
|
||||
|
||||
public CartService()
|
||||
{
|
||||
_order = new Order();
|
||||
_order.OrderItems = new System.Collections.Generic.List<OrderItem>();
|
||||
_order.OrderItems.Add(new OrderItem()
|
||||
{
|
||||
ProductName = "Cart product"
|
||||
});
|
||||
}
|
||||
|
||||
public void AddItemToOrder(CatalogItem item)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public int GetItemCountFromOrderInProgress()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public Task<Order> GetActiveOrder()
|
||||
{
|
||||
return Task.Run(() => { return _order; });
|
||||
}
|
||||
|
||||
public void RemoveItemFromOrder(Guid itemIdentifier)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
@ -32,41 +32,41 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
#region fake data
|
||||
_items = new List<CatalogItem>()
|
||||
{
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Roslyn Red T-Shirt", Name = "Roslyn Red T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Cupt Black & White Mug", Name = "Cupt Black & White Mug", Price= 17, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=CuptBlack&WhiteMug" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = "Prism White T-Shirt", Name = "Prism White T-Shirt", Price = 12, PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.PrismWhiteT-Shirt" },
|
||||
new CatalogItem() { Id = Guid.NewGuid().ToString(), Description = ".NET Bot Black Sweatshirt", Name = ".NET Bot Black Sweatshirt", Price = decimal.Parse("19.5"), PicsUrl = "http://fakeimg.pl/370x240/EEEEEE/000/?text=.NETBotBlack" }
|
||||
};
|
||||
#endregion
|
||||
}
|
||||
|
||||
public CatalogItem GetCatalogItem(Guid Id)
|
||||
public CatalogItem GetCatalogItem(string Id)
|
||||
{
|
||||
return _items.Where(x => x.Id == Id).FirstOrDefault();
|
||||
return _items.Where(x => x.Id.Equals(Id)).FirstOrDefault();
|
||||
}
|
||||
|
||||
public Task<List<CatalogItem>> GetCatalogItems(int? skip,int? take)
|
||||
|
@ -1,16 +0,0 @@
|
||||
using Microsoft.eShopOnContainers.WebMVC.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
{
|
||||
public interface ICartService
|
||||
{
|
||||
void AddItemToOrder(CatalogItem item);
|
||||
void RemoveItemFromOrder(Guid itemIdentifier);
|
||||
int GetItemCountFromOrderInProgress();
|
||||
Task<Order> GetActiveOrder();
|
||||
}
|
||||
}
|
@ -12,7 +12,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
int TotalItems { get; }
|
||||
|
||||
Task<List<CatalogItem>> GetCatalogItems(int? skip, int? take);
|
||||
CatalogItem GetCatalogItem(Guid Id);
|
||||
CatalogItem GetCatalogItem(string Id);
|
||||
IEnumerable<SelectListItem> GetBrands();
|
||||
IEnumerable<SelectListItem> GetTypes();
|
||||
}
|
||||
|
@ -8,8 +8,10 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
{
|
||||
public interface IOrderingService
|
||||
{
|
||||
List<Order> GetOrders();
|
||||
Order GetOrder(Guid Id);
|
||||
void AddOrder(Order Order);
|
||||
int ItemsInCart { get; }
|
||||
List<Order> GetMyOrders(ApplicationUser user);
|
||||
Order GetActiveOrder(ApplicationUser user);
|
||||
void AddToCart(ApplicationUser user, OrderItem product);
|
||||
Order GetOrder(ApplicationUser user, Guid orderId);
|
||||
}
|
||||
}
|
||||
|
@ -3,44 +3,90 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.eShopOnContainers.WebMVC.Models;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
|
||||
namespace Microsoft.eShopOnContainers.WebMVC.Services
|
||||
{
|
||||
public class OrderingService : IOrderingService
|
||||
{
|
||||
private List<Order> _orders;
|
||||
private int _itemsInCart;
|
||||
private IHttpContextAccessor _httpContextAccessor;
|
||||
public int ItemsInCart { get { return _itemsInCart; } }
|
||||
//var ordersUrl = _settings.OrderingUrl + "/api/ordering/orders";
|
||||
//var dataString = await _http.GetStringAsync(ordersUrl);
|
||||
//var items = JsonConvert.DeserializeObject<List<Order>>(dataString);
|
||||
|
||||
public OrderingService()
|
||||
public OrderingService(IHttpContextAccessor httpContextAccessor)
|
||||
{
|
||||
_httpContextAccessor = httpContextAccessor;
|
||||
|
||||
_orders = new List<Order>()
|
||||
{
|
||||
new Order()
|
||||
{
|
||||
BuyerId = Guid.NewGuid(), OrderDate = DateTime.Now,
|
||||
BuyerId = new Guid("ebcbcb4c-b032-4baa-834b-7fd66d37bc95").ToString(),
|
||||
OrderDate = DateTime.Now,
|
||||
State = OrderState.Active,
|
||||
OrderItems = new List<OrderItem>()
|
||||
{
|
||||
new OrderItem() { UnitPrice = 12 }
|
||||
new OrderItem() { UnitPrice = 12, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt", Quantity = 1, ProductName="Roslyn Red T-Shirt" }
|
||||
}
|
||||
},
|
||||
new Order()
|
||||
{
|
||||
BuyerId = new Guid("ebcbcb4c-b032-4baa-834b-7fd66d37bc95").ToString(),
|
||||
OrderDate = DateTime.Now,
|
||||
State = OrderState.InProcess,
|
||||
OrderItems = new List<OrderItem>()
|
||||
{
|
||||
new OrderItem() { UnitPrice = 12, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt", Quantity = 1, ProductName="Roslyn Red T-Shirt" }
|
||||
}
|
||||
},
|
||||
new Order()
|
||||
{
|
||||
BuyerId = new Guid("ebcbcb4c-b032-4baa-834b-7fd66d37bc95").ToString(),
|
||||
OrderDate = DateTime.Now,
|
||||
State = OrderState.InProcess,
|
||||
OrderItems = new List<OrderItem>()
|
||||
{
|
||||
new OrderItem() { UnitPrice = 12, PicsUrl = "https://fakeimg.pl/370x240/EEEEEE/000/?text=RoslynRedT-Shirt", Quantity = 1, ProductName="Roslyn Red T-Shirt" }
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
public void AddOrder(Order Order)
|
||||
public Order GetActiveOrder(ApplicationUser user)
|
||||
{
|
||||
_orders.Add(Order);
|
||||
//I think could be a good aproach to work with session to store the active order.
|
||||
//....
|
||||
Order activeOrder;
|
||||
activeOrder = _httpContextAccessor.HttpContext.Session.GetObject<Order>("MyActiveOrder");
|
||||
if (activeOrder == null)
|
||||
activeOrder = _orders.Where(x => x.BuyerId.Equals(user.Id) && x.State == OrderState.Active).FirstOrDefault();
|
||||
|
||||
_itemsInCart = (activeOrder != null) ? activeOrder.OrderItems.Count() : 0;
|
||||
|
||||
return activeOrder;
|
||||
}
|
||||
|
||||
public Order GetOrder(Guid Id)
|
||||
public Order GetOrder(ApplicationUser user, Guid Id)
|
||||
{
|
||||
return _orders.Where(x => x.BuyerId == Id).FirstOrDefault();
|
||||
return _orders.Where(x => x.BuyerId.Equals(user.Id) && x.Id.Equals(Id)).FirstOrDefault();
|
||||
}
|
||||
|
||||
public List<Order> GetOrders()
|
||||
public List<Order> GetMyOrders(ApplicationUser user)
|
||||
{
|
||||
return _orders;
|
||||
return _orders.Where(x => x.BuyerId.Equals(user.Id)).ToList();
|
||||
}
|
||||
|
||||
public void AddToCart(ApplicationUser user, OrderItem product)
|
||||
{
|
||||
var activeOrder = GetActiveOrder(user);
|
||||
activeOrder.OrderItems.Add(product);
|
||||
//CCE: lacks and httpcall to persist in the real back.end service.
|
||||
_httpContextAccessor.HttpContext.Session.SetObject("MyActiveOrder", activeOrder);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -49,13 +49,14 @@ namespace Microsoft.eShopOnContainers.WebMVC
|
||||
.AddDefaultTokenProviders();
|
||||
|
||||
services.AddMvc();
|
||||
services.AddDistributedMemoryCache(); // default implementation (in memory), you can move to SQL or custom store that could be Redis..
|
||||
services.AddSession();
|
||||
|
||||
// Add application services.
|
||||
services.AddTransient<IEmailSender, AuthMessageSender>();
|
||||
services.AddTransient<ISmsSender, AuthMessageSender>();
|
||||
services.AddTransient<ICatalogService, CatalogService>();
|
||||
services.AddSingleton<ICatalogService, CatalogService>();
|
||||
services.AddTransient<IOrderingService, OrderingService>();
|
||||
services.AddTransient<ICartService, CartService>();
|
||||
|
||||
services.Configure<AppSettings>(Configuration);
|
||||
}
|
||||
@ -81,6 +82,8 @@ namespace Microsoft.eShopOnContainers.WebMVC
|
||||
|
||||
app.UseIdentity();
|
||||
|
||||
app.UseSession();
|
||||
|
||||
// Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715
|
||||
|
||||
app.UseMvc(routes =>
|
||||
|
31
src/Web/WebMVC/ViewComponents/Cart.cs
Normal file
31
src/Web/WebMVC/ViewComponents/Cart.cs
Normal file
@ -0,0 +1,31 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.eShopOnContainers.WebMVC.Models;
|
||||
using Microsoft.eShopOnContainers.WebMVC.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Microsoft.eShopOnContainers.WebMVC.ViewComponents
|
||||
{
|
||||
public class Cart : ViewComponent
|
||||
{
|
||||
private readonly IOrderingService _cartSvc;
|
||||
|
||||
public Cart(IOrderingService cartSvc)
|
||||
{
|
||||
_cartSvc = cartSvc;
|
||||
}
|
||||
|
||||
public async Task<IViewComponentResult> InvokeAsync(ApplicationUser user)
|
||||
{
|
||||
var itemsInCart = await ItemsInCartAsync(user);
|
||||
return View(itemsInCart);
|
||||
}
|
||||
private Task<int> ItemsInCartAsync(ApplicationUser user)
|
||||
{
|
||||
_cartSvc.GetActiveOrder(user);
|
||||
return Task.Run ( ()=> { return _cartSvc.ItemsInCart; });
|
||||
}
|
||||
}
|
||||
}
|
@ -10,21 +10,21 @@ namespace Microsoft.eShopOnContainers.WebMVC.ViewComponents
|
||||
{
|
||||
public class CartList : ViewComponent
|
||||
{
|
||||
private readonly ICartService _cartSvc;
|
||||
private readonly IOrderingService _cartSvc;
|
||||
|
||||
public CartList(ICartService cartSvc)
|
||||
public CartList(IOrderingService cartSvc)
|
||||
{
|
||||
_cartSvc = cartSvc;
|
||||
}
|
||||
|
||||
public async Task<IViewComponentResult> InvokeAsync()
|
||||
public async Task<IViewComponentResult> InvokeAsync(ApplicationUser user)
|
||||
{
|
||||
var item = await GetItemsAsync();
|
||||
var item = await GetItemsAsync(user);
|
||||
return View(item);
|
||||
}
|
||||
private Task<Order> GetItemsAsync()
|
||||
private Task<Order> GetItemsAsync(ApplicationUser user)
|
||||
{
|
||||
return _cartSvc.GetActiveOrder();
|
||||
return Task.Run(()=> { return _cartSvc.GetActiveOrder(user); });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -63,7 +63,7 @@
|
||||
<div class="col-sm-4 home-catalog-item">
|
||||
<div class="home-catalog-item-image" >
|
||||
<img src="@catalogItem.PicsUrl" />
|
||||
<a asp-area="" asp-controller="Home" asp-action="About" class="btn-brand home-catalog-item-image-addCart">
|
||||
<a asp-area="" asp-controller="Order" asp-action="AddToCart" asp-route-productId="@catalogItem.Id" class="btn-brand home-catalog-item-image-addCart">
|
||||
ADD TO CART
|
||||
</a>
|
||||
</div>
|
||||
|
@ -1,4 +1,5 @@
|
||||
@model Microsoft.eShopOnContainers.WebMVC.Models.Order
|
||||
@inject UserManager<ApplicationUser> UserManager
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "My Cart";
|
||||
@ -17,7 +18,7 @@
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>
|
||||
<th class="cart-product-column">
|
||||
PRODUCT
|
||||
</th>
|
||||
<th>
|
||||
@ -38,7 +39,7 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@await Component.InvokeAsync("CartList")
|
||||
@await Component.InvokeAsync("CartList", new { user = await UserManager.GetUserAsync(User) })
|
||||
</tbody>
|
||||
</table>
|
||||
</section>
|
||||
|
@ -1,10 +1,17 @@
|
||||
@model Microsoft.eShopOnContainers.WebMVC.Models.Order
|
||||
@model System.Int32
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "My Cart";
|
||||
}
|
||||
|
||||
<a asp-area="" asp-controller="Order" asp-action="Cart"><img src="~/images/cart.PNG" class="layout-cart-image hidden-xs"></a>
|
||||
<div>
|
||||
<a asp-area="" asp-controller="Order" asp-action="Cart"><img src="~/images/cart.PNG" class="fr layout-cart-image hidden-xs" />
|
||||
|
||||
</a>
|
||||
<div class="layout-cart-badge">
|
||||
@Model
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
@ -7,12 +7,12 @@
|
||||
@foreach (var item in Model.OrderItems)
|
||||
{
|
||||
<tr>
|
||||
<td>@*image*@</td>
|
||||
<td class="cart-product-column"><img class="cart-product-image"src="@item.PicsUrl" /></td>
|
||||
<td>@item.ProductName</td>
|
||||
<td>ROSLYN</td>
|
||||
<td>$ @item.UnitPrice</td>
|
||||
<td>@item.Quantity</td>
|
||||
<td>$ @item.Quantity * @item.UnitPrice</td>
|
||||
<td>$ @(item.Quantity * item.UnitPrice)</td>
|
||||
</tr>
|
||||
}
|
||||
|
||||
|
@ -7,15 +7,15 @@
|
||||
@if (SignInManager.IsSignedIn(User))
|
||||
{
|
||||
<form asp-area="" asp-controller="Account" asp-action="LogOff" method="post" id="logoutForm" class="navbar-right">
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li style="float:right"><a asp-area="" asp-controller="Order" asp-action="Cart"><img src="~/images/cart.PNG" class="layout-cart-image hidden-xs"></a></li>
|
||||
<li class="fr login-user"><a asp-area="" asp-controller="Manage" asp-action="Index" title="Manage">@UserManager.GetUserName(User)</a></li>
|
||||
@*<li class="fr"><a href="javascript:document.getElementById('logoutForm').submit()" class="btn-login"> Log Out </a></li>*@
|
||||
</ul>
|
||||
<div class=".login-user-dropdown-content">
|
||||
<a href="#">Link 1</a>
|
||||
<a href="#">Link 2</a>
|
||||
<a href="#">Link 3</a>
|
||||
<div class="nav navbar-nav navbar-right mt-15">
|
||||
@await Component.InvokeAsync("Cart", new { user = await UserManager.GetUserAsync(User) })
|
||||
<div class="fr login-user">
|
||||
<span>@UserManager.GetUserName(User)<i class="down-arrow"></i></span>
|
||||
<div class="login-user-dropdown-content">
|
||||
<a href="#">MY ORDERS<i class="myorders-icon"></i></a>
|
||||
<a href="javascript:document.getElementById('logoutForm').submit()">LOG OUT<i class="logout-icon"></i></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
}
|
||||
@ -23,6 +23,5 @@ else
|
||||
{
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li><a asp-area="" asp-controller="Account" class="btn-login" asp-action="Login"> Log In </a></li>
|
||||
@*<li><a asp-area="" asp-controller="Order" asp-action="Cart"><img src="~/images/cart.PNG" class="layout-cart-image hidden-xs"></a></li>*@
|
||||
</ul>
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
"Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.0.0",
|
||||
"Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",
|
||||
"Microsoft.AspNetCore.Mvc": "1.0.0",
|
||||
"Microsoft.AspNetCore.Session": "1.0.0",
|
||||
"Microsoft.AspNetCore.Razor.Tools": {
|
||||
"version": "1.0.0-preview2-final",
|
||||
"type": "build"
|
||||
|
@ -16,6 +16,10 @@ body {
|
||||
font-family: Montserrat,sans-serif;
|
||||
}
|
||||
|
||||
.mt-15 {
|
||||
margin-top:15px;
|
||||
}
|
||||
|
||||
/* Wrapping element */
|
||||
/* Set some basic padding to keep content from hitting the edges */
|
||||
.body-content {
|
||||
@ -93,6 +97,20 @@ select::-ms-expand {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.layout-cart-badge {
|
||||
position: absolute;
|
||||
margin-top: 2px;
|
||||
margin-left: 14px;
|
||||
background-color: #83d01b;
|
||||
padding: 1px;
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* buttons and links extension to use brackets: [ click me ] */
|
||||
.btn-bracketed:hover:before {
|
||||
display: inline-block;
|
||||
@ -491,6 +509,14 @@ form .col-md-4 {
|
||||
padding-top: 40px;
|
||||
}
|
||||
|
||||
.cart-product-column {
|
||||
max-width: 120px;
|
||||
}
|
||||
|
||||
.cart-product-image {
|
||||
max-width: 210px;
|
||||
}
|
||||
|
||||
.input-validation-error {
|
||||
border: 1px solid #fb0d0d;
|
||||
}
|
||||
@ -529,10 +555,35 @@ form .col-md-4 {
|
||||
float:right!important;
|
||||
}
|
||||
|
||||
.down-arrow {
|
||||
background-image: url('../images/arrow-down.png');
|
||||
height: 7px;
|
||||
width: 10px;
|
||||
display: inline-block;
|
||||
margin-left: 20px;
|
||||
}
|
||||
|
||||
.logout-icon {
|
||||
background-image: url('../images/logout.PNG');
|
||||
display: inline-block;
|
||||
height:19px;
|
||||
width:19px;
|
||||
margin-left: 15px;
|
||||
}
|
||||
|
||||
.myorders-icon {
|
||||
background-image: url('../images/my_orders.PNG');
|
||||
display: inline-block;
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
margin-left: 15px;
|
||||
}
|
||||
|
||||
.login-user {
|
||||
position: absolute!important;
|
||||
top: 15px;
|
||||
top: 30px;
|
||||
right: 65px;
|
||||
cursor:pointer;
|
||||
}
|
||||
|
||||
.login-user-dropdown {
|
||||
@ -543,9 +594,10 @@ form .col-md-4 {
|
||||
.login-user-dropdown-content {
|
||||
display: none;
|
||||
position: absolute;
|
||||
background-color: #f9f9f9;
|
||||
background-color: #FFFFFF;
|
||||
min-width: 160px;
|
||||
box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
|
||||
left: 100px;
|
||||
}
|
||||
|
||||
.login-user-dropdown-content a {
|
||||
@ -553,6 +605,16 @@ form .col-md-4 {
|
||||
padding: 12px 16px;
|
||||
text-decoration: none;
|
||||
display: block;
|
||||
text-align:right;
|
||||
text-transform:uppercase;
|
||||
}
|
||||
|
||||
.login-user:hover .login-user-dropdown-content {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.login-user-dropdown-content a:hover {
|
||||
color: #f1f1f1;
|
||||
}
|
||||
|
||||
.es-header {
|
||||
|
BIN
src/Web/WebMVC/wwwroot/images/logout.PNG
Normal file
BIN
src/Web/WebMVC/wwwroot/images/logout.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 429 B |
BIN
src/Web/WebMVC/wwwroot/images/my_orders.PNG
Normal file
BIN
src/Web/WebMVC/wwwroot/images/my_orders.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 221 B |
Loading…
x
Reference in New Issue
Block a user