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

news2024/12/23 10:49:33

经过一段时间的准备,新的一期【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开发实战之商城系统第二部分内容,后续将继续介绍其他模块,敬请期待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/785946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一百三十五、Azkaban——AzkabanWebServer服务开启后秒退

一、问题 Azkaban的AzkabanWebServer服务开启后秒退&#xff0c;造成Azkaban的页面登录不上 AzkabanWebServer服务开启后&#xff0c;第一个jps里面有AzkabanWebServer&#xff0c;随后第二个jps里面没有AzkabanWebServer 二、问题原因 MySQL中azkaban数据库的表executors的…

PDF转换成word乱码了怎么办?最实用的方法在这里!

在日常办公中&#xff0c;我们常常需要将PDF文件转换成Word文件&#xff0c;以便于编辑和修改。然而有时候在PDF转Word的过程中可能会遇到乱码的问题&#xff0c;让人感到困扰。在面对这种情况时&#xff0c;我们需要选择正确的方法&#xff0c;避免文件转换后出现乱码。下面我…

面积阵列封装技术-BGA CSP/Flip Chip

面积阵列封装有不同的类型&#xff0c;因此也就有着不 同的结构特点和组装方式。面积阵列封装以其结构 形 式 可 分 为 两 大 类 :BGA/CSP 和 倒 装 芯 片&#xff08;Flip Chip&#xff09;。 1 BGA技术 BGA 形式封装是 1980 年由富士通公司提出&#xff0c; 在日本 IBM 公司…

Excel处理数据的常用函数整理

1.常用函数 2.常见数学和三角函数 excel求逆矩阵的例子&#xff1a; 3.统计函数

图像滤波器

图像噪声 • 图像噪声是图像在获取或是传输过程中受到随机信号干扰&#xff0c;妨碍人们对图像理解及分析处理 的信号。 • 图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量&#xff0c;图像在传输过程中产 生图像噪声的主要因素是所用的传输信道受到了噪声…

mysql用is null查不生效的一种情况

今天发现了一个诡异的情况&#xff1a; 首先是在记录中可以明显看到 update_time有null记录。 但用一下sql查询&#xff1a; SELECT count(*) FROM risknoting WHERE noting_state未标注 and update_time is NULL得到结果却是0条。 但应该无论如何都要大于等于1条。 因此&am…

互联网医院系统|互联网医院软件开发|互联网医院搭建方案

随着互联网技术的发展&#xff0c;互联网医院系统逐渐成为医疗服务的新模式&#xff0c;为患者和医生提供了更加方便和高效的医疗体验。下面将介绍互联网医院系统的功能优势。   在线挂号和预约&#xff1a;互联网医院系统可以提供在线挂号和预约功能&#xff0c;患者可以通过…

Mysql关于进程中的死锁和解除锁

Mysql 经常会遇到语句或者存储过程长时间没有反应&#xff0c;大概率就是挂掉了&#xff0c;或者死锁了。 可通过如下几种方式来查看当前进程状态 1. 查询数据库所有的进程状态 SHOW PROCESSLIST SELECT * FROM information_schema.PROCESSLIST; 2. 查询在锁的事务 SELECT…

Unity TMP (TextMeshPro) 创建字体材质

1 TMP 简介 完整名称&#xff1a;Text Mesh Pro &#xff0c;unity新一代主流字体插件 1.1 组件变化 内置的Text组件以及与内置Text组件绑定的Button、DropDown、InputField均被替换为使用TextMeshPro的版本 内置的Text组件以及与内置Text组件绑定的Button、DropDown、Input…

Python基于PyTorch实现循环神经网络分类模型(LSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 LSTM网络是目前更加通用的循环神经网络结构&#xff0c;全称为Long Short-Term Memory&#xff0c;翻…

事业单位-语言理解1】逻辑填空-词的辨析04

事业单位-语言理解1】逻辑填空04 一、词的辨析1.1词义侧重瞻前顾后 三、程度轻重四、感情色彩五&#xff0c;今日词义搭配 一、词的辨析 2022年联考常见词汇 1.1词义侧重 推脱&#xff0c;推托&#xff0c;可以把拆开&#xff0c;单单看脱和托的区别。 注意前后的主语和宾…

性能测试请求重试实现思路

文章目录 一、背景二、尝试的解决方案三、解决方案1&#xff1a;jmeter retrier插件&#xff01;有点用但是不是特别有用-_-||四&#xff0c;最终解决方案&#xff1a;lucust! 一、背景 最近系统需要压测一些活动&#xff0c;场景是新建抽奖活动之后&#xff0c;每隔2s查询1次…

Java 稀疏数组

实际需求&#xff08;应用场景&#xff09; 稀疏数组基本介绍 上面表格的第一行中的6、7、8 表示左边的二维数组一共有 6 行 7 列&#xff0c;在数组中有 8 个不同的值&#xff0c;分别是22、15、 11、17、 -6、 39、 91、 28. 表格的其他行表示每个值所在的行列信息&#xff0…

斯坦福开源FlashAttention,大模型速度翻倍

一年时间&#xff0c;斯坦福大学提出的新型 Attention 算法 ——FlashAttention 完成了进化。这次在算法、并行化和工作分区等方面都有了显著改进&#xff0c;对大模型的适用性也更强了。 近来&#xff0c;几种长上下文语言模型陆续问世&#xff0c;包括 GPT-4&#xff08;上下…

【C#性能】C# 语言中的数组迭代

一、说明 可迭代性&#xff0c;是数组等操作的根本&#xff1b;在C程序开发过程中&#xff0c;可迭代操作是非常普遍、非常广泛的&#xff0c;然而&#xff0c;对这种操作知道多少&#xff0c;又不知道多少&#xff0c;都将影响开发灵活性、开发的进度。因此&#xff0c;本文干…

vs2013 编译wxwidgets界面库

首先进入官网下载&#xff0c;本人再git上下载的基本都编译失败 https://www.wxwidgets.org/ 在网站里面找最新的就可以&#xff0c;下载之后放在一个目录&#xff0c;找到vs的目录 然后找到wx_vc12.sln&#xff0c;打开编译即可 Debug、Release编译出来的是静态库 DLL Deb…

P1149火柴棒等式题解

P1149[NOIP2008 提高组] 火柴棒等式 题目描述 给你 n n n 根火柴棍&#xff0c;你可以拼出多少个形如 A B C ABC ABC 的等式&#xff1f;等式中的 A A A、 B B B、 C C C 是用火柴棍拼出的整数&#xff08;若该数非零&#xff0c;则最高位不能是 0 0 0&#xff09;。用…

华南理工大学电信学院信号与系统实验1~4(杨俊美老师)

博客中仅放了题目&#xff0c;源码在下方链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1TpRAiNltybYWimETKHFKWA?pwd88ux 提取码&#xff1a;88ux --来自百度网盘超级会员V4的分享 有可能实验的序号可能编错码或者放错文件夹&#xff08;因为老师给的时候很多…

题目4 命令执行(保姆级教程)

url&#xff1a;http://192.168.154.253:84/ #打开http://XXX:81/&#xff0c;XXX为靶机的ip地址 审题 1、打开题目看到有一个提示&#xff0c;此题目需要通过利用命令执行漏洞执行Linux命令获取webshell&#xff0c;最后从根目录下key.php文件中获得flag 2、开始答题 第一步&…

【Kafka】消息队列Kafka基础

目录 消息队列简介消息队列的应用场景异步处理系统解耦流量削峰日志处理 消息队列的两种模式点对点模式发布订阅模式 Kafka简介及应用场景Kafka比较其他MQ的优势Kafka目录结构搭建Kafka集群编写Kafka一键启动/关闭脚本 Kafka基础操作创建topic生产消息到Kafka从Kafka消费消息使…