[回馈]ASP.NET Core MVC开发实战之商城系统(二)

简介: [回馈]ASP.NET Core MVC开发实战之商城系统(二)

经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页商品类型,banner条,友情链接等功能的开发,今天继续讲解首页的降价促销,新品爆款等内容,仅供学习分享使用,如有不足之处,还请指正。

开发工具及技术

在本商城系统实例中,主要用到的开发工具和技术,如下所示:

  • 开发工具,Visual Studio 2022
  • 数据库,SQL Server Management Studio 2012
  • 开发框架,基于.Net 6.0的ASP.NET Core MVC
  • 前端框架,基于项目自带的bootstrap,jQuery等前端库。

页面布局

根据前一篇文章的讲解,在首页除了商品类型,banner条,友情链接外,还有降价促销,新品爆款两个部分,为首页产品展示的核心,具体布局如下所示:

数据表设计

首先设计产品表Product,主要用于存储产品的详细信息,包括产品名称,价格,店铺ID等内容,具体如下所示:

建表语句,如下所示:

CREATE TABLE [dbo].[EB_Product](
  [Id] [bigint] IDENTITY(1,1) NOT NULL,
  [ShopId] [bigint] NULL,
  [Name] [varchar](100) NULL,
  [CategoryId] [bigint] NULL,
  [SubCategoryId] [bigint] NULL,
  [Price] [money] NULL,
  [Preferential] [numeric](18, 4) NULL,
  [PreferentialPrice] [money] NULL,
  [Description] [text] NULL,
  [Brand] [varchar](50) NULL,
  [BasicStyle] [varchar](50) NULL,
  [ProductStyle] [varchar](50) NULL,
  [Year] [varchar](50) NULL,
  [Season] [varchar](50) NULL,
  [Scenario] [varchar](50) NULL,
  [ImageUrl] [varchar](500) NULL,
  [CreateTime] [datetime] NULL,
  [CreateUser] [varchar](50) NULL,
  [LastEditTime] [datetime] NULL,
  [LastEditUser] [varchar](50) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

 

商品实体创建

产品表对应的项目模型实体,和数据表一一对应,如下所示:

using SqlSugar;
namespace EasyBuyShop.Models
{
    [SugarTable("EB_Product")]
    public class Product : EntityModel
    {
        /// <summary>
        /// 店铺ID
        /// </summary>
        public long ShopId { get; set; }
        /// <summary>
        /// 产品名称
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 大类ID
        /// </summary>
        public long CategoryId { get; set; }
        /// <summary>
        /// 小类ID
        /// </summary>
        public long SubCategoryId { get; set; }
        /// <summary>
        /// 价格
        /// </summary>
        public decimal Price { get; set; }
        /// <summary>
        /// 打折后价格
        /// </summary>
        public decimal PreferentialPrice { get; set; }
        /// <summary>
        /// 品牌
        /// </summary>
        public string Brand { get; set; }
        /// <summary>
        /// 折扣
        /// </summary>
        public decimal Preferential { get; set; }
        public string Description { get; set; }
        /// <summary>
        /// 基础风格
        /// </summary>
        public string BasicStyle { get; set; }
        /// <summary>
        /// 产品风格
        /// </summary>
        public string ProductStyle { get; set; }
        /// <summary>
        /// 年份
        /// </summary>
        public string Year { get; set; }
        /// <summary>
        /// 季节
        /// </summary>
        public string Season { get; set; }
        /// <summary>
        /// 主要场景
        /// </summary>
        public string Scenario { get; set; }
        /// <summary>
        /// 主图片Url
        /// </summary>
        public string ImageUrl { get; set; }
    }
}

 

数据处理层DAL

数据处理层用于和数据库进行交互,本次主要用于获取折扣Top3,和新品Top100这两种条件的的商品列表,如下所示:

using EasyBuyShop.Models;
using EasyBuyShop.Utils;
namespace EasyBuyShop.DAL
{
    public class ProductDal:BaseDal
    {
        /// <summary>
        /// 新品前100
        /// </summary>
        /// <returns></returns>
        public List<Product> GetTopNew100()
        {
            try
            {
                using (var db = this.GetDb(BaseDal.ConnStr))
                {
                    return db.Queryable<Product>().OrderByDescending(r => r.Id).Take(100).ToList();
                }
            }
            catch (Exception ex)
            {
                LogHelper.Fatal(ex.Message);
                return new List<Product>();
            }
        }
        /// <summary>
        /// 折扣Top3
        /// </summary>
        /// <returns></returns>
        public List<Product> GetTopDisCount3()
        {
            try
            {
                using (var db = this.GetDb(BaseDal.ConnStr))
                {
                    return db.Queryable<Product>().OrderByDescending(r => r.Preferential).Take(3).ToList();
                }
            }
            catch (Exception ex)
            {
                LogHelper.Fatal(ex.Message);
                return new List<Product>();
            }
        }
    }
}

 

注意:上述功能采用SqlSugar自带的方法实现,会根据Lamada表达式生成对应的SQL语句,可减少手写SQL的繁琐。

控制器获取

因为降价促销和新品爆款,也是首页的一部分,所以需要在首页控制器HomeController中,获取对应商品,传递到视图层,如下所示:

using EasyBuyShop.DAL;
using EasyBuyShop.Models;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
namespace EasyBuyShop.Controllers
{
    public class HomeController : Controller
    {
        private readonly ILogger<HomeController> logger;
        public HomeController(ILogger<HomeController> logger)
        {
            this.logger = logger;
        }
        public IActionResult Index()
        {
            CategoryDal categoryDal = new CategoryDal();
            SubCategoryDal subCategoryDal = new SubCategoryDal();
            ProductDal productDal = new ProductDal();
            var categories = categoryDal.GetCategories();
            var subCategories = subCategoryDal.GetSubCategories();
            var topNew100Product = productDal.GetTopNew100();
            var topDiscount3Product = productDal.GetTopDisCount3();
            ViewData["Categories"] = categories;
            ViewData["SubCategories"] = subCategories;
            ViewData["TopNew100"] = topNew100Product;
            ViewData["TopDiscount3"] = topDiscount3Product;
            var username = HttpContext.Session.GetString("username");
            var realName = HttpContext.Session.GetString("realname");
            ViewBag.Username = username;
            ViewBag.RealName = realName;
            return View();
        }
    }
}

 

注意:控制器方法中,往视图层传递数据采用ViewData和ViewBag实现,也可采用其他方式实现。具体ViewData和ViewBag传递数据之间的差异,可参考之前写的相关文章。

视图层展示

在Views/Home/Index.cshtml视图页面中,降价促销为一行三列,展示降价Top3的商品,具体如下所示:

<!-- banner style 2 start -->
<div class="banner-style-2 pt-100">
  <div class="container" style="margin-left:0px;margin-right:0px;padding-right:0px;padding-left:0px;">
    <div class="row">
      @foreach (var topDiscount in ViewData["TopDiscount3"] as List<Product>)
      {
        <div class="col-md-4">
          <div class="banner-style-2-img mb-res">
            <img src="@topDiscount.ImageUrl" alt="">
            <div class="banner-style-2-dec">
              <h4>@topDiscount.Brand</h4>
              <h3>降价 @(Math.Round( topDiscount.Preferential*100,0))% 销售</h3>
              <a href="" onclick="javascript:buy(@(topDiscount.Id));return false;">购买</a><br>
            </div>
          </div>
          <div class="shop-title f-left">
            <h3><a href="/Product/Detail/@(topDiscount.Id)">@topDiscount.Name</a></h3>
          </div>
        </div>
      }
    </div>
  </div>
</div>
<!-- banner style 2 end -->

 

新品爆款为一行四列,展示新品信息,源码如下所示:

<!-- shop area start -->
<div class="portfolio-area pt-100 pb-70" style="padding-top:100px;padding-bottom:70px;">
  <div class="container">
    <div class="section-title text-center mb-50">
      <h2>新品爆款 <i class="fa fa-shopping-cart"></i></h2>
    </div>
    <div class="row portfolio-style-2">
      <div class="grid" style="position: relative; height: 100%;">
        @foreach (var topNewProduct in ViewData["TopNew100"] as List<Product>)
        {
          <div class="col-md-3 col-sm-6 col-xs-12 mb-30">
            <div class="single-shop">
              <div class="shop-img">
                <a href="/Product/Detail/@(topNewProduct.Id)"><img src="@topNewProduct.ImageUrl" alt=""></a>
                <div class="shop-quick-view">
                  <a href="/Product/Detail/@(topNewProduct.Id)" 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">新品</span>
                </div>
                <div class="button-group">
                  <a href="#" title="添加购物车" onclick="javascript:addCart(@(topNewProduct.Id));return false;">
                    <i class="pe-7s-cart"></i>
                    添加购物车
                  </a>
                  <a class="wishlist" href="#" onclick="javascript:buy(@(topNewProduct.Id));return false;" title="立即购买">
                    <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/@(topNewProduct.Id)">@topNewProduct.Name</a></h3>
                  </div>
                  <span class="price f-right">
                    <span class="new">$@topNewProduct.PreferentialPrice</span>
                  </span>
                </div>
                <div class="fix">
                  <span class="f-left">@(topNewProduct.BasicStyle) | @(topNewProduct.ProductStyle)</span>
                </div>
              </div>
            </div>
          </div>
        }
      </div>
    </div>
  </div>
</div>
<!-- shop area end -->

 

注意:其中视图层代码,采用Razor表达式for循环,展示列表中的内容。关于Razor表达式的使用可参考其他文章。


以上就是ASP.NET Core MVC开发实战之商城系统第二部分内容,后续将继续介绍其他模块,敬请期待。

相关文章
|
6天前
|
开发框架 Oracle 关系型数据库
ASP.NET实验室LIS系统源码 Oracle数据库
LIS是HIS的一个组成部分,通过与HIS的无缝连接可以共享HIS中的信息资源,使检验科能与门诊部、住院部、财务科和临床科室等全院各部门之间协同工作。 
43 4
|
6天前
|
安全 数据管理 中间件
云LIS系统源码JavaScript+B/S架构MVC+SQLSugar医院版检验科云LIS系统源码 可提供演示
检验科云LIS系统源码是医疗机构信息化发展的重要趋势。通过云计算技术实现数据的集中管理和共享可以提高数据利用效率和安全性;通过高效灵活的系统设计和可扩展性可以满足不同医疗机构的需求;通过移动性和智能化可以提高医疗服务的精准度和效率;通过集成性可以实现医疗服务的协同性和效率。因此,多医院版检验科云LIS系统源码将成为未来医疗机构信息化发展的重要方向之一。
27 2
|
6天前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
49 0
|
6天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
23 0
|
6天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
33 0
|
6天前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
123 5
|
6天前
|
SQL 开发框架 .NET
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
ASP.NET WEB+EntityFramework数据持久化——考核练习库——1、用户管理系统(考点:查询列表、增加、删除)
73 0
|
6天前
|
前端开发
.net core mvc获取IP地址和IP所在地(其实是百度的)
.net core mvc获取IP地址和IP所在地(其实是百度的)
128 0
|
9月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
126 0
|
10月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
67 0