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

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

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

 

购物车功能说明

 

在首页或者商品列表页面,如果用户对商品感兴趣,可以点击快捷方式,将商品加入购物车;或者在商品详情页面,选择对应的商品参数后,将商品加入购物车。商品加入购物车的渠道是有多种,而用户也可以对已经加入购物车的商品进行购买,或者删除购物车。每一个用户都有各自的购物车,相互之间独立,所以购物车功能需要用户先进行登录,才能查看。

 

购物车功能设计

 

根据购物车功能说明,购物车主要显示已添加的商品列表,并可以删除,或者选择商品进行购买,设计页面如下所示:

 

购物车功能开发

 

 

购物车主要展示用户选择的商品信息。

 

1. 数据表创建

 

购物车表EB_Cart主要用于存储商品信息,用户信息,数量,及个人喜好等内容,如下所示:

购物车表创建语句如下所示:

CREATETABLE[dbo].[EB_Cart]([Id][bigint] IDENTITY(1,1)NOTNULL,[ProductId][bigint]NULL,[CustomerId][bigint]NULL,[Quantity][int]NULL,[Remark][varchar](200)NULL,[CreateTime][datetime]NULL,[CreateUser][varchar](50)NULL,[LastEditTime][datetime]NULL,[LastEditUser][varchar](50)NULL)ON[PRIMARY]

 

2. 购物车实体创建

 

购物车实体和数据表结构保持一致,方便进行映射。如下所示:

usingSqlSugar;
namespaceEasyBuyShop.Models{
/// <summary>/// 购物车/// </summary>    [SugarTable("EB_Cart")]
publicclassCart:EntityModel    {
publiclongProductId { get; set; }
publiclongCustomerId { get; set; }
/// <summary>/// 数量/// </summary>publicintQuantity { get; set; }
publicstringRemark { get; set; }
    }
}

 

3. 数据处理层DAL

 

购物车列表,主要包括添加购物车,删除,查询等功能,DAL层代码如下所示:

usingEasyBuyShop.Models;
usingEasyBuyShop.Utils;
namespaceEasyBuyShop.DAL{
publicclassCartDal:BaseDal    {
/// <summary>/// 获取购物车列表/// </summary>/// <param name="userId"></param>/// <returns></returns>publicList<Cart>GetCartListByUserId(longuserId)
        {
try            {
using (vardb=this.GetDb(BaseDal.ConnStr))
                {
returndb.Queryable<Cart>().Where(r=>r.CustomerId==userId).ToList();
                }
            }
catch (Exceptionex)
            {
LogHelper.Fatal(ex.Message);
returnnewList<Cart>();
            }
        }
publicintDeleteById(longid)
        {
try            {
using (vardb=this.GetDb(BaseDal.ConnStr))
                {
intcnt=db.Deleteable<Cart>(r=>r.Id==id).ExecuteCommand();
returncnt;
                }
            }
catch (Exceptionex)
            {
LogHelper.Fatal(ex.Message);
return-1;
            }
        }
publicCartGetCart(longid)
        {
try            {
using (vardb=this.GetDb(BaseDal.ConnStr))
                {
returndb.Queryable<Cart>().First(r=>r.Id==id);
                }
            }
catch (Exceptionex)
            {
LogHelper.Fatal(ex.Message);
returnnull;
            }
        }
    }
}

 

4. 控制器获取

 

控制器方法主要包括添加购物车【1.首页或商品列表快捷添加购物车 2.商品详情页面添加购物车】,查询购物车, 删除购物车,代码如下所示:

usingEasyBuyShop.DAL;
usingEasyBuyShop.Models;
usingMicrosoft.AspNetCore.Mvc;
namespaceEasyBuyShop.Controllers{
/// <summary>/// 购物车控制器/// </summary>publicclassCartController : Controller    {
/// <summary>/// 购物车列表页面/// </summary>/// <returns></returns>publicIActionResultIndex()
        {
varuserId=HttpContext.Session.GetInt32("userid");
if (userId==null)
            {
returnRedirect("/Auth/login");
            }
varcartDal=newCartDal();
varproductDal=newProductDal();
varcartList=cartDal.GetCartListByUserId((long)userId);
varproducts=productDal.GetProductListByIds(cartList.Select(r=>r.ProductId).ToList());
ViewData["CartList"] =cartList;
ViewData["ProductList"]=products;
varusername=HttpContext.Session.GetString("username");
varrealName=HttpContext.Session.GetString("realname");
ViewData["Username"] =username;
ViewData["RealName"] =realName;
returnView();
        }
/// <summary>/// 首页或商品列表,快捷加入购物车/// </summary>/// <param name="productId"></param>/// <returns></returns>        [HttpPost]
publicIActionResultAdd(intproductId)
        {
Msgmsg=newMsg();
varuserId=HttpContext.Session.GetInt32("userid");
varuserName=HttpContext.Session.GetString("username");
if (userId==null)
            {
msg.code=-1;
msg.message="尚未登录";
returnJson(msg);
            }
varproductDal=newProductDal();
varproduct=productDal.GetProduct(productId);
if (product!=null)
            {
varcartDal=newCartDal();
varcart=newCart();
cart.ProductId=productId;
cart.CustomerId=userId.Value;
cart.Quantity=1;
cart.Remark=string.Empty;
cart.CreateUser=userName;
cart.CreateTime=DateTime.Now;
cart.LastEditUser=userName;
cart.LastEditTime=DateTime.Now;
intid=cartDal.InsertT<Cart>(cart);
if(id>0)
                {
msg.code=0;
msg.message="成功";
returnJson(msg);
                }
else                {
msg.code=-1;
msg.message="加入购物车失败";
returnJson(msg);
                }
            }
else            {
msg.code=-1;
msg.message="商品不存在";
returnJson(msg);
            }
        }
/// <summary>/// 商品详情页面加入购物车/// </summary>/// <returns></returns>        [HttpPost]
publicIActionResultAddWithForm()
        {
Msgmsg=newMsg();
varuserId=HttpContext.Session.GetInt32("userid");
varuserName=HttpContext.Session.GetString("username");
if (userId==null)
            {
msg.code=-1;
msg.message="尚未登录";
returnJson(msg);
            }
varproductId=long.Parse( Request.Form["productId"]);
varquantity=int.Parse(Request.Form["quantity"]);
varcolor=Request.Form["color"];
varsize=Request.Form["size"];
varremark=$"颜色:{color},大小:{size}";
varproductDal=newProductDal();
varproduct=productDal.GetProduct(productId);
if (product!=null)
            {
varcartDal=newCartDal();
varcart=newCart();
cart.ProductId=productId;
cart.CustomerId=userId.Value;
cart.Quantity=quantity;
cart.Remark=remark;
cart.CreateUser=userName;
cart.CreateTime=DateTime.Now;
cart.LastEditUser=userName;
cart.LastEditTime=DateTime.Now;
intid=cartDal.InsertT<Cart>(cart);
if (id>0)
                {
msg.code=0;
msg.message="成功";
                }
else                {
msg.code=-1;
msg.message="加入购物车失败";
                }
            }
else            {
msg.code=-1;
msg.message="商品不存在";
            }
returnRedirect("/Cart/Index");
        }
/// <summary>/// 移除购物车/// </summary>/// <param name="Id"></param>/// <returns></returns>publicActionResultDelete(intId)
        {
varcartDal=newCartDal();
if(cartDal.DeleteById(Id) >0)
            {
//成功            }
else            {
//删除失败            }
returnView();
        }
    }
}

 

5. 视图层展示

 

在Views/Cart/Index.cshtml购物车视图中,接收控制器传递的参数。如下所示:

@{
    var totalPrice = 0.0M;
}
<divclass="content-wrap"><divclass="content"><!-- shopping-cart-area start --><divclass="cart-area ptb-100"><formaction="/Purchase/BuyWithCart"method="post"><divclass="container"><divclass="row"><divclass="col-lg-12 col-md-12 col-sm-12 col-xs-12"><divclass="table-content table-responsive"><table><thead><tr><thclass="product-check">选择</th><thclass="product-price">图片</th><thclass="product-name">产品名称</th><thclass="product-price">价格</th><thclass="product-price">优惠价格</th><thclass="product-quantity">数量</th><thclass="product-subtotal">总计</th><thclass="product-name">删除</th></tr></thead><tbody>                                        @{
                                            var cartList = ViewData["CartList"] as List<Cart>;
                                            var productList = ViewData["ProductList"] as List<Product>;
                                            if (cartList.Count > 0)
                                            {
                                                foreach (var cart in cartList)
                                                {
                                                    var product = productList.FirstOrDefault(r => r.Id == cart.ProductId);
                                                    totalPrice = totalPrice + (product.PreferentialPrice * cart.Quantity);
<tr><tdclass="product-check"><inputtype="checkbox"value="@(cart.Id)"name="chkCart"style="width:25px;height:25px;"checked="checked"onchange="javascript:checkCartProduct(this);"/></td><tdclass="product-thumbnail"><ahref="/Product/Detail/@(product.Id)"><imgsrc="@(product.ImageUrl)"alt=""width="100"height="100"></a></td><tdclass="product-name"><ahref="/Product/Detail/@(product.Id)">@product.Name</a><br/><spanstyle="font-size:12px; color:lightgray">备注:@(string.IsNullOrEmpty(cart.Remark) ? "无" : cart.Remark)</span></td><tdclass="product-price"><spanclass="amount">@(Math.Round(product.Price, 2))</span></td><tdclass="product-price"><spanclass="amount">@(Math.Round(product.PreferentialPrice, 2))</span></td><tdclass="product-quantity"><inputvalue="@(cart.Quantity)"type="number"></td><tdclass="product-subtotal">@(Math.Round(product.PreferentialPrice * cart.Quantity, 2))</td><tdclass="product-remove"><ahref="/Cart/Delete/@(cart.Id)"><iclass="fa fa-times"><fontstyle="font-size:14px;">删除</font></i></a></td></tr>                                                }
                                            }
                                            else
                                            {
<tr><tdcolspan="7">购物车暂无商品</td></tr>                                            }
                                        }
</tbody></table></div></div></div><divclass="row tax-coupon-div"><divclass="col-md-7 col-sm-12 col-xs-12"></div><divclass="col-md-5 col-sm-12 col-xs-12"><divclass="cart-total"><ul><liclass="cart-black">总计<span>@totalPrice</span></li></ul><divclass="cart-total-btn"><divclass="cart-total-btn1 f-left"></div><divclass="cart-total-btn2 f-right"><inputtype="submit"value="购买"class="go-btn"onclick="javascript:return checkSubmit();"style="background-color: rgb(255, 80, 0);border-width:0px;margin-top:5px;"/></div></div></div></div></div></div></form></div><!-- shopping-cart-area end --></div><!-- content end --></div><!-- content-wrap end --><scriptsrc="~/js/shop.js"></script>

 

购物车页面展示

 

运行程序,点击登录,在登录成功后,在右上角个人名称,点击下拉菜单,选择购物车,然后打开购物车页面,如下所示:

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


相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
23天前
|
关系型数据库 C# 数据库
.NET 8.0 开源在线考试系统(支持移动端)
【10月更文挑战第27天】以下是适用于 .NET 8.0 的开源在线考试系统(支持移动端)的简介: 1. **基于 .NET Core**:跨平台,支持多种数据库,前后端分离,适用于多操作系统。 2. **结合 Blazor**:使用 C# 开发 Web 应用,支持响应式设计,优化移动端体验。 3. **基于 .NET MAUI**:跨平台移动应用开发,一套代码多平台运行,提高开发效率。 开发时需关注界面设计、安全性与稳定性。
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
93 3
|
30天前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
2月前
|
JSON 安全 数据安全/隐私保护
从0到1搭建权限管理系统系列三 .net8 JWT创建Token并使用
【9月更文挑战第22天】在.NET 8中,从零开始搭建权限管理系统并使用JWT(JSON Web Tokens)创建Token是关键步骤。JWT是一种开放标准(RFC 7519),用于安全传输信息,由头部、载荷和签名三部分组成。首先需安装`Microsoft.AspNetCore.Authentication.JwtBearer`包,并在`Program.cs`中配置JWT服务。接着,创建一个静态方法`GenerateToken`生成包含用户名和角色的Token。最后,在控制器中使用`[Authorize]`属性验证和解析Token,从而实现身份验证和授权功能。
131 3
|
1月前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
Java C# 开发工具
.Net码农学Android---系统架构和基本概念
原文:.Net码农学Android---系统架构和基本概念 至此,你应该已经完成以下前期准备事情: 1.安装完JDK 2.安装完SDK(并在Manager中进行相关版本的更新) 3.相关IDE(如eclipse) 4.安装完ADT 5.安装完AVD(如果你是真机模拟的话也可以不安装) 前期环境搭建基本完成,并按照网上的教程可以运行出HelloWorld,确保可以流程走的通。
983 0
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
41 7

相关实验场景

更多