前后端分離之購物車

購物車添加

購物車頁面

需要用戶id,商品id,商家id,規(guī)格id,規(guī)格信息,規(guī)格價格,庫存數(shù)量,購買數(shù)量,購買時間

購物車表

DROP TABLE IF EXISTS spcar;
CREATE TABLE spcar(
  carId VARCHAR(32) PRIMARY KEY COMMENT'主鍵',
  uid       VARCHAR(32) NOT NULL    COMMENT'用戶id',
  pdId  VARCHAR(32) NOT NULL    COMMENT'商品id',
  comId VARCHAR(32) NOT NULL    COMMENT'商家id',
  ggId  VARCHAR(32) NOT NULL    COMMENT'規(guī)格id',
  pcInfo    VARCHAR(255) NOT NULL   COMMENT'規(guī)格信息',
  pcprice   DECIMAL(9,2) NOT NULL   COMMENT'規(guī)格價格',
  pcCount   INT          NOT NULL   COMMENT'庫存數(shù)量',
  spCount   INT          NOT NULL   COMMENT'購買數(shù)量',
  joinTime DATETIME  NOT NULL   COMMENT'購買時間',  
  y1    VARCHAR(255)        COMMENT '預(yù)留1',
  y2    VARCHAR(255)        COMMENT '預(yù)留2',
  y3    VARCHAR(255)        COMMENT '預(yù)留3'
);
ALTER TABLE spcar ADD CONSTRAINT fk_users_spcar FOREIGN KEY (uid) REFERENCES users(userid);
ALTER TABLE spcar ADD CONSTRAINT fk_product_spcar FOREIGN KEY (pdId) REFERENCES product(pid);
ALTER TABLE spcar ADD CONSTRAINT fk_com_spcar FOREIGN KEY (comId) REFERENCES users(userid);
ALTER TABLE spcar ADD CONSTRAINT fk_prodCount_spcar FOREIGN KEY (ggId) REFERENCES prodCount(pcid);

添加購物車

<a id="LikBasket" title="加入購物車" href="javascript:f2()"><i></i>加入購物車</a>

思路:

  • 用戶id:可以從session中獲取
  • 規(guī)格信息:選中的規(guī)格用#拼接起來
  • 商品id:${param.id}
  • 商家id:在service層根據(jù)商品id查出商家id
  • 規(guī)格id:在service層根據(jù)商品id和規(guī)格信息11#22查到規(guī)格id

1. 頁面上參數(shù)的獲取和處理

  • 規(guī)格的id是選中的規(guī)格標簽的xxyyzz的值用#拼接
  • 一級規(guī)格都要選上才能添加到購物車,可以定義一個全局變量var spgejhsl=0;
  • 在顯示詳情頁面的時候spgejhsl = dt.data.yjge.length;保存規(guī)格數(shù)
  • 用來判斷規(guī)格是否全選上,數(shù)量也不能為零
  • 從session中獲得userId必須登陸才可以加入購物車
function f2(){
  //獲取選擇的規(guī)格
  var allg = $(".theme-options ul .selected");
  var gids = "";
  $.each(allg,function(i,n){

    gids+=$(n).attr("xxyyzz");
    if( i < allg.length-1)gids+="#";
  });
  //單價
  var price=$(".sys_item_price").html();
  //購買數(shù)量
  var ct = $("#text_box").val();
  var us = "${lged.userId}";
  //是否登錄?
  if( !us || us.length == 0 ){
    //("#xyz").dialog()
    alert("請先登錄");
  }
  //只顯示 二級規(guī)格 的 上級規(guī)格 集合
  //購買數(shù)量 > 0 驱还, 規(guī)格都要選 才可 提交
  if( allg.length != spgejhsl || ct=='0' ) return;  //JM抖印6吡稀!比較
  $.ajax({
    url:    "ctrl/users/joinCar.do",
    type:   "post",
    data:{
      "uid":'${lged.userId}',
      "pdid":'${param.id}',
      "gginfo":gids,
      "buyCount":ct,
      "price":price
    }
  })
}//f2

2. Controller

  • 用Map集合來封裝購物車的屬性,其他屬性交給service層
  • 向JSON中存入是否添加成功的信息,返回給頁面
@RequestMapping("/joinCar")
@ResponseBody
public void carAdd(@RequestParam String uid,@RequestParam String pdid,
                   @RequestParam String gginfo,@RequestParam String buyCount,
                   @RequestParam double price,HttpServletResponse resp) throws IOException{
  System.out.println("日志1...接:" + uid +"\t 商品:"+pdid+"\t規(guī)格:" + gginfo+"\t數(shù)量:"+buyCount+"\t價格:"+price);
  Map<String,Object> car = new HashMap<String, Object>();
  //controller添加購物車對象的部分信息
  car.put("uid",uid);
  car.put("pdId",pdid);
  car.put("gginfo",gginfo);
  car.put("spCount",Integer.parseInt(buyCount));
  car.put("price",price);
  JSONObject json = new JSONObject();
  try{
    carSvs.save(car);
    json.put("success","0");
  }catch(RuntimeException e){
    e.printStackTrace();
    json.put("success","-1");
  }
  WebUtils.toJson(resp, json);

}

3. Service

  • 根據(jù)Map集合中的商品id查到商家id
  • 根據(jù)Map集合中的規(guī)格信息(11#22)和商品id查出商品價格和庫存和商品庫存id
  • 在Map集合中繼續(xù)存入商家id,庫存id,商品價格,庫存數(shù)量,時間和購物車Id
  • 調(diào)用Dao保存購物車信息
public void save(Map<String, Object> car) throws RuntimeException {
  log.debug("");
  //service添加購物車對象的其它一些查詢信息
  String cmpId = prodDao.findProdCompanyId(car.get("pdId").toString());
  log.debug("1..查詢 商家 id :"+cmpId);
  String[] pcInfoArray = car.get("gginfo").toString().split("#");
  log.debug("2...字規(guī)格個數(shù):"+pcInfoArray.length+"\t"+Arrays.toString(pcInfoArray));
  Map<String,Object> pt = prodDao.findByPcInfo(car.get("pdId").toString(),pcInfoArray);
  log.debug("3...查詢 ProdCount對象:"+pt);
  car.put("comId",cmpId);
  car.putAll(pt);
  car.put("ggId",pt.get("pcid"));
  car.put("joinTime", WebUtils.getFormatDate(new Date()));
  car.put("carId",WebUtils.get32UUID());
  //dao 保存購物車的全部信息
  log.debug("3...保存購物車信息");
  carDao.save(car);
}

時間轉(zhuǎn)換字符串

public static String getFormatDate(Date d){
  SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  return fmt.format(d);
}

4. Dao

4.1 ProdDao
/**
     * 根據(jù) 商品id 查詢 商家 id
     * @param prodId
     * @return
     */
public String findProdCompanyId(String prodId)throws RuntimeException;

/**
     * 根據(jù) 商品 和 規(guī)格info 查詢規(guī)格對象
     * @param string
     * @param pcInfoArray
     * @return
     */
public Map<String, Object> findByPcInfo(@Param("pid") String pid, @Param("infoArr") String[] infoArr)throws RuntimeException;
4.2 CarDao
/**
     * 保存一個購物信息
     * @param mp
     * @throws RuntimeException
     */
public void save(Map<String,Object> mp)throws RuntimeException;

5. mapper.xml

5.1 ProdMapper.xml
<select id="findByPcInfo" resultType="Map">
  select * from prodcount where prodid=#{pid}
  <foreach collection="infoArr" item="ins">
    and pcinfo like concat('%',concat(#{ins},'%'))
  </foreach>
</select>

<select id="findProdCompanyId" resultType="String" parameterType="String">
  select userid from product where pid =#{id}
</select>
5.2 CarMapper.xml
<insert id="save" parameterType="Map">
        insert into spcar values(
  #{carId},
  #{uid},
  #{pdId},
  #{comId},
  #{ggId},
  #{pcinfo},
  #{pcprice},
  #{pccount},
  #{spCount},
  #{joinTime},
  #{y1},
  #{y2},
  #{y3}
)
  </insert>

購物車展示

思路:

  • 購物車頁面加載完成時向服務(wù)端發(fā)送請求得到購物車表的數(shù)據(jù)
  • Controller層需要JSON進行數(shù)據(jù)的封裝,
  • 每個Map是一個商品信息,規(guī)格信息是List<Map>存到Map中
  • 規(guī)格信息的Map中存子規(guī)格id和名稱父規(guī)格id和名稱,所有規(guī)格存到Map中
  • 其中規(guī)格信息需要在service層進行#分割查詢

JSON存放格式:一組商品信息

{"success":"0",data:[
  {
    "carId":    "8a683f60c3dc11e902012c86b718fe04", 
    "pdId":     "a44",              
    "pcprice":  "310.00", 
    "pname":    "橙味芬達", 
    "pcCount":  "10", 
    "comId":    "kele003",
    "cname":    "可口可樂公司", 
    "spCount":  "10", 
    "pcinfo":   "72#76", 
    "infoData": [   
      {subName=罐裝, topName=包裝材料, topid=70, subid=72}, 
      {subName=250ml, topName=容量, topid=75, subid=76}]
    ]
  },

1. 頁面的請求

根據(jù)當前登陸的用戶的id進行查詢

$(function(){
  //alert("111");
  $.ajax({
    url:"ctrl/users/carList.do?uid=${lged.userId}",
    type:"get",
    async:false,
    success:function(dt){

2. Controller

  • List<Map>存放所有商品的信息,調(diào)用service層的方法去查詢
  • 對JSON數(shù)據(jù)進行封裝
@RequestMapping("/carList.do")
@ResponseBody
public void carList(@RequestParam String uid,HttpServletResponse resp)throws Exception{
  log.debug("");
  List<Map<String,Object>> carList = null;
  JSONObject json = new JSONObject();
  carList = carSvs.getCarByUserId(uid);
  if(carList==null||carList.size()<0){
    json.put("success","-1");
  }
  json.put("success","0");
  json.put("data",carList);
  log.debug(carList);
  WebUtils.toJson(resp, json);
}

3. Service

  • 調(diào)用Dao層的方法查詢購物車的信息
  • 規(guī)格信息為11#22格式這里補全規(guī)格的信息
  • 每一個商品的規(guī)格信息為List<Map>遍歷所有商品存到對應(yīng)的商品信息中
  • 根據(jù)#進行分割得到規(guī)格id去查到規(guī)格對象,把名字和id存到Map中
public List<Map<String, Object>> getCarByUserId(String uid)
  throws RuntimeException {
  List<Map<String,Object>> carList = carDao.findCarByUserId(uid);
  for(Map<String,Object> map:carList){
    String[] sp = map.get("pcinfo").toString().split("#");
    List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
    for(String s:sp){
      Prodtypes ps = typeDao.findById(Integer.parseInt(s));
      Prodtypes pf = typeDao.findById(typeDao.findById(Integer.parseInt(s)).getPupid());
      Map<String,Object> info = new HashMap<String, Object>();
      info.put("topid", pf.getPtpid());
      info.put("topName", pf.getPtpname());
      info.put("subid", ps.getPtpid());
      info.put("subName", ps.getPtpname());
      list.add(info);
    }
    map.put("infoData",list);
  }
  return carList;
}

4. Dao

4.1 CarDao

public List<Map<String, Object>> findCarByUserId(String uid)throws RuntimeException;

CarMapper.xml

<select id="findCarByUserId" parameterType="String" resultType="Map">
  select
  c.carId,
  c.pdId,
  p.pname,
  (select img.pimgpath from productImgs img where img.prodid = c.pdId and img.pimgtype=20) pimg,
  gg.pcinfo,
  c.pcprice,
  c.spCount,
  c.pcCount,
  c.comId,
  uf.cname
  from
  spcar c,
  prodcount gg,
  product p,
  companyinfo uf
  where
  c.pdId = p.pid 
  and c.ggId = gg.pcid
  and c.comId = uf.uid
  and c.uid =#{id}
  order by c.joinTime desc, c.comId;
</select>

4.1 ProdTypesDao

public Prodtypes findById(int pid)throws RuntimeException;

ProdTypesMapper.xml

<select id="findById" resultType="myProType" parameterType="int">
  select * from prodtypes where ptpid = #{pid}
</select>

5. 頁面信息獲取

  • $.each(dt.data,function(x,y){遍歷所有商品信息用y.數(shù)據(jù)庫列名獲取

  • 再嵌套一層循環(huán)遍歷規(guī)格信息用y.infoData存入List<Map>集合的鍵map.put("infoData",list);

  • 同一家商家的物品放到一起,這里做一個判斷

$.ajax({
  url:"ctrl/users/carList.do?uid=${lged.userId}",
  type:"get",
  async:false,
  success:function(dt){
    alert(dt);
    dt = eval("("+dt+")");
    if(dt.success=='0'){
      alert(dt.data.length);
      var comName = "";
      $.each(dt.data,function(x,y){
        var str="";
        //str+="<tr class='item-list02'>";
        str+="<div class='bundle  bundle-last '>";
        if( comName != y.cname){
          //alert('新公司');
          comName = y.cname;        
          str+="    <div class='bundle-hd'>";
$.each(y.infoData,function(q,w){
  str+="                    <span class='sku-line'>"+w.topName+":"+w.subName+"</span>";
});
  • 點擊添加商品數(shù)量的”+“或手動輸入時不能超過最大庫存,而且后面的金額要跟著變化
  • 添加按鈕上增加點擊事件,傳入商品的購物車id和它的庫存
  • 我們把要購買的商品數(shù)量標簽的id設(shè)為t+carId,這樣方便我們得到它的標簽對象
<input class='text_box' id='t"+y.carId+"' name='' xxyyzz='"+y.pcprice+"' type='text' value='"+y.spCount+"' style='width:30px;'  onkeyUp='f4(\""+y.carId+"\","+y.pcCount+")' />
<input class='add am-btn' name='' type='button' value='+' onclick='f3(\""+y.carId+"\","+y.pcCount+")'/>
  • 標簽的value值轉(zhuǎn)int-parseInt( txt.val() )
  • 標簽xxyyzz屬性的值轉(zhuǎn)為Float-parseFloat( txt.attr("xxyyzz") )
  • 保留兩位小數(shù)-(num * pr).toFixed(2)
function f3(id,mx){
  var txt = $("#t"+id);     //添加按鈕對應(yīng)的   文本框
  var num = parseInt( txt.val() );
  console.log("num:"+num+" mx:"+mx + ( num >= mx ) );
  num++;
  if( num > mx){
    //alert("最大了");
    num=mx;
  }
  txt.val( num );   //最大值
  f5(id);           
}//
//手動輸入
function f4(id,mx){
  var txt = $("#t"+id);         //添加按鈕對應(yīng)的   文本框
  var num = parseInt( txt.val() );
  if( num > mx) txt.val( mx );
  f5(id);
}//
//重新計算小計
function f5(id){
  var txt = $("#t"+id);
  var num =  parseInt( txt.val() ); //獲取文本框的值
  var pr  =  parseFloat( txt.attr("xxyyzz") );
  console.log("num:"+num+" pr:"+pr + ( num * pr ) );
  $("#e"+id).html( (num * pr).toFixed(2) );
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末策添,一起剝皮案震驚了整個濱河市材部,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唯竹,老刑警劉巖乐导,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浸颓,居然都是意外死亡物臂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門产上,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棵磷,“玉大人,你說我怎么就攤上這事晋涣∫敲剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵谢鹊,是天一觀的道長算吩。 經(jīng)常有香客問我,道長佃扼,這世上最難降的妖魔是什么偎巢? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮松嘶,結(jié)果婚禮上艘狭,老公的妹妹穿的比我還像新娘。我一直安慰自己翠订,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布遵倦。 她就那樣靜靜地躺著尽超,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梧躺。 梳的紋絲不亂的頭發(fā)上似谁,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天傲绣,我揣著相機與錄音,去河邊找鬼巩踏。 笑死秃诵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的塞琼。 我是一名探鬼主播菠净,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼彪杉!你這毒婦竟也來了毅往?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤派近,失蹤者是張志新(化名)和其女友劉穎攀唯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渴丸,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡侯嘀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谱轨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片残拐。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碟嘴,靈堂內(nèi)的尸體忽然破棺而出溪食,到底是詐尸還是另有隱情,我是刑警寧澤娜扇,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布错沃,位于F島的核電站,受9級特大地震影響雀瓢,放射性物質(zhì)發(fā)生泄漏枢析。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一刃麸、第九天 我趴在偏房一處隱蔽的房頂上張望醒叁。 院中可真熱鬧,春花似錦泊业、人聲如沸把沼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饮睬。三九已至,卻和暖如春篮奄,著一層夾襖步出監(jiān)牢的瞬間捆愁,已是汗流浹背割去。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昼丑,地道東北人呻逆。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像菩帝,于是被迫代替她去往敵國和親咖城。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容