none
ASP.NET CORE MVC BASKET(Shopping cart, Alışveriş Sepeti) Hk. RRS feed

  • Soru

  • Merhaba, alışveriş sepetini nasıl yapiyoruz? (sepet ekleme, silme güncelleme, basket'e atma), internet de araştırdım kafam çok karişti en doğru yolu nedir?
    26 Mayıs 2019 Pazar 16:39

Tüm Yanıtlar

  • import { Injectable } from '@angular/core';
    import { IProduct } from './data.service';
    import * as _ from 'underscore';
    import swal from 'sweetalert2';
    
    @Injectable({
      providedIn: 'root'
    })
    export class ShoppingCartService {
    
      constructor() {
        this.getStorage();
      }
    
      shoppingCart: IShoppingCart = new ShoppingCart();
    
      add(product: IProduct) {
        var item: IShoppingCartItem = _.find(this.shoppingCart.items, (i: IShoppingCartItem) => { return i.product.id === product.id });
        if (item)
          item.quantity++;
        else {
          item = new ShoppingCartItem(product);
          this.shoppingCart.items.push(item);
        }
        swal.fire({
          type: 'success',
          text: '"' + item.product.name + '" sepetinize eklendi.',
          confirmButtonText: 'TAMAM'
        });
        this.setStorage();
      }
    
      
    
      remove(item: IShoppingCartItem) {
        swal.fire({
          type: 'warning',
          text: '"' + item.product.name + '" isimli ürün sepetinizden çıkarılacaktır. Devam etmek istiyor musunuz?',
          confirmButtonText: 'SİL',
          showCancelButton: true,
          cancelButtonText: 'İPTAL'
        }).then((result) => {
          if (result.value) {
            this.shoppingCart.items = _.without(this.shoppingCart.items, item);
            this.setStorage();
          }
        });
      }
    
      clear() {
        swal.fire({
          type: 'warning',
          text: 'Sepetinizdeki tüm ürünler çıkarılacaktır. Devam etmek istiyor musunuz?',
          confirmButtonText: 'TEMİZLE',
          showCancelButton: true,
          cancelButtonText: 'İPTAL'
        }).then((result) => {
          if (result.value) {
            this.shoppingCart.items = [];
            this.setStorage();
          }
        });
      }
    
      private setStorage() {
        localStorage.setItem('shoppingCart', JSON.stringify(this.shoppingCart.items));
      }
      private getStorage() {
        var items = JSON.parse(localStorage.getItem('shoppingCart')) || [];
        for (var i = 0; i < items.length; i++) {
          items[i].amount = items[i].product.price * items[i].quantity;
          this.shoppingCart.items.push(items[i]);
        }
      }
    
    }
    
    export
      interface IShoppingCartItem {
      product: IProduct,
      quantity: number,
      amount: number
    }
    
    export
      class ShoppingCartItem implements IShoppingCartItem {
    
      constructor(product: IProduct, quantity: number = 1) {
        this.product = product;
        this.quantity = quantity;
      }
    
    
      product: IProduct;
      quantity: number;
    
      get amount(): number {
        return this.product.price * this.quantity;
      }
    }
    
    export
      interface IShoppingCart {
      items: IShoppingCartItem[];
      total: number
    }
    
    export
      class ShoppingCart implements IShoppingCart {
      items: IShoppingCartItem[] = [];
      get total(): number {
        return _.reduce(this.items, (m: number, i: IShoppingCartItem) => { return m + i.amount }, 0);
      }
    }
    
    
    


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    26 Mayıs 2019 Pazar 19:17
    Moderatör
  • Kişi login değilse sessionstorage veya localstorage, login ise sunucuda saklanmalı bence. Login olursa da xxxstorage dan otomaitk online sepete aktarılmalı. Sepete işte ekleyip evde sipariş verdiğim için sepetin online olması önemli bence.

    En doğru yol sorulmuş, en doğru yol çalışan ve güvenli olan yol :) Ne yapıp geçeceksin ne de üzerinde aylar günler harcayacaksın. Kodun sonradan oraya başka nir şey sıkıştırabilecek gibi olsun yeter. Bak, Önay'abinin koduna; şu an localstorage kullanıyor ama sepet koduna hiç dokunmadan bunu sessionstorage'a da çevirebilir sunucu taraflı da yapabilir. Çünkü bağlar gevşek...


    www.cihanyakar.com



    27 Mayıs 2019 Pazartesi 08:30
    Moderatör
  • @Cihan aslında son hali dediğin gibi. Sepetin saklandığı yer login durumuna göre değişiyor. setStorage ve getStorage methodlarını servisten alıp, ShoppingCart clasına taşıdım, User'i constructora inject ettim. User var ise sunucuya gönderdim ;)

    Yalnız!:

     private getStorage() {
        var items = JSON.parse(localStorage.getItem('shoppingCart')) || [];
        for (var i = 0; i < items.length; i++) {
          items[i].amount = items[i].product.price * items[i].quantity;
          this.shoppingCart.items.push(items[i]);
        }
      }
    Bu bölüm midemi bulandırıyor. Deserialize/serialize ettiğim obje sadece property value'leri barındırabiliyor, haliyle get amount:number 0 dönüyor. TypeScript'te henüz buna bi çare bulamadım :(

    Önerisi olan varsa duymak isterim.



    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com



    27 Mayıs 2019 Pazartesi 10:08
    Moderatör
  • Bu standart mı acaba? Bunu yapana kadar daha kısa bişeyler ben uydururdum gibime geliyor. Olmazsa böyle yapacaz artık.

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    27 Mayıs 2019 Pazartesi 11:56
    Moderatör
  • Evet  "toJson", aslında javascriptten geliyor : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

    Biz JS/TS tarafında getter/setter kullanmakta imtina ediyoruz işleri kolaylaştırsın dedğin şeyler zorlaştırdığında anlamını yitiriyor.


    www.cihanyakar.com


    27 Mayıs 2019 Pazartesi 12:13
    Moderatör