From 86f3de9b78db41e89b0767b5407715a00bc6551d Mon Sep 17 00:00:00 2001 From: bymoye Date: Fri, 12 Jul 2024 00:38:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=85=E5=AE=8C=E6=88=90,=20UUID=E5=B7=A5?= =?UTF-8?q?=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/func_enum.dart | 6 ++ lib/utils/uuid/uuid_analysis.dart | 75 ++++++++++++++++++++++ lib/utils/uuid/uuid_bit_layout.dart | 99 +++++++++++++++++++++++++++++ lib/uuid_tools/controller.dart | 25 ++++++++ lib/uuid_tools/index.dart | 55 ++++++++++++++++ pubspec.yaml | 7 +- 6 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 lib/utils/uuid/uuid_analysis.dart create mode 100644 lib/utils/uuid/uuid_bit_layout.dart create mode 100644 lib/uuid_tools/controller.dart create mode 100644 lib/uuid_tools/index.dart diff --git a/lib/func_enum.dart b/lib/func_enum.dart index ec00810..f91ec34 100644 --- a/lib/func_enum.dart +++ b/lib/func_enum.dart @@ -5,6 +5,7 @@ import 'package:tools/date_tools/date_calculation.dart' import 'package:tools/index/index.dart' deferred as index; import 'package:tools/json_tools/json_utils.dart' deferred as json_utils; import 'package:tools/world_time/index.dart' deferred as world_time; +import 'package:tools/uuid_tools/index.dart' deferred as uuid_tools; import 'package:web/web.dart' as web; enum FunctionEnum { @@ -12,6 +13,7 @@ enum FunctionEnum { dateCalculation("日期计算", route: "/date-caluculation"), jsonUtils("JSON压缩/格式化工具", route: "/json-utils"), worldTime("世界时间", route: "/world-time"), + uuidTools("UUID工具", route: "/uuid-tools"), /// 图片处理 imageProcess("图片处理"); @@ -41,6 +43,10 @@ enum FunctionEnum { await world_time.loadLibrary(); return world_time.WorldTime(); }, + FunctionEnum.uuidTools => () async { + await uuid_tools.loadLibrary(); + return uuid_tools.UuidToolsPage(); + }, _ => () async { return const SizedBox(); } diff --git a/lib/utils/uuid/uuid_analysis.dart b/lib/utils/uuid/uuid_analysis.dart new file mode 100644 index 0000000..65acb7d --- /dev/null +++ b/lib/utils/uuid/uuid_analysis.dart @@ -0,0 +1,75 @@ +import 'package:uuid/uuid.dart'; + +import 'uuid_bit_layout.dart'; + +class UuidAnalysis extends UuidValue { + UuidAnalysis(super.uuid) { + super.validate(); + } + + String get variant { + String variantByte = uuid.substring(19, 20).toUpperCase(); + + int? variantInt = int.tryParse(variantByte); + if (variantInt != null && variantInt >= 1 && variantInt <= 7) { + return '为 NCS 兼容性保留'; + } else if (["8", "9", "A", "B"].contains(variantByte)) { + return '在 RFC 9562 中指定'; + } else if (["C", "D"].contains(variantByte)) { + return '为与 Microsoft 兼容而保留'; + } else if (["E", "F"].contains(variantByte)) { + return '保留以供将来定义'; + } else { + return "未知变种"; + } + } + + int get timeLow { + return int.parse(uuid.substring(0, 8), radix: 16); + } + + int get timeMid { + return int.parse(uuid.substring(9, 13), radix: 16); + } + + int get timeHigh { + return int.parse(uuid.substring(14, 18), radix: 16); + } + + @override + int get time { + if (version == 1) { + return ((timeHigh & 0xfff) << 48) | (timeMid << 32) | timeLow; + } + if (version == 6) { + return (timeLow << 28) | (timeMid << 12) | ((timeLow & 0x0FFF)); + } + if (version == 7) { + return int.parse(uuid.substring(0, 8) + uuid.substring(9, 13), radix: 16); + } + return -1; + } + + String get bitLayout { + return switch (version) { + 1 => UuidBitLayout.v1, + 3 => UuidBitLayout.v3, + 4 => UuidBitLayout.v4, + 5 => UuidBitLayout.v5, + 6 => UuidBitLayout.v6, + 7 => UuidBitLayout.v7, + 8 => UuidBitLayout.v8, + _ => "未知版本" + }; + } + + DateTime get timeValue { + if ([1, 6].contains(version)) { + return DateTime.utc(1582, 10, 15).add(Duration(microseconds: time ~/ 10)); + } + if (version == 7) { + return DateTime.fromMillisecondsSinceEpoch(time, isUtc: true); + } + return DateTime.fromMillisecondsSinceEpoch(0); + } +} diff --git a/lib/utils/uuid/uuid_bit_layout.dart b/lib/utils/uuid/uuid_bit_layout.dart new file mode 100644 index 0000000..00de847 --- /dev/null +++ b/lib/utils/uuid/uuid_bit_layout.dart @@ -0,0 +1,99 @@ +class UuidBitLayout { + static const String v1 = """ + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| time_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| time_mid | ver | time_high | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| clock_seq | node | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| node | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +"""; + + static const String v3 = """ + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| md5_high | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| md5_high | ver | md5_mid | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| md5_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| md5_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +"""; + + static const String v4 = """ + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| random_a | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| random_a | ver | random_b | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| random_c | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| random_c | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +"""; + + static const String v5 = """ + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| sha1_high | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| sha1_high | ver | sha1_mid | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| sha1_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| sha1_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +"""; + + static const String v6 = """ + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| time_high | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| time_mid | ver | time_low | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| clock_seq | node | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| node | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +"""; + + static const String v7 = """ + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| unix_ts_ms | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| unix_ts_ms | ver | rand_a | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| rand_b | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| rand_b | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +"""; + + static const String v8 = """ + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| custom_a | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| custom_a | ver | custom_b | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +|var| custom_c | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +| custom_c | ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +"""; +} diff --git a/lib/uuid_tools/controller.dart b/lib/uuid_tools/controller.dart new file mode 100644 index 0000000..71092e4 --- /dev/null +++ b/lib/uuid_tools/controller.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:refreshed/refreshed.dart'; +import 'package:tools/utils/uuid/uuid_analysis.dart'; + +class UuidToolsController extends GetxController { + final TextEditingController textEditingController = TextEditingController(); + + final RxString helper = "".obs; + + final Rx borderColor = Rx(Colors.grey); + + void onEditingComplete() { + try { + final UuidAnalysis analysis = UuidAnalysis(textEditingController.text); + } catch (e) { + if (e is FormatException) { + borderColor.value = Colors.red; + // textEditingController. + helper.value = "UUID格式错误"; + update(); + } + print(e); + } + } +} diff --git a/lib/uuid_tools/index.dart b/lib/uuid_tools/index.dart new file mode 100644 index 0000000..d43d5f9 --- /dev/null +++ b/lib/uuid_tools/index.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:refreshed/refreshed.dart'; +import 'package:tools/uuid_tools/controller.dart'; + +class UuidToolsPage extends StatelessWidget { + const UuidToolsPage({super.key}); + + @override + Widget build(BuildContext context) { + return GetBuilder( + init: UuidToolsController(), + builder: (UuidToolsController controller) { + return Center( + child: TextField( + controller: controller.textEditingController, + // onChanged: controller.onChanged, + onEditingComplete: controller.onEditingComplete, + + /// 输入框样式 + decoration: InputDecoration( + /// 输入框内部填充 + // label: const Text("UUID"), + labelText: "请在此处输入需要解析的UUID", + // labelStyle: const TextStyle(color: Colors.grey), + helper: ValueListenableBuilder( + valueListenable: controller.helper, + builder: (BuildContext context, String value, Widget? child) { + return Text( + controller.helper.value, + style: const TextStyle(color: Colors.grey), + ); + }, + ), + contentPadding: const EdgeInsets.all(10), + + /// 输入框边框 + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: + BorderSide(color: controller.borderColor.value)), + + /// 输入框填充颜色 + filled: true, + + /// 输入框提示文字 + hintText: "请在此处输入需要解析的UUID", + + /// 输入框提示文字样式 + hintStyle: const TextStyle(color: Colors.grey), + ), + ), + ); + }); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 424e183..bb699b6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -43,6 +43,7 @@ dependencies: http: ^1.2.1 fetch_client: ^1.1.2 web: ^0.5.1 + uuid: ^4.4.1 simple_icons: ^10.1.3 dependency_overrides: @@ -51,10 +52,12 @@ dependency_overrides: url: https://github.com/raldhafiri/flutter_keyboard_visibility.git ref: master path: flutter_keyboard_visibility_web + + meta: ^1.15.0 dev_dependencies: - flutter_test: - sdk: flutter + # flutter_test: + # sdk: flutter # The "flutter_lints" package below contains a set of recommended lints to # encourage good coding practices. The lint set provided by the package is