B2B2C分銷商城系統開發解析-首篇


B2B2C分銷商城大系統是一款基於移動互聯網的電商應用服務產品,通過在微信中建立購物商城,實現在線購物功能的一款系統軟件。

 


b2b2c分銷系統,第一個B指廣義的賣方(即成品、半成品、材料提供商等),第二個B指交易平台,即提供賣方與買方的聯系平台,同時提供優質的附加服務,C即指買方。其中,中間的B(平台)絕非簡簡單單的中介,而是提供高附加值服務的渠道機構,擁有客戶管理、信息反饋、數據庫管理、決策支持等功能的服務平台。中間的這個B是電子商務模式的核心重點。

B2B2C多用戶分銷商城系統開發 找陳洋₁₅₀₁₃₁₅₁₇₄₀T/V,F2C,C2C,B2C等大型電商平台(微商城 + WAP + Android APP + IOS APP + PC+小程序)

b2b2c分銷系統對於網站經營采用了兩種模式經營方案,如A、B。且對管理員后台可以進行設置,模式如下:

 


b2b2c分銷系統 

A:供應商入駐網站發布商品分銷→站長審核商品→入駐商家挑選商品進貨並發布到店鋪→買家挑選商品→買家支付貨款→站長訂單通知供應商(商家)發貨→供應商(商家)發送貨給買家→買家確認收到商品→供應商收貨款→網站收取提成→供應商(商家)申請提現→交易完成。 

B:站長發布商品分銷→入駐商家挑選商品進貨並發布到店鋪→買家挑選商品→買家支付貨款→站長(商家)發貨→買家確認收到商品→商家賺提成,站長收貨款→商家申請提現→交易完成。 


 首先來說一下B2B2C多用戶商城系統的框架:如下↓

一、緩存

    1、數據緩存

    2、頁面、文件等緩存

        類似淘寶、京東都是把圖片、文件緩存在用戶本地,下次再訪問就直接訪問本地文件,如果訪問沒有,就去CDN服務器上下載,下載也是通過集群分發形式,下載最近的服務器文件。下載到本地之后,就做永久保存,不做刪除,如果需要修改文件,就改文件名就行了。

 

二、分布式圖片服務器

    類似FastDFS等,這個有java、php、.net等客戶端,支持多語言,非常不錯

三、集群

    這個是老生常談,必須要做的,一個需要注意的是session的統一管理

四、分布式

   將一些訪問量高的接口獨立出來,做成服務化的方式,服務化不一定非得用dubbo,其實阿里的很多開源產品,代碼質量寫的也不咋樣,只不過你也沒有更好的替代品了,畢竟它是經過那么多考驗的了。目前我們公司有自己定制的dubbo。

 

五、數據庫讀寫分離、分庫分表

   這個主要是DBA做的,數據庫做成支持讀寫分離、分庫分表

 

六、大表處理

   大表一般目前可以做分區表,但是分區表也是有隱患的,最好前期就支持分表的,根據業務經常划分

   推薦技術:1、sharding-jdbc,在jdbc層做分表,目前支持mybatis、hibernate、jpa等等,需要開發負責

             2、mycat,通過代理的形式,這個只需要運維負責就行

 

 

 


 

最近幾年微信公眾號三級分銷程序挺火的,關於微信的程序開發,功能點比較多,如消息推送、自定義菜單,jssdk集成,支付接口等等本文主要討論一下會員三級關系的數據庫設計。從優化角度來重新設計。

 

分銷結構操作文檔:

首先看一下傳統的表設計

以下是一張會員信息表,這里WxId是微信公眾號的id(因我設計的這個程序是要支持多個微信公眾號的),UserId是當前會員id,下圖中的Pid就是會員的上一級用戶id

 

下面看一下數據:

 

根據上圖,userid=1的這個會員Pid為0的說明會員是頂級的,沒有任何人推廣。userid=2的這個會員pid為1,說明他是userid為1的會員推廣而來。然后看userid=7的這個會員,他的pid=2,說明他是userid=2的這個會員推廣來。說白了推廣關系就是:

userid(1)->userid(2)->userid(7)

userid(1)->userid(3)

userid(1)->userid(4)

userid(1)->userid(5)

userid(1)->userid(6)

那么我們要查詢一個會員(假設他的id為1)所有的推廣一級會員,對應的sql就是:select * from t_user where Pid=1,這里沒有什么問題,到是不難

 

那繼續來,要查詢他的二級或是三級分銷會員的話,就麻煩了,需要使用子循環了。對應的代碼如下:

public String gets(int pid){

  StringBuffer sb=new StringBuffer(sb);

  ArrayList list=(ArrayList)DaoFactory.getUserDAO().exe("select id,Pid from t_user where Pid="+pid);

  for (Iterator iter = list.iterator(); iter.hasNext(); ) {
        DataField df=(DataField)iter.next();

  sb.append("<li>"+df.getInt("id")+"</li>");

//遞歸調用

sb.append(gets(df.getInt("id")));

 

  }

}

上面看到了,主要解決辦法就是遞歸調用。雖然功能也能實現,但在數量比較大的情況下,很容易產生性能問題(這里只是查找會員,如果在統計每個級別下會員的消費,收入統計時,需要和消費表關系查詢,那性能不知卡到什么時候)。

下面重點來了,我們重新設計一下表,這里我們主要是通過數據庫設計來解決,我們知道數據庫存儲數量量不怕多,於是我們想,可以這樣,每當用戶推廣一個會員的時候,我們向一個表(暫且叫作用戶關系表)寫入他的級別關系不就行了嗎。比如 a推廣了b,然后b推廣了c,c推廣了d,這樣我我們就向數據庫中寫一個記錄b以上三級的關系。

看一下表中的數據

上圖中,除了原來的會員表,我們新增加了個會員關系表:t_user_relations

這里看到,ChildId=2的這個會員,他是id為1(Pid=1)的一級分銷用戶(FxLevel=1)

ChildId=7的這個會員,數據庫中有兩條記錄,一個是:他是id為2(Pid=2)的一級分銷用戶(FxLevel=1),再就是他是id為1(Pid=1)的二級分銷用戶(FxLevel=2),所以不難理解,如果一個會員上面有三級的話,這里應該有三條記錄。簡單理解就是,當用戶新增加時,將此用戶上面所有級別對應的用戶信息記錄到用戶關系表中。

這樣,當我們要查詢一個會員所有一級會員時,可以使用sql:select * from t_user_relations where Pid=1 and FxLevel=1

所有二級會員sql:select * from t_user_relations where Pid=1 and FxLevel=2

所有三級會員sql:select * from t_user_relations where Pid=1 and FxLevel=3

當我們需要統計三級會員的消費總額的時候,可以很方便使用sql:select sum(t_pay.Money) from t_user_relations,t_pay where t_user_relations.ChildId=t_pay.Userid and t_user_relations.Pid=1 and t_user_relations.FxLevel=3

同理查詢二級會員的消費:select sum(t_pay.Money) from t_user_relations,t_pay where t_user_relations.ChildId=t_pay.Userid and t_user_relations.Pid=1 and t_user_relations.FxLevel=2

那要查詢所有子會員的消費怎么辦?總不能寫三個sql吧,當然不會了。使用條件FxLevel>0不就可以了嗎:)

select sum(t_pay.Money) from t_user_relations,t_pay where t_user_relations.ChildId=t_pay.Userid and t_user_relations.Pid=1 and t_user_relations.FxLevel>0

 


 

這樣一個sql就解決了。如果使用一開始使用的遞歸方法,隨着數據量的增長,速度會非常非常的糟糕。

上面你還可能 還會問一個問題,那如果知道某個會員他是誰的一級,誰的二級呢,.....?這需要用到第一個方法設計的表了,看到了,上面的表設計我們還是要用到:)

select Pid from t_user where id=2

if(Pid!=0)說明還不是頂級,繼續查。這里可以 使用遞歸查詢或做三次查詢(通過 pid是否為0,這樣有的可能只是一級或兩次查詢,最多就是3次),放心,這樣的不會太影響性能的,可以忽略不計。

或者把id,pid數據放到緩存里,redis是個不錯的選擇。大家可以試下了。

最后看一下偶開發的效果:)




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM