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 += `
|