diff --git a/web/admin/admin.js b/web/admin/admin.js
index 0f2440e..231a949 100644
--- a/web/admin/admin.js
+++ b/web/admin/admin.js
@@ -97,6 +97,11 @@ function renderModels() {
rb.onclick = function () { rollbackModel(i); };
ops.appendChild(rb);
}
+ // issue #153:该模型的审计历史(promote/rollback/register 可追溯)
+ var hist = el("button", null, "历史");
+ hist.style.marginLeft = "6px";
+ hist.onclick = function () { renderModelHistory(m.name); };
+ ops.appendChild(hist);
tr.appendChild(ops);
tbody.appendChild(tr);
});
@@ -141,6 +146,22 @@ function rollbackModel(i) {
audit("rollback", "model", m.name + "@" + m.version + " → " + prev);
renderModels();
}
+/* issue #153:按模型名过滤审计日志,展示版本/阶段变迁历史 */
+function renderModelHistory(name) {
+ var box = document.getElementById("model-history");
+ box.hidden = false;
+ box.innerHTML = "";
+ box.appendChild(el("div", null, "模型「" + name + "」审计历史:"));
+ var log = (typeof UserStore !== "undefined") ? UserStore.auditLog() : [];
+ var hits = log.filter(function (e) {
+ return e.resource === "model" && e.reason.indexOf(name) >= 0;
+ });
+ if (!hits.length) { box.appendChild(el("div", "hint", "(暂无该模型的审计记录)")); return; }
+ hits.slice().reverse().forEach(function (e) {
+ box.appendChild(el("div", null,
+ e.time.slice(0, 19).replace("T", " ") + " | " + e.actor + " | " + e.action + " | " + e.reason));
+ });
+}
/* ---------------- 知识库管理 ---------------- */
function getKbDocs() { return load(KB_KEY, []); }
diff --git a/web/admin/index.html b/web/admin/index.html
index 7a24249..34f098e 100644
--- a/web/admin/index.html
+++ b/web/admin/index.html
@@ -41,6 +41,8 @@
模型 版本 阶段 作者 更新时间 操作