From db5b6bb6c797a43e76f35e0a405093f59fc6bf21 Mon Sep 17 00:00:00 2001 From: hubian <908234780@qq.com> Date: Tue, 28 Apr 2026 12:05:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=90=8E=E5=8F=B0=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=89=80=E6=9C=89=E7=B1=BB=E5=88=AB=E6=95=B0=E6=8D=AE=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=AD=90=E7=B1=BB=E5=88=AB=E5=AD=97=E6=AE=B5=E5=92=8C?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/categories.json | 9 +- data/gpus.json | 12 ++- data/models.json | 9 +- templates/admin.html | 192 +++++++++++++++++++++++++++++++++++++------ 4 files changed, 192 insertions(+), 30 deletions(-) diff --git a/data/categories.json b/data/categories.json index 9975f21..4ec4869 100644 --- a/data/categories.json +++ b/data/categories.json @@ -366,8 +366,15 @@ "price" ], "name": "单反相机" + }, + { + "id": "90ce312b560d", + "name": "口袋云台相机", + "icon": "ri-folder-line", + "key_features": [], + "feature_labels": {} } ], - "updated_at": "2026-04-28 09:44:52" + "updated_at": "2026-04-28 10:55:02" } ] \ No newline at end of file diff --git a/data/gpus.json b/data/gpus.json index 8f46a20..8dfc06f 100644 --- a/data/gpus.json +++ b/data/gpus.json @@ -171,7 +171,10 @@ "raw_text": "据tweaktown报道,NVIDIA为中国市场定制的全新工作站显卡RTX 6000D近日迎来首度拆解。该卡搭载84GB GDDR7显存、19968个CUDA核心,采用被动散热设计,专为服务器机箱风道优化。\n\n\n相较于满血RTX PRO 6000(96GB GDDR7/512-bit),中国特供版RTX 6000D在规格上进行了多处调整。国内团队“技数犬”发布了拆解视频。\n\n据了解,RTX 6000D为无风扇被动散热设计,完全依靠机箱气流降温。\n\nRTX 6000D搭载28颗VRAM模块,总计84GB GDDR7显存,显存总线为448位(相比RTX PRO 6000的96GB/512位有所减少)。\n\nRTX 6000D GPU 核心为156 SM单元,19,968个CUDA核心,比RTX PRO 6000少约17%。\n\nRTX 6000D核心频率为2430MHz(RTX PRO 6000为2600MHz),TDP暂未公布。性能方面,RTX 6000D在Geekbench 6 OpenCL测试中获得390,656分,低于RTX PRO 6000的45–50万分。", "currency": "CNY", "price_usd": 45000, - "updated_at": "2026-04-20 18:28:10" + "updated_at": "2026-04-28 11:56:48", + "subcategory_id": "professional", + "views": 0, + "images": [] }, { "name": "RTX PRO 6000", @@ -185,7 +188,10 @@ "cuda_cores": 24064, "currency": "CNY", "price_usd": 65000, - "updated_at": "2026-04-20 18:28:23", - "manufacturer": "NVIDIA" + "updated_at": "2026-04-28 11:56:38", + "manufacturer": "NVIDIA", + "subcategory_id": "professional", + "views": 0, + "images": [] } ] \ No newline at end of file diff --git a/data/models.json b/data/models.json index 9e9613a..37d0142 100644 --- a/data/models.json +++ b/data/models.json @@ -9,13 +9,16 @@ "input_price": 0.03, "output_price": 0.06, "mmlu": 86.4, - "humaneval": 67.0, + "humaneval": 67, "is_open_source": false, "license": "Proprietary", "description": "OpenAI最强大的多模态大模型", "created_at": "2024-01-01", - "updated_at": "2026-04-28 10:09:47", - "raw_text": "\nGPT-4 Turbo version with 128K context length, price is $10 per 1M input tokens" + "updated_at": "2026-04-28 11:57:02", + "raw_text": "\nGPT-4 Turbo version with 128K context length, price is $10 per 1M input tokens", + "subcategory_id": "chat", + "views": 0, + "images": [] }, { "id": "gpt4turbo", diff --git a/templates/admin.html b/templates/admin.html index d278fa9..b71f5fb 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -159,6 +159,11 @@ +
+ 子类别筛选: + +
+
加载中...
@@ -173,6 +178,11 @@ +
+ 子类别筛选: + +
+
@@ -180,18 +190,17 @@ + - - - +
置顶 名称 厂商子类别 参数量 上下文 类型 发布日期 热度创建时间更新时间 显示 操作
加载中...
加载中...
@@ -205,6 +214,11 @@ +
+ 子类别筛选: + +
+
@@ -212,18 +226,17 @@ + - - - +
置顶 名称 厂商子类别 显存 架构 价格 发布日期 热度创建时间更新时间 显示 操作
加载中...
加载中...
@@ -237,6 +250,11 @@ +
+ 子类别筛选: + +
+
@@ -244,18 +262,17 @@ + - - - +
置顶 名称 厂商子类别 核心/线程 主频 价格 发布日期 热度创建时间更新时间 显示 操作
加载中...
加载中...
@@ -448,11 +465,46 @@ let categories = []; let currentFilter = ''; let dynamicCategoryId = ''; + let modelSubcategoryFilter = ''; + let gpuSubcategoryFilter = ''; + let cpuSubcategoryFilter = ''; + let dynamicSubcategoryFilter = ''; // 生成随机ID(12位十六进制) function generateId() { return Math.random().toString(16).slice(2, 8) + Math.random().toString(16).slice(2, 8); } + + // 获取子类别名称 + function getSubcategoryName(categoryId, subcategoryId) { + const cat = categories.find(c => c.id === categoryId); + if (!cat || !cat.subcategories) return '-'; + const sub = cat.subcategories.find(s => s.id === subcategoryId); + return sub ? sub.name : '-'; + } + + // 获取子类别图标 + function getSubcategoryIcon(categoryId, subcategoryId) { + const cat = categories.find(c => c.id === categoryId); + if (!cat || !cat.subcategories) return ''; + const sub = cat.subcategories.find(s => s.id === subcategoryId); + return sub ? sub.icon : ''; + } + + // 渲染子类别筛选按钮 + function renderSubcategoryFilters(categoryId, containerId, filterFunction) { + const cat = categories.find(c => c.id === categoryId); + const container = document.getElementById(containerId); + if (!cat || !cat.subcategories || cat.subcategories.length === 0) { + container.innerHTML = ''; + return; + } + container.innerHTML = cat.subcategories.map(sub => ` + + `).join(''); + } const colorMap = { blue: 'bg-blue-100 text-blue-600', @@ -582,6 +634,7 @@ // 显示动态分类数据 async function showDynamicCategory(categoryId) { dynamicCategoryId = categoryId; + dynamicSubcategoryFilter = ''; // 重置筛选 const cat = categories.find(c => c.id === categoryId); document.querySelectorAll('section').forEach(s => s.classList.add('hidden')); @@ -599,21 +652,44 @@ document.getElementById('dynamic-title').textContent = cat.name + '管理'; + // 渲染子类别筛选按钮 + if (cat.subcategories && cat.subcategories.length > 0) { + document.getElementById('dynamic-filter-area').classList.remove('hidden'); + renderSubcategoryFilters(categoryId, 'dynamic-subcategory-filters', 'filterDynamicBySubcategory'); + } else { + document.getElementById('dynamic-filter-area').classList.add('hidden'); + } + // 加载该分类的数据(后台显示全部,包括隐藏的) const res = await fetch(`/api/items/${categoryId}?all=1`); - const items = await res.json(); + let items = await res.json(); + + // 子类别筛选 + if (dynamicSubcategoryFilter) { + items = items.filter(i => i.subcategory_id === dynamicSubcategoryFilter); + } if (items.length === 0) { document.getElementById('admin-dynamic-table').innerHTML = '暂无数据,点击上方"添加数据"按钮添加'; } else { - const keys = Object.keys(items[0]).filter(k => !['id', 'created_at', 'updated_at', 'visible', 'raw_text'].includes(k)); + const keys = Object.keys(items[0]).filter(k => !['id', 'created_at', 'updated_at', 'visible', 'raw_text', 'subcategory_id'].includes(k)); let html = ``; + // 添加子类别列 + if (cat.subcategories && cat.subcategories.length > 0) { + html += `子类别`; + } keys.forEach(k => { html += `${k}`; }); html += `显示`; html += `操作`; items.forEach(item => { html += ``; + // 子类别显示 + if (cat.subcategories && cat.subcategories.length > 0) { + const subName = getSubcategoryName(categoryId, item.subcategory_id); + const subIcon = getSubcategoryIcon(categoryId, item.subcategory_id); + html += `${item.subcategory_id ? `${subName}` : '-'}`; + } keys.forEach(k => { html += `${item[k] || '-'}`; }); html += `