feat: Sentinel 支持自定义 API 路径前缀 (base_path)

- 节点编辑对话框新增「API 路径前缀」字段 (默认 /SenSu)
- 后端保存/读取 base_path
- API 响应包含 base_path 供前端回显

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
qinglong
2026-06-13 21:19:25 +08:00
parent 67d0f00525
commit 68717daefb
2 changed files with 7 additions and 0 deletions
+3
View File
@@ -109,6 +109,7 @@ class Plugin(PluginWebMixin):
result.append({
"id": n.get("id", ""), "name": n.get("name", ""), "url": n.get("url", ""),
"notes": n.get("notes", ""),
"base_path": n.get("base_path", "/SenSu"),
"enabled": n.get("enabled", True),
"online": c.get("online", False),
"system": c.get("system", {}),
@@ -130,6 +131,7 @@ class Plugin(PluginWebMixin):
"name": data.get("name", "").strip(),
"url": data.get("url", "").strip().rstrip("/"),
"api_key": data.get("api_key", "").strip(),
"base_path": data.get("base_path", "/SenSu").strip() or "/SenSu",
"notes": data.get("notes", "").strip(),
"enabled": data.get("enabled", True),
}
@@ -233,6 +235,7 @@ class Plugin(PluginWebMixin):
result.append({
"id": n.get("id", ""), "name": n.get("name", ""), "url": n.get("url", ""),
"notes": n.get("notes", ""),
"base_path": n.get("base_path", "/SenSu"),
"enabled": n.get("enabled", True),
"online": c.get("online", False),
"system": c.get("system", {}),
+4
View File
@@ -30,6 +30,7 @@
<div class="form-row"><label>名称 *</label><input id="edit-name" placeholder="例如: OnePlus 15"></div>
<div class="form-row"><label>URL *</label><input id="edit-url" placeholder="http://192.168.1.100:4200"></div>
<div class="form-row"><label>API Key</label><input id="edit-key" placeholder="sk-..."></div>
<div class="form-row"><label>API 路径前缀</label><input id="edit-base" placeholder="/SenSu" value="/SenSu"></div>
<div class="form-row"><label>备注</label><textarea id="edit-notes" rows="2" placeholder="设备位置、用途等..."></textarea></div>
<div style="display:flex;gap:8px;justify-content:flex-end;margin-top:16px">
<button class="btn btn-outlined" onclick="testConn()">测试连接</button>
@@ -238,6 +239,7 @@
document.getElementById("edit-name").value = "";
document.getElementById("edit-url").value = "http://";
document.getElementById("edit-key").value = "";
document.getElementById("edit-base").value = "/SenSu";
document.getElementById("edit-notes").value = "";
document.getElementById("test-result").innerHTML = "";
document.getElementById("edit-dialog").style.display = "flex";
@@ -250,6 +252,7 @@
document.getElementById("edit-name").value = n.name||"";
document.getElementById("edit-url").value = n.url||"";
document.getElementById("edit-key").value = n.api_key||"";
document.getElementById("edit-base").value = n.base_path||"/SenSu";
document.getElementById("edit-notes").value = n.notes||"";
document.getElementById("test-result").innerHTML = "";
document.getElementById("edit-dialog").style.display = "flex";
@@ -263,6 +266,7 @@
name: document.getElementById("edit-name").value.trim(),
url: document.getElementById("edit-url").value.trim(),
api_key: document.getElementById("edit-key").value.trim(),
base_path: document.getElementById("edit-base").value.trim() || "/SenSu",
notes: document.getElementById("edit-notes").value.trim()
};
if(!data.name||!data.url){ alert("名称和 URL 不能为空"); return; }