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