首页/ mobileweb/ 小草快批下单 H5 移动端功能演示/ 代码预览

💻 代码预览 · 小草快批下单 H5 移动端功能演示

mw_service · 上传者 驰旭教育
← 返回详情
r105/cart.js · 约 4452 字符
1/* 小草快批下单 · 购物车 / 订单 / 地址 逻辑(共享,原生 JS) */2var XC_K = { cart:'xc_cart', orders:'xc_orders', addr:'xc_address', mg:'xc_mg', ov:'xc_override' };3var XC_MG_PASS = 'xc8888';45/* 管理端改价覆盖(本地演示) */6var XC_OVERRIDE = {};7try { XC_OVERRIDE = JSON.parse(localStorage.getItem(XC_K.ov) || '{}'); } catch(e){ XC_OVERRIDE = {}; }8function xcSaveOverride(){ localStorage.setItem(XC_K.ov, JSON.stringify(XC_OVERRIDE)); }9function xcPriceOf(p, specKey){10  if (XC_OVERRIDE[p.id] && XC_OVERRIDE[p.id][specKey] != null) return XC_OVERRIDE[p.id][specKey];11  return p[specKey].price;12}1314function xcGetCart(){ try { return JSON.parse(localStorage.getItem(XC_K.cart)||'[]'); } catch(e){ return []; } }15function xcSetCart(c){ localStorage.setItem(XC_K.cart, JSON.stringify(c)); }16function xcCartCount(){ return xcGetCart().reduce(function(s,i){ return s + i.qty; }, 0); }17function xcCartTotal(){ return xcGetCart().reduce(function(s,i){ return s + i.price*i.qty; }, 0); }1819/* pid, specKey('small'|'medium'), qty */20function xcAddToCart(pid, specKey, qty){21  qty = qty || 1;22  var p = xcGetProduct(pid); if (!p) return;23  var spec = p[specKey]; if (!spec) return;24  var cart = xcGetCart();25  var key = pid + '|' + specKey;26  var found = null;27  for (var i=0;i<cart.length;i++){ if (cart[i].key===key){ found = cart[i]; break; } }28  if (found){ found.qty += qty; }29  else {30    cart.push({31      key:key, pid:pid, specKey:specKey, specLabel:spec.label,32      name:p.name, emoji:p.emoji, color:p.color, unit:spec.unit,33      price:xcPriceOf(p, specKey), qty:qty34    });35  }36  xcSetCart(cart);37  xcToast('已加入购物车:' + p.name + ' ' + spec.label);38  xcUpdateTabBadge();39}4041function xcRemoveCart(key){42  var cart = xcGetCart().filter(function(i){ return i.key!==key; });43  xcSetCart(cart); xcUpdateTabBadge();44}45function xcSetQty(key, qty){46  var cart = xcGetCart();47  for (var i=0;i<cart.length;i++){48    if (cart[i].key===key){ cart[i].qty = Math.max(1, qty); break; }49  }50  xcSetCart(cart); xcUpdateTabBadge();51}5253function xcGetOrders(){ try { return JSON.parse(localStorage.getItem(XC_K.orders)||'[]'); } catch(e){ return []; } }54function xcSaveOrders(o){ localStorage.setItem(XC_K.orders, JSON.stringify(o)); }5556/* 由当前购物车生成订单并清空购物车 */57function xcCheckout(){58  var cart = xcGetCart();59  if (!cart.length) return null;60  var total = cart.reduce(function(s,i){ return s + i.price*i.qty; }, 0);61  var addr = xcGetAddress();62  var order = {63    oid: 'XC' + Date.now().toString().slice(-8),64    time: new Date().toLocaleString('zh-CN'),65    items: cart.slice(),66    total: total,67    addr: addr ? (addr.name + ' ' + addr.phone + ' ' + addr.text) : '未填写收货地址'68  };69  var orders = xcGetOrders();70  orders.unshift(order);71  xcSaveOrders(orders);72  xcSetCart([]);73  xcUpdateTabBadge();74  return order;75}7677function xcGetAddress(){ try { return JSON.parse(localStorage.getItem(XC_K.addr)||'null'); } catch(e){ return null; } }78function xcSetAddress(a){ localStorage.setItem(XC_K.addr, JSON.stringify(a)); }7980/* 底部导航角标 */81function xcUpdateTabBadge(){82  var els = document.querySelectorAll('.tab-cart .badge');83  var n = xcCartCount();84  els.forEach(function(el){85    el.textContent = n;86    el.style.display = n>0 ? 'inline-block' : 'none';87  });88}8990/* 轻提示 */91function xcToast(msg){92  var t = document.getElementById('xc-toast');93  if (!t){94    t = document.createElement('div');95    t.id = 'xc-toast';96    t.style.cssText = 'position:fixed;left:50%;top:42%;transform:translate(-50%,-50%);background:rgba(0,0,0,.78);color:#fff;padding:10px 16px;border-radius:10px;font-size:13px;z-index:9999;max-width:80%;text-align:center;';97    document.body.appendChild(t);98  }99  t.textContent = msg;100  t.style.display = 'block';101  clearTimeout(t._timer);102  t._timer = setTimeout(function(){ t.style.display='none'; }, 1400);103}104105/* 各页共用底部导航 */106function xcTabbar(active){107  return '' +108  '<nav class="tabbar">' +109    '<a class="tab'+(active==='home'?' on':'')+'" href="index.html"><span class="ti">🛒</span><span>选购</span></a>' +110    '<a class="tab tab-cart'+(active==='cart'?' on':'')+'" href="cart.html"><span class="ti">🧺<i class="badge" style="display:none">0</i></span><span>购物车</span></a>' +111    '<a class="tab'+(active==='my'?' on':'')+'" href="my.html"><span class="ti">👤</span><span>我的</span></a>' +112  '</nav>';113}114