fix: 「用户与角色」模块切换到 FBA UI 承载(Epic #159 遗漏收尾)
This commit is contained in:
@@ -102,6 +102,20 @@
|
||||
</main>
|
||||
<script src="user_store.js"></script>
|
||||
<script src="../shared/session.js"></script>
|
||||
<script>
|
||||
/* Epic #159:FBA 轨道下「用户与角色」由 FBA UI(/fba-admin/)承载。
|
||||
* 直接访问/书签/iframe 直达本页时,若 FBA 在线且已有 FBA 登录态,
|
||||
* 顶层跳转到 FBA UI;否则保留本页(本地演示降级)。 */
|
||||
(function () {
|
||||
if (!window.IAOP_SESSION || !IAOP_SESSION.fbaStatus) return;
|
||||
IAOP_SESSION.fbaStatus().then(function (st) {
|
||||
if (!st.available) return;
|
||||
if (!localStorage.getItem("iaop.fba.token.v1")) return;
|
||||
try { window.top.location.href = "/fba-admin/"; }
|
||||
catch (e) { location.href = "/fba-admin/"; }
|
||||
});
|
||||
})();
|
||||
</script>
|
||||
<script src="../shared/pro-header.js"></script>
|
||||
<script src="users.js"></script>
|
||||
</body>
|
||||
|
||||
@@ -182,14 +182,18 @@
|
||||
}
|
||||
|
||||
/* ---- 菜单渲染(需要登录角色,异步) ----------------------------------- */
|
||||
function addLeafItem(key, icon, text, href) {
|
||||
function addLeafItem(key, icon, text, href, external) {
|
||||
var a = el("a", "pro-menu-item" + (key === active ? " active" : ""));
|
||||
a.href = href;
|
||||
a.title = text;
|
||||
a.setAttribute("data-module", key);
|
||||
a.appendChild(el("span", "pro-menu-icon", icon));
|
||||
a.appendChild(el("span", "pro-menu-text", text));
|
||||
if (SHELL) {
|
||||
if (external) {
|
||||
// 外部承载模块(FBA UI 等):新标签打开,不进 iframe 外壳
|
||||
a.target = "_blank";
|
||||
a.rel = "noopener";
|
||||
} else if (SHELL) {
|
||||
a.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
go(href);
|
||||
@@ -250,7 +254,8 @@
|
||||
// 输出(FBA 服务端按角色授权过滤,本地角色过滤兜底)
|
||||
(mods || []).forEach(function (m) {
|
||||
if (m.children && m.children.length) addSubMenu(m);
|
||||
else addLeafItem(m.key, m.icon, m.title, prefix + m.url);
|
||||
else addLeafItem(m.key, m.icon, m.title,
|
||||
m.external ? m.url : prefix + m.url, !!m.external);
|
||||
});
|
||||
if (!SHELL) syncSubHighlight();
|
||||
// 菜单(重)渲染完成事件:shell.js 据此重放当前高亮,
|
||||
|
||||
+13
-3
@@ -62,8 +62,11 @@ var IAOP_SESSION = (function () {
|
||||
{ key: "audit", title: "审计查询", hash: "#audit" }
|
||||
] },
|
||||
{ key: "users", title: "用户与角色", icon: "👤", url: "auth/users.html",
|
||||
desc: "用户管理、角色分配(readonly / engineer / admin)、审计(PRD 8.2)",
|
||||
roles: ["admin"], tag: "管理员", tagColor: "gold" },
|
||||
desc: "用户管理、角色分配、菜单授权(Epic #159 起由 FBA UI 承载)",
|
||||
roles: ["admin"], tag: "管理员", tagColor: "gold",
|
||||
/* FBA 模式下该模块由 FBA UI(/fba-admin/)承载,新标签打开;
|
||||
* fbaUrl 由 menuTree() 在 FBA 轨道生效时注入 */
|
||||
fbaUrl: "/fba-admin/" },
|
||||
{ key: "mobile", title: "移动端驾驶舱", icon: "📱", url: "mobile/",
|
||||
desc: "移动端只读驾驶舱与交接班摘要(iOS14+ / Android 10+)",
|
||||
roles: ["readonly", "engineer", "admin"], tag: "移动端", tagColor: "default" }
|
||||
@@ -441,7 +444,14 @@ var IAOP_SESSION = (function () {
|
||||
return copy;
|
||||
});
|
||||
// 服务端树里没有任何 iAOP 模块(未播种)→ 本地角色过滤兜底
|
||||
return mods.length ? mods : modulesFor(user.role);
|
||||
if (!mods.length) return modulesFor(user.role);
|
||||
// FBA 轨道生效:带 fbaUrl 的模块(用户与角色)指向 FBA UI,新标签打开
|
||||
return mods.map(function (m) {
|
||||
if (m.fbaUrl) {
|
||||
return Object.assign({}, m, { url: m.fbaUrl, external: true });
|
||||
}
|
||||
return m;
|
||||
});
|
||||
})
|
||||
.catch(function () { return modulesFor(user.role); });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user