{{include "header.html"}} {{include "nav.html"}} {{/* 购物车页(cart.html) ⚠️ 本模板**平铺在 views/ 根下**,不进子目录 —— front_service.go 的 normalizeViewName 用 `^[A-Za-z0-9_-]+\.html$` 拦子目录(含 / 直接判非法)。 放开子目录要同时处理分段上限、逐段拒 ..、空段,改错就是目录穿越, 所以宁可文件名扁平,也不要碰那个安全敏感的正则。 数据从哪来: - ViewModel.Cart 是**服务端填好的购物车摘要**(件数/金额/是否免运费), 由 FrontService 在渲染前填充(只有 service 层拿得到 VShop Cookie); - 商品行不在 ViewModel 里 —— 那些必须按现价现库存实时算, 放进 ViewModel 等于每个页面都多一次商品查询。 所以购物车页在客户端通过 /api/public/shop/cart 拉整车,用 JS 渲染。 为什么用 JS 渲染而不是服务端循环: 购物车是个「随时在变」的状态(加购、改数量、合并登录车都会变), 服务端渲染出来的一快照很快就不准;而金额本来就必须由服务端算, 客户端只负责画。混起来做(客户端算钱)等于把定价权交给浏览器。 */}}

Cart

Loading your cart…

{{include "footer.html"}} {{/* 🚨 js.html 必须在最后 include:它同时输出 。 这四个商城页原来只 include 了 footer —— 页面没有闭合标签, 而且拿不到 jQuery 与「加入购物车」的全局脚本。 */}} {{include "js.html"}}