Rematch catalog data to ecommerce source
23099
app/catalog-data.ts
@@ -1,93 +0,0 @@
|
|||||||
import type { CatalogProduct } from "./catalog-data";
|
|
||||||
|
|
||||||
// The ecommerce image archive groups products by family rather than by the
|
|
||||||
// individual model code used in the PDF catalog. These are the corresponding
|
|
||||||
// family-level main images copied into public/catalog-products/source-main.
|
|
||||||
const SOURCE_MAIN_IMAGES = {
|
|
||||||
"1004": "/catalog-products/source-main/1004-main.png",
|
|
||||||
"258": "/catalog-products/source-main/258-main.jpg",
|
|
||||||
"259": "/catalog-products/source-main/259-main.jpg",
|
|
||||||
"266": "/catalog-products/source-main/266-main.jpg",
|
|
||||||
"267": "/catalog-products/source-main/267-main.jpg",
|
|
||||||
"268": "/catalog-products/source-main/268-main.jpg",
|
|
||||||
"270": "/catalog-products/source-main/270-main.jpg",
|
|
||||||
"271": "/catalog-products/source-main/271-main.jpg",
|
|
||||||
"272": "/catalog-products/source-main/272-main.jpg",
|
|
||||||
"273": "/catalog-products/source-main/273-main.jpg",
|
|
||||||
"274": "/catalog-products/source-main/274-main.jpg",
|
|
||||||
"275": "/catalog-products/source-main/275-main.jpg",
|
|
||||||
"276": "/catalog-products/source-main/276-main.jpg",
|
|
||||||
"308": "/catalog-products/source-main/308-main.png",
|
|
||||||
"309": "/catalog-products/source-main/309-main.png",
|
|
||||||
"310": "/catalog-products/source-main/310-main.png",
|
|
||||||
"311": "/catalog-products/source-main/311-main.png",
|
|
||||||
"313": "/catalog-products/source-main/313-main.png",
|
|
||||||
} as const;
|
|
||||||
|
|
||||||
type SourceImageKey = keyof typeof SOURCE_MAIN_IMAGES;
|
|
||||||
|
|
||||||
function hasWeight(name: string, grams: string) {
|
|
||||||
return new RegExp(`${grams}\\s*(?:g|克)`, "i").test(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getGearSeries(name: string) {
|
|
||||||
if (/半金属/.test(name)) return "semi";
|
|
||||||
if (/全金属|金属/.test(name)) return "metal";
|
|
||||||
if (/塑胶|塑料/.test(name)) return "plastic";
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSmallServoImage(name: string): string | null {
|
|
||||||
if (hasWeight(name, "1\\.7")) return SOURCE_MAIN_IMAGES["1004"];
|
|
||||||
|
|
||||||
const gearSeries = getGearSeries(name);
|
|
||||||
if (hasWeight(name, "2") && gearSeries === "plastic") return SOURCE_MAIN_IMAGES["272"];
|
|
||||||
if (hasWeight(name, "3\\.7") && gearSeries === "plastic") return SOURCE_MAIN_IMAGES["271"];
|
|
||||||
|
|
||||||
if (hasWeight(name, "9")) {
|
|
||||||
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["266"];
|
|
||||||
if (gearSeries === "semi") return SOURCE_MAIN_IMAGES["259"];
|
|
||||||
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["258"];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasWeight(name, "17")) {
|
|
||||||
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["274"];
|
|
||||||
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["273"];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasWeight(name, "25")) {
|
|
||||||
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["276"];
|
|
||||||
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["275"];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hasWeight(name, "37")) {
|
|
||||||
if (gearSeries === "metal") return SOURCE_MAIN_IMAGES["270"];
|
|
||||||
if (gearSeries === "semi") return SOURCE_MAIN_IMAGES["268"];
|
|
||||||
if (gearSeries === "plastic") return SOURCE_MAIN_IMAGES["267"];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getBrickServoImage(name: string): string | null {
|
|
||||||
if (name.includes("3x3x3")) return SOURCE_MAIN_IMAGES["311"];
|
|
||||||
if (name.includes("3x3x7")) return SOURCE_MAIN_IMAGES["310"];
|
|
||||||
if (name.includes("3x7x5")) return SOURCE_MAIN_IMAGES["309"];
|
|
||||||
if (name.includes("6x6x5")) return SOURCE_MAIN_IMAGES["308"];
|
|
||||||
if (name.includes("11x5x4")) return SOURCE_MAIN_IMAGES["313"];
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getCatalogProductImage(product: CatalogProduct) {
|
|
||||||
if (product.category === "积木舵机") {
|
|
||||||
return getBrickServoImage(product.name) ?? product.image;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (product.category === "标准舵机" || product.category === "异形舵机") {
|
|
||||||
return getSmallServoImage(product.name) ?? product.image;
|
|
||||||
}
|
|
||||||
|
|
||||||
return product.image;
|
|
||||||
}
|
|
||||||
|
|
||||||
export const CATALOG_SOURCE_IMAGE_KEYS: SourceImageKey[] = Object.keys(SOURCE_MAIN_IMAGES) as SourceImageKey[];
|
|
||||||
@@ -242,7 +242,7 @@ select:focus, input:focus, textarea:focus { border-color: var(--blue); box-shado
|
|||||||
.section-heading > p { max-width: 480px; margin: 0; color: #6e7a8e; line-height: 1.8; font-size: 13px; }
|
.section-heading > p { max-width: 480px; margin: 0; color: #6e7a8e; line-height: 1.8; font-size: 13px; }
|
||||||
.catalog-summary {
|
.catalog-summary {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: repeat(7, 1fr);
|
grid-template-columns: repeat(5, 1fr);
|
||||||
gap: 9px;
|
gap: 9px;
|
||||||
margin-bottom: 22px;
|
margin-bottom: 22px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,17 +11,17 @@ export async function generateMetadata(): Promise<Metadata> {
|
|||||||
return {
|
return {
|
||||||
metadataBase,
|
metadataBase,
|
||||||
title: "高徳乐 AI 舵机选型助手",
|
title: "高徳乐 AI 舵机选型助手",
|
||||||
description: "高徳乐280个产品型号完整目录,支持搜索筛选、AI舵机初选与样品申请。",
|
description: "高徳乐商城536款产品资料,支持产品参数搜索、AI舵机初选与样品申请。",
|
||||||
openGraph: {
|
openGraph: {
|
||||||
title: "高徳乐 AI 舵机选型助手",
|
title: "高徳乐 AI 舵机选型助手",
|
||||||
description: "280个型号完整目录。3分钟找到适合你的舵机,AI初选,工程师复核。",
|
description: "536款商城产品完整目录。3分钟找到适合你的舵机,AI初选,工程师复核。",
|
||||||
images: [{ url: new URL("/og.png", metadataBase).toString(), width: 1200, height: 630 }],
|
images: [{ url: new URL("/og.png", metadataBase).toString(), width: 1200, height: 630 }],
|
||||||
type: "website",
|
type: "website",
|
||||||
},
|
},
|
||||||
twitter: {
|
twitter: {
|
||||||
card: "summary_large_image",
|
card: "summary_large_image",
|
||||||
title: "高徳乐 AI 舵机选型助手",
|
title: "高徳乐 AI 舵机选型助手",
|
||||||
description: "3分钟,找到适合你的舵机。",
|
description: "高徳乐商城产品资料与 AI 舵机选型助手。",
|
||||||
images: [new URL("/og.png", metadataBase).toString()],
|
images: [new URL("/og.png", metadataBase).toString()],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
87
app/page.tsx
@@ -3,15 +3,9 @@
|
|||||||
import { FormEvent, useMemo, useState } from "react";
|
import { FormEvent, useMemo, useState } from "react";
|
||||||
import {
|
import {
|
||||||
CATALOG_COUNTS,
|
CATALOG_COUNTS,
|
||||||
CATALOG_PRODUCTS as RAW_CATALOG_PRODUCTS,
|
CATALOG_PRODUCTS,
|
||||||
type CatalogProduct,
|
type CatalogProduct,
|
||||||
} from "./catalog-data";
|
} from "./catalog-data";
|
||||||
import { getCatalogProductImage } from "./catalog-image-map";
|
|
||||||
|
|
||||||
const CATALOG_PRODUCTS = RAW_CATALOG_PRODUCTS.map((product) => ({
|
|
||||||
...product,
|
|
||||||
image: getCatalogProductImage(product),
|
|
||||||
}));
|
|
||||||
|
|
||||||
type Requirements = {
|
type Requirements = {
|
||||||
application: string;
|
application: string;
|
||||||
@@ -40,12 +34,10 @@ const APPLICATIONS = [
|
|||||||
|
|
||||||
const PRIMARY_CATALOG_CATEGORIES = [
|
const PRIMARY_CATALOG_CATEGORIES = [
|
||||||
"标准舵机",
|
"标准舵机",
|
||||||
"异形舵机",
|
|
||||||
"全金属舵机",
|
|
||||||
"大扭矩舵机",
|
|
||||||
"积木舵机",
|
"积木舵机",
|
||||||
|
"舵盘配件",
|
||||||
"标准齿轮箱",
|
"标准齿轮箱",
|
||||||
"翻盖电机",
|
"精密齿轮配件",
|
||||||
];
|
];
|
||||||
|
|
||||||
const CATALOG_FILTER_CATEGORIES = ["全部产品", ...PRIMARY_CATALOG_CATEGORIES, "静音舵机"];
|
const CATALOG_FILTER_CATEGORIES = ["全部产品", ...PRIMARY_CATALOG_CATEGORIES, "静音舵机"];
|
||||||
@@ -60,6 +52,13 @@ const FEATURED_SPEC_ORDER = [
|
|||||||
"寿命",
|
"寿命",
|
||||||
"产品尺寸",
|
"产品尺寸",
|
||||||
"外形尺寸",
|
"外形尺寸",
|
||||||
|
"空载速度",
|
||||||
|
"材质",
|
||||||
|
"模数",
|
||||||
|
"齿数",
|
||||||
|
"孔径",
|
||||||
|
"重量",
|
||||||
|
"参考单价",
|
||||||
];
|
];
|
||||||
|
|
||||||
function getFeaturedSpecs(product: CatalogProduct) {
|
function getFeaturedSpecs(product: CatalogProduct) {
|
||||||
@@ -69,20 +68,32 @@ function getFeaturedSpecs(product: CatalogProduct) {
|
|||||||
.map((label) => [label, product.specs[label]] as const);
|
.map((label) => [label, product.specs[label]] as const);
|
||||||
}
|
}
|
||||||
|
|
||||||
const SERVO_CATEGORIES = ["标准舵机", "异形舵机", "全金属舵机", "大扭矩舵机", "积木舵机"];
|
const SERVO_CATEGORIES = ["标准舵机", "积木舵机"];
|
||||||
const SILENT_SERVO_CATEGORY = "静音舵机";
|
const SILENT_SERVO_CATEGORY = "静音舵机";
|
||||||
const CUSTOM_SERVO_CATEGORY = "非标准舵机定制";
|
const CUSTOM_SERVO_CATEGORY = "非标准舵机定制";
|
||||||
const TORQUE_MIN = 0.09;
|
const TORQUE_MIN = 0.09;
|
||||||
const TORQUE_MAX = 920;
|
const TORQUE_MAX = Math.max(
|
||||||
const TORQUE_PRESETS = [0.1, 1, 5, 20, 100, 300, 920];
|
TORQUE_MIN,
|
||||||
|
...CATALOG_PRODUCTS.filter((product) => SERVO_CATEGORIES.includes(product.category))
|
||||||
|
.map((product) => product.torqueValue ?? 0),
|
||||||
|
);
|
||||||
|
const TORQUE_PRESETS = [...new Set([
|
||||||
|
0.1,
|
||||||
|
1,
|
||||||
|
5,
|
||||||
|
20,
|
||||||
|
100,
|
||||||
|
300,
|
||||||
|
TORQUE_MAX,
|
||||||
|
].filter((value) => value <= TORQUE_MAX))];
|
||||||
|
|
||||||
const APPLICATION_CATEGORY_MAP: Record<string, string[]> = {
|
const APPLICATION_CATEGORY_MAP: Record<string, string[]> = {
|
||||||
AI毛绒: ["标准舵机", "异形舵机"],
|
AI毛绒: ["标准舵机"],
|
||||||
智能玩具: ["标准舵机", "异形舵机", "积木舵机"],
|
智能玩具: ["标准舵机", "积木舵机"],
|
||||||
"教育/积木": ["积木舵机", "标准舵机"],
|
"教育/积木": ["积木舵机", "标准舵机"],
|
||||||
微型机器人: ["标准舵机", "异形舵机", "全金属舵机"],
|
微型机器人: ["标准舵机", "积木舵机"],
|
||||||
"云台/航模": ["标准舵机", "全金属舵机"],
|
"云台/航模": ["标准舵机"],
|
||||||
工业设备: ["全金属舵机", "大扭矩舵机", "异形舵机"],
|
工业设备: ["标准舵机", "积木舵机"],
|
||||||
};
|
};
|
||||||
|
|
||||||
function parseNumbers(value = "") {
|
function parseNumbers(value = "") {
|
||||||
@@ -97,7 +108,7 @@ function isSilentServo(product: CatalogProduct) {
|
|||||||
const SILENT_SERVO_COUNT = CATALOG_PRODUCTS.filter(isSilentServo).length;
|
const SILENT_SERVO_COUNT = CATALOG_PRODUCTS.filter(isSilentServo).length;
|
||||||
|
|
||||||
function getCategoryCount(category: string) {
|
function getCategoryCount(category: string) {
|
||||||
return category === SILENT_SERVO_CATEGORY ? SILENT_SERVO_COUNT : CATALOG_COUNTS[category];
|
return category === SILENT_SERVO_CATEGORY ? SILENT_SERVO_COUNT : CATALOG_COUNTS[category] ?? 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
type ProductScale = {
|
type ProductScale = {
|
||||||
@@ -214,10 +225,10 @@ const SELECTOR_PRODUCTS = CATALOG_PRODUCTS.filter((product) =>
|
|||||||
weight: inferWeight(product),
|
weight: inferWeight(product),
|
||||||
isSilent: isSilentServo(product),
|
isSilent: isSilentServo(product),
|
||||||
gear: classifyGear(product.specs["齿轮材质"]),
|
gear: classifyGear(product.specs["齿轮材质"]),
|
||||||
angle: product.specs["可操作角度"] ?? product.specs["操作角度范围"] ?? "",
|
angle: product.specs["可操作角度"] ?? "",
|
||||||
control,
|
control,
|
||||||
speed: product.specs["空载速度"] ?? product.specs["转动速度"] ?? "",
|
speed: product.specs["空载速度"] ?? "",
|
||||||
size: product.specs["产品尺寸"] ?? product.specs["外形尺寸"] ?? "",
|
size: product.specs["产品尺寸"] ?? "",
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -349,6 +360,8 @@ export default function Home() {
|
|||||||
product.name,
|
product.name,
|
||||||
product.code,
|
product.code,
|
||||||
product.category,
|
product.category,
|
||||||
|
product.subCategory,
|
||||||
|
product.sourceCategory,
|
||||||
...Object.keys(product.specs),
|
...Object.keys(product.specs),
|
||||||
...Object.values(product.specs),
|
...Object.values(product.specs),
|
||||||
]
|
]
|
||||||
@@ -429,8 +442,8 @@ export default function Home() {
|
|||||||
<a href="#products" className="text-action">查看能力范围</a>
|
<a href="#products" className="text-action">查看能力范围</a>
|
||||||
</div>
|
</div>
|
||||||
<div className="trust-row">
|
<div className="trust-row">
|
||||||
<span><b>280</b> 个产品型号</span>
|
<span><b>{CATALOG_PRODUCTS.length}</b> 个商城产品</span>
|
||||||
<span><b>0.09–920</b> kgf·cm</span>
|
<span><b>{formatTorque(TORQUE_MIN)}–{formatTorque(TORQUE_MAX)}</b> kgf·cm</span>
|
||||||
<span><b>48h</b> 方案响应</span>
|
<span><b>48h</b> 方案响应</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -492,7 +505,7 @@ export default function Home() {
|
|||||||
<div className="question-step">
|
<div className="question-step">
|
||||||
<p className="step-kicker">第二步 · 核心参数</p>
|
<p className="step-kicker">第二步 · 核心参数</p>
|
||||||
<h2>输入舵机的关键技术要求</h2>
|
<h2>输入舵机的关键技术要求</h2>
|
||||||
<p className="step-help">已覆盖243款舵机:0.09–920 kgf·cm,并按官方目录额定电压精确筛选。</p>
|
<p className="step-help">已覆盖{SELECTOR_PRODUCTS.length}款可选舵机:{TORQUE_MIN}–{TORQUE_MAX} kgf·cm,并按商城资料额定电压筛选。</p>
|
||||||
<div className="two-fields compact-fields">
|
<div className="two-fields compact-fields">
|
||||||
<label className="select-field">
|
<label className="select-field">
|
||||||
<span>目标产品系列</span>
|
<span>目标产品系列</span>
|
||||||
@@ -500,7 +513,7 @@ export default function Home() {
|
|||||||
value={requirements.category}
|
value={requirements.category}
|
||||||
onChange={(event) => update("category", event.target.value)}
|
onChange={(event) => update("category", event.target.value)}
|
||||||
>
|
>
|
||||||
<option value="全部舵机">全部舵机(243款)</option>
|
<option value="全部舵机">全部舵机({SELECTOR_PRODUCTS.length}款)</option>
|
||||||
<optgroup label="官方产品系列">
|
<optgroup label="官方产品系列">
|
||||||
{SERVO_CATEGORIES.map((category) => (
|
{SERVO_CATEGORIES.map((category) => (
|
||||||
<option key={category} value={category}>
|
<option key={category} value={category}>
|
||||||
@@ -560,7 +573,11 @@ export default function Home() {
|
|||||||
value={torqueToSlider(requirements.torque)}
|
value={torqueToSlider(requirements.torque)}
|
||||||
onChange={(event) => update("torque", sliderToTorque(Number(event.target.value)))}
|
onChange={(event) => update("torque", sliderToTorque(Number(event.target.value)))}
|
||||||
/>
|
/>
|
||||||
<div className="range-scale"><span>0.09</span><span>1</span><span>10</span><span>100</span><span>920</span></div>
|
<div className="range-scale">
|
||||||
|
{[TORQUE_MIN, 1, 10, 100, TORQUE_MAX]
|
||||||
|
.filter((value, index, values) => value <= TORQUE_MAX && values.indexOf(value) === index)
|
||||||
|
.map((value) => <span key={value}>{formatTorque(value)}</span>)}
|
||||||
|
</div>
|
||||||
<div className="torque-presets" aria-label="常用扭矩快捷值">
|
<div className="torque-presets" aria-label="常用扭矩快捷值">
|
||||||
{TORQUE_PRESETS.map((torque) => (
|
{TORQUE_PRESETS.map((torque) => (
|
||||||
<button
|
<button
|
||||||
@@ -820,7 +837,7 @@ export default function Home() {
|
|||||||
{match.reasons.slice(0, 2).map((reason) => <li key={reason}>✓ {reason}</li>)}
|
{match.reasons.slice(0, 2).map((reason) => <li key={reason}>✓ {reason}</li>)}
|
||||||
</ul>
|
</ul>
|
||||||
<div className="source-line">
|
<div className="source-line">
|
||||||
<span>官方目录型号</span>
|
<span>商城资料产品</span>
|
||||||
<strong>{match.product.category}</strong>
|
<strong>{match.product.category}</strong>
|
||||||
<small>价格与交期按用量确认</small>
|
<small>价格与交期按用量确认</small>
|
||||||
</div>
|
</div>
|
||||||
@@ -891,9 +908,9 @@ export default function Home() {
|
|||||||
<div className="section-heading">
|
<div className="section-heading">
|
||||||
<div>
|
<div>
|
||||||
<p className="eyebrow"><span /> 官方产品目录 · 2026.06</p>
|
<p className="eyebrow"><span /> 官方产品目录 · 2026.06</p>
|
||||||
<h2>完整收录280个产品型号</h2>
|
<h2>完整收录{CATALOG_PRODUCTS.length}个商城产品</h2>
|
||||||
</div>
|
</div>
|
||||||
<p>官方目录按七个主分类收录280款产品;静音舵机作为特色子集筛选,不重复计入产品总数。</p>
|
<p>产品数据、分类、参数与主图均来自高徳乐商城产品资料;舵机选型仅从其中可用于选型的舵机系列中推荐。</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="catalog-summary" aria-label="产品分类统计">
|
<div className="catalog-summary" aria-label="产品分类统计">
|
||||||
@@ -912,7 +929,7 @@ export default function Home() {
|
|||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<p className="catalog-category-note">分类已按官方目录表头及业务规则复核 · 七个主分类合计280款 · 静音舵机11款为标准舵机特色子集</p>
|
<p className="catalog-category-note">商城资料共 {CATALOG_PRODUCTS.length} 款产品,包含舵机、舵盘配件、积木舵机、标准齿轮箱与精密齿轮配件;静音舵机为标准舵机特色子集。</p>
|
||||||
|
|
||||||
<div className="catalog-toolbar">
|
<div className="catalog-toolbar">
|
||||||
<label className="catalog-search">
|
<label className="catalog-search">
|
||||||
@@ -989,7 +1006,7 @@ export default function Home() {
|
|||||||
) : (
|
) : (
|
||||||
<span className="catalog-placeholder">GAUDELOT</span>
|
<span className="catalog-placeholder">GAUDELOT</span>
|
||||||
)}
|
)}
|
||||||
<small>{product.category}</small>
|
<small>{product.subCategory || product.category}</small>
|
||||||
<span className="catalog-zoom-hint">点击查看大图</span>
|
<span className="catalog-zoom-hint">点击查看大图</span>
|
||||||
</button>
|
</button>
|
||||||
<div className="catalog-card-body">
|
<div className="catalog-card-body">
|
||||||
@@ -1032,6 +1049,8 @@ export default function Home() {
|
|||||||
role="presentation"
|
role="presentation"
|
||||||
onMouseDown={() => setSelectedCatalogProduct(null)}
|
onMouseDown={() => setSelectedCatalogProduct(null)}
|
||||||
>
|
>
|
||||||
|
{/* Stop a click inside the dialog from closing the backdrop. */}
|
||||||
|
{/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}
|
||||||
<section
|
<section
|
||||||
className="catalog-modal"
|
className="catalog-modal"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
@@ -1057,7 +1076,7 @@ export default function Home() {
|
|||||||
<p className="step-kicker">{selectedCatalogProduct.category}</p>
|
<p className="step-kicker">{selectedCatalogProduct.category}</p>
|
||||||
<h2 id="catalog-modal-title">{selectedCatalogProduct.name}</h2>
|
<h2 id="catalog-modal-title">{selectedCatalogProduct.name}</h2>
|
||||||
<code>{selectedCatalogProduct.code}</code>
|
<code>{selectedCatalogProduct.code}</code>
|
||||||
<p className="catalog-source-note">官方产品目录第 {selectedCatalogProduct.page} 页</p>
|
<p className="catalog-source-note">商城资料编号 {selectedCatalogProduct.sourceId} · {selectedCatalogProduct.sourceCategory}</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="catalog-spec-table">
|
<div className="catalog-spec-table">
|
||||||
|
|||||||
BIN
public/catalog-products/source-main/1000.jpg
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
public/catalog-products/source-main/1003.jpg
Normal file
|
After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 271 KiB |
BIN
public/catalog-products/source-main/1004.jpg
Normal file
|
After Width: | Height: | Size: 163 KiB |
|
Before Width: | Height: | Size: 186 KiB |
BIN
public/catalog-products/source-main/258.jpg
Normal file
|
After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 173 KiB |
BIN
public/catalog-products/source-main/259.jpg
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
public/catalog-products/source-main/260.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 170 KiB |
BIN
public/catalog-products/source-main/266.jpg
Normal file
|
After Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 193 KiB |
BIN
public/catalog-products/source-main/267.jpg
Normal file
|
After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 188 KiB |
BIN
public/catalog-products/source-main/268.jpg
Normal file
|
After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 186 KiB |
BIN
public/catalog-products/source-main/270.jpg
Normal file
|
After Width: | Height: | Size: 145 KiB |
|
Before Width: | Height: | Size: 189 KiB |
BIN
public/catalog-products/source-main/271.jpg
Normal file
|
After Width: | Height: | Size: 148 KiB |
|
Before Width: | Height: | Size: 224 KiB |
BIN
public/catalog-products/source-main/272.jpg
Normal file
|
After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 169 KiB |
BIN
public/catalog-products/source-main/273.jpg
Normal file
|
After Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 186 KiB |
BIN
public/catalog-products/source-main/274.jpg
Normal file
|
After Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 179 KiB |
BIN
public/catalog-products/source-main/275.jpg
Normal file
|
After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 188 KiB |
BIN
public/catalog-products/source-main/276.jpg
Normal file
|
After Width: | Height: | Size: 144 KiB |
|
Before Width: | Height: | Size: 1.5 MiB |
BIN
public/catalog-products/source-main/308.jpg
Normal file
|
After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 1.3 MiB |
BIN
public/catalog-products/source-main/309.jpg
Normal file
|
After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 850 KiB |
BIN
public/catalog-products/source-main/310.jpg
Normal file
|
After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 1.4 MiB |
BIN
public/catalog-products/source-main/311.jpg
Normal file
|
After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 1.7 MiB |
BIN
public/catalog-products/source-main/313.jpg
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/catalog-products/source-main/329.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/catalog-products/source-main/330.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/catalog-products/source-main/331.jpg
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/catalog-products/source-main/332.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
public/catalog-products/source-main/333.jpg
Normal file
|
After Width: | Height: | Size: 57 KiB |
BIN
public/catalog-products/source-main/334.jpg
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
public/catalog-products/source-main/335.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/catalog-products/source-main/336.jpg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/catalog-products/source-main/337.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/catalog-products/source-main/338.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
public/catalog-products/source-main/339.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/catalog-products/source-main/340.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/catalog-products/source-main/341.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
public/catalog-products/source-main/342.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/catalog-products/source-main/343.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/catalog-products/source-main/344.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/catalog-products/source-main/345.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
public/catalog-products/source-main/346.jpg
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/catalog-products/source-main/347.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
public/catalog-products/source-main/348.jpg
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
public/catalog-products/source-main/349.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
public/catalog-products/source-main/350.jpg
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/catalog-products/source-main/351.jpg
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/catalog-products/source-main/352.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/catalog-products/source-main/353.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/catalog-products/source-main/354.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
public/catalog-products/source-main/355.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/catalog-products/source-main/356.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/catalog-products/source-main/358.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/catalog-products/source-main/359.jpg
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
public/catalog-products/source-main/360.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
public/catalog-products/source-main/361.jpg
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/catalog-products/source-main/362.jpg
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/catalog-products/source-main/363.jpg
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/catalog-products/source-main/364.jpg
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
public/catalog-products/source-main/365.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
public/catalog-products/source-main/366.jpg
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
public/catalog-products/source-main/367.jpg
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
public/catalog-products/source-main/368.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/catalog-products/source-main/369.jpg
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/catalog-products/source-main/370.jpg
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/catalog-products/source-main/371.jpg
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
public/catalog-products/source-main/372.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/catalog-products/source-main/373.jpg
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/catalog-products/source-main/374.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
public/catalog-products/source-main/375.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
public/catalog-products/source-main/376.jpg
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
public/catalog-products/source-main/377.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
public/catalog-products/source-main/378.jpg
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
public/catalog-products/source-main/379.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
public/catalog-products/source-main/380.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/catalog-products/source-main/381.jpg
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
public/catalog-products/source-main/382.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
public/catalog-products/source-main/383.jpg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
public/catalog-products/source-main/384.jpg
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
public/catalog-products/source-main/385.jpg
Normal file
|
After Width: | Height: | Size: 43 KiB |