在上一篇文章中,大略说明了一个商品的添加编辑和删除操作。本文会继承其支付流程来展示如何购
买商品以及系统设计。

首先打开一个有效的商品,在商品显示页面中单击“立刻购买”按钮,如下:

这样就会跳转到“确认购买信息”页面(buygoods.aspx),如下:

在这个页面中,系统会执行如下操作:
     1.进行商品信息有效性校验(如未通过则显示相应提示信息,从而中止后续操作),如下:

private bool IsConditionsValid()
        {
            if (goodsinfo.Expiration <= DateTime.Now)
            {
                AddErrLine("非常抱歉, 该宝贝不存在或已经结束了!");
                return false;
            }

if (goodsinfo.Closed == 1)
            {
                AddErrLine("此商品已关闭!");
                return false;
            }

if (goodsinfo.Selleruid <= 0)
            {
                AddErrLine("商品卖家信息错误!");
                return false;
            }

if (userid == goodsinfo.Selleruid)
            {
                AddErrLine("买卖双方不能为同一用户!");
                return false;
            }

if (goodsinfo.Displayorder == -1)
            {
                AddErrLine("此商品已被删除!");
                return false;
            }

if (goodsinfo.Displayorder == -2)
            {
                AddErrLine("此商品未经审核!");
                return false;
            }
       

2.当点击“确认购买”时,进行购买数量校验以及与剩余数量比较判断,如下:

//如果是提交
if (ispost)
{
     //创建商品交易日志
     goodstradelog.Number = DNTRequest.GetInt("number", 0);
     // 商品数不正确
     if (goodstradelog.Number <= 0)
     {
         AddErrLine("请输入正确的商品数, 请返回修改.");
         return;
     }

if (goodsinfo.Amount < goodstradelog.Number)
    {
          AddErrLine("商品剩余数量不足 (剩余数量为 " + goodsinfo.Amount + ", 而购买数量为 " + goodstradelog.Number + ").");
          return;
     }
     

3.创建商品交易日志(CreateTradeLog):


goodstradelog.Baseprice = goodsinfo.Costprice;
goodstradelog.Discount = goodsinfo.Discount;
goodstradelog.Ratestatus = 0;
goodstradelog.Message = "";

int tradelogid = TradeLogs.CreateTradeLog(goodstradelog);

if (tradelogid > 0)
{
       string jumpurl = "";
       if (goodstradelog.Offline == 0)
       {
             jumpurl = "onlinetrade.aspx?goodstradelogid=" + tradelogid;
       }
       else
       {
              jumpurl = "offlinetrade.aspx?goodstradelogid=" + tradelogid;
       }
       SetUrl(jumpurl);
       SetMetaRefresh();
       AddMsgLine("交易单已创建, 现在将转入交易单页面<br />(<a href=""" + jumpurl + """>如果您的浏览器没有自动跳转, 请点击这里</a>)<br />");
}
else
{
       SetUrl("buygoods.aspx?goodsid=" + goodsid);
       SetMetaRefresh();
       AddMsgLine("交易单创建错误, 请重新添写交易单<br />(<a href=""" + "buygoods.aspx?goodsid=" + goodsid + """>如果您的浏览器没有自动跳转, 请点击这里</a>)<br />");
}

这里的TradeLogs.CreateTradeLog(goodstradelog)方法内容如下:

/// <summary>
/// 创建商品交易日志
/// </summary>
/// <param name="__goodstradelog">要创建的商品交易日志</param>
/// <returns>创建的商品交易日志id</returns>
public static int CreateTradeLog(Goodstradeloginfo __goodstradelog)
{
    //当为支付宝付款方式时,将订单号绑定到tradeno字段
    if (__goodstradelog.Offline == 0)
    {
        __goodstradelog.Tradeno = __goodstradelog.Orderid;
    }

if (__goodstradelog.Buyermsg.Length > 100)
    {
        __goodstradelog.Buyermsg = __goodstradelog.Buyermsg.Substring(0, 100);
    }

if (__goodstradelog.Buyercontact.Length > 100)
    {
        __goodstradelog.Buyercontact = __goodstradelog.Buyercontact.Substring(0, 100);
    }

if (__goodstradelog.Number > 0)
    {
        //更新商品数量和最近交易信息
        Goodsinfo __goodsinfo = Goods.GetGoodsInfo(__goodstradelog.Goodsid);
        if (__goodsinfo != null && __goodsinfo.Goodsid > 0)
        {
            //当商品库存变为0(负)库存时
            if (__goodsinfo.Amount > 0 && (__goodsinfo.Amount - __goodstradelog.Number) <= 0)
            {

DbProvider.GetInstance().UpdateCategoryGoodsCounts(__goodsinfo.Categoryid,

__goodsinfo.Parentcategorylist, -1);

}

__goodsinfo.Totalitems = __goodsinfo.Totalitems + __goodstradelog.Number; //累加总交易量
            __goodsinfo.Amount = __goodsinfo.Amount - __goodstradelog.Number; //减少当前商品数量
            __goodsinfo.Tradesum = __goodsinfo.Tradesum + __goodstradelog.Tradesum;  //累加总交易额

__goodsinfo.Lastbuyer = __goodstradelog.Buyer;
            __goodsinfo.Lasttrade = DateTime.Now;

Goods.UpdateGoods(__goodsinfo);
        }
    }
    __goodstradelog.Id = DbProvider.GetInstance().CreateGoodsTradeLog(__goodstradelog);

SendPM(__goodstradelog);

return __goodstradelog.Id;
}

基本上是对要创建的交易信息进行数据修正,并更新商品表中的相应字段(Totalitems,Amount等)。

当创建交易日志完成之后,上面的SendPM(__goodstradelog);用于向卖家发送短消息。其代码段如下所示:

/// <summary>
/// 根据交易日志的状态发送相应短消息
/// </summary>
/// <param name="__goodstradelog">交易日志信息</param>
/// <returns>是否发送成功</returns>
public static bool SendPM(Goodstradeloginfo __goodstradelog)
{
    string pm_content = "这是由论坛系统自动发送的通知短消息.<BR />";
    string pm_title = "";
    bool issendpm = false;
    int msgtoid = 0;
    string msgto = "";
    string pagename = __goodstradelog.Offline == 1 ? "offlinetrade.aspx" : "onlinetrade.aspx";
    switch ((TradeStatusEnum)__goodstradelog.Status)
    {
        case TradeStatusEnum.UnStart:
            {
                pm_title = "[系统消息] 有买家购买您的商品";
                pm_content = pm_content + string.Format("买家 {0} 购买您的商品 {1}. 但交易尚未生效, 等待您的确认, 请<a href =""" + pagename + "?goodstradelogid={2}"">点击这里</a>查看详情.",
                            __goodstradelog.Buyer,
                            __goodstradelog.Subject,
                            __goodstradelog.Id);
                issendpm = true;
                msgtoid = __goodstradelog.Sellerid;
                msgto = __goodstradelog.Seller;
                break;
            }
        case TradeStatusEnum.WAIT_SELLER_SEND_GOODS:
            {
                pm_title = "[系统消息] 买家已付款, 等待您发货";
                pm_content = pm_content + string.Format("买家 {0} 购买您的商品 {1}. 买家已付款, 等待您发货, 请<a href =""" + pagename + "?goodstradelogid={2}"">点击这里</a>查看详情.",
                            __goodstradelog.Buyer,
                            __goodstradelog.Subject,
                            __goodstradelog.Id);
                issendpm = true;
                msgtoid = __goodstradelog.Sellerid;
                msgto = __goodstradelog.Seller;
                break;
            }
        case TradeStatusEnum.WAIT_BUYER_CONFIRM_GOODS:
            {
                pm_title = "[系统消息] 您购买的商品已经发货";
                pm_content = pm_content + string.Format("您购买的商品 {0} . 卖家 {1} 已发货, 等待您的确认, 请<a href =""" + pagename + "?goodstradelogid={2}"">点击这里</a>查看详情.",
                            __goodstradelog.Subject,
                            __goodstradelog.Seller,
                            __goodstradelog.Id);
                msgtoid = __goodstradelog.Buyerid;
                msgto = __goodstradelog.Buyer;
                issendpm = true;
                issendpm = true; break;
            }
        case TradeStatusEnum.WAIT_SELLER_AGREE:
            {
                pm_title = "[系统消息] 有买家等待你同意退款";
                pm_content = pm_content + string.Format("买家 {0} 等待你同意退款, 请<a href =""" + pagename + "?goodstradelogid={1}"">点击这里</a>查看详情.",
                             __goodstradelog.Buyer,
                            __goodstradelog.Id);
                issendpm = true;
                msgtoid = __goodstradelog.Sellerid;
                msgto = __goodstradelog.Seller;
                break;
            }
        case TradeStatusEnum.SELLER_REFUSE_BUYER:
            {
                pm_title = "[系统消息] 有卖家拒绝您的条件, 等待您修改条件";
                pm_content = pm_content + string.Format("卖家 {0} 拒绝您的条件, 等待您修改条件, 请<a href =""" + pagename + "?goodstradelogid={1}"">点击这里</a>查看详情.",
                             __goodstradelog.Seller,
                            __goodstradelog.Id);
                issendpm = true;
                msgtoid = __goodstradelog.Buyerid;
                msgto = __goodstradelog.Buyer;
                break;
            }
        case TradeStatusEnum.WAIT_BUYER_RETURN_GOODS:
            {
                pm_title = "[系统消息] 有卖家同意退款, 等待您退货";
                pm_content = pm_content + string.Format("卖家 {0} 同意退款, 等待您退货, 请<a href =""" + pagename + "?goodstradelogid={1}"">点击这里</a>查看详情.",
                             __goodstradelog.Seller,
                            __goodstradelog.Id);
                msgtoid = __goodstradelog.Buyerid;
                msgto = __goodstradelog.Buyer;
                issendpm = true;
                break;
            }
        case TradeStatusEnum.WAIT_SELLER_CONFIRM_GOODS:
            {
                pm_title = "[系统消息] 有买家已退货, 等待您收货";
                pm_content = pm_content + string.Format("买家 {0} 已退货, 等待您收货, 请<a href =""" + pagename + "?goodstradelogid={1}"">点击这里</a>查看详情.",
                             __goodstradelog.Buyer,
                            __goodstradelog.Id);
                msgtoid = __goodstradelog.Sellerid;
                msgto = __goodstradelog.Seller;
                issendpm = true;
                break;
            }
        case TradeStatusEnum.TRADE_FINISHED:
            {
                pm_title = "[系统消息] 商品交易已成功完成";
                pm_content = pm_content + string.Format("商品 {0} 已交易成功, 请<a href =""goodsrate.aspx?goodstradelogid={1}"">点击这里</a>给对方评分.",
                            __goodstradelog.Subject,
                            __goodstradelog.Id);
                msgtoid = __goodstradelog.Sellerid;
                msgto = __goodstradelog.Seller;
                issendpm = true;
                break;
            }
        case TradeStatusEnum.TRADE_CLOSED:
            {
                pm_title = "[系统消息] 卖家已取消此次交易, 当前交易关闭";
                pm_content = pm_content + string.Format("商品 {0} 交易失败, 卖家取消交易, 请<a href =""goodsrate.aspx?goodstradelogid={1}"">点击这里</a>查看详情.",
                            __goodstradelog.Subject,
                            __goodstradelog.Id);
                msgtoid = __goodstradelog.Sellerid;
                msgto = __goodstradelog.Seller;
                issendpm = true;
                break;
            }          
        case TradeStatusEnum.REFUND_SUCCESS:
            {
                pm_title = "[系统消息] 您购买的商品已成功退款";
                pm_content = pm_content + string.Format("商品 {0} 已退款成功, 请<a href =""goodsrate.aspx?goodstradelogid={1}"">点击这里</a>给对方评分.",
                            __goodstradelog.Subject,
                            __goodstradelog.Id);
                msgtoid = __goodstradelog.Buyerid;
                msgto = __goodstradelog.Buyer;
                issendpm = true;
                break;
            }
    }

//发送短消息
    if(issendpm)
    {
        PrivateMessageInfo __privatemessageinfo = new PrivateMessageInfo();

// 收件箱
        __privatemessageinfo.Message = Utils.HtmlEncode(pm_content.ToString());
        __privatemessageinfo.Subject = Utils.HtmlEncode(pm_title);
        __privatemessageinfo.Msgto = msgto;
        __privatemessageinfo.Msgtoid = msgtoid;
        __privatemessageinfo.Msgfrom = "系统";
        __privatemessageinfo.Msgfromid = 0;
        __privatemessageinfo.New = 1;
        __privatemessageinfo.Postdatetime = Utils.GetDateTime();

PrivateMessages.CreatePrivateMessage(__privatemessageinfo, 0);
    }
    return true;
}

上面的代码主要是根据交易日志的状态,向买卖双方发送相应的短消息。而交易的状态采用了支付宝
文档中所述的17种状态,其说明如下(位于Discuz.Entity项目下的Mall/GoodsrateinfoCollection.cs):

/// <summary>
/// 交易状态枚举
/// </summary>
public enum TradeStatusEnum
{
    /// <summary>
    /// 未生效的交易
    /// </summary>
    UnStart = 0,
    /// <summary>
    /// 等待买家付款
    /// </summary>
    WAIT_BUYER_PAY = 1,
    /// <summary>
    /// 交易已创建,等待卖家确认
    /// </summary>
    WAIT_SELLER_CONFIRM_TRADE = 2,
    /// <summary>
    /// 确认买家付款中,暂勿发货
    /// </summary>
    WAIT_SYS_CONFIRM_PAY = 3,
    /// <summary>
    /// 买家已付款(或支付宝收到买家付款),请卖家发货
    /// </summary>
    WAIT_SELLER_SEND_GOODS = 4,
    /// <summary>
    /// 卖家已发货,买家确认中
    /// </summary>
    WAIT_BUYER_CONFIRM_GOODS = 5,
    /// <summary>
    /// 买家确认收到货,等待支付宝打款给卖家
    /// </summary>
    WAIT_SYS_PAY_SELLER = 6,
    /// <summary>
    /// 交易成功结束
    /// </summary>
    TRADE_FINISHED = 7,
    /// <summary>
    /// 交易中途关闭(未完成)
    /// </summary>
    TRADE_CLOSED = 8,
    /// <summary>
    /// 等待卖家同意退款
    /// </summary>
    WAIT_SELLER_AGREE = 10,
    /// <summary>
    /// 卖家拒绝买家条件,等待买家修改条件
    /// </summary>
    SELLER_REFUSE_BUYER = 11,
    /// <summary>
    /// 卖家同意退款,等待买家退货
    /// </summary>
    WAIT_BUYER_RETURN_GOODS = 12,
    /// <summary>
    /// 等待卖家收货
    /// </summary>
    WAIT_SELLER_CONFIRM_GOODS = 13,
    /// <summary>
    /// 双方已经一致,等待支付宝退款
    /// </summary>
    WAIT_ALIPAY_REFUND = 14,
    /// <summary>
    /// 支付宝处理中
    /// </summary>
    ALIPAY_CHECK = 15,
    /// <summary>
    /// 结束的退款
    /// </summary>
    OVERED_REFUND = 16,
    /// <summary>
    /// 退款成功(卖家已收到退货)
    /// </summary>
    REFUND_SUCCESS = 17,
    /// <summary>
    /// 退款关闭
    /// </summary>
    REFUND_CLOSED = 18
}

到这里,确认交易页面介绍的差不多了,当然上面所帖的图中“交易方式”选择“下同之后,则进入到offlinetrade.aspx中。

如下所示:

在这里,当前的交易状态为"未生效的交易"(即:UnStart = 0)

当用户点击“我已付款,等待卖家发货”按钮时,会显示“买家已付款,等待卖家发货”的提示信息如下图:

如果这时卖家(登陆后)进入到当前交易页面时,会显示如下信息:

这里如果卖家确认买家并点击“我已发货”按钮后,当前交易状态会成“卖家已发货,买家确认中(即:
WAIT_BUYER_CONFIRM_GOODS = 5)。

这时当买家(登陆后)进入到当前交易页面时,会显示如下信息:

当买家最终确认并收货之后,点击“我收到货,交易成功结束”按钮,当前交易状态会变成“交易成功结束”

(RADE_FINISHED = 7)。如下所示:


  
    这样本次交易流程基本上就结束了,当然最后买卖双方还要互评,以便为“信用机制”提供有效信息。如下
图(点击上图中的“评价”按钮):
    

当买卖双方评价完成后,交易变成了“双方已评”

这时,当我们点击“商品显示页面”中的“信用链接”(如下图):

系统会进入到“信用页面(eccredit.aspx)”, 如下图:
 
 
    在这里,我们就可以看到当前商品的卖家和买家信用,以及按时间(最近一周,一个月,六个月等)所获
得的“好,中,差”评的次数以及相应的评价内容。此外还包括"好评率”,“给他人评价”等信息。

这样,我们基本上完成了一个交易流程(线下交易,注:退货退款等交易中止流程本文未进行说明,大家可

安装之后一用便知)。

当然,我们这里在处理交易的页面中,只是在买卖双方的推动下,不断更新交易状态的过程,因为下面简要
介绍一下Discuz.Mall/Pages/offlinetrade.cs(线下交易页面)的代码:

首先是IsConditionsValid方法,该方法用户校验买家或卖家身份以及交易和商品的信息有效性,如下:

private bool IsConditionsValid()
{
    if (goodstradelog.Offline == 0)
    {
        AddErrLine("当前交易为在线交易!");
        return false;
    }

//当前用户为买家时
    if (goodstradelog.Buyerid == userid)
    {
        isbuyer = true;
    }

//当前用户为卖家时
    if (goodstradelog.Sellerid == userid)
    {
        isseller = true;
    }

//当前用户既不是买家也不是卖家
    if (!isbuyer && !isseller)
    {
        AddErrLine("当前用户身份既不是买家也不是卖家!");
        return false;
    }

if (goodstradelog.Buyerid <= 0)
    {
        AddErrLine("商品买家信息错误!");
        return false;
    }

if (goodstradelog.Sellerid <= 0)
    {
        AddErrLine("商品卖家信息错误!");
        return false;
    }

int goodsid = goodstradelog.Goodsid;
    // 如果商品ID无效
    if (goodsid <= 0)
    {
        AddErrLine("无效的商品ID");
        return false;
    }

goodsinfo = Goods.GetGoodsInfo(goodsid);

if (goodsinfo.Displayorder == -1)
    {
        AddErrLine("此商品已被删除!");
        return false;
    }

if (goodsinfo.Displayorder == -2)
    {
        AddErrLine("此商品未经审核!");
        return false;
    }

if (goodsinfo.Expiration <= DateTime.Now)
    {
        AddErrLine("非常抱歉, 该商品不存在或已经到期!");
        return false;
    }

return true;
}

当通过上面方法的校验并实例化相应的交易信息后,则进行更新当前交易状态的操作,其调用代码如下
(Discuz.Mall/Pages/offlinetrade.cs):

if (TradeLogs.UpdateTradeLog(goodstradelog, oldstatus, true))
{
      SetUrl("offlinetrade.aspx?goodstradelogid=" + goodstradelogid);
      SetMetaRefresh();
      AddMsgLine("交易单已更新, 现在转入交易单页面<br />(<a href=""" + "offlinetrade.aspx?goodstradelogid=" + goodstradelogid + """>如果您的浏览器没有自动跳转, 请点击这里</a>)<br />");
}

下面介绍一下TradeLogs.UpdateTradeLog方法,该方法执行更新交易状态的操作(相关内容见注释):

/// <summary>
/// 更新交易信息
/// </summary>
/// <param name="__goodstradelog">要更新的交易信息</param>
/// <param name="oldstatus">更新之前的状态</param>
/// <param name="issendpm">更新交易信息成功后, 是否发送短消息</param>
/// <returns>是否更新成功</returns>
public static bool UpdateTradeLog(Goodstradeloginfo __goodstradelog, int oldstatus, bool issendpm)
{
    bool result = UpdateTradeLog(__goodstradelog, oldstatus); //调用重载方法
    if (result && issendpm)
    {
        SendPM(__goodstradelog);
    }

return result;
}

/// <summary>
/// 更新交易信息
/// </summary>
/// <param name="__goodstradelog">要更新的交易信息</param>
/// <param name="oldstatus">本次更新之前的状态</param>
/// <returns>是否更新成功</returns>
public static bool UpdateTradeLog(Goodstradeloginfo __goodstradelog, int oldstatus)
{
    if (__goodstradelog.Buyermsg.Length > 100)
    {
        __goodstradelog.Buyermsg = __goodstradelog.Buyermsg.Substring(0, 100);
    }

if (__goodstradelog.Buyercontact.Length > 100)
    {
        __goodstradelog.Buyercontact = __goodstradelog.Buyercontact.Substring(0, 100);
    }

__goodstradelog.Tradesum = __goodstradelog.Number * __goodstradelog.Price +

(__goodstradelog.Transportpay == 2 ? __goodstradelog.Transportfee : 0);

//当交易状态发生变化时
    if (__goodstradelog.Status != oldstatus)
    {
        if (__goodstradelog.Number > 0)
        {
            //获取当前交易的商品信息
            Goodsinfo __goodsinfo = Goods.GetGoodsInfo(__goodstradelog.Goodsid);

//当交易从中途关闭(未完成)状态变为生效(Status: 1为生效, 4为买家已付款等待卖家发货)时更新商品数量)
            if (oldstatus == 8 && (__goodstradelog.Status == 1 || __goodstradelog.Status == 4))
            {
                //当商品库存变为0(负)库存时
                if (__goodsinfo.Amount > 0 && (__goodsinfo.Amount - __goodstradelog.Number) <= 0)
                {

DbProvider.GetInstance().UpdateCategoryGoodsCounts(__goodsinfo.Categoryid,                                                                                           __goodsinfo.Parentcategorylist, -1);

}

__goodsinfo.Totalitems = __goodsinfo.Totalitems + __goodstradelog.Number; //累加总交易量
                __goodsinfo.Amount = __goodsinfo.Amount - __goodstradelog.Number; //减少当前商品数量
                __goodsinfo.Tradesum = __goodsinfo.Tradesum + __goodstradelog.Tradesum;  //累加总交易额
            }

//当退款成功后(Status = 17, 表示此次交易无效,同时更新商品信息并还原商品数目)
            //或交易中途关闭,未完成(Status = 8, 更新商品数量)
            if (__goodstradelog.Status == 17 || __goodstradelog.Status == 8)
            {
                //当商品库存从0(负)库存变为有效库存时
                if (__goodsinfo.Amount <= 0 && (__goodsinfo.Amount + __goodstradelog.Number) > 0)
                {

DbProvider.GetInstance().UpdateCategoryGoodsCounts(__goodsinfo.Categoryid,

__goodsinfo.Parentcategorylist, 1);

}

__goodsinfo.Totalitems = __goodsinfo.Totalitems - __goodstradelog.Number; //减少总交易量
                __goodsinfo.Amount = __goodsinfo.Amount + __goodstradelog.Number; //还原当前商品数量
                __goodsinfo.Tradesum = __goodsinfo.Tradesum - __goodstradelog.Tradesum;//减少总交易额
            }
          
            __goodsinfo.Lastbuyer = __goodstradelog.Buyer;
            __goodsinfo.Lasttrade = DateTime.Now;

Goods.UpdateGoods(__goodsinfo);
        }
    }

return DbProvider.GetInstance().UpdateGoodsTradeLog(__goodstradelog);
}

当前在交易状态更新完成后,会最终发送短消息给买家或卖家,其方法在本文前面已介绍后,这里就不再

多说了。当然这里还有双方互评时的页面逻辑和方法没有介绍,这部分留到以后的“商品交易插件信用机制”一

文中再详加说明。

好了,今天的内容就先到这里了,因为一些细节暂未详细描述,只是粗略的浏览了一遍,如果大家感兴趣
欢迎在回复中讨论。
 
    tag : discuznt, mall, 交易, trade
    作者: 代震军, daizhj
    原帖链接: http://www.cnblogs.com/daizhj/archive/2008/08/12/1265648.html

DiscuzNT 商品交易插件设计之[线下交易流程]相关推荐

  1. 给我设计套高端一点的线下接待流程以及话术

    好的,高端一点的线下接待流程如下: 接待员迎宾:接待员热情地问候客人,并向他们介绍公司. 入场:接待员带领客人进入接待区,并为他们提供简单的饮料和零食. 介绍产品:接待员简要介绍公司的产品,并解释产品 ...

  2. 中国移动支付线下交易扩大,支付服务角逐趋热

    11月14日,腾讯公布2018年第三季度业绩显示线下日均商业支付交易量同比增长200%,纵观支付宝的发展趋势,近几年在门店合作.智能出行等线下行业全面渗透,这说明在第三方支付机构线上支付日益激烈的竞争 ...

  3. 架构设计 | 基于电商交易流程,图解TCC事务分段提交

    本文源码:GitHub·点这里 || GitEE·点这里 一.场景案例简介 1.场景描述 分布式事务在业务系统中是十分常见的,最经典的场景就是电商架构中的交易业务,如图: 客户端通过请求订单服务,执行 ...

  4. 第十二届“中国软件杯”大学生软件设计大赛线下集训营·武汉站活动圆满结束...

    青春五月,活力四射."中国软件杯"大学生软件设计大赛(简称"大赛")组委会携手中国移动云能力中心走进湖北工业大学开展武汉站线下集训活动. 深入高校 推动校企合作 ...

  5. 如何整合线上和线下营销进行深度交融

    消费者和品牌交互的方式越来越多样化,营销人常面对如何推陈出新,改良传统营销模式的难题,线上线下营销的深度交融就是其一.早前线下营销曾一度被唱衰,但是面对消费升级,线上数字广告的饱和,线下营销再次被赋予 ...

  6. 从线下走到线上,艺术品能否找到新突破口?

    艺术品因其具有的收藏价值.文化价值.观赏价值以及不可复制性,让收藏者愿不远万里前去赴约,许以千金只求抱得珍品归.中国作为有五千年悠久历史的古国之一,前人留下的传世艺术品不计其数,艺术品交易需求不小,但 ...

  7. BAT巨头三角争逐,线下O2O谁更略胜一筹?

    BAT巨头三角争逐,线下O2O谁更略胜一筹?(转) 张江健 / 2014年09月06日 中国是一个很有意思的市场,大凡存在巨大市场空间的领域往往都会盘踞着相互厮杀的三大巨头,也许这样才有利于市场平衡和 ...

  8. 浩易南:线下手机销售维修店O2O思路

    这个朋友的情况:会基本的手机修理,能说会道. 第一步,先开个实体店,主营业务为苹果三星等智能手机的维修和销售.店面不用多大,位置不用太好,主要是为了客户线下交易能有个店面. 然后打造一个牛逼QQ空间, ...

  9. P2P(人对人)、O2O(线上到线下)、B2C(企业对消费者)、B2B(企业对企业的电子商务模式)、C2C(消费者对消费者的电子商务模式)、B2B2C(企业对企业对消费者的商业模式)

    P2P中的P是Peer或person(人.个人); O2O中的O是Online(网游.互联网)和Offline(线下.离线): B2C中的B是Business(商业.企业),而C是Customer(顾 ...

最新文章

  1. SpringMVC背景介绍及常见MVC框架比较
  2. GetDlgItem的用法
  3. libevent之Reactor模式详解
  4. Qt Creator建立多个平台
  5. 做技术的,聊聊研发。
  6. 简单获取任意app的URL Schemes
  7. 计算机专业跨专业考文科,给07年想跨专业考湖大计算机专业的同学
  8. 牛客网刷题(纯java题型 211~240题)
  9. Django模板语言相关内容
  10. php.ini 开启zend,php之ZendFramewor篇(1)application.ini配置说明
  11. DataTable查询。
  12. regexp函数mysql_mysql中regexp_like()函数的例子解析
  13. 【故障诊断分析】滚动轴承故障诊断系统含Matlab源码
  14. 计算机网络实验 网络命令的使用,计算机网络常用网络命令 实验报告.doc
  15. 比较结构的关联词(二)
  16. Vue 组件封装之 Result 结果页
  17. 【牛奶豆腐汤喝出小蛮腰】
  18. WebRTC实时通信系列教程7 使用Socket.IO搭建信令服务器交换信息
  19. 小红书种草模式有哪些?如何保证种草效果
  20. Java 编写程序打印以下图形_怎么用java编写如下程序在屏幕上输出如下图形 * *** *** * 循环语句做(if语句)...

热门文章

  1. 自动化测试测试工具 AirTest 的使用方法与简介
  2. python中字典格式_如何在Python中使用带有字典的格式函数和整数键
  3. matlab函数isempty_matlab基本函数inf, isempty, round, floor, fix
  4. html5 ar开发,HTML5 WebAR开发
  5. 关于Linux用户管理相关研究-------(二)
  6. java 句子拆分_java – 将段落拆分为单个句子.我在这里覆盖了所有的基地吗?
  7. PTA 基础编程题目集 6-8 简单阶乘计算 C语言
  8. Vue教程3【使用Vue脚手架】render ref props minin scoped $emit $bus 消息订阅发布 动画
  9. 利用fputc函数写一个putw(w,fp)函数,将整数w写入fp所指文件中; 利用fgetc函数写一函数getw(fp)从所指文件读出一整数
  10. 【c语言】蓝桥杯算法训练 斜率计算