پیاده سازی سبد خرید AngularJS با استفاده از MVC و سرویس WCF REST

چهارشنبه 28 بهمن 1394

در این مقاله با جزئیات نشان خواهیم داد که چگونه می توان با استفاده از AngularJS و سرویس WCF Rest سبد خرید آنلاینی را پیاده سازی کرد.

پیاده سازی سبد خرید AngularJS با استفاده از MVC  و سرویس WCF REST

در این مقاله با جزئیات نشان خواهیم داد که چگونه می توان با استفاده از  AngularJS و سرویس  WCF Rest سبد خرید آنلاینی را پیاده سازی کرد.

 در صورت تمایل میتوانید به صورت رایگان آموزش WCF به همراه پروژه عملی را در سایت تاپ لرن مشاهده کنید .

برنامه های  Service-oriented

 WCF  یک فریم ورک برای ایجاد برنامه های Service-oriented  است. در این برنامه ها با استفاده از یک پروتکل ، سرویس می تواند بر روی یک شبکه به اشتراک گذاشته شده و استفاده شود.

برای مثال اگر توابع دیتابیسی معمولی داشته باشیم که در چندین پروژه از آنها استفاده می شود و این پروژه ها در جاهای مختلفی قرار داشته باشند و توسط اینترنت متصل باشند، در این وضعیت می توانیم یک سرویس  WCF ایجاد کنیم و توابع مورد نظر را در آن بنویسیم . می توان  WCF را بر روی  IIS توسعه داد و از  Url آن در برنامه های خود استفاده کرد. در بخش کد خواهیم دید که چگونه می توان یک سرویس  WCF REST ایجاد و از آن در برنامه های  AngularJS استفاده کرد

AngularJS

 حتما با  Model ,View ,ViewModel یا  MVVM  و  Model ,View ,Controller یا  MVCآشنا هستید .   AngularJS نیز یک فریم ورک  JavaScript است که صرفا بر اساس  HTMl ,CSS و JavaScript   ایجاد شده است.

الگوی AngularJS به صورت  Model View Whatever یا  MVW است که شبیه الگوی  MVC و  MVVM می باشد. در مثال ما این الگو  Model, View,Service  است . در بخش کد خواهید دید که چگونه  AngularJS را در برنامه های  MVC نصب و ایجاد کنید.

ایجاد دیتابیس

یک جدول  ItemDetails را تحت دیتابیس  DatabaseDB ایجاد خواهیم کرد. در زیر دستورات را برای ایجاد دیتابیس مشاهده میکنید.

USE MASTER
GO
-- 1) Check for the Database Exists .If the database is exist then drop and create new DB
IF EXISTS (SELECT [name] FROM sys.databases WHERE [name] = 'ShoppingDB' )
DROP DATABASE ShoppingDB
GO

CREATE DATABASE ShoppingDB
GO

USE ShoppingDB
GO

-- 1) //////////// ToysDetails table
-- Create Table  ToysDetails ,This table will be used to store the details like Toys Information 

IF EXISTS ( SELECT [name] FROM sys.tables WHERE [name] = 'ItemDetails' )
DROP TABLE ItemDetails
GO

CREATE TABLE ItemDetails
(
   Item_ID int identity(1,1),
   Item_Name NVARCHAR(100)  NOT NULL,
   Item_Price int  NOT NULL,
   Image_Name NVARCHAR(100)  NOT NULL,
   Description NVARCHAR(100)  NOT NULL,
   AddedBy NVARCHAR(100)  NOT NULL,
CONSTRAINT [PK_ItemDetails] PRIMARY KEY CLUSTERED      
(     
  [Item_ID] ASC     
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]     
) ON [PRIMARY]   

GO

-- Insert the sample records to the ToysDetails Table
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('Access Point','Access Pointبرای استفاده  WIFI',950,'AccessPoint.png','علی')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('CD','Compact Disk',350,'CD.png','Afraz')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('Desktop Computer','کامپیوتر رومیزی',1400,'DesktopComputer.png','علی')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('DVD','دیسک دیجیتال چند منظوره',1390,'DVD.png','مسعود')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('DVD Player','DVD Player ',450,'DVDPlayer.png','میلاد')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('Floppy','Floppy',1250,'Floppy.png','علی')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('HDD','Hard Disk',950,'HDD.png','علی')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('MobilePhone','موبایل',1150,'MobilePhone.png','علی')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('Mouse','ماوس',399,'Mouse.png','مسعود')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('MP3 Player ','Multi MediaPlayer',897,'MultimediaPlayer.png','میلاد')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('Notebook','نوت بوک',750,'Notebook.png','میلاد')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('Printer','پرینتر',675,'Printer.png','علی')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('RAM','Random Access Memory ',1950,'RAM.png','مسعود')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('Smart Phone','Smart Phone',679,'SmartPhone.png','علی')
Insert into ItemDetails(Item_Name,Description,Item_Price,Image_Name,AddedBy) values('USB','USB',950,'USB.png','علی')



select * from ItemDetails

ایجاد سرویس  WCF REST

در ویژوال استودیو 2013 از قسمت File  به  New و سپس  Project  رفته، آنگاه  WCF Service Application را انتخاب کنید.

بعد از ایجاد سرویس مورد نظر در  Solution دو آیتم   IService.CSو  Service1.svc را مشاهده میکنید.

در  IService.CS می توانیم سه قرارداد را به صورت پیش فرض ببینیم.

[ServiceContract]  متدها یا هر عمل موجودی را برای سرویس تعریف میکندیک اینترفیس است و و متدها می توانند درون اینترفیس سرویس با استفاده از صفت  Operation Contract تعریف شوند.

[OprationContract]  شبیه  Web service  یا  WebMethod است .

[DataContract ]  تبادل داده ها بین سرویس گیرنده و سرویس را تعریف میکند.

  

Service Contract

کد زیر به صورت خودکار برای همه فایل های  IService.csایجاد می شود. می توانیم کد خود را در آن بنویسیم.

public interface IService1  
   {  
   
       [OperationContract]  
       string GetData(int value);  
   
       [OperationContract]  
       CompositeType GetDataUsingDataContract(CompositeType composite);  
   
       // TODO: Add your service operations here  
   }  
   // Use a data contract as illustrated in the sample below to add composite types to service operations.  
   [DataContract]  
   public class CompositeType  
   {  
       bool boolValue = true;  
       string stringValue = "Hello ";  
   
       [DataMember]  
       public bool BoolValue  
       {  
           get { return boolValue; }  
           set { boolValue = value; }  
       }  
   
       [DataMember]  
       public string StringValue  
       {  
           get { return stringValue; }  
           set { stringValue = value; }  
       }  
   }

Data Contract

در این مثال به دریافت همه جزئیات محصولات از دیتابیس نیاز داریم . بنابراین یک DataContract با نام  itemDetailsDataContract ایجاد میکنیم.  نام ستونهای جدول خود را به عنوان Data Member  مشخص کردیم.

public class shoppingCartDataContract
        {


            [DataContract]
            public class itemDetailsDataContract
            {
                [DataMember]
                public string Item_ID { get; set; }

                [DataMember]
                public string Item_Name { get; set; }

                [DataMember]
                public string Description { get; set; }

                [DataMember]
                public string Item_Price { get; set; }

                [DataMember]
                public string Image_Name { get; set; }


                [DataMember]
                public string AddedBy { get; set; }
            }

        }

در  OperationContract  دو آیتم  WebInvoke  و  WebGet رامی توانیم مشاهده کنیم که داده ها را از دیتابیس در  سرویس REST  بازیابی میکنند.

RequestFormat = WebMessageFormat.Json,  
ResponseFormat = WebMessageFormat.Json,

برای فرمت درخواست و پاسخ از  JSON استفاده شده است.

JSON مخفف  JavaScript Object Notation است. یک فرمت تبادل داده سبک است.

UriTemplate  نام متد ماست و نوع بازگشتی متد به صورت  List  است.

در اینجا سه متد با نام های  GetOrderMaster , SearchOrderMaster و  OrderDetails را تعریف میکنیم.

متد GetOrderMaster   رکوردهای  Order Master  را دریافت میکند.  در متد  OrderDetails پارامتر  order_No فیلتر جزئیات سفارش را توسط  Order Number فراهم میکند. 

یک متد GetItemDetails تعریف کرده و از آن برای دریافت جزئیات محصولات از دیتابیس استفاده میکنیم. و یک addItemMaster برای افزودن محصول جدید در دیتابیس استفاده میکینم.

[ServiceContract]
        public interface IService1
        {
            [OperationContract]
            [WebInvoke(Method = "GET",
               RequestFormat = WebMessageFormat.Json,
               ResponseFormat = WebMessageFormat.Json,
               UriTemplate = "/GetItemDetails/")]
            List<shoppingCartDataContract.itemDetailsDataContract> GetItemDetails();
            // TODO: Add your service operations here

       

            // to Insert the Item Master
            [OperationContract]
            [WebInvoke(Method = "POST",
               RequestFormat = WebMessageFormat.Json,
               ResponseFormat = WebMessageFormat.Json,
               UriTemplate = "/addItemMaster")]
            bool addItemMaster(shoppingCartDataContract.itemDetailsDataContract itemDetails);


        }

 IService.cs کامل شده به صورت زیر می باشد:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace ShanuSchoppingCart_WCF
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
   

        [ServiceContract]
        public interface IService1
        {
            [OperationContract]
            [WebInvoke(Method = "GET",
               RequestFormat = WebMessageFormat.Json,
               ResponseFormat = WebMessageFormat.Json,
               UriTemplate = "/GetItemDetails/")]
            List<shoppingCartDataContract.itemDetailsDataContract> GetItemDetails();
            // TODO: Add your service operations here

       

            // to Insert the Item Master
            [OperationContract]
            [WebInvoke(Method = "POST",
               RequestFormat = WebMessageFormat.Json,
               ResponseFormat = WebMessageFormat.Json,
               UriTemplate = "/addItemMaster")]
            bool addItemMaster(shoppingCartDataContract.itemDetailsDataContract itemDetails);


        }

        // Use a data contract as illustrated in the sample below to add composite types to service operations.
        public class shoppingCartDataContract
        {


            [DataContract]
            public class itemDetailsDataContract
            {
                [DataMember]
                public string Item_ID { get; set; }

                [DataMember]
                public string Item_Name { get; set; }

                [DataMember]
                public string Description { get; set; }

                [DataMember]
                public string Item_Price { get; set; }

                [DataMember]
                public string Image_Name { get; set; }


                [DataMember]
                public string AddedBy { get; set; }
            }

        }
    }

اضافه کردن دیتابیس با استفاده از  ADO.net Entity Data Model

بر روی پروژه  WCF  خود کلیک راست کرده و از قسمت  Add New Item  ، گزینه  ADO.net Entity Data Model را انتخاب کنید.

پس از آن  EF Designer from Database را انتخاب کنید.

New Connection را کلیک کنید.

در این قسمت دیتابیس خود را انتخاب کرده و جداول مورد نظر را به مدل اضافه میکنیم.

Service1.svc

در این بخش اینترفیس  IService  را پیاده سازی کرده و همه متد های  Operation Contract  را باز نویسی میکنیم.

public class Service1 : IService1
    {
        ShoppingDBEntities1 OME;
        public Service1()
        {
            OME = new ShoppingDBEntities1();
        }
         // This method is get the Toys details from Db and bind to list  using the Linq query
        public List<shoppingCartDataContract.itemDetailsDataContract> GetItemDetails()
        {
            var query = (from a in OME.ItemDetails select a).Distinct();

            List<shoppingCartDataContract.itemDetailsDataContract> ItemDetailsList = new List<shoppingCartDataContract.itemDetailsDataContract>();

            query.ToList().ForEach(rec =>
            {
                ItemDetailsList.Add(new shoppingCartDataContract.itemDetailsDataContract
                {
                    Item_ID =  Convert.ToString(rec.Item_ID),
                    Item_Name = rec.Item_Name,
                    Description=rec.Description,
                    Item_Price = Convert.ToString(rec.Item_Price),
                    Image_Name = rec.Image_Name,
                    AddedBy = rec.AddedBy

                });
               
            });
            return ItemDetailsList;
        }

کد کامل  Service.svc.cs  به صورت زیر است :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using ShanuSchoppingCart_WCF.Module;

namespace ShanuSchoppingCart_WCF
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    // NOTE: In order to launch WCF Test Client for testing this service, please select Service1.svc or Service1.svc.cs at the Solution Explorer and start debugging.
    public class Service1 : IService1
    {
        ShoppingDBEntities1 OME;
        public Service1()
        {
            OME = new ShoppingDBEntities1();
        }
         // This method is get the Toys details from Db and bind to list  using the Linq query
        public List<shoppingCartDataContract.itemDetailsDataContract> GetItemDetails()
        {
            var query = (from a in OME.ItemDetails select a).Distinct();

            List<shoppingCartDataContract.itemDetailsDataContract> ItemDetailsList = new List<shoppingCartDataContract.itemDetailsDataContract>();

            query.ToList().ForEach(rec =>
            {
                ItemDetailsList.Add(new shoppingCartDataContract.itemDetailsDataContract
                {
                    Item_ID =  Convert.ToString(rec.Item_ID),
                    Item_Name = rec.Item_Name,
                    Description=rec.Description,
                    Item_Price = Convert.ToString(rec.Item_Price),
                    Image_Name = rec.Image_Name,
                    AddedBy = rec.AddedBy

                });
               
            });
            return ItemDetailsList;
        }

        public bool addItemMaster(shoppingCartDataContract.itemDetailsDataContract ItmDetails)   
      {   
          try   
          {   
                 ItemDetail itm = OME.ItemDetails.Create();                  
                    itm.Image_Name = ItmDetails.Item_Name;
                    itm.Description=ItmDetails.Description;
                    itm.Item_Price = Convert.ToInt32(ItmDetails.Item_Price);
                    itm.Image_Name = ItmDetails.Image_Name;
                    itm.AddedBy = ItmDetails.AddedBy;
                    OME.ItemDetails.Add(itm);
                    OME.SaveChanges();   
         }   
         catch (Exception ex)   
          {   
               throw new FaultException<string>   
                    (ex.Message);   
         }   

         return true; 
  
       }   

       
    }
    }

Web.Config

در پروژه های  WCF، بخش  Web.config  به صورت زیر می باشد:

تغییر :

<add binding="basicHttpsBinding" scheme="https" /> to <add binding="webHttpBinding" scheme="http" />

جایگزینی  behavior  با  :

<endpointBehaviors>  
      <behavior>  
          <webHttp helpEnabled="True"/>  
      </behavior>  
</endpointBehaviors>    

ایجاد برنامه  MVC

 می توانیم پروژه جدیدی به پروژه فعلی خود اضافه کنیم و یک MVC web application با راست کلیک بر روی  Solution و انتخاب گزینه  Add New Project ایجاد کنیم.

MVC را انتخاب کرده و OK  کنید.

حالا وقت اضافه کردن سرویس  WCF و نصب پکیج  AngularJS به  Solution  ماست.

با کلیک راست بر روی پروژه  MVC و انتخاب گزینه  Add بر روی  Service  Reference  کلیک کنید.

URL  سرویس  WCF خود را وارد کرده و بر روی  GO کلیک کنید.

با موفقیت سرویس  WCF به برنامه  MVC اضافه می شود.

روند نصب پکیج  AngularJS

بر روی پروژه  MVC کلیک راست کرده و  Manage NuGet Pakage را انتخاب کنید.

گزینه  Onlineرا انتخاب کرده و  AngularJS را جستجو کنید. آن را انتخاب و نصب کنید.

 AngularJS به پروژه اضافه شد. اکنون وقت ایجاد آن است.

.   Modules.js

.   Controllers.js

.   Services.js

 .  ShopingController.js

روند ایجاد فایلهای اسکریپت  AngularJS

بر روی پوشه  Script راست کلیک کرده و یک پوشه جدید برای ایجاد  AngularJs Model/Controller  و سرویس JavaScript  اضافه میکنیم. در این پوشه سه فایل  JavaScript  با نام های  Modules.js ، Controller.js و  Service.js به صورت زیر اضافه کنید.

 :  Modules.js  در اینجا منابع را برای  Angular.js JavaScript اضافه میکنیم. در برنامه خود از  AngularJs FileUpload نیز استفاده خواهیم کرد. برای استفاده از آن باید  angular-File-Upload.js  و  angular- File-Upload.min.js را اضافه کنیم. نام ماژول خود را  RESTClientModule قرار دادیم .

/// <reference path="../angular.js" /> 
/// <reference path="../angular.min.js" />   
/// <reference path="../angular-animate.js" />   
/// <reference path="../angular-animate.min.js" />   
/// <reference path="../angular-file-upload.js" />   
/// <reference path="../angular-file-upload.min.js" />   
var app;
var shoppingCartList = [{ Item_IDs: '', Item_Names: '', Item_Prices: '', Image_Names: '', Descriptions: '', ItemCount: 0 }];

(function () {
    app = angular.module("RESTClientModule", []);
})()

Sevice.js   :Sevice.js  در اینجا هم منابع را برای Angular.js  و Module.js  اضافه میکنیم.

یک نام برای سرویس خود فراهم کرده و از این نام در Controller.js  استفاده میکنیم. برای سرویس  Angular خود نام را  AngularJs_WCFService قرار دادیم. در متد ، URL سرویس  WCF خود را پاس داده ایم. AngularJS می تواند داده های  JSON را دریافت کند . میتوانید در اینجا ببینید که برای دریافت جزئیات محصولات به صورت  JSON آدرس سرویس خود را در این بخش قرار داده ایم. برای وارد کردن اطلاعات محصول در دیتابیس نیز داده ها به صورت JSON به عنوان پارامتر به متد Insert سرویس  فرستاده می شوند.

/// <reference path="../angular.js" />  
/// <reference path="../angular.min.js" />   
/// <reference path="../angular-animate.js" />   
/// <reference path="../angular-animate.min.js" />   
/// <reference path="Modules.js" />   

app.service("AngularJs_WCFService", function ($http) {
    //Get Order Master Records  
    this.GetItemDetails = function () {
        return $http.get("http://localhost:4191/Service1.svc/GetItemDetails/");
    };


    //To Save the Item Details with Image Name to the Database    
  
    this.post = function (ItemDetails) {
        var request = $http({
            method: "post",
            url: "http://localhost:4191/Service1.svc/addItemMaster",
            data: ItemDetails
        });
    
   
      return request;   
   }   

    
});

کنترلرهای AngularJS

دو کنترلر AngularJS با نام های controller.js  و ShopingController  ایجاد کردیم. از کنترلر  ShopingController.js برای صفحه سبد خرید استفاده خواهیم کرد و Controller.js  برای اضافه کردن آیتم جدید و بارگذاری تصویر جدید در روت پروژه استفاده می شود.

shopingController.js  : در اینجا منابع را برای  Angular.js JavaScript و Module.js و  Sevice.js اضافه میکنیم. برای این کنترلر نام AngularJs_ShoppingFController قرار داده شده است.

  در کنترلر همه منطق های کاری و بازگرداندن داده از داده های  WCF JSON به صفحه  MVC HTML را اجرا میکنیم.

Variable declarations   : ابتدا متغیرهای محلی که استفاده می شوند را اعلان میکنیم . و برای تاریخ جاری و ذخیره تاریخ از  $scope.date استفاده میکنیم.

Methods : متد  GetItemDetails()

$scope.showImage = function(imgeNm , ItemID, ItemName, ItemPrize, ItemDescription)

این متد همه جزئیات آیتم ها را برای اضافه کردن به سبد خرید زمانی که کاربر بر روی تصویر محصول کلیک میکند، نمایش می دهد.

$Scope.ShowMyCart=function()

 این متد جدول جزئیات را پنهان کرده و آیتم های سبد را نمایش می دهد.

Function getItem Totalresult()

این متد قیمت TotalPrice ، جمع تعداد TotalQty و جمع کل  GrandTotal را محاسبه میکند.

Function addItemstoCart()

این متد آیتم ها را به سبد خرید اضافه میکند و اگر در سبد موجود باشد تعداد آن را یکی یکی بالا می برد.

$Scope.removeFromCart=function(index)

این متد آیتم ها را از سبد خرید حذف میکند .هر آیتم درون سبد خرید می تواند حذف شود. از صفحه  HTML شماره  Row index  به این متد برای حذف شدن از آرایه ارسال می شود.

کد کامل شده  ShoppingController.js  به صورت زیر خواهد بود.

/// <reference path="../angular.js" />  
/// <reference path="../angular.min.js" />   
/// <reference path="../angular-animate.js" />   
/// <reference path="../angular-animate.min.js" />   
/// <reference path="Modules.js" />   
/// <reference path="Services.js" />   

app.controller("AngularJs_ShoppingFController", function ($scope, $http, $timeout, $rootScope, $window, AngularJs_WCFService) {
    $scope.date = new Date();
    //  To set and get the Item Details values
    var firstbool = true;
    $scope.Imagename = "";
    $scope.Item_ID = "";
    $scope.Item_Name = "";
    $scope.Description = "";
    $scope.Item_Price = "0";
    $scope.txtAddedBy = "";

    // Item List Arrays.This arrays will be used to Add and Remove Items to the Cart.
    $scope.items = [];
    //to display the Table for Shopping cart Page.
    $scope.showItem = false;
    $scope.showDetails = false;
    $scope.showCartDetails = false;

    //This variable will be used to Increment the item Quantity by every click.
    var ItemCountExist = 0;
    //This variable will be used to calculate and display the Cat Total Price,Total Qty and GrandTotal result in Cart
    $scope.totalPrice = 0;
    $scope.totalQty = 0;
    $scope.GrandtotalPrice = 0;
  
    // This is publich method which will be called initially and load all the item Details.
    GetItemDetails();
    //To Get All Records   
    function GetItemDetails() {

        $scope.showItem = false;
        $scope.showDetails = true;
        $scope.showCartDetails = false;

        var promiseGet = AngularJs_WCFService.GetItemDetails();
        promiseGet.then(function (pl) {
            $scope.getItemDetailsDisp = pl.data
        },
             function (errorPl) {
             });
    }

   
    //This method used to get all the details when user clicks on Image Inside the Grid and display the details to add items to the Cart
    $scope.showImage = function (imageNm, ItemID, ItemName, ItemPrize, ItemDescription) {
      
        $scope.Imagename = imageNm;
        $scope.Item_ID = ItemID;
        $scope.Item_Name = ItemName;
        $scope.Description = ItemDescription;
        $scope.Item_Price = ItemPrize;
        $scope.showItem = true;
        $scope.showDetails = true;
        $scope.showCartDetails = false;

        ItemCountExist = 0;
    }

    //This method will hide the detail table Row and display the Cart Items
   
    $scope.showMyCart = function () {
        if ($scope.items.length > 0)
        {
            alert("You have added " +$scope.items.length + " Items in Your Cart !");
            $scope.showItem = false;
            $scope.showDetails = false;
            $scope.showCartDetails = true; 
        }
        else {
            alert("محصولی در سبد خرید شما موجود نمی باشد. بری مشاهده سبد خرید ، محصولی را اضافه کنید. ")
        }
    }
    //This method will hide the detail table Row and display the Cart Items
    $scope.showCart = function () {     
        //alert(shoppingCartList.length);
        $scope.showItem = true;
        $scope.showDetails = false;
        $scope.showCartDetails = true;
        addItemstoCart();      
    }
  
   // This method is to calculate the TotalPrice,TotalQty and Grand Total price
    function getItemTotalresult() {
        $scope.totalPrice = 0;
        $scope.totalQty = 0;
        $scope.GrandtotalPrice = 0;

        for (count = 0; count < $scope.items.length; count++) {
         
            $scope.totalPrice += parseInt($scope.items[count].Item_Prices );
            $scope.totalQty += ($scope.items[count].ItemCounts);
           

            $scope.GrandtotalPrice += ($scope.items[count].Item_Prices * $scope.items[count].ItemCounts);
        }
       
      
    }
    
   //This method will add the Items to the cart and if the Item already exist then the Qty will be incremnet by 1.
    function addItemstoCart() {
       
        if ($scope.items.length > 0)
            {
            for (count = 0; count < $scope.items.length; count++) {
              
                if ($scope.items[count].Item_Names == $scope.Item_Name) {

                    ItemCountExist = $scope.items[count].ItemCounts + 1;
                    $scope.items[count].ItemCounts = ItemCountExist;
                } 
            }        }
        if (ItemCountExist <= 0)
        {
            ItemCountExist = 1;
            var ItmDetails = {
                Item_IDs: $scope.Item_ID,
                Item_Names: $scope.Item_Name,
                Descriptions: $scope.Description,
                Item_Prices: $scope.Item_Price,
                Image_Names: $scope.Imagename,
                ItemCounts: ItemCountExist
            };
            $scope.items.push(ItmDetails);
            $scope.item = {};

        }
        getItemTotalresult();

      
    }

    //This method is to remove the Item from the cart.Each Item inside the Cart can be removed.
    $scope.removeFromCart = function (index) {
        $scope.items.splice(index, 1);
    }

    //This Method is to hide the Chopping cart details and Show the Item Details to add more items to the cart.
    $scope.showItemDetails = function () {      
        $scope.showItem = false;
        $scope.showDetails = true;
        $scope.showCartDetails = false;

    }

}); 

Controller.js : در اینجا منابع را برای  Angular.js JavaScript ، Module.js و  Service.js اضافه میکنیم. همانند سرویس ها برای کنترلر نیز نامی را قرار دادیم،  AngularJs_WCFController

  در کنترلر همه منطق های کاری و بازگرداندن داده از داده های  WCF JSON به صفحه  MVC HTML را اجرا میکنیم.

Variable declarations :  ابتدا متغیرهای محلی که استفاده می شوند را اعلان میکنیم . و برای تاریخ جاری و ذخیره تاریخ از  $scope.date استفاده میکنیم.

   GetItemDetails() : Methods      

این متد همه جزئیات آیتم ها را از  JSON دریافت کرده و نتیجه را به صفحه فروش اتصال می دهد.

$scope.CheckFileValid

این متد فایل تصویر پیوست شده را چک میکند که معتبر است یا نه . اگر فایل تصویر نامعتبر باشد آنگاه پیغام خطایی چاپ می شود.

$Scope.SaveFile=function()

در این متد فایل تصویر به متد  UploadFile فرستاده می شود و هنگامی که تصویر با موفقیت در روت پروژه بارگذاری شد ، جزئیات آیتم ها درون دیتابیس وارد می شود.

Fac.UploadFile=function(file)

در این متد با استفاده از  $http.post فایل تصویر خود را به کنترلر MVC و متد  HTTPpost  خود می فرستیم.

$http.post("/shanuShopping/UploadFile", formData,
            {
                withCredentials: true,
                headers: { 'Content-Type': undefined },
                transformRequest: angular.identity
            })

در $http.post("")  نام کنترلر MVC و متد  HTTPpost  خود را قرار می دهیم. در زیر کد مورد نظر برای آپلود تصویر در کنترلر  MVC را آورده ایم.

     [HttpPost]
        public JsonResult UploadFile()
        {
            string Message, fileName;
            Message = fileName = string.Empty;
            bool flag = false;
            if (Request.Files != null)
            {
                var file = Request.Files[0];
                fileName = file.FileName;
                try
                {
                    file.SaveAs(Path.Combine(Server.MapPath("~/Images"), fileName));
                    Message = "فایل آپلود شد.";
                    flag = true;
                }
                catch (Exception)
                {
                    Message = "آپلود فایل ناموفق ! دوباره تلاش کنید.";
                }

            }
            return new JsonResult { Data = new { Message = Message, Status = flag } };
        }

MVC Controller WEB Method  

کد کامل شده  Controller.js  به صورت زیر خواهد بود.

/// <reference path="../angular.js" />  
/// <reference path="../angular.min.js" />   
/// <reference path="../angular-animate.js" />   
/// <reference path="../angular-animate.min.js" />   
/// <reference path="Modules.js" />   
/// <reference path="Services.js" />   

app.controller("AngularJs_WCFController", function ($scope, $timeout, $rootScope, $window, AngularJs_WCFService, FileUploadService) {
    $scope.date = new Date();
 //  To set and get the Item Details values
    var firstbool = true;  
    $scope.Imagename = "";
    $scope.Item_ID = "0";
    $scope.Item_Name = "";
    $scope.Description = "";
    $scope.Item_Price = "0";
    $scope.txtAddedBy = "";

   


    // This is publich method which will be called initially and load all the item Details. 
    GetItemDetails();
    //To Get All Records   
    function GetItemDetails() {


        var promiseGet = AngularJs_WCFService.GetItemDetails();
        promiseGet.then(function (pl) {
            $scope.getItemDetailsDisp = pl.data
        },
             function (errorPl) {
             });
    }

    //Declarationa and Function for Image Upload and Save Data
    //--------------------------------------------
    // Variables
    $scope.Message = "";
    $scope.FileInvalidMessage = "";
    $scope.SelectedFileForUpload = null;
        $scope.FileDescription_TR = "";
    $scope.IsFormSubmitted = false;
    $scope.IsFileValid = false;
    $scope.IsFormValid = false;

    //Form Validation
    $scope.$watch("f1.$valid", function (isValid) {
        $scope.IsFormValid = isValid;
    });


    // THIS IS REQUIRED AS File Control is not supported 2 way binding features of Angular
    // ------------------------------------------------------------------------------------
    //File Validation
    $scope.ChechFileValid = function (file) {
        var isValid = false;
        if ($scope.SelectedFileForUpload != null) {
            if ((file.type == 'image/png' || file.type == 'image/jpeg' || file.type == 'image/gif') && file.size <= (800 * 800)) {
                $scope.FileInvalidMessage = "";
                isValid = true;
            }
            else {
                $scope.FileInvalidMessage = "فقط تصاویر JPEG/PNG/Gif می توانند بارگذاری شوند.  )";
            }
        }
        else {
            $scope.FileInvalidMessage = "وارد کردن تصویر اجباری است";
        }
        $scope.IsFileValid = isValid;
    };

    //File Select event 
    $scope.selectFileforUpload = function (file) {

        var files = file[0];
        $scope.Imagename = files.name;
        alert($scope.Imagename);
        $scope.SelectedFileForUpload = file[0];
       
    }
    //----------------------------------------------------------------------------------------
  
    //Save File
    $scope.SaveFile = function () {
        $scope.IsFormSubmitted = true;
     
        $scope.Message = "";
        $scope.ChechFileValid($scope.SelectedFileForUpload);
        if ($scope.IsFormValid && $scope.IsFileValid) {
            FileUploadService.UploadFile($scope.SelectedFileForUpload).then(function (d) {             

                var ItmDetails = {
                    Item_ID:$scope.Item_ID,
                    Item_Name: $scope.Item_Name,
                    Description: $scope.Description,
                    Item_Price: $scope.Item_Price,
                    Image_Name: $scope.Imagename,
                    AddedBy: $scope.txtAddedBy
                };
             
                var promisePost = AngularJs_WCFService.post(ItmDetails);
                promisePost.then(function (pl) {
                    alert(p1.data.Item_Name);
                    GetItemDetails();
                }, function (err) {
                   // alert("Data Insert Error " + err.Message);
                });
                alert(d.Message + " محصول ذخیره شد!");
                $scope.IsFormSubmitted = false;
                ClearForm();
               
            }, function (e) {
                alert(e);
            });
        }
        else {
            $scope.Message = "وارد کردن همه فیلدها اجباری است";
        }

    };
    //Clear form 
    function ClearForm() {
        $scope.Imagename = "";
        $scope.Item_ID = "0";
        $scope.Item_Name = "";
        $scope.Description = "";
        $scope.Item_Price = "0";
        $scope.txtAddedBy = "";

        angular.forEach(angular.element("input[type='file']"), function (inputElem) {
            angular.element(inputElem).val(null);
        });

        $scope.f1.$setPristine();
        $scope.IsFormSubmitted = false;
    }

})
.factory('FileUploadService', function ($http, $q) {

    var fac = {};
    fac.UploadFile = function (file) {
        var formData = new FormData();
        formData.append("file", file);
     
        var defer = $q.defer();
        $http.post("/shanuShopping/UploadFile", formData,
            {
                withCredentials: true,
                headers: { 'Content-Type': undefined },
                transformRequest: angular.identity
            })
        .success(function (d) {
            defer.resolve(d);
        })
        .error(function () {
            defer.reject("آپلود فایل با شکست مواجه شد!");
        });

        return defer.promise;

    }
    return fac;

    //---------------------------------------------
    //End of Image Upload and Insert record

   

});

ایجاد  Controller و  Viewدر  MVC

حالا به سراغ  MVCرفته و برای نمایش نتیجه Controller  و View  را برای آن ایجاد میکنیم. برای اضافه کردن کنترلر آن را به صورت  Empty  ایجاد میکنیم.

بر روی index   موجود در کنترلر راست کلیک کرده و  View  را اضافه میکنیم.

دو ActionResult  در  کنترلر داریم یکی  index  و دیگری  ItemMaster . یک  View  برای index  ایجاد میکنیم که نمایش جزئیات سبد خرید را به عهده دارد و یک View  نیز برای  ItemMaster  ایجاد میکنیم که برای برای نمایش جزئیات محصولات استفاده می شود.

public class shanuShoppingController : Controller
    {
        // GET: shanuShopping
        public ActionResult Index()
        {
            return View();
        }
        
        public ActionResult ItemMaster()
        {
            return View();
        }


        [HttpPost]
        public JsonResult UploadFile()
        {
            string Message, fileName;
            Message = fileName = string.Empty;
            bool flag = false;
            if (Request.Files != null)
            {
                var file = Request.Files[0];
                fileName = file.FileName;
                try
                {
                    file.SaveAs(Path.Combine(Server.MapPath("~/Images"), fileName));
                    Message = "فایل آپلود شد.";
                    flag = true;
                }
                catch (Exception)
                {
                    Message = "آپلود فایل ناموفق ! دوباره تلاش کنید.";
                }

            }
            return new JsonResult { Data = new { Message = Message, Status = flag } };
        }
    }

برنامه خود را اجرا کنید.  در بخش فروشگاه به صورت پیش فرض تمام محصولات با جزئیات نمایش داده می شوند. کاربر می تواند محصول مورد نظر خود را با استفاده از فیلتر هایی که در بالای جدول قرار داده شده است پیدا کند . و با کلیک بر روی نام ستونها جدول را بر اساس نیاز خود مرتب کند.

با کلیک بر روی هر محصول ، جزئیات آن در بالای صفحه نمایش داده می شود .

و با کلیک بر روی اضافه کردن به سبد خرید می توانید آن را در سبد خرید خود مشاهده کنید.

برای اولین بار که برای یک کالا  برروی اضافه کردن به سبد خرید کلیک می شود تعداد آن 1 است و اگر کالا در سبد خرید موجود باشد با هر بار کلیک برروی آن تعداد نیز یک به یک بالا می رود.

در قسمت مدیریت محصولات نیز به صورت پیش فرض لیستی از محصولات نمایش داده می شود. و فیلتر ها و مرتب سازی نیز به همان صورت عمل میکند. و کاربر می تواند رکوردهای جدیدی را اضافه کند.  

تصویر مناسب را جستجو کرده و فایل را آپلود کنید. و آیتم را ذخیره کنید.

می توانید این پروژه را بسته به نیاز های خود گسترش دهید.

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید