Add silent servo category
This commit is contained in:
32
app/page.tsx
32
app/page.tsx
@@ -39,6 +39,7 @@ const CATALOG_CATEGORIES = [
|
||||
"全金属舵机",
|
||||
"大扭矩舵机",
|
||||
"积木舵机",
|
||||
"静音舵机",
|
||||
"标准齿轮箱",
|
||||
"翻盖电机",
|
||||
];
|
||||
@@ -63,6 +64,8 @@ function getFeaturedSpecs(product: CatalogProduct) {
|
||||
}
|
||||
|
||||
const SERVO_CATEGORIES = ["标准舵机", "异形舵机", "全金属舵机", "大扭矩舵机", "积木舵机"];
|
||||
const SILENT_SERVO_CATEGORY = "静音舵机";
|
||||
const SELECTOR_CATEGORIES = [...SERVO_CATEGORIES, SILENT_SERVO_CATEGORY];
|
||||
const TORQUE_MIN = 0.09;
|
||||
const TORQUE_MAX = 920;
|
||||
const TORQUE_PRESETS = [0.1, 1, 5, 20, 100, 300, 920];
|
||||
@@ -80,6 +83,17 @@ function parseNumbers(value = "") {
|
||||
return (value.match(/\d+(?:\.\d+)?/g) ?? []).map(Number);
|
||||
}
|
||||
|
||||
function isSilentServo(product: CatalogProduct) {
|
||||
return SERVO_CATEGORIES.includes(product.category) &&
|
||||
[product.name, ...Object.values(product.specs)].join(" ").includes("静音");
|
||||
}
|
||||
|
||||
const SILENT_SERVO_COUNT = CATALOG_PRODUCTS.filter(isSilentServo).length;
|
||||
|
||||
function getCategoryCount(category: string) {
|
||||
return category === SILENT_SERVO_CATEGORY ? SILENT_SERVO_COUNT : CATALOG_COUNTS[category];
|
||||
}
|
||||
|
||||
function inferWeight(product: CatalogProduct) {
|
||||
const listedWeight = parseNumbers(product.specs["重量"])[0];
|
||||
if (Number.isFinite(listedWeight)) return listedWeight;
|
||||
@@ -152,6 +166,7 @@ const SELECTOR_PRODUCTS = CATALOG_PRODUCTS.filter((product) =>
|
||||
voltageMin: voltageValues[0] ?? ratedVoltage,
|
||||
voltageMax: voltageValues.at(-1) ?? ratedVoltage,
|
||||
weight: inferWeight(product),
|
||||
isSilent: isSilentServo(product),
|
||||
gear: classifyGear(product.specs["齿轮材质"]),
|
||||
angle: product.specs["可操作角度"] ?? product.specs["操作角度范围"] ?? "",
|
||||
control,
|
||||
@@ -186,8 +201,9 @@ function getMatches(requirements: Requirements) {
|
||||
return SELECTOR_PRODUCTS.map((product) => {
|
||||
let score = 20;
|
||||
const reasons: string[] = [];
|
||||
const categoryOk =
|
||||
requirements.category === "全部舵机" || requirements.category === product.category;
|
||||
const categoryOk = requirements.category === "全部舵机" ||
|
||||
requirements.category === product.category ||
|
||||
(requirements.category === SILENT_SERVO_CATEGORY && product.isSilent);
|
||||
const torqueOk = product.torque >= requirements.torque;
|
||||
const voltageOk = requirements.voltage === product.ratedVoltage;
|
||||
const weightOk =
|
||||
@@ -275,7 +291,9 @@ export default function Home() {
|
||||
const query = catalogQuery.trim().toLowerCase();
|
||||
return CATALOG_PRODUCTS.filter((product) => {
|
||||
const matchesCategory =
|
||||
catalogCategory === "全部产品" || product.category === catalogCategory;
|
||||
catalogCategory === "全部产品" ||
|
||||
product.category === catalogCategory ||
|
||||
(catalogCategory === SILENT_SERVO_CATEGORY && isSilentServo(product));
|
||||
if (!matchesCategory) return false;
|
||||
if (!query) return true;
|
||||
const haystack = [
|
||||
@@ -427,9 +445,9 @@ export default function Home() {
|
||||
onChange={(event) => update("category", event.target.value)}
|
||||
>
|
||||
<option value="全部舵机">全部舵机(243款)</option>
|
||||
{SERVO_CATEGORIES.map((category) => (
|
||||
{SELECTOR_CATEGORIES.map((category) => (
|
||||
<option key={category} value={category}>
|
||||
{category}({CATALOG_COUNTS[category]}款)
|
||||
{category}({getCategoryCount(category)}款)
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
@@ -742,7 +760,7 @@ export default function Home() {
|
||||
<p className="eyebrow"><span /> 官方产品目录 · 2026.06</p>
|
||||
<h2>完整收录280个产品型号</h2>
|
||||
</div>
|
||||
<p>覆盖标准、异形、全金属、大扭矩和积木舵机,以及标准齿轮箱与翻盖电机。参数来自高徳乐官方产品型号表。</p>
|
||||
<p>覆盖标准、异形、静音、全金属、大扭矩和积木舵机,以及标准齿轮箱与翻盖电机。参数来自高徳乐官方产品型号表。</p>
|
||||
</div>
|
||||
|
||||
<div className="catalog-summary" aria-label="产品分类统计">
|
||||
@@ -756,7 +774,7 @@ export default function Home() {
|
||||
setCatalogLimit(24);
|
||||
}}
|
||||
>
|
||||
<strong>{CATALOG_COUNTS[category]}</strong>
|
||||
<strong>{getCategoryCount(category)}</strong>
|
||||
<span>{category}</span>
|
||||
</button>
|
||||
))}
|
||||
|
||||
Reference in New Issue
Block a user