Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b473ae7205 | ||
|
|
dee20ca122 | ||
|
|
ea8165bbd8 | ||
|
|
2d5abe5975 | ||
|
|
9005a48bf3 |
+2042
-224
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,17 @@
|
||||
#!/bin/bash
|
||||
# param-hub 启动脚本(setsid 完全脱离终端,确保持久运行)
|
||||
APP_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
PID_FILE="$APP_DIR/app.pid"
|
||||
PYTHON="/home/hz1/miniconda3/envs/openclaw/bin/python3"
|
||||
cd "$APP_DIR"
|
||||
if [ -f "$PID_FILE" ]; then
|
||||
PID=$(cat "$PID_FILE")
|
||||
if ps -p $PID > /dev/null 2>&1; then
|
||||
echo "param-hub 已在运行 (PID: $PID)"
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
setsid nohup "$PYTHON" app.py > logs/app.log 2>&1 &
|
||||
echo $! > "$PID_FILE"
|
||||
sleep 2
|
||||
echo "param-hub 已启动 (PID: $(cat $PID_FILE))"
|
||||
+20
-7
@@ -507,6 +507,7 @@
|
||||
<div class="space-y-4">
|
||||
<div><label class="text-sm text-gray-600 mb-1 block">字段名 *</label><input type="text" id="field_key" class="w-full px-3 py-2 border rounded-lg" placeholder="如:context_length"></div>
|
||||
<div><label class="text-sm text-gray-600 mb-1 block">显示名 *</label><input type="text" id="field_label" class="w-full px-3 py-2 border rounded-lg" placeholder="如:上下文长度"></div>
|
||||
<div><label class="text-sm text-gray-600 mb-1 block">字段类别</label><input type="text" id="field_category" class="w-full px-3 py-2 border rounded-lg" placeholder="如:图形处理器芯片基础信息(参数分组,可为空)"></div>
|
||||
<div><label class="text-sm text-gray-600 mb-1 block">字段类型</label><select id="field_type" class="w-full px-3 py-2 border rounded-lg">
|
||||
<option value="text">文本</option>
|
||||
<option value="number">数字</option>
|
||||
@@ -1585,7 +1586,7 @@
|
||||
${imageUrls.map((url, idx) => `
|
||||
<div class="relative w-24 h-24 border rounded-lg overflow-hidden group">
|
||||
<img src="${url}" class="w-full h-full object-cover">
|
||||
<button onclick="removeImage(${idx})" class="absolute top-1 right-1 w-6 h-6 bg-red-500 text-white rounded-full opacity-0 group-hover:opacity-100 transition flex items-center justify-center">
|
||||
<button type="button" onclick="removeImage(${idx})" class="absolute top-1 right-1 w-6 h-6 bg-red-500 text-white rounded-full opacity-0 group-hover:opacity-100 transition flex items-center justify-center">
|
||||
<i class="ri-close-line"></i>
|
||||
</button>
|
||||
</div>
|
||||
@@ -1593,10 +1594,10 @@
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
<input type="file" id="imageInput" accept="image/*" multiple class="hidden" onchange="handleImageUpload(event, '${type}')">
|
||||
<button onclick="document.getElementById('imageInput').click()" class="px-4 py-2 bg-gray-100 text-gray-600 rounded-lg hover:bg-gray-200 text-sm">
|
||||
<button type="button" onclick="document.getElementById('imageInput').click()" class="px-4 py-2 bg-gray-100 text-gray-600 rounded-lg hover:bg-gray-200 text-sm">
|
||||
<i class="ri-image-add-line mr-1"></i>选择图片
|
||||
</button>
|
||||
<button onclick="pasteImageFromClipboard('${type}')'" class="px-4 py-2 bg-gray-100 text-gray-600 rounded-lg hover:bg-gray-200 text-sm">
|
||||
<button type="button" onclick="pasteImageFromClipboard('${type}')'" class="px-4 py-2 bg-gray-100 text-gray-600 rounded-lg hover:bg-gray-200 text-sm">
|
||||
<i class="ri-clipboard-line mr-1"></i>粘贴图片
|
||||
</button>
|
||||
</div>
|
||||
@@ -1842,10 +1843,10 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex gap-2 opacity-0 group-hover:opacity-100 transition">
|
||||
<button onclick="editSubcategory(${index})" class="px-2 py-1 text-blue-600 hover:bg-blue-50 rounded text-sm">
|
||||
<button type="button" onclick="editSubcategory(${index})" class="px-2 py-1 text-blue-600 hover:bg-blue-50 rounded text-sm">
|
||||
<i class="ri-edit-line"></i>
|
||||
</button>
|
||||
<button onclick="deleteSubcategory(${index})" class="px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm">
|
||||
<button type="button" onclick="deleteSubcategory(${index})" class="px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm">
|
||||
<i class="ri-delete-bin-line"></i>
|
||||
</button>
|
||||
</div>
|
||||
@@ -1879,13 +1880,14 @@
|
||||
${field.required ? '<span class="text-red-500">必填</span>' : '可选'}
|
||||
${field.description ? ` | ${field.description}` : ''}
|
||||
</div>
|
||||
${field.category ? `<div class="mt-1"><span class="inline-block px-2 py-0.5 bg-indigo-50 text-indigo-600 border border-indigo-100 rounded text-xs">📁 ${field.category}</span></div>` : ''}
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex gap-2 opacity-0 group-hover:opacity-100 transition">
|
||||
<button onclick="editField(${index})" class="px-2 py-1 text-blue-600 hover:bg-blue-50 rounded text-sm">
|
||||
<button type="button" onclick="editField(${index})" class="px-2 py-1 text-blue-600 hover:bg-blue-50 rounded text-sm">
|
||||
<i class="ri-edit-line"></i>
|
||||
</button>
|
||||
<button onclick="deleteField(${index})" class="px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm">
|
||||
<button type="button" onclick="deleteField(${index})" class="px-2 py-1 text-red-600 hover:bg-red-50 rounded text-sm">
|
||||
<i class="ri-delete-bin-line"></i>
|
||||
</button>
|
||||
</div>
|
||||
@@ -1900,6 +1902,7 @@
|
||||
document.getElementById('fieldModalTitle').textContent = '添加参数字段';
|
||||
document.getElementById('field_key').value = '';
|
||||
document.getElementById('field_label').value = '';
|
||||
document.getElementById('field_category').value = '';
|
||||
document.getElementById('field_type').value = 'text';
|
||||
document.getElementById('field_desc').value = '';
|
||||
document.getElementById('field_required').checked = false;
|
||||
@@ -1915,6 +1918,7 @@
|
||||
document.getElementById('fieldModalTitle').textContent = '编辑参数字段';
|
||||
document.getElementById('field_key').value = field.key || '';
|
||||
document.getElementById('field_label').value = field.label || '';
|
||||
document.getElementById('field_category').value = field.category || '';
|
||||
document.getElementById('field_type').value = field.type || 'text';
|
||||
document.getElementById('field_desc').value = field.description || '';
|
||||
document.getElementById('field_required').checked = field.required || false;
|
||||
@@ -1938,6 +1942,7 @@
|
||||
function saveField() {
|
||||
const key = document.getElementById('field_key').value.trim();
|
||||
const label = document.getElementById('field_label').value.trim();
|
||||
const category = document.getElementById('field_category').value.trim();
|
||||
const type = document.getElementById('field_type').value;
|
||||
const description = document.getElementById('field_desc').value.trim();
|
||||
const required = document.getElementById('field_required').checked;
|
||||
@@ -1948,6 +1953,7 @@
|
||||
}
|
||||
|
||||
const field = { key, label, type, description, required };
|
||||
if (category) field.category = category;
|
||||
|
||||
if (currentFieldTarget === 'subcategory') {
|
||||
// 子类别额外字段
|
||||
@@ -2233,6 +2239,13 @@
|
||||
document.getElementById('smartUpdateModal').addEventListener('click', function(e) { if (e.target === this) closeSmartUpdateModal(); });
|
||||
document.getElementById('fieldModal').addEventListener('click', function(e) { if (e.target === this) closeFieldModal(); });
|
||||
|
||||
// 防止 itemForm 原生提交(保存统一走 saveItem,避免表单 GET 提交导致页面跳转/刷新)
|
||||
document.addEventListener('submit', function(e) {
|
||||
if (e.target && e.target.id === 'itemForm') {
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
|
||||
// ============ 智能添加功能 ============
|
||||
|
||||
let smartAddType = '';
|
||||
|
||||
Reference in New Issue
Block a user