From e7129dadec6bcf3a00dc9eb0fe0d5c67985b0d50 Mon Sep 17 00:00:00 2001 From: hejl Date: Wed, 28 May 2025 19:08:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=8A=A0=E8=BD=BDOK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../assets/config/uft_macro_list.yaml | 27 ++++---- .../services/macro_template_service.dart | 68 +++++++++++++++++++ .../framework/services/uft_macro_service.dart | 51 -------------- .../controllers/memory_table_controller.dart | 10 +++ .../memory_table/models/memory_table.dart | 62 +++++++++++++++++ .../widgets/memory_table_right_side.dart | 64 ++++++----------- .../widgets/memory_table_view.dart | 1 + 7 files changed, 178 insertions(+), 105 deletions(-) create mode 100644 win_text_editor/lib/framework/services/macro_template_service.dart delete mode 100644 win_text_editor/lib/framework/services/uft_macro_service.dart diff --git a/win_text_editor/assets/config/uft_macro_list.yaml b/win_text_editor/assets/config/uft_macro_list.yaml index ee4e8c5..cfa3788 100644 --- a/win_text_editor/assets/config/uft_macro_list.yaml +++ b/win_text_editor/assets/config/uft_macro_list.yaml @@ -1,13 +1,16 @@ -获取记录:| - [获取记录][{{tableName}}({{keyName}}) - ][ - {{#keyFields}} - {{.}} = @{{.}}{{^@last}}, {{/@last}} - {{/keyFields}} - ] - [继续执行] - [记录为空][{{tableName}}] - { - [报错返回][][{{#keyFields}}{{.}} = @{{.}}{{^@last}}, {{/@last}}{{/keyFields}}] - } \ No newline at end of file +templates: + 获取记录: + header: "[获取记录][{{tableName}}({{keyName}})" + body: | + ][ + {{#keyFields}} + {{value}} = @{{value}} {{^isLast}}, {{/isLast}} + {{/keyFields}} + ] + footer: | + [继续执行] + [记录为空][{{tableName}}] + { + [报错返回][ERR_???][{{#keyFields}}{{value}} = @{{value}}{{^isLast}}, {{/isLast}}{{/keyFields}}] + } \ No newline at end of file diff --git a/win_text_editor/lib/framework/services/macro_template_service.dart b/win_text_editor/lib/framework/services/macro_template_service.dart new file mode 100644 index 0000000..098a86a --- /dev/null +++ b/win_text_editor/lib/framework/services/macro_template_service.dart @@ -0,0 +1,68 @@ +import 'package:flutter/services.dart' show rootBundle; +import 'package:yaml/yaml.dart'; +import 'package:mustache_template/mustache_template.dart' as mustache; + +class MacroTemplateService { + final Map _templates = {}; + bool _inited = false; + bool get inited => _inited; + + Future init() async { + try { + final configString = await rootBundle.loadString('assets/config/uft_macro_list.yaml'); + final yamlMap = loadYaml(configString); + + if (yamlMap is! YamlMap) { + throw const FormatException('Invalid YAML structure: root should be a map'); + } + + final templates = yamlMap['templates']; + if (templates is YamlMap) { + _templates.clear(); + templates.forEach((key, value) { + if (value is YamlMap) { + _templates[key] = { + 'header': value['header']?.toString() ?? '', + 'body': value['body']?.toString() ?? '', + 'footer': value['footer']?.toString() ?? '', + }; + } + }); + } + _inited = true; + } catch (e) { + throw Exception('Failed to load macro templates: $e'); + } + } + + Map? getTemplate(String templateName) { + return _templates[templateName] is Map + ? Map.from(_templates[templateName]) + : null; + } + + String renderTemplate(List templateList, Map context) { + StringBuffer buffer = StringBuffer(); + for (var templateName in templateList) { + final template = getTemplate(templateName); + if (template == null) throw Exception('Template $templateName not found'); + + buffer.writeln( + [ + _render(template['header'], context), + _render(template['body'], context), + _render(template['footer'], context), + ].join('\n'), + ); + + buffer.writeln(); + } + + return buffer.toString(); + } + + String _render(String template, Map context) { + final t = mustache.Template(template); + return t.renderString(context); + } +} diff --git a/win_text_editor/lib/framework/services/uft_macro_service.dart b/win_text_editor/lib/framework/services/uft_macro_service.dart deleted file mode 100644 index e6b58fa..0000000 --- a/win_text_editor/lib/framework/services/uft_macro_service.dart +++ /dev/null @@ -1,51 +0,0 @@ -import 'package:flutter/services.dart' show rootBundle; -import 'package:yaml/yaml.dart'; - -class UftMacroService { - static final UftMacroService _instance = UftMacroService._internal(); - factory UftMacroService() => _instance; - UftMacroService._internal(); - - late Map _config; - - static bool _isInitialized = false; - - // 初始化配置 - Future init() async { - if (_isInitialized) return; - final configString = await rootBundle.loadString('assets/config/uft_macro_list.yaml'); - final yamlMap = loadYaml(configString) as YamlMap; - - final globalConfig = yamlMap['global'] as YamlMap? ?? {}; - - _config = {...globalConfig}; - - _isInitialized = true; - } - - // 获取配置值 - dynamic get(String key) { - return _config[key]; - } - - // 获取字符串值 - String getString(String key) { - return _config[key] as String; - } - - // 获取布尔值 - bool getBool(String key) { - return _config[key] as bool; - } - - // 获取整数 - int getInt(String key) { - return _config[key] as int; - } - - // 获取列表 - List getList(String key) { - final list = _config[key] as List; - return list.cast(); - } -} 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 84db131..20d21bf 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 @@ -1,5 +1,6 @@ import 'package:syncfusion_flutter_datagrid/datagrid.dart'; import 'package:win_text_editor/framework/controllers/logger.dart'; +import 'package:win_text_editor/framework/services/macro_template_service.dart'; import 'package:win_text_editor/modules/memory_table/controllers/base_data_source.dart'; import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; import 'package:win_text_editor/modules/memory_table/services/memory_table_service.dart'; @@ -14,6 +15,7 @@ class MemoryTableController extends BaseContentController { late DataGridSource fieldsSource; late DataGridSource indexesSource; final MemoryTableService _service; + final MacroTemplateService templateService = MacroTemplateService(); // 新增:维护MemoryTable对象 late MemoryTable _memoryTable; @@ -47,6 +49,14 @@ class MemoryTableController extends BaseContentController { // 新增:获取当前MemoryTable MemoryTable get memoryTable => _memoryTable; + String? genCodeString(List macroList) { + if (!templateService.inited) { + templateService.init(); + } + + return templateService.renderTemplate(macroList, _memoryTable.toMap()); + } + @override Future onOpenFile(String filePath) async { Logger().info("Opening file: $filePath"); diff --git a/win_text_editor/lib/modules/memory_table/models/memory_table.dart b/win_text_editor/lib/modules/memory_table/models/memory_table.dart index 28cbd2d..a0a8d3d 100644 --- a/win_text_editor/lib/modules/memory_table/models/memory_table.dart +++ b/win_text_editor/lib/modules/memory_table/models/memory_table.dart @@ -31,4 +31,66 @@ class MemoryTable { final List indexes; MemoryTable({required this.tableName, required this.columns, required this.indexes}); + + //获取第一个主键,如果有多个,则取选中的主键 + String? get keyName { + Index? index; + for (var i in indexes) { + if (!i.isPrimary) continue; + if (index == null) { + index = i; + if (i.isSelected) break; + } else if (i.isSelected) { + index = i; + } + } + return index?.indexName; + } + + //获取主键的字段 + List get keyFields { + var name = keyName; + if (name!.isEmpty) return []; + for (var index in indexes) { + if (index.indexName == name) { + return index.fields; + } + } + return []; + } + + Map toMap() { + return { + 'tableName': tableName, + 'fields': + columns + .map( + (field) => { + 'id': field.id, + 'name': field.name, + 'chineseName': field.chineseName, + 'type': field.type, + 'isSelected': field.isSelected, + }, + ) + .toList(), + 'indexes': + indexes + .map( + (index) => { + 'indexName': index.indexName, + 'isPrimary': index.isPrimary, + 'indexFields': index.indexFields, + 'rule': index.rule, + 'isSelected': index.isSelected, + }, + ) + .toList(), + 'keyName': keyName, + 'keyFields': + keyFields.asMap().entries.map((entry) { + return {'value': entry.value, 'isLast': entry.key == keyFields.length - 1}; + }).toList(), + }; + } } diff --git a/win_text_editor/lib/modules/memory_table/widgets/memory_table_right_side.dart b/win_text_editor/lib/modules/memory_table/widgets/memory_table_right_side.dart index ded71bc..f7af7cc 100644 --- a/win_text_editor/lib/modules/memory_table/widgets/memory_table_right_side.dart +++ b/win_text_editor/lib/modules/memory_table/widgets/memory_table_right_side.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:win_text_editor/modules/memory_table/controllers/memory_table_controller.dart'; -import 'package:win_text_editor/modules/memory_table/models/memory_table.dart'; class MemoryTableRightSide extends StatefulWidget { final MemoryTableController controller; @@ -14,12 +13,12 @@ class MemoryTableRightSide extends StatefulWidget { } class _MemoryTableRightSideState extends State { + final List _selectedOperations = []; + @override void initState() { super.initState(); - // 添加监听器 widget.controller.addListener(_updateDisplay); - _updateDisplay(); } @override @@ -29,38 +28,18 @@ class _MemoryTableRightSideState extends State { } void _updateDisplay() { - final table = widget.controller.memoryTable; - widget.codeController.text = _formatMemoryTable(table); + widget.codeController.text = widget.controller.genCodeString(_selectedOperations)!; } - String _formatMemoryTable(MemoryTable table) { - final buffer = StringBuffer(); - - buffer.writeln('tableName = ${table.tableName}'); - buffer.writeln(); - - buffer.writeln('columns:'); - for (final field in table.columns) { - buffer.writeln(' name = ${field.name}'); - buffer.writeln(' chineseName = ${field.chineseName}'); - buffer.writeln(' dataType = ${field.type}'); - buffer.writeln(' isSelected = ${field.isSelected}'); - buffer.writeln(); - } - - buffer.writeln('indexes:'); - for (final index in table.indexes) { - buffer.writeln(' name = ${index.indexName}'); - buffer.writeln(' isPrimary = ${index.isPrimary}'); - buffer.writeln(' isSelected = ${index.isSelected}'); - buffer.writeln(' fields:'); - for (final field in index.fields) { - buffer.writeln(' name = $field'); + void _toggleOperation(String operation, bool? value) { + setState(() { + if (value == true) { + _selectedOperations.add(operation); + } else { + _selectedOperations.remove(operation); } - buffer.writeln(); - } - - return buffer.toString(); + _updateDisplay(); + }); } @override @@ -73,7 +52,7 @@ class _MemoryTableRightSideState extends State { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - const Text('MemoryTable 数据:', style: TextStyle(fontWeight: FontWeight.bold)), + const Text('生成代码:', style: TextStyle(fontWeight: FontWeight.bold)), IconButton( icon: const Icon(Icons.content_copy, size: 20), tooltip: '复制代码', @@ -95,6 +74,8 @@ class _MemoryTableRightSideState extends State { } Widget _buildCheckboxSection() { + final operations = ['获取记录', '获取记录数', '插入记录', '修改记录', '删除记录', '遍历记录']; + return SizedBox( width: double.infinity, child: Card( @@ -106,14 +87,7 @@ class _MemoryTableRightSideState extends State { Wrap( spacing: 16, runSpacing: 8, - children: [ - _buildCheckbox('获取记录'), - _buildCheckbox('获取记录数'), - _buildCheckbox('插入记录'), - _buildCheckbox('修改记录'), - _buildCheckbox('删除记录'), - _buildCheckbox('遍历记录'), - ], + children: operations.map((op) => _buildCheckbox(op)).toList(), ), ], ), @@ -125,7 +99,13 @@ class _MemoryTableRightSideState extends State { Widget _buildCheckbox(String label) { return Row( mainAxisSize: MainAxisSize.min, - children: [Checkbox(value: false, onChanged: (bool? value) {}), Text(label)], + children: [ + Checkbox( + value: _selectedOperations.contains(label), + onChanged: (bool? value) => _toggleOperation(label, value), + ), + Text(label), + ], ); } diff --git a/win_text_editor/lib/modules/memory_table/widgets/memory_table_view.dart b/win_text_editor/lib/modules/memory_table/widgets/memory_table_view.dart index 6433ea8..8bda07e 100644 --- a/win_text_editor/lib/modules/memory_table/widgets/memory_table_view.dart +++ b/win_text_editor/lib/modules/memory_table/widgets/memory_table_view.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:win_text_editor/framework/controllers/tab_items_controller.dart'; import 'package:win_text_editor/modules/memory_table/controllers/memory_table_controller.dart'; + import 'memory_table_left_side.dart'; import 'memory_table_right_side.dart';