Files
TtxPageAdmin/lib/studio_app_models.dart
T
2026-05-16 19:03:01 +08:00

295 lines
7.1 KiB
Dart

part of 'studio_app.dart';
const String _defaultWorkspace = 'ttx-xwms-test';
class StudioRuntime {
const StudioRuntime({
required this.backendUrl,
required this.client,
required this.session,
required this.user,
required this.loginConfig,
required this.systemConfig,
required this.orgName,
required this.allowedMenuIds,
required this.profile,
});
final String backendUrl;
final StudioBackendClient client;
final StudioBackendSession session;
final StudioUser user;
final Map<String, dynamic> loginConfig;
final Map<String, dynamic> systemConfig;
final String orgName;
final Set<String> allowedMenuIds;
final StudioBackendUserProfile? profile;
}
class StudioUser {
const StudioUser({
required this.workspace,
required this.displayName,
required this.role,
required this.languageCode,
required this.backendAppName,
required this.organizationName,
});
final String workspace;
final String displayName;
final String role;
final String languageCode;
final String backendAppName;
final String organizationName;
}
class StudioActivity {
StudioActivity({required this.title, required this.detail})
: time = DateTime.now();
final String title;
final String detail;
final DateTime time;
}
class StudioTab {
StudioTab({
required this.id,
required this.title,
required this.summary,
required this.pageType,
required this.icon,
});
static const String dashboardId = 'dashboard';
factory StudioTab.dashboard() {
return StudioTab(
id: dashboardId,
title: '工作台',
summary: 'Studio 首页和快捷入口',
pageType: StudioPageType.dashboard,
icon: Icons.space_dashboard_rounded,
);
}
final String id;
final String title;
final String summary;
final StudioPageType pageType;
final IconData icon;
}
enum StudioPageType {
dashboard,
modelEditor,
jsonEditor,
navigationEditor,
manage,
history,
sync,
repair,
sqlTemplate,
sqlRunner,
portalMaintain,
}
class StudioNavNode {
StudioNavNode({
required this.id,
required this.title,
required this.summary,
required this.icon,
required this.pageType,
this.children = const [],
});
final String id;
final String title;
final String summary;
final IconData icon;
final StudioPageType pageType;
final List<StudioNavNode> children;
}
class _HistoryRow {
const _HistoryRow(this.version, this.user, this.time, this.status, this.note);
final String version;
final String user;
final String time;
final String status;
final String note;
}
final List<StudioNavNode> studioNavTree = [
StudioNavNode(
id: 'model-center',
title: '模型中心',
summary: '数据、单据、界面和导航',
icon: Icons.account_tree_rounded,
pageType: StudioPageType.dashboard,
children: [
StudioNavNode(
id: 'TableModelEditor',
title: '数据模型',
summary: '字段、索引、关系与版本',
icon: Icons.table_rows_rounded,
pageType: StudioPageType.modelEditor,
),
StudioNavNode(
id: 'BillModelEditor',
title: '单据模型',
summary: '业务单据结构和规则',
icon: Icons.description_rounded,
pageType: StudioPageType.modelEditor,
),
StudioNavNode(
id: 'ViewModelEditor',
title: '界面模型',
summary: '界面布局和控件配置',
icon: Icons.dashboard_customize_rounded,
pageType: StudioPageType.modelEditor,
),
StudioNavNode(
id: 'NavigationEditor',
title: '菜单维护',
summary: '导航结构和入口配置',
icon: Icons.menu_rounded,
pageType: StudioPageType.navigationEditor,
),
],
),
StudioNavNode(
id: 'history',
title: '模型日志',
summary: '版本与修改历史',
icon: Icons.history_rounded,
pageType: StudioPageType.dashboard,
children: [
StudioNavNode(
id: 'TableModelHistory',
title: '数据模型日志',
summary: '数据模型修改历史',
icon: Icons.query_builder_rounded,
pageType: StudioPageType.history,
),
StudioNavNode(
id: 'BillModelHistory',
title: '单据模型日志',
summary: '单据模型修改历史',
icon: Icons.history_toggle_off_rounded,
pageType: StudioPageType.history,
),
StudioNavNode(
id: 'WsoDataHistory',
title: '界面模型日志',
summary: '界面模型修改历史',
icon: Icons.event_note_rounded,
pageType: StudioPageType.history,
),
StudioNavNode(
id: 'NavigatorHistory',
title: '菜单维护日志',
summary: '菜单配置修改历史',
icon: Icons.receipt_long_rounded,
pageType: StudioPageType.history,
),
],
),
StudioNavNode(
id: 'ModelSync',
title: '配置下载',
summary: '同步和导出配置',
icon: Icons.file_download_rounded,
pageType: StudioPageType.sync,
),
StudioNavNode(
id: 'DataRepair',
title: '数据修复',
summary: '异常数据处理和修复',
icon: Icons.build_rounded,
pageType: StudioPageType.repair,
),
StudioNavNode(
id: 'SqlTemplate',
title: 'SQL 模板',
summary: '查询模板和脚本管理',
icon: Icons.description_rounded,
pageType: StudioPageType.sqlTemplate,
),
StudioNavNode(
id: 'AdvancedSqlTemplate',
title: 'SQL 模板执行',
summary: '直接执行查询模板',
icon: Icons.play_arrow_rounded,
pageType: StudioPageType.sqlRunner,
),
StudioNavNode(
id: 'PortalMaintain',
title: 'Portal 配置',
summary: '门户和主题管理',
icon: Icons.settings_applications_rounded,
pageType: StudioPageType.portalMaintain,
),
];
List<StudioNavNode> _filterNavNodes(
List<StudioNavNode> nodes,
Set<String> allowedIds,
) {
if (allowedIds.isEmpty) {
return nodes;
}
final filtered = <StudioNavNode>[];
for (final node in nodes) {
final filteredChildren = node.children.isEmpty
? const <StudioNavNode>[]
: _filterNavNodes(node.children, allowedIds);
final allowed = allowedIds.contains(node.id);
if (allowed || filteredChildren.isNotEmpty) {
filtered.add(
StudioNavNode(
id: node.id,
title: node.title,
summary: node.summary,
icon: node.icon,
pageType: node.pageType,
children: filteredChildren,
),
);
}
}
return filtered;
}
String _extractStringFromConfig(
Map<String, dynamic> config,
List<String> keys,
) {
for (final key in keys) {
final value = config[key];
if (value != null && value.toString().trim().isNotEmpty) {
return value.toString().trim();
}
}
return '';
}
String? _extractAppName(Map<String, dynamic>? config) {
if (config == null || config.isEmpty) {
return null;
}
final candidate = _extractStringFromConfig(config, const [
'appName',
'name',
'title',
'portalName',
'systemName',
]);
return candidate.isEmpty ? null : candidate;
}