feat: Phase 3 FBA UI 预构建产物 + Phase 4 按钮级权限(fba_jwt + perms)(Epic #159)

This commit is contained in:
2026-08-06 10:18:15 +08:00
parent 067ba0abe1
commit 4ea81cea91
7 changed files with 342 additions and 4 deletions
+15
View File
@@ -311,6 +311,21 @@
var color = IAOP_SESSION.ROLE_TAG_COLORS[u.role] || "default";
var label = IAOP_SESSION.ROLE_LABELS[u.role] || u.role;
userBox.appendChild(el("span", "pro-tag pro-tag-" + color, label));
// Epic #159 Phase 3:FBA 在线且当前为 admin → 顶栏提供「系统管理」
// 直达 FBA UI(用户/角色/菜单/日志管理),新标签打开
if (u.role === "admin" && IAOP_SESSION.fbaStatus) {
IAOP_SESSION.fbaStatus().then(function (st) {
if (!st.available) return;
var link = el("a", "pro-logout", "系统管理");
link.href = "/fba-admin/"; // nginx 绝对路径(deploy/fba/nginx-fba.conf)
link.target = "_blank";
link.rel = "noopener";
link.style.textDecoration = "none";
link.style.display = "inline-block";
right.insertBefore(link, logoutBtn);
});
}
// 菜单异步:FBA token 存在时取服务端授权菜单树(Phase 2)
IAOP_SESSION.menuTree(u).then(renderMenu);
});
+24 -1
View File
@@ -446,6 +446,27 @@ var IAOP_SESSION = (function () {
.catch(function () { return modulesFor(user.role); });
}
/* ---- Epic #159 Phase 4:按钮级权限码 ------------------------------------
* FBA GET /auth/codes 返回当前用户权限码集合(服务端按角色聚合;
* 超管返回全部菜单 perms,含播种脚本写入的 iaop:<module>)。
* 结果按会话缓存(登录后只拉一次),非 FBA 轨道返回空数组。 */
var _codesCache = null; // Promise<string[]> | null
function perms() {
if (_codesCache) return _codesCache;
if (!readFbaToken()) return Promise.resolve([]);
_codesCache = fbaFetch("/auth/codes")
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (d) {
return d && d.code === 200 && Array.isArray(d.data) ? d.data : [];
})
.catch(function () { return []; });
return _codesCache;
}
function hasPerm(code) {
return perms().then(function (codes) {
return codes.indexOf(code) >= 0;
});
}
return {
MODULES: MODULES,
@@ -461,7 +482,9 @@ var IAOP_SESSION = (function () {
fbaStatus: fbaStatus,
getCaptcha: getCaptcha,
getAuthHeaders: getAuthHeaders,
menuTree: menuTree
menuTree: menuTree,
perms: perms,
hasPerm: hasPerm
};
})();