From 98a9c2c4ec4c73c24a4f01262837407b1fdba7e0 Mon Sep 17 00:00:00 2001 From: hejl Date: Wed, 28 May 2025 14:34:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=87=E5=87=86=E5=AD=97=E6=AE=B5=E7=BF=BB?= =?UTF-8?q?=E8=AF=91OK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/tab_items_controller.dart | 2 - win_text_editor/lib/main.dart | 13 +++ .../controllers/base_data_source.dart | 4 +- .../controllers/memory_table_controller.dart | 8 +- .../services/memory_table_service.dart | 79 +++++++++++++++++-- .../widgets/memory_table_left_side.dart | 5 -- .../lib/shared/data/std_fields_cache.dart | 44 +++++++++++ .../lib/shared/models/std_filed.dart | 15 ++++ win_text_editor/pubspec.lock | 24 ++++++ win_text_editor/pubspec.yaml | 2 + 10 files changed, 175 insertions(+), 21 deletions(-) create mode 100644 win_text_editor/lib/shared/data/std_fields_cache.dart create mode 100644 win_text_editor/lib/shared/models/std_filed.dart diff --git a/win_text_editor/lib/framework/controllers/tab_items_controller.dart b/win_text_editor/lib/framework/controllers/tab_items_controller.dart index 712a602..0ad1e7a 100644 --- a/win_text_editor/lib/framework/controllers/tab_items_controller.dart +++ b/win_text_editor/lib/framework/controllers/tab_items_controller.dart @@ -119,8 +119,6 @@ class TabItemsController with ChangeNotifier { default: Logger().error("没有活动的内容控制器", source: 'TabItemsController'); } - - return; } activeContentController?.onOpenFile(filePath); } diff --git a/win_text_editor/lib/main.dart b/win_text_editor/lib/main.dart index 8cc0bea..a7ef7fa 100644 --- a/win_text_editor/lib/main.dart +++ b/win_text_editor/lib/main.dart @@ -1,6 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:hive_flutter/hive_flutter.dart'; + import 'package:provider/provider.dart'; import 'package:win_text_editor/framework/widgets/app_scaffold.dart'; +import 'package:win_text_editor/shared/data/std_fields_cache.dart'; import 'package:window_manager/window_manager.dart'; import 'framework/controllers/logger.dart'; // 新增导入 @@ -19,6 +22,16 @@ void main() async { await windowManager.focus(); }); + // 初始化数据缓存 + WidgetsFlutterBinding.ensureInitialized(); + + // 清理旧数据(仅在开发时需要) + await Hive.initFlutter(); + await Hive.deleteBoxFromDisk('uft_stdFieldsCache'); + + // 重新初始化 + await StdFieldsCache.init(); + runApp( MultiProvider( providers: [ diff --git a/win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart b/win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart index fa3181b..8838d52 100644 --- a/win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart +++ b/win_text_editor/lib/modules/memory_table/controllers/base_data_source.dart @@ -46,13 +46,12 @@ abstract class SelectableDataSource extends DataGridSo } class Field implements SelectableItem { - Field(this.id, this.name, this.chineseName, this.type, this.remark, [this.isSelected = false]); + Field(this.id, this.name, this.chineseName, this.type, [this.isSelected = false]); final String id; final String name; final String chineseName; final String type; - final String remark; @override bool isSelected; } @@ -83,7 +82,6 @@ class FieldsDataSource extends SelectableDataSource { DataGridCell(columnName: 'name', value: field.name), DataGridCell(columnName: 'chineseName', value: field.chineseName), DataGridCell(columnName: 'type', value: field.type), - DataGridCell(columnName: 'remark', value: field.remark), ], ), ) diff --git a/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart b/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart index b057596..5ebf132 100644 --- a/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart +++ b/win_text_editor/lib/modules/memory_table/controllers/memory_table_controller.dart @@ -17,9 +17,9 @@ class MemoryTableController extends BaseContentController { MemoryTableController() : _service = MemoryTableService(Logger()) { // 初始化空数据 fieldsSource = FieldsDataSource([ - Field('1', '', '', '', ''), // 序号1的空字段 - Field('2', '', '', '', ''), // 序号2的空字段 - Field('3', '', '', '', ''), // 序号3的空字段 + Field('1', '', '', ''), // 序号1的空字段 + Field('2', '', '', ''), // 序号2的空字段 + Field('3', '', '', ''), // 序号3的空字段 ]); indexesSource = IndexesDataSource([ @@ -32,6 +32,7 @@ class MemoryTableController extends BaseContentController { @override Future onOpenFile(String filePath) async { + Logger().info("Opening file: $filePath"); try { final tableData = await _service.parseStructureFile(filePath); @@ -52,6 +53,7 @@ class MemoryTableController extends BaseContentController { } catch (e) { _errorMessage = e.toString(); notifyListeners(); + Logger().error("Error opening file: $e"); } } diff --git a/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart b/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart index 91f2954..9e9babd 100644 --- a/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart +++ b/win_text_editor/lib/modules/memory_table/services/memory_table_service.dart @@ -2,6 +2,8 @@ import 'dart:io'; import 'package:win_text_editor/modules/memory_table/controllers/base_data_source.dart'; +import 'package:win_text_editor/shared/data/std_fields_cache.dart'; +import 'package:win_text_editor/shared/models/std_filed.dart'; import 'package:xml/xml.dart' as xml; import 'package:path/path.dart' as path; import 'package:win_text_editor/framework/controllers/logger.dart'; @@ -18,7 +20,16 @@ class MemoryTableService { throw const FormatException("文件扩展名必须是.uftstructure"); } - // 2. Read and parse file content + // 2. 查找 metadata 目录和 stdfield.stfield 文件 + if (await StdFieldsCache.getLength() == 0) { + _logger.info("加载标准字段缓存"); + final metadataFile = await _findMetadataFile(filePath); + if (metadataFile != null) { + await _processStdFieldFile(metadataFile); + } + } + + // 3. Read and parse structure file content final file = File(filePath); final content = await file.readAsString(); @@ -29,30 +40,31 @@ class MemoryTableService { throw const FormatException("文件格式错误:缺少structure:Structure节点"); } - // 3. Get basic info + // 4. Get basic info final fileNameWithoutExt = path.basenameWithoutExtension(filePath); final chineseName = structureNode.getAttribute('chineseName') ?? ''; final objectId = structureNode.getAttribute('objectId') ?? ''; - // 4. Process properties (fields) + // 5. Process properties (fields) final properties = document.findAllElements('properties'); final fields = []; int index = 1; for (final property in properties) { final id = property.getAttribute('id') ?? ''; + // 尝试从缓存获取标准字段信息 + final stdField = StdFieldsCache.getData(id); fields.add( Field( (index++).toString(), // 序号 id, // 名称 - '', // 中文名 - '', // 类型 - '', // 备注 + stdField?.chineseName ?? '', // 中文名 + stdField?.dateType ?? '', // 类型 ), ); } - // 5. Process indexes + // 6. Process indexes final indexes = document.findAllElements('indexs'); final indexList = []; @@ -97,8 +109,59 @@ class MemoryTableService { } } + // 查找 metadata 目录和 stdfield.stfield 文件 + Future _findMetadataFile(String filePath) async { + Directory currentDir = File(filePath).parent; + const targetDirName = 'metadata'; + const targetFileName = 'stdfield.stdfield'; + + // 向上查找 metadata 目录 + while (true) { + final metadataDir = Directory('${currentDir.path}/$targetDirName'); + if (await metadataDir.exists()) { + final stdFieldFile = File('${metadataDir.path}/$targetFileName'); + if (await stdFieldFile.exists()) { + return stdFieldFile; + } else { + _logger.error("没找到标准字段文件 $targetFileName"); + return null; + } + } + + // 到达根目录时停止 + if (currentDir.path == currentDir.parent.path) { + _logger.error("没有找到元数据目录 $targetDirName"); + return null; + } + + currentDir = currentDir.parent; + } + } + + // 处理标准字段文件并缓存 + Future _processStdFieldFile(File stdFieldFile) async { + try { + final content = await stdFieldFile.readAsString(); + final document = xml.XmlDocument.parse(content); + final items = document.findAllElements('items'); + + for (final item in items) { + final name = item.getAttribute('name') ?? ''; + final chineseName = item.getAttribute('chineseName') ?? ''; + final dataType = item.getAttribute('dataType') ?? ''; + + if (name.isNotEmpty) { + final stdField = StdField(name: name, chineseName: chineseName, dateType: dataType); + await StdFieldsCache.setData(name, stdField); + } + } + } catch (e) { + _logger.error("处理标准字段文件时出错: $e"); + } + } + List _getDefaultFields() { - return [Field('1', '', '', '', ''), Field('2', '', '', '', ''), Field('3', '', '', '', '')]; + return [Field('1', '', '', ''), Field('2', '', '', ''), Field('3', '', '', '')]; } List _getDefaultIndexes() { diff --git a/win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart b/win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart index e6f62f2..d47538f 100644 --- a/win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart +++ b/win_text_editor/lib/modules/memory_table/widgets/memory_table_left_side.dart @@ -75,11 +75,6 @@ class MemoryTableLeftSide extends StatelessWidget { label: _buildGridHeader('类型'), minimumWidth: 120, ), - GridColumn( - columnName: 'remark', - label: _buildGridHeader('备注'), - minimumWidth: 200, - ), ], onCellTap: (details) { if (details.column.columnName == 'select') { diff --git a/win_text_editor/lib/shared/data/std_fields_cache.dart b/win_text_editor/lib/shared/data/std_fields_cache.dart new file mode 100644 index 0000000..1060a6b --- /dev/null +++ b/win_text_editor/lib/shared/data/std_fields_cache.dart @@ -0,0 +1,44 @@ +import 'package:hive_flutter/hive_flutter.dart'; +import 'package:win_text_editor/shared/models/std_filed.dart'; + +class StdFieldsCache { + static late final Box _box; // 指定泛型类型 + + // 初始化 + static Future init() async { + await Hive.initFlutter(); + Hive.registerAdapter(StdFieldAdapter()); // 在打开Box前注册适配器 + _box = await Hive.openBox('uft_stdFieldsCache'); // 指定泛型类型 + } + + static Future getLength() async { + return _box.length; + } + + // 通用数据存取 + static StdField? getData(String key) => _box.get(key); + static Future setData(String key, StdField value) => _box.put(key, value); + + // 清空缓存 + static Future clear() async { + await _box.clear(); + } +} + +// 确保typeId在整个应用中唯一 +class StdFieldAdapter extends TypeAdapter { + @override + final int typeId = 7; // 改为一个唯一ID,确保不与其他适配器冲突 + + @override + StdField read(BinaryReader reader) { + return StdField(name: reader.read(), chineseName: reader.read(), dateType: reader.read()); + } + + @override + void write(BinaryWriter writer, StdField obj) { + writer.write(obj.name); + writer.write(obj.chineseName); + writer.write(obj.dateType); + } +} diff --git a/win_text_editor/lib/shared/models/std_filed.dart b/win_text_editor/lib/shared/models/std_filed.dart new file mode 100644 index 0000000..70511d8 --- /dev/null +++ b/win_text_editor/lib/shared/models/std_filed.dart @@ -0,0 +1,15 @@ +import 'package:hive/hive.dart'; + +@HiveType(typeId: 7) // 确保与适配器的typeId一致 +class StdField { + @HiveField(0) + final String name; + + @HiveField(1) + final String chineseName; + + @HiveField(2) + final String dateType; + + StdField({required this.name, required this.chineseName, required this.dateType}); +} diff --git a/win_text_editor/pubspec.lock b/win_text_editor/pubspec.lock index d92b2c7..97b1813 100644 --- a/win_text_editor/pubspec.lock +++ b/win_text_editor/pubspec.lock @@ -89,6 +89,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.4+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" csv: dependency: "direct main" description: @@ -184,6 +192,22 @@ packages: description: flutter source: sdk version: "0.0.0" + hive: + dependency: "direct main" + description: + name: hive + sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + url: "https://pub.dev" + source: hosted + version: "2.2.3" + hive_flutter: + dependency: "direct main" + description: + name: hive_flutter + sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc + url: "https://pub.dev" + source: hosted + version: "1.1.0" http: dependency: transitive description: diff --git a/win_text_editor/pubspec.yaml b/win_text_editor/pubspec.yaml index c75ce03..c1cc95b 100644 --- a/win_text_editor/pubspec.yaml +++ b/win_text_editor/pubspec.yaml @@ -24,6 +24,8 @@ dependencies: csv: ^6.0.0 mustache_template: ^2.0.0 shared_preferences: ^2.2.1 + hive: ^2.2.3 + hive_flutter: ^1.1.0 dev_dependencies: flutter_test: