feat: 实现用户画像、占卜历史与后端用户管理模块

This commit is contained in:
ZL-Q
2026-04-06 01:28:10 +08:00
parent d87b2e1e3a
commit 8a18b3528b
77 changed files with 5850 additions and 2604 deletions
@@ -60,6 +60,21 @@ class DivinationParams {
};
}
factory DivinationParams.fromPayload(Map<String, dynamic> payload) {
return DivinationParams(
method: divinationMethodFromName(_requiredString(payload, 'method')),
questionType: questionTypeFromName(
_requiredString(payload, 'questionType'),
),
question: _requiredString(payload, 'question'),
divinationTime: DateTime.parse(
_requiredString(payload, 'divinationTime'),
),
coinBalance: _requiredInt(payload, 'coinBalance'),
userId: _requiredString(payload, 'userId'),
);
}
String toBinary(List<YaoType> yaoStates) {
return yaoStates
.map(
@@ -85,3 +100,43 @@ class DivinationParams {
.join();
}
}
DivinationMethod divinationMethodFromName(String raw) {
return DivinationMethod.values.firstWhere(
(value) => value.name == raw,
orElse: () => DivinationMethod.manual,
);
}
QuestionType questionTypeFromName(String raw) {
return QuestionType.values.firstWhere(
(value) => value.name == raw,
orElse: () => QuestionType.other,
);
}
YaoType yaoTypeFromName(String raw) {
return YaoType.values.firstWhere(
(value) => value.name == raw,
orElse: () => YaoType.undetermined,
);
}
String _requiredString(Map<String, dynamic> json, String key) {
final value = json[key];
if (value is! String || value.isEmpty) {
throw FormatException('Missing required string: $key');
}
return value;
}
int _requiredInt(Map<String, dynamic> json, String key) {
final value = json[key];
if (value is int) {
return value;
}
if (value is num) {
return value.toInt();
}
throw FormatException('Missing required int: $key');
}