[回饋]ASP.NET Core MVC開發實戰之商城系統(三)

經過一段時間的準備,新的一期【ASP.NET Core MVC開發實戰之商城系統】已經開始,在之前的文章中,講解了商城系統的整體功能設計,頁面佈局設計,環境搭建,系統配置,及首頁【商品類型,banner條,友情鏈接,降價促銷,新品爆款】等功能的開發,今天繼續講解商品列表頁面功能開發,僅供學習分享使用,如有不足之處,還請指正。

 

商品列表功能說明

 

一般首頁主要用於呈現給客戶最想看到的商品,如:銷量最高,降價促銷,季度新品等,如果客戶想要的商品在首頁並沒有展示,就需要用戶搜索商品的關鍵詞來查找,或者通過商品類型來縮小範圍,這時候就會需要用到商品列表功能。

商品列表主要用於搜索商品結果的展示,或者某一種商品類型商品的展示,呈現方式有兩種:網格形式或者列表形式,用戶可以在兩種形式之間自由切換。

 

商品列表設計

 

根據功能分析,商品列表主要展示商品信息,有網格形式和列表形式兩種。整體頁面如下所示:

 

商品列表功能開發

 

商品列表主要展示商品信息,關於商品表EB_Product和對應模型Product的創建,可參考前一篇文章。

 

1. 數據處理層DAL

 

首先商品列表主要有兩個來源,1.點擊商品類型跳轉商品列表 2. 關鍵字搜索進入商品列表。所以在檢索時需要滿足兩個條件。DAL【Data Access Layer】層處理如下所示:

using EasyBuyShop.Models;
using EasyBuyShop.Utils;

namespace EasyBuyShop.DAL
{
    public class ProductDal:BaseDal
    {
        public List<Product> GetProductList(int categoryId,int subCategoryId,string productName)
        {
            try
            {
                using (var db = this.GetDb(BaseDal.ConnStr))
                {
                    if(categoryId>0 && subCategoryId > 0)
                    {
                        return db.Queryable<Product>().Where(r=>r.CategoryId==categoryId && r.SubCategoryId==subCategoryId).ToList();
                    }
                    else
                    {
                        return db.Queryable<Product>().Where(r => r.Name.Contains(productName)).ToList();
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Fatal(ex.Message);
                return new List<Product>();
            }
        }
    }
}

 

2. 控制器獲取

 

在控制器ProductController的Index方法中,以接收到的參數爲條件,獲取符合條件的商品列表,傳遞到視圖層,如下所示:

public IActionResult Index(int categoryId,int subCategoryId,string productName)
{
    var username = HttpContext.Session.GetString("username");
    var realName = HttpContext.Session.GetString("realname");
    ViewBag.Username = username;
    ViewBag.RealName = realName;
    ProductDal productDal = new ProductDal();
    var productList= productDal.GetProductList(categoryId, subCategoryId, productName);
    ViewData["ProductList"]= productList;
    return View();
}

同樣在本示例中,以ViewData來傳遞數據。個人建議:對於簡單類型,可採用ViewBag進行傳遞;對於複雜類型,或視圖中需要明確類型的,可採用ViewData進行傳遞。

 

3. 視圖層展示

 

在視圖Views\Product\Index.cshtml頁面中,對控制器方法傳遞的數據進行解析組合展示。如下所示:

@{
    ViewData["Title"] = "商品列表";
}
<div class="shop-page-area ptb-100">
    <div class="container" style="width:100%;padding-left:0px;padding-right:0px;">
        <div class="row">
            <div class="col-md-9">
                <div class="blog-wrapper shop-page-mrg">
                    <div class="tab-menu-product">
                        <div class="tab-menu-sort">
                            <div class="tab-menu">
                                <ul role="tablist">
                                    <li class="active" id="gridTab">
                                        <a href="#grid" data-toggle="tab" onclick="javascript:showGrid();return false;">
                                            <i class="fa fa-th-large"></i>
                                            網格
                                        </a>
                                    </li>
                                    <li id="listTab">
                                        <a href="#list" data-toggle="tab" onclick="javascript:showList();return false;">
                                            <i class="fa fa-align-justify"></i>
                                            列表
                                        </a>
                                    </li>
                                </ul>
                            </div>
                            <div class="tab-sort">
                                <label>排序 : </label>
                                <select>
                                    <option value="">位置</option>
                                    <option value="">流行度</option>
                                    <option value="">價格</option>
                                    <option value="">評分</option>
                                </select>
                            </div>
                        </div>
                        <div class="tab-product">
                            <div class="tab-content">
                                <div class="tab-pane active" id="grid">
                                    <div class="row">
                                        @{
                                            var products = ViewData["ProductList"] as List<Product>;
                                            if(products!=null && products.Count > 0)
                                            {
                                                foreach (var product in products)
                                                {
                                                    <div class="col-md-6 col-lg-4 col-sm-6">
                                                        <div class="single-shop mb-40">
                                                            <div class="shop-img">
                                                                <a href="#"><img src="@product.ImageUrl" alt=""></a>
                                                                <div class="shop-quick-view">
                                                                    <a href="/Product/Detail/@product.Id" data-toggle="modal" data-target="#quick-view" title="預覽">
                                                                        <i class="pe-7s-look"></i>
                                                                    </a>
                                                                </div>
                                                                <div class="button-group">
                                                                    <a href="#" title="添加購物車" onclick="javascript:addCart(@(product.Id));return false;">
                                                                        <i class="pe-7s-cart"></i>
                                                                        添加購物車
                                                                    </a>
                                                                    <a class="wishlist" href="#" title="立即購買" onclick="javascript:buy(@(product.Id));return false;">
                                                                        <i class="pe-7s-like"></i>
                                                                        立即購買
                                                                    </a>
                                                                </div>
                                                            </div>
                                                            <div class="shop-text-all">
                                                                <div class="title-color fix">
                                                                    <div class="shop-title f-left">
                                                                        <h3><a href="/Product/Detail/@product.Id">@product.Name</a></h3>
                                                                    </div>
                                                                    <span class="price f-right">
                                                                        <span class="new">[email protected]</span>
                                                                    </span>
                                                                </div>
                                                                <div class="fix">
                                                                    <span class="f-left">@(product.BasicStyle) | @(product.ProductStyle)</span>
                                                                </div>
                                                            </div>
                                                        </div>
                                                    </div>
                                                }
                                            }
                                            else
                                            {
                                                <div>沒有符合條件的商品</div>
                                            }
                                        }
                                    </div>
                                </div>
                                <div class="tab-pane mb-10" id="list">
                                    <div class="row">
                                        <div class="col-md-12">
                                            <div class="row">
                                                @{
                                                    if (products != null && products.Count > 0)
                                                    {
                                                        foreach (var product in products)
                                                        {
                                                            <div class="single-shop mb-40">
                                                                <div class="col-md-4 col-sm-4 col-xs-12">
                                                                    <div class="shop-list-left">
                                                                        <div class="shop-img">
                                                                            <a href="#"><img src="@product.ImageUrl" alt=""></a>
                                                                            <div class="shop-quick-view">
                                                                                <a href="#" data-toggle="modal" data-target="#quick-view" title="預覽">
                                                                                    <i class="pe-7s-look"></i>
                                                                                </a>
                                                                            </div>
                                                                            <div class="price-up-down">
                                                                                <span class="sale-new"> @(Math.Round(product.Preferential * 100, 0))% </span>
                                                                            </div>
                                                                        </div>
                                                                    </div>
                                                                </div>
                                                                <div class="col-md-8 col-sm-8 col-xs-12">
                                                                    <div class="shop-list-right">
                                                                        <div class="shop-list-all">
                                                                            <div class="shop-list-name">
                                                                                <h3><a href="/Product/Detail/@product.Id">@product.Name</a></h3>
                                                                            </div>
                                                                            <div class="shop-list-rating">
                                                                                <span class="ratting">
                                                                                    <i class="fa fa-star active"></i>
                                                                                    <i class="fa fa-star active"></i>
                                                                                    <i class="fa fa-star active"></i>
                                                                                    <i class="fa fa-star active"></i>
                                                                                    <i class="fa fa-star active"></i>
                                                                                </span>
                                                                            </div>
                                                                            <div class="shop-list-price">
                                                                                <span class="list-price">
                                                                                    <span class="new">[email protected]</span>
                                                                                    <span class="old">[email protected]</span>
                                                                                </span>
                                                                            </div>
                                                                            <div class="shop-list-cart">
                                                                                <div class="shop-group">
                                                                                    <a href="#" title="加入購物車" onclick="javascript:addCart(@(product.Id));return false;">
                                                                                        <i class="pe-7s-cart"></i>
                                                                                        加入購物車
                                                                                    </a>
                                                                                    <a class="wishlist" href="#" title="立即購買" onclick="javascript:buy(@(product.Id));return false;">
                                                                                        <i class="pe-7s-like"></i>
                                                                                        立即購買
                                                                                    </a>
                                                                                </div>
                                                                            </div>
                                                                        </div>
                                                                    </div>
                                                                </div>
                                                            </div>
                                                        }
                                                    }
                                                    else
                                                    {
                                                        <div>沒有符合條件的商品</div>
                                                    }
                                                }
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div class="page-pagination text-center" style="margin-top:10px;">
                                    <ul>
                                        @{
                                            var totalNum =Math.Ceiling(products.Count / 40.0f);
                                            var currentNum = 1;
                                            for(int i = 1; i <= totalNum; i++)
                                            {
                                                <li><a class="@(i == currentNum?"active":string.Empty)" href="#">@i</a></li>
                                            }
                                        }
                                        <li><a href="#"><i class="fa fa-angle-double-right">»</i></a></li>
                                    </ul>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<script src="~/js/plugins.js"></script>
<script src="~/js/shop.js"></script>

 

運行測試

 

運行頁面,點擊商品類型,跳轉到商品列表,效果如下所示:

 

UI設計說明

 

在本示例中,其實後端業務邏輯並不是很複雜,主要是前端UI相對比較麻煩,如佈局,展示,定位等相關內容。如果沒有對應方面的知識儲備,建議先找相資料進行學習。

關於CSS中display屬性以及說明如下所示:

關於CSS中的Position屬性說明如下所示:

以上就是ASP.NET Core MVC開發實戰之商城系統第三部分內容。後續將繼續介紹其他模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章