黑马程序员_学习日记81_810图书商城项目纪要

一、购物车(购物表)
Cart表(Id UserId BookId Count)
1.新建BuyMaster.Master+Cart.aspx
2.在BookDetail.aspx中添加“购买”按钮
3.Cart.aspx:显示购物信息
3.1添加repeater,其中放买的东西。
3.2(1)在Page_Load中,判断用户是否登录(或者不在这里判断,付款时再判断,这里用cookie读取用户信息)
protected void Page_Load(object sender, EventArgs e)
{
    if (Common.Common.CheckSession())//判断用户是否登录
    {
        AddCart();//将想买的东西放入购物车
        BindRepeater();//绑定购物车(Cart表)中的商品到Repeater控件
    }
    else
    {
        Common.Common.GotoPage();//没登录,返回登录页面
    }
}


   (2)添加AddCart()方法,将东西放入购物车
private void AddCart()
{
    //判断bookId有没有传过来。如果用户直接点击“购物车”导航进入该页面,则没有id
    if (!string.IsNullOrEmpty(Request.QueryString["id"]))
    {
        int id = 0;
        //检验id是否符合规范,因为url地址可能是用户手写的
        if (!int.TryParse(Request.QueryString["id"],out id))
        {
            Response.Redirect("/BookList.aspx");
        }
        BLL.BookManager bll = new BLL.BookManager();
        Model.Book bookModel = bll.GetModel(id);
        if (bookModel != null)//判断这本书是否存在,因为如果用户手动输入url可能输入的id不存在
        {
            BLL.CartManager cartBll = new BLL.CartManager();
            int userId = ((Model.User)Session["UserName"]).Id;//用户已登录,从Session中得到用户Id
            //根据用户Id和书的Id从Cart表中查找对应的数据
            Model.Cart cartModel = cartBll.GetCart(id, userId);
            if (cartModel != null)//当前用户的购物车中已经存在该书,将其数量加1
            {
                cartModel.Count = cartModel.Count + 1;
                cartBll.Update(cartModel);
            }
            else//向购物车中添加一本新书
            {
                Model.Cart modelCart = new Model.Cart();
                modelCart.Count = 1;
                modelCart.User = (Model.User)Session["UserName"];
                modelCart.Book = bookModel;
                cartBll.Add(cartModel);
            }
        }
        else//用户手动修改了url,使id不存在
        {
            Response.Redirect("/BookList.aspx");
        }
    }
}


3.3在CartServices中添加GetCart方法,根据用户编号与书的编号在购物车中查找。
   public Model.Cart GetCart(int bookId,int userId)
3.4绑定购物车中的商品项

4.更新购物车中商品数量,删除商品,计算更新总价,用jQueryUI代替alert显示提示信息
4.1Cart.aspx:
//引用jQueryUI
$(fucntion(){
    $("#dialog-message").dialog({
        autoOpen:false,
    });
});

function changeBar(operation,pkId,bookId){
    var $control = $("#txtCount"+bookId);
    if(operation == '-'){
        var count = $control.val();
        count = parseInt(count) - 1;
        if(count <= 0){
            //alert("数量至少为1");
            $("#errorMessage").dialog("数量至少为1");
            ShowMessage();
            return;
        }
    }
    else if(operation == '+'){
        count = parseInt(count)+1;
        if(count >= 999){
            alert("最多买999本");//其实是要查库存
            return;
        }
    }
    $.post("/ashx/CartProcess.ashx",{"action":"change","count":count,"pkId":pkId,})
        if(data == "yes"){
            $control.val(count);//更新文本框数量
        }
        else if(data == "no"){
            alert("修改失败");
        }
        else{
            alert("出现异常");
        }
    },"text")
    
    //当图书数量文本框失去焦点时,更新文本框中的图书数量
    function changeTextOnBlur(pkId,bookId,control){
        var count = $(control).val();//获得文本框的值
        var reg = /^\d{1,3}$/;
        if(reg.test(count)){
            $.post("/ashx/CartProcess.ashx",{"action":"change","count":count,"pkId":pkId,})
                if(data == "yes"){
                    $control.val(count);//更新文本框数量
                }
                else if(data == "no"){
                    alert("修改失败");
                }
                else{
                    alert("出现异常");
                }
            },"text")
        }
        else{
            alert("请输入数字");
            $(control).val(inputText);//将之前的数字放回去
        }
    }
    
    var inputText;
    //当图书数量文本框获取焦点时,得到文本框的值
    function changeTextOnTocus(control)
    {
        inputText = $(control).val();
    }
    
    function removeProductOnShoppingCart(pkId,control){
        if(confirm("确定删除?")){
            $.post("/ashx/CartProcess.ashx",{"action":"del","id":pkId},function(data){
                if(data == "yes"){
                    $(control).parent().parent().remove();//移除当前tr
                    //更新商品总价
                    GetTotalMoney();
                }
            })
        }
    }
    
    function GetTotalMoney(){
        var tMoney = 0;//总价
        $(".align_Center:gt(0)").each(function(){
            var price = $(this).find("price").text();//单价
            var count = $(this).find("input").val();//数量
            tMoney += price*count;
        });
        $("#totleMoney").Text(tMoney);
    }
}

<!--图书数量文本框获得和失去焦点事件-->
οnfοcus='changeTextOnFocus(this)' οnblur="changeTextOnBlur(<%#Eval("Id")%>,<%#Eval("Book.Id")%>,this);"
<!--删除链接点击事件-->
οnclick="removeProductOnShoppingCart(<%#Eval("Id")%>,this)"


4.2CartProcess.ashx:
string action = context.Request.QueryString["action"];
if(action = "change")
{
    int count=Convert.ToInt32(context.Request.Form["count"]);
    int pkId=Convert.ToInt32(context.Request.Form["pkId"]);
    int bookId=Convert.ToInt32(context.Request.Form["bookId"]);
    Bll.BookManager bll = new BookShop.Bll.BookManager();
    Model.Book bookModel = bll.
}
else if(action = "del")
{
    int id = Convert.ToInt32();
    
    cartBll.
}

二、结算(将购物表中信息放入订单表)
Orders表
OrderBook表

1.订单的存储过程
create proc crate_orderConfirm
@number nvarchar(50),
@userId int,
@address nvarchar(255),
@totalMoney money output
as
declare @error int
set @error=0--记录错误
--计算总价
select @totalMoney = sum([count]*UnitPrice) from Cart inner join Books on Cart.BookId=Books.Id

begin transaction
--向订单主表中插入数据
insert into Orders(OrderId,OrderDate,UserId,TotalPrice,PostAddress,state) values(@number,getdate())
set @error=@error+@@error

insert into OrderBook(OrderID,)

delete from Cart where UserId=@userId--删除购物车表中的数据
set @error=@error+@@error
if @error>0
begin
    rollback transaction
end
else
begin
    commit transaction
end


2.订单确认页面OrderConfirm.aspx
protected decimal totalPrice=0;
protected Model.User currUser = null;
protected string strHtml = null;

Page_Load()
{
    if(Common.Common.CheckSession())
    {
        currUser = (Model.User)Session["UserName"];
    }
    else
    {
        Common.Common.GotoPage();
    }
    if(!IsPostBack)
    {
        BindCartItem();//绑定商品
    }
    if(IsPostBack)
    {
        CreateOrder();//创建订单
    }
}

void CreateOrder()
{
    if(CheckAddress())
    {
        //1、调用存储过程,下订单
        int userId = currUser.Id;
        string orderNum = DateTime.Now.ToString("yyyyMMddHHmmssfff")+userId;//订单号
        string address = string.Format("收货人:{0},地址:{1},电话:{2}",Request.Form["txtName"]...);//地址
        BLL.OrderManager bll = new BookShop.BLL.OrderManager();
        decimal totalMoney =  bll.CreateOrders(userId,ordernum,address);//调用存储过程,下订单
        //2、向支付宝发送数据
        if(!string.IsNullOrEmpty(Request.Form["zfPay"]))
        {
            Common.Pay pay = new BookShop.Web.Common.Pay("商城","图书商城",ordernum,totalMoney);
            Response.Redirect(pay.PayUrl());//构建支付宝的URL参数
        }
    }
}
//用户是否填了收货人地址
bool CheckAddress()
{
    if(!string.IsNullOrEmpty(Request.Form("txtName"))&&!string.IsNullOrEmpty(Request.Form["txtAddress"]))
    {
        
    }
}

//绑定商品
void BindCartItem()
{
    BLL.CartManager bll = new BookShop.BLL.CartManager();
    //查该用户在购物车中是否有商品
    List<Model.Cart> list = bll.GetModelList("UserId"+["UserName"]).Id)
    if(list != null)
    {
        //拼接字符串,显示用户订单
        totalPrice +=
    }
}


3.支付流程
(1)下订单,得到订单号、总价格等信息
(2)按照支付宝要求的数据格式进行组织。并通过密钥(支付宝提供)将要发给支付宝的数据进行加密
(3)将加密好的数据以get方式发给支付宝(网银支付以post方式提交)

(4)支付宝接受发送过来的数据,进行校验。
(5)校验成功后出现支付宝登录界面,开始支付。
(6)无论支付成功与否,都会返回给网站一个信息。

(7)接收从支付宝返回的数据,进行校验,如果成功,修改订单状态。
订单号对支付宝来说没有意义,支付宝会将订单号原样返回,我们接收后,就知道哪个订单支付了。

4.
<appSettings>
    <add key="partner" value="1"/>
    <add key="return_url" value="http://localhost:8899/ashx/GetPay.ashx"/>
    <add key="seller_email" value="zhangsan@126.com"/>
    <add key="key" value="mk@2$z"/>
    <add key="payGetUrl" value="zhangsan@126.com"/>
</appSettings>


5.在Common文件夹中建Pay.cs文件
public class Pay
{
    public Pay(string subject,string body,string out_trade_no,decimal total_fee)
    {
        this.subject = subject;
        ...
        this.return_url = ConfigurationManager.appSetting[""]
        
        //数字签名
        this.sign = Common.CreateMd5(total_fee.ToString()+partner+out_trade_no+subject+key).ToLower();
    }
    
    protected string PayUrl()
    {
        return string.Format("{0}?partner={1}&return_url={2}&...",payGetUrl,partner,return_url,...);
    }
}


三、互联网调优
缓存、CDN加速、多服务器文件同步
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值