您的位置:首页 > 职场人生

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

2012-08-15 23:00 411 查看
一、购物车(购物表)

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);
}
}


<!--图书数量文本框获得和失去焦点事件-->
onfocus='changeTextOnFocus(this)' onblur="changeTextOnBlur(<%#Eval("Id")%>,<%#Eval("Book.Id")%>,this);"
<!--删除链接点击事件-->
onclick="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加速、多服务器文件同步
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: