ops-console v1.0.2 (versionCode 8) 源码入库
This commit is contained in:
69
lib/utils/permissions.dart
Normal file
69
lib/utils/permissions.dart
Normal file
@@ -0,0 +1,69 @@
|
||||
// 账号类别与功能模块权限判定。
|
||||
//
|
||||
// 作为菜单可见性与路由可达性的**单一来源**: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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user