{{include "header.html"}} {{include "nav.html"}} {{$cur := default (index .ThemesExt "currency_symbol") "$"}} {{if index .ThemesExt "show_breadcrumb"}} {{if .Nav}} {{end}} {{end}} {{if .Content}}
{{if .Content.Img}}
{{.Content.Title}}
{{end}}

{{.Content.Title}}

{{/* 评分紧贴标题下方(价格上方):对标里 PDP 评分放这个位置平均提升加购 11% */}} {{if .Content.Ext}} {{$rating := index .Content.Ext "rating"}} {{$reviews := index .Content.Ext "reviews"}} {{if $rating}}
{{$rating}} {{if $reviews}}{{$reviews}} 条评价{{end}}
{{end}} {{end}} {{if .Content.Price}}
{{$cur}}{{printf "%.2f" .Content.Price}}
{{end}} {{if .Content.Ext}} {{/* 服装属性表。 ⚠️ 这里刻意**不做尺码/颜色的选择器**:本版本的商品模型没有多规格 (Sku 只是货号,不参与交易),做一个能点但不进订单的选择器 等于骗用户 —— 他选了 M 码,订单里却没有这个信息。 所以属性按「说明」展示,下单以商品本身为准。 ⚠️ `spec` 那段自由文本也保留:运营常用它写一句卖点,删了会让 老数据(default 主题迁过来的商品)丢内容。 */}} {{$spec := index .Content.Ext "spec"}} {{if $spec}}

{{$spec}}

{{end}} {{/* 外贸交易条款表。 外贸买家看详情页的顺序是:单价 → MOQ → 交期 → 贸易条款。 把这四项 + 认证/OEM/包装放在购买区正上方, 买家不用翻正文就能把「能不能做、怎么做」判断完。 ⚠️ 这里刻意**不做规格选择器**:本版本的商品模型没有多规格 (Sku 只是货号,不参与交易),做一个能点但不进订单的选择器 等于骗用户 —— 他选了 6500K,订单里却没有这个信息。 ⚠️ `spec` 那段自由文本也保留:运营常用它写一句卖点,删了会让 老数据(default 主题迁过来的商品)丢内容。 */}} {{$moq := index .Content.Ext "moq"}} {{$lead := index .Content.Ext "lead_time"}} {{$port := index .Content.Ext "port"}} {{$payment := index .Content.Ext "payment"}} {{$cert := index .Content.Ext "cert"}} {{$oem := index .Content.Ext "oem"}} {{$packing := index .Content.Ext "packing"}} {{if or $moq $lead $port $payment $cert $oem $packing}}

Trade information

{{if $moq}}
MOQ {{$moq}}
{{end}} {{if $lead}}
Lead time {{$lead}}
{{end}} {{if $port}}
Shipment port {{$port}}
{{end}} {{if $payment}}
Payment terms {{$payment}}
{{end}} {{if $cert}}
Certification {{$cert}}
{{end}} {{if $oem}}
OEM / ODM {{$oem}}
{{end}} {{if $packing}}
Packing {{$packing}}
{{end}}
{{/* 产品目录:外贸站的刚需入口,链接走主题数据,没有就不显示 */}} {{with index $.ThemesExt "catalog_url"}} Download catalogue → {{end}}
{{end}} {{end}}

{{.Content.Description}}

{{/* SPU 复合选择器(京东式,2026-10-08)。 spu 字段只做 **id 关联**(索引查询起点);规格维度 = 栏目字段模型里 indexed 的 ext 属性字段,可选值 = 组内商品在这些字段上的取值**并集**。 点击属性组合 → 前端匹配出对应商品 id → **就地**切换标题/相册/价格/库存/ 加购 id,页面不跳转。全量变体数据通过 JSON 数据岛一次性下发。 服务端先渲染初始按钮态(当前商品的属性值高亮),JS 接管后续交互。 🚨 数据岛必须直接 {{.}}(结构体):html/template 在 script 标签上下文 会把结构体序列化成 JSON 对象字面量;若包一层 Json 函数(返回字符串), 字符串会被再包一层引号并转义,JSON.parse 出来是 string 不是对象。 */}} {{with .Content.SpuPicker}}
{{range .Dimensions}}
{{$dk := .Key}}
{{if .Label}}{{.Label}}{{else}}{{.Key}}{{end}}
{{range .Values}} {{if or (eq $dk "color") (eq $dk "cct")}} {{else}} {{end}} {{end}}
{{end}}
{{end}} {{/* 购买区。 ⚠️ 售罄判定必须用 Content.IsSoldOut —— 它内部看的是 StockLimit 标记位, 不能写成「Stock == 0 即不限量」:限量商品卖到 0 之后那样判会显示成 「不限量」,用户点进去却买不了。 🚨 2026-10-06 加了商城开关判断,三态不能混: · 商城关闭(.ShopEnabled=false)→ 整块购买区不渲染,只留「立即咨询」; 商城三页(/cart /checkout /orders)此时本身是 404,渲染出加购按钮 等于「按钮在、点下去 404」,比不显示更糟。 · 商城开着但售罄 → 仍显示「已售罄」(这是商品状态,与商城开关无关)。 · 商城开着且有货 → 正常显示数量选择 + 加入购物车 + 查看购物车。 顺序上先判商城关闭、后判售罄:两者同时成立时,「商城没开」对用户更有意义。 */}} {{if not .ShopEnabled}} {{/* 商城关闭:不给「加购」入口,改为引导咨询 —— 页面仍可作为商品介绍展示。 */}}
Online ordering is closed Request a quote →
{{else}}
{{if .Content.IsSoldOut}}
Temporarily out of stock — contact us for a restock schedule
{{else}}
{{/* 限量商品的 max 用 Stock,不限量不给 max(HTML 上限变成无限制)。 条件写「StockLimit != 2」而不是「== 1」:模型默认值是 1, 而老数据行(迁移前建的)该列可能为 0,按 ==1 判断会让它们 意外走进限量分支。 */}}
{{/* 「查看购物车(N)」。 🚨 N 用 span 包起来并给 id:它是服务端渲染的快照,加购后必须由 js.html 的 VMCartBadge 同步 —— 同一个页面上头栏角标变了、 这个数字没变,用户会以为加购没生效。 */}} View cart({{if .Cart}}{{.Cart.TotalQty}}{{end}})
{{/* 购买区信任集群:对标里 CTA 附近 3 条图标化承诺横排,比整段文字更能促决策 */}}
  • 验货合格后发货
  • 报关单据齐全
  • 支持第三方验厂

{{if ne .Content.StockLimit 2}}{{.Content.Stock}} in stock{{else}}In stock{{end}} {{if gt .Content.Sales 0}} · {{.Content.Sales}} sold{{end}}

{{end}} {{/* 加购反馈区:只在「有货可加购」时存在(ID 被上面那段 JS 监听)。 */}}

{{end}} Request a quote

Product details

{{.Content.Content|Str2Html}}
{{$albums := .Content.Albums}} {{if and $albums (ne (index $albums 0) "[]")}}

Gallery

{{range $albums}} {{if and . (ne . "[]")}}
{{$.Content.Title}} photo
{{end}} {{end}}
{{end}} {{if .Content.Tags}}

Tags

{{range .Content.Tags}} {{.Name}} {{end}}
{{end}}

You may also like

{{$related := Related .Content.Id 4}} {{if $related}}
{{range $related}}
{{if .Img}}
{{.Title}}
{{end}}
{{end}}
{{end}}
{{end}} {{include "footer.html"}} {{include "js.html"}} {{if and .Content .Content.SpuPicker}} {{end}} {{/* vv-pdp-deepened */}}