Skip to content

Commit

Permalink
待完成, UUID工具
Browse files Browse the repository at this point in the history
  • Loading branch information
bymoye committed Jul 11, 2024
1 parent 6debca6 commit 86f3de9
Show file tree
Hide file tree
Showing 6 changed files with 265 additions and 2 deletions.
6 changes: 6 additions & 0 deletions lib/func_enum.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ 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 {
defaultPage("首页", route: "/"),
dateCalculation("日期计算", route: "/date-caluculation"),
jsonUtils("JSON压缩/格式化工具", route: "/json-utils"),
worldTime("世界时间", route: "/world-time"),
uuidTools("UUID工具", route: "/uuid-tools"),

/// 图片处理
imageProcess("图片处理");
Expand Down Expand Up @@ -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();
}
Expand Down
75 changes: 75 additions & 0 deletions lib/utils/uuid/uuid_analysis.dart
Original file line number Diff line number Diff line change
@@ -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);
}
}
99 changes: 99 additions & 0 deletions lib/utils/uuid/uuid_bit_layout.dart
Original file line number Diff line number Diff line change
@@ -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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
""";
}
25 changes: 25 additions & 0 deletions lib/uuid_tools/controller.dart
Original file line number Diff line number Diff line change
@@ -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<Color> borderColor = Rx<Color>(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);
}
}
}
55 changes: 55 additions & 0 deletions lib/uuid_tools/index.dart
Original file line number Diff line number Diff line change
@@ -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<UuidToolsController>(
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<String>(
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),
),
),
);
});
}
}
7 changes: 5 additions & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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
Expand Down

0 comments on commit 86f3de9

Please sign in to comment.