feat: 实现起卦、设置与积分系统

This commit is contained in:
qzl
2026-04-03 16:56:47 +08:00
parent 31594558eb
commit f245eec5f6
170 changed files with 20728 additions and 328 deletions
@@ -0,0 +1,100 @@
enum DivinationMethod { manual, auto }
enum QuestionType {
career,
love,
wealth,
fortune,
dream,
health,
study,
search,
other,
}
enum YaoType { undetermined, youngYang, youngYin, oldYang, oldYin }
class DivinationParams {
const DivinationParams({
required this.method,
required this.questionType,
required this.question,
required this.divinationTime,
required this.coinBalance,
required this.userId,
});
final DivinationMethod method;
final QuestionType questionType;
final String question;
final DateTime divinationTime;
final int coinBalance;
final String userId;
DivinationParams copyWith({
DivinationMethod? method,
QuestionType? questionType,
String? question,
DateTime? divinationTime,
int? coinBalance,
String? userId,
}) {
return DivinationParams(
method: method ?? this.method,
questionType: questionType ?? this.questionType,
question: question ?? this.question,
divinationTime: divinationTime ?? this.divinationTime,
coinBalance: coinBalance ?? this.coinBalance,
userId: userId ?? this.userId,
);
}
Map<String, dynamic> toPayload() {
return <String, dynamic>{
'method': method.name,
'questionType': questionType.name,
'question': question,
'divinationTime': divinationTime.toIso8601String(),
'coinBalance': coinBalance,
'userId': userId,
};
}
String toBinary(List<YaoType> yaoStates) {
return yaoStates
.map(
(v) => switch (v) {
YaoType.youngYang || YaoType.oldYang => '1',
_ => '0',
},
)
.join();
}
String toChangedBinary(List<YaoType> yaoStates) {
return yaoStates
.map(
(v) => switch (v) {
YaoType.youngYang => '1',
YaoType.youngYin => '0',
YaoType.oldYang => '0',
YaoType.oldYin => '1',
YaoType.undetermined => '0',
},
)
.join();
}
}
class DivinationMockData {
static DivinationParams initial() {
return DivinationParams(
method: DivinationMethod.manual,
questionType: QuestionType.career,
question: '',
divinationTime: DateTime.now(),
coinBalance: 8,
userId: 'mock_user_10001',
);
}
}
@@ -0,0 +1,91 @@
import 'divination_params.dart';
class DivinationResultData {
const DivinationResultData({
required this.params,
required this.binaryCode,
required this.changedBinaryCode,
required this.guaName,
required this.targetGuaName,
required this.upperName,
required this.lowerName,
required this.signType,
required this.keywords,
required this.conclusion,
required this.analysis,
required this.suggestion,
required this.ganzhi,
required this.wuXingStatus,
required this.yaoLines,
required this.targetYaoLines,
});
final DivinationParams params;
final String binaryCode;
final String changedBinaryCode;
final String guaName;
final String targetGuaName;
final String upperName;
final String lowerName;
final String signType;
final String keywords;
final String conclusion;
final String analysis;
final String suggestion;
final GanzhiData ganzhi;
final Map<String, String> wuXingStatus;
final List<YaoLineData> yaoLines;
final List<YaoLineData> targetYaoLines;
bool get hasChangingYao => binaryCode != changedBinaryCode;
}
class GanzhiData {
const GanzhiData({
required this.yearGanZhi,
required this.monthGanZhi,
required this.dayGanZhi,
required this.timeGanZhi,
required this.yearKongWang,
required this.monthKongWang,
required this.dayKongWang,
required this.timeKongWang,
required this.yueJian,
required this.riChen,
required this.yuePo,
required this.riChong,
});
final String yearGanZhi;
final String monthGanZhi;
final String dayGanZhi;
final String timeGanZhi;
final String yearKongWang;
final String monthKongWang;
final String dayKongWang;
final String timeKongWang;
final String yueJian;
final String riChen;
final String yuePo;
final String riChong;
}
class YaoLineData {
const YaoLineData({
required this.index,
required this.spirit,
required this.relation,
required this.branch,
required this.element,
required this.type,
required this.mark,
});
final int index;
final String spirit;
final String relation;
final String branch;
final String element;
final YaoType type;
final String mark;
}