70 lines
2.9 KiB
Dart
70 lines
2.9 KiB
Dart
|
|
// 账号类别与功能模块权限判定。
|
|||
|
|
//
|
|||
|
|
// 作为菜单可见性与路由可达性的**单一来源**:AdminHubPage 据此决定模块是否
|
|||
|
|
// 显示在界面,router.dart 的 redirect 据此决定是否拦截深链/返回键,二者保持
|
|||
|
|
// 完全一致,避免「界面看不到却能路由进入」或「点进去被弹回」的不一致。
|
|||
|
|
//
|
|||
|
|
// 判定依据:登录用户 [User] 的 [User.superAdmin] / [User.orgId] / [User.orgType]。
|
|||
|
|
// - superAdmin=true 或 orgId 为空 → 管理员(可见全部模块);
|
|||
|
|
// - orgType=1(渠道)→ 渠道商;orgType=2(代理商)→ 代理商;
|
|||
|
|
// - 受限但类型未知 → 按渠道商兜底,确保「渠道商管理」对渠道商账号可开放
|
|||
|
|
// (fail-open,符合「渠道商账号点击渠道商管理应正常打开」的修复目标)。
|
|||
|
|
//
|
|||
|
|
// 模块可见性规则:
|
|||
|
|
// - 用户管理:所有已登录账号可见(管理员/渠道商/代理商各看自己范围内用户);
|
|||
|
|
// - 渠道商管理:管理员 + 渠道商可见,代理商不可见;
|
|||
|
|
// - 其余模块(设备/激活码/公司介绍/滚动字幕):所有账号可见。
|
|||
|
|
import '../models/user.dart';
|
|||
|
|
|
|||
|
|
enum AccountCategory {
|
|||
|
|
/// 管理员(超级管理员 / 无组织归属)。
|
|||
|
|
admin,
|
|||
|
|
|
|||
|
|
/// 渠道商(orgType=1)。
|
|||
|
|
channelMerchant,
|
|||
|
|
|
|||
|
|
/// 代理商(orgType=2)。
|
|||
|
|
agent,
|
|||
|
|
|
|||
|
|
/// 未知(理论上不会在 UI 中出现,作为兜底占位)。
|
|||
|
|
unknown,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 功能模块权限判定工具。
|
|||
|
|
class SessionPermissions {
|
|||
|
|
SessionPermissions._();
|
|||
|
|
|
|||
|
|
/// 依据当前登录用户推导账号类别。
|
|||
|
|
static AccountCategory category(User? user) {
|
|||
|
|
if (user == null) return AccountCategory.unknown;
|
|||
|
|
if (user.superAdmin) return AccountCategory.admin;
|
|||
|
|
if (user.orgId.isEmpty) return AccountCategory.admin;
|
|||
|
|
switch (user.orgType) {
|
|||
|
|
case 0:
|
|||
|
|
return AccountCategory.admin; // 平台
|
|||
|
|
case 1:
|
|||
|
|
return AccountCategory.channelMerchant; // 渠道
|
|||
|
|
case 2:
|
|||
|
|
return AccountCategory.agent; // 代理商
|
|||
|
|
default:
|
|||
|
|
// 受限但类型未知:按渠道商兜底,开放「渠道商管理」。
|
|||
|
|
return AccountCategory.channelMerchant;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 是否管理员(可访问系统管理 / 用户管理等全部模块)。
|
|||
|
|
static bool isAdmin(User? user) => category(user) == AccountCategory.admin;
|
|||
|
|
|
|||
|
|
/// 是否可见 / 可访问「用户管理」(所有已登录账号)。
|
|||
|
|
///
|
|||
|
|
/// 管理员看全量,渠道商/代理商看自己组织范围内的用户;具体数据范围由
|
|||
|
|
/// [UserPage] 调用后端时按会话权限收敛,不再在菜单层一刀切隐藏。
|
|||
|
|
static bool canViewUserManagement(User? user) => user != null;
|
|||
|
|
|
|||
|
|
/// 是否可见 / 可访问「渠道商管理」(管理员 + 渠道商;代理商不可)。
|
|||
|
|
static bool canViewChannelManagement(User? user) {
|
|||
|
|
final c = category(user);
|
|||
|
|
return c == AccountCategory.admin || c == AccountCategory.channelMerchant;
|
|||
|
|
}
|
|||
|
|
}
|