From 30cec4d97d5eded618ed598d5657cb7c676fca00 Mon Sep 17 00:00:00 2001 From: Violet <3551664030@qq.com> Date: Thu, 9 Oct 2025 11:18:40 +0800 Subject: [PATCH] V1.0 --- .../2904255373@qq.com/2025-10-09-10-07-28.txt | 19 ++ .../2904255373@qq.com/2025-10-09-10-34-24.txt | 19 ++ .../2904255373@qq.com/2025-10-09-10-48-34.txt | 19 ++ .../2904255373@qq.com/2025-10-09-10-49-26.txt | 19 ++ .../2904255373@qq.com/2025-10-09-10-49-43.txt | 0 .../2904255373@qq.com/2025-10-09-10-49-47.txt | 0 .../2904255373@qq.com/2025-10-09-10-49-54.txt | 19 ++ .../2904255373@qq.com/2025-10-09-10-50-09.txt | 19 ++ .../2904255373@qq.com/2025-10-09-11-05-48.txt | 19 ++ .../2904255373@qq.com/2025-10-09-11-06-01.txt | 19 ++ .../2904255373@qq.com/2025-10-09-11-06-16.txt | 19 ++ .../2904255373@qq.com/2025-10-09-11-06-45.txt | 19 ++ .../2904255373@qq.com/2025-10-09-11-06-56.txt | 19 ++ .../2904255373@qq.com/2025-10-09-11-07-13.txt | 19 ++ .../2904255373@qq.com/2025-10-09-11-13-59.txt | 19 ++ .../2904255373@qq.com/2025-10-09-11-14-12.txt | 19 ++ .../2904255373@qq.com/2025-10-09-11-14-28.txt | 59 +++++++ src/model/QuestionGenerator.java | 163 ++++++++++++------ src/model/UserManager.java | 33 +++- src/ui/ChangePasswordDialog.java | 7 +- src/ui/PasswordSetupDialog.java | 51 ++++-- src/ui/QuizFrame.java | 11 +- src/ui/RegisterDialog.java | 6 +- .../classes/model/QuestionGenerator$1.class | Bin 3052 -> 3052 bytes target/classes/model/QuestionGenerator.class | Bin 11171 -> 12348 bytes .../classes/model/UserManager$UserInfo.class | Bin 928 -> 1070 bytes target/classes/model/UserManager.class | Bin 1984 -> 2280 bytes target/classes/ui/ChangePasswordDialog.class | Bin 5309 -> 5364 bytes target/classes/ui/PasswordSetupDialog.class | Bin 6221 -> 6841 bytes target/classes/ui/QuizFrame.class | Bin 6816 -> 6995 bytes target/classes/ui/RegisterDialog.class | Bin 7784 -> 7783 bytes 31 files changed, 521 insertions(+), 75 deletions(-) create mode 100644 questions/2904255373@qq.com/2025-10-09-10-07-28.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-10-34-24.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-10-48-34.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-10-49-26.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-10-49-43.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-10-49-47.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-10-49-54.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-10-50-09.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-11-05-48.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-11-06-01.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-11-06-16.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-11-06-45.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-11-06-56.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-11-07-13.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-11-13-59.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-11-14-12.txt create mode 100644 questions/2904255373@qq.com/2025-10-09-11-14-28.txt diff --git a/questions/2904255373@qq.com/2025-10-09-10-07-28.txt b/questions/2904255373@qq.com/2025-10-09-10-07-28.txt new file mode 100644 index 0000000..50823b7 --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-10-07-28.txt @@ -0,0 +1,19 @@ +1. 75 * ( 4 / 10 ) * 39 + +2. 7 / 64 / 38 + +3. 55 * 80 / 29 + +4. 51 - 68 - 71 + ( 73 - 47 ) + +5. 42 - 23 + +6. 58 + 40 - ( 2 - 52 ) + +7. 17 - 24 + +8. 79 * 41 + ( 11 * 71 ) - 74 + +9. 10 * ( 1 / 1 ) + +10. 67 * 76 - 47 diff --git a/questions/2904255373@qq.com/2025-10-09-10-34-24.txt b/questions/2904255373@qq.com/2025-10-09-10-34-24.txt new file mode 100644 index 0000000..db528cb --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-10-34-24.txt @@ -0,0 +1,19 @@ +1. 33 + 28 + +2. 78 - 41 + +3. 93 + 26 - 67 + +4. 71 - 62 + -13.0 - 62 + +5. 89 - 41 + +6. 44 - 3 + +7. 40 - 38 + +8. 19 + 91 + +9. 57 + 63 + +10. 60 - ( 23 - 1 ) diff --git a/questions/2904255373@qq.com/2025-10-09-10-48-34.txt b/questions/2904255373@qq.com/2025-10-09-10-48-34.txt new file mode 100644 index 0000000..46123dd --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-10-48-34.txt @@ -0,0 +1,19 @@ +1. 58 + (18 * 5) + +2. (98 * 20) / 56 + +3. 22 - 12 + +4. 22 - 15 + +5. 43 - 2 + +6. 3 * 13 + +7. 67 - 51 + +8. 20 * 1 + +9. 80 * 14 + +10. 86 + (16 * 2) diff --git a/questions/2904255373@qq.com/2025-10-09-10-49-26.txt b/questions/2904255373@qq.com/2025-10-09-10-49-26.txt new file mode 100644 index 0000000..99752d1 --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-10-49-26.txt @@ -0,0 +1,19 @@ +1. 72 * pow(2,2) + +2. 81 + 5 / pow(73,2) * 99 / 97 + +3. 46 * 16 - pow(42,2) / 64 / 79 + +4. 31 + pow(55,2) + +5. 17 / 67 / pow(62,2) + 32 + +6. 67 / 77 / pow(49,2) + 77 + +7. 95 / pow(74,2) + +8. 46 + pow(86,2) - 28 + +9. 97 + pow(41,2) + +10. 29 / pow(12,2) * 2 diff --git a/questions/2904255373@qq.com/2025-10-09-10-49-43.txt b/questions/2904255373@qq.com/2025-10-09-10-49-43.txt new file mode 100644 index 0000000..e69de29 diff --git a/questions/2904255373@qq.com/2025-10-09-10-49-47.txt b/questions/2904255373@qq.com/2025-10-09-10-49-47.txt new file mode 100644 index 0000000..e69de29 diff --git a/questions/2904255373@qq.com/2025-10-09-10-49-54.txt b/questions/2904255373@qq.com/2025-10-09-10-49-54.txt new file mode 100644 index 0000000..387c682 --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-10-49-54.txt @@ -0,0 +1,19 @@ +1. 73 + 24 - pow(10,2) - 70 - 50 + +2. 25 + pow(68,2) + +3. 100 - 74 - pow(14,2) / 26 + +4. 38 + pow(90,2) + +5. 79 / pow(12,2) + +6. 59 + 41 / pow(71,2) * 51 - 68 + +7. 14 - pow(97,2) + +8. 19 + pow(82,2) / 92 + +9. 27 - 47 + pow(84,2) - 53 + +10. 14 + 34 / pow(64,2) / 60 / 83 diff --git a/questions/2904255373@qq.com/2025-10-09-10-50-09.txt b/questions/2904255373@qq.com/2025-10-09-10-50-09.txt new file mode 100644 index 0000000..62db36c --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-10-50-09.txt @@ -0,0 +1,19 @@ +1. 51 * pow(84,2) + +2. 47 - 55 * pow(58,2) - 58 / 64 + +3. 42 + pow(78,2) - 50 + +4. 98 - pow(74,2) + +5. 31 + pow(97,2) * 12 + +6. 27 + 83 + pow(89,2) - 54 + +7. 42 * pow(22,2) + 7 + +8. 52 + 28 + pow(43,2) / 98 * 39 + +9. 24 * pow(22,2) + 57 + +10. 73 / pow(9,2) diff --git a/questions/2904255373@qq.com/2025-10-09-11-05-48.txt b/questions/2904255373@qq.com/2025-10-09-11-05-48.txt new file mode 100644 index 0000000..507769a --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-11-05-48.txt @@ -0,0 +1,19 @@ +1. 17 * 13 - 180 + +2. 47 - 16 + +3. 92 - 52 - 34 + +4. (97 + 3) - 76 + +5. 64 - 9 + +6. (12 - 10) * 3 + +7. 30 + (9 / 13) + +8. (25 - 3) / 2 + +9. 73 - 37 + +10. 71 * 6 / 426 diff --git a/questions/2904255373@qq.com/2025-10-09-11-06-01.txt b/questions/2904255373@qq.com/2025-10-09-11-06-01.txt new file mode 100644 index 0000000..8191191 --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-11-06-01.txt @@ -0,0 +1,19 @@ +1. 36 * 69 - 54 + +2. 76 * 87 / 97 + 100 + +3. 55 * 56 * 79 + +4. (√36) + 46 + +5. 18 - (√81) + +6. 21 / 38 + 91 + +7. 89 / 85 + 55 + 91 + +8. 24 * 63 / 32 + +9. 45 * 53 * 5 + +10. 95 * 87 * (√64) diff --git a/questions/2904255373@qq.com/2025-10-09-11-06-16.txt b/questions/2904255373@qq.com/2025-10-09-11-06-16.txt new file mode 100644 index 0000000..93a026c --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-11-06-16.txt @@ -0,0 +1,19 @@ +1. (√16) * 98 + +2. 33 / 100 / 28 + +3. 99 - 57 - 35 - (√16) + +4. 17 - (√36) * 87 + +5. 7 / 57 - 32 * 10 + +6. 24 - 79 + +7. 51 - 86 / (√64) - 74 + +8. 13 * 49 / 95 - 54 + +9. 53 / 55 * 59 / 97 + +10. 13 / 47 - 48 diff --git a/questions/2904255373@qq.com/2025-10-09-11-06-45.txt b/questions/2904255373@qq.com/2025-10-09-11-06-45.txt new file mode 100644 index 0000000..1fe3d07 --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-11-06-45.txt @@ -0,0 +1,19 @@ +1. 87 + (√49) + 69 + 82 + +2. 27 * 28 - 79 / 50 + +3. 10 + (√1) * 5 + +4. 26 * 24 + +5. 57 - (√36) * 52 + +6. 67 + 5 / 95 + +7. 37 + (√9) * 36 + 18 + +8. 11 / 38 / (√49) + +9. 29 * 97 + +10. 55 + 91 + 85 diff --git a/questions/2904255373@qq.com/2025-10-09-11-06-56.txt b/questions/2904255373@qq.com/2025-10-09-11-06-56.txt new file mode 100644 index 0000000..4cd3f78 --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-11-06-56.txt @@ -0,0 +1,19 @@ +1. 20 + 65 + +2. 4 + 28 * 74 * tan(12) + +3. 46 - tan(2) / 73 / 56 + +4. cos(321) - 67 + +5. 6 + 34 * 87 + tan(83) + +6. 26 - 65 + +7. 51 + 69 - tan(19) + +8. 52 / 49 - 78 - 63 + +9. 60 * 50 * 11 + +10. cos(232) / 54 diff --git a/questions/2904255373@qq.com/2025-10-09-11-07-13.txt b/questions/2904255373@qq.com/2025-10-09-11-07-13.txt new file mode 100644 index 0000000..3de6381 --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-11-07-13.txt @@ -0,0 +1,19 @@ +1. 32 / 9 / sin(8) + +2. tan(57) + 16 + +3. 45 / 55 * 5 - 31 + +4. 19 - 48 * 22 + +5. 26 + 78 + +6. 38 + 14 + +7. 39 + cos(22) - 55 + +8. 90 / 82 + 41 + +9. 55 * 94 / 83 / 15 + +10. 91 * sin(241) - 55 diff --git a/questions/2904255373@qq.com/2025-10-09-11-13-59.txt b/questions/2904255373@qq.com/2025-10-09-11-13-59.txt new file mode 100644 index 0000000..56c7eec --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-11-13-59.txt @@ -0,0 +1,19 @@ +1. 80 + tan(0) + +2. sin(265) - 39 - 40 + +3. 52 - cos(229) - 69 + +4. sin(268) * 82 + +5. 71 + tan(21) + +6. cos(74) + 100 + +7. 60 * cos(299) + +8. cos(325) * 68 + +9. cos(138) + 96 / 14 + +10. 48 - 92 / sin(107) diff --git a/questions/2904255373@qq.com/2025-10-09-11-14-12.txt b/questions/2904255373@qq.com/2025-10-09-11-14-12.txt new file mode 100644 index 0000000..acfa7dc --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-11-14-12.txt @@ -0,0 +1,19 @@ +1. 10 + 83 / (√4) + +2. (√4) / 47 + +3. 17 - 54 + (√36) + +4. 57 / (√64) + +5. 80 / (√100) + 34 + +6. 50 / (√16) - 44 + +7. 76 - (√100) / 12 + +8. 80 - (√64) + +9. (√1) - 87 / 37 + +10. 10 - (√16) - 10 diff --git a/questions/2904255373@qq.com/2025-10-09-11-14-28.txt b/questions/2904255373@qq.com/2025-10-09-11-14-28.txt new file mode 100644 index 0000000..454cbc4 --- /dev/null +++ b/questions/2904255373@qq.com/2025-10-09-11-14-28.txt @@ -0,0 +1,59 @@ +1. 70 + (√64) + +2. (√36) - 19 + +3. 25 + (√25) / 46 + +4. 71 * (√25) + +5. (√25) - 40 + +6. 47 * 8 + (√9) + +7. (√9) / 34 + +8. 88 - (√49) + +9. 3 + (√100) / 94 + +10. 82 - 5 * (√1) + +11. 5 - 18 - (√49) + +12. (√81) * 100 * 18 + +13. (√100) / 8 + +14. (√16) * 31 + +15. (√16) * 76 + +16. 74 + 46 * (√49) + +17. (√1) - 75 + +18. (√25) + 97 + +19. (√25) - 75 + +20. 21 / (√9) / 72 + +21. (√16) * 99 + +22. (√100) - 45 + +23. (√1) + 27 * 30 + +24. 46 * (√64) + +25. (√49) - 11 + +26. (√49) * 80 + 20 + +27. 18 - 20 - (√1) + +28. (√81) / 97 + +29. (√81) - 53 + +30. 72 - (√100) - 37 diff --git a/src/model/QuestionGenerator.java b/src/model/QuestionGenerator.java index f0ea5d4..6cea686 100644 --- a/src/model/QuestionGenerator.java +++ b/src/model/QuestionGenerator.java @@ -91,18 +91,92 @@ public class QuestionGenerator { * @return 数学表达式 */ private String generatePrimaryExpression() { - int termCount = random.nextInt(4) + 2; - StringBuilder expr = new StringBuilder(); + int termCount = random.nextInt(2) + 2; // 2或3个操作数 char[] operators = {'+', '-', '*', '/'}; - expr.append(random.nextInt(100) + 1); - for (int i = 1; i < termCount; i++) { - char op = operators[random.nextInt(operators.length)]; - int num = random.nextInt(100) + 1; - expr.append(" ").append(op).append(" ").append(num); + int num1 = random.nextInt(100) + 1; + char op1 = operators[random.nextInt(operators.length)]; + int num2; + + // 为第一个操作符生成第二个操作数,并确保合法性 + if (op1 == '-') { + num2 = random.nextInt(num1 + 1); // 确保 num1 >= num2 + } else if (op1 == '/') { + List divisors = getDivisors(num1); + num2 = divisors.get(random.nextInt(divisors.size())); + } else { // + or * + num2 = random.nextInt(20) + 1; // 乘法和加法的数小一点,避免结果过大 + } + + // 如果只有两个操作数,直接返回 + if (termCount == 2) { + return String.format("%d %c %d", num1, op1, num2); + } + + // --- 如果有三个操作数 --- + String firstPart = String.format("%d %c %d", num1, op1, num2); + double interimResult; + try { + interimResult = evaluateExpression(firstPart); + } catch (Exception e) { + // 如果第一部分计算出错(理论上不应该),则简化为两项操作 + return firstPart; + } + + // 确保中间结果为非负整数 + if (interimResult < 0 || interimResult != (int)interimResult) { + return firstPart; // 不满足条件,提前返回两项操作 + } + + char op2 = operators[random.nextInt(operators.length)]; + int num3; + + // 为第二个操作符生成第三个操作数,并确保合法性 + if (op2 == '-') { + num3 = random.nextInt((int) interimResult + 1); // 确保 interimResult >= num3 + } else if (op2 == '/') { + if (interimResult == 0) { // 除数不能为0 + op2 = '+'; // 将操作符改为加法 + num3 = random.nextInt(20) + 1; + } else { + List divisors = getDivisors((int)interimResult); + num3 = divisors.get(random.nextInt(divisors.size())); + } + } else { // + or * + num3 = random.nextInt(20) + 1; } - return addBrackets(expr.toString()); + // 随机决定是否以及如何添加括号 + if (random.nextBoolean()) { + return String.format("(%d %c %d) %c %d", num1, op1, num2, op2, num3); + } else { + // 检查第二个操作符优先级是否高于第一个 + if ((op2 == '*' || op2 == '/') && (op1 == '+' || op1 == '-')) { + return String.format("%d %c (%d %c %d)", num1, op1, num2, op2, num3); + } + // 默认无括号或左侧括号 + return String.format("%d %c %d %c %d", num1, op1, num2, op2, num3); + } + } + + /** + * 获取一个数的所有正整数约数 + * @param n 数字 + * @return 约数列表 + */ + private List getDivisors(int n) { + List divisors = new ArrayList<>(); + if (n == 0) { + divisors.add(1); // 除数不能为0,返回1作为安全值 + return divisors; + } + n = Math.abs(n); // 处理可能的负数输入 + for (int i = 1; i <= n; i++) { + if (n % i == 0) { + divisors.add(i); + } + } + return divisors; } /** @@ -141,10 +215,10 @@ public class QuestionGenerator { * @return 数学表达式 */ private String generateMiddleExpression() { - int termCount = random.nextInt(4) + 2; + int termCount = random.nextInt(2) + 2; // 2或3个项 StringBuilder expr = new StringBuilder(); char[] operators = {'+', '-', '*', '/'}; - boolean hasPowerOrSqrt = false; + int specialOpIndex = random.nextInt(termCount); // 随机决定哪一项是特殊运算 for (int i = 0; i < termCount; i++) { if (i > 0) { @@ -152,29 +226,22 @@ public class QuestionGenerator { expr.append(" ").append(op).append(" "); } - int num = random.nextInt(100) + 1; - if (i == termCount / 2 && !hasPowerOrSqrt) { + if (i == specialOpIndex) { + // 强制生成特殊运算 if (random.nextBoolean()) { + // 生成平方运算 + int num = random.nextInt(15) + 1; // 平方的底数小一些 expr.append("pow(").append(num).append(",2)"); } else { - expr.append("sqrt(").append(num).append(")"); + // 生成开方运算, 确保是完全平方数 + int sqrtNum = random.nextInt(10) + 1; // 1-10 + int perfectSquare = sqrtNum * sqrtNum; + expr.append("(√").append(perfectSquare).append(")"); } - hasPowerOrSqrt = true; } else { - expr.append(num); - } - } - - if (!hasPowerOrSqrt) { - int num = random.nextInt(100) + 1; - char op = operators[random.nextInt(operators.length)]; - if (random.nextBoolean()) { - expr.append(" ").append(op).append(" pow(").append(num).append(",2)"); - } else { - expr.append(" ").append(op).append(" sqrt(").append(num).append(")"); + expr.append(random.nextInt(100) + 1); } } - return expr.toString(); } @@ -184,11 +251,11 @@ public class QuestionGenerator { * @return 数学表达式 */ private String generateHighExpression() { - int termCount = random.nextInt(4) + 2; + int termCount = random.nextInt(2) + 2; // 2或3个项 StringBuilder expr = new StringBuilder(); char[] operators = {'+', '-', '*', '/'}; String[] functions = {"sin", "cos", "tan"}; - boolean hasTrig = false; + int trigFuncIndex = random.nextInt(termCount); // 随机决定哪一项是三角函数 for (int i = 0; i < termCount; i++) { if (i > 0) { @@ -196,24 +263,20 @@ public class QuestionGenerator { expr.append(" ").append(op).append(" "); } - if (i == termCount / 2 && !hasTrig) { + if (i == trigFuncIndex) { + // 强制生成三角函数 String func = functions[random.nextInt(functions.length)]; - int angle = random.nextInt(100); + int angle; + if ("tan".equals(func)) { + angle = random.nextInt(90); // tan的角度范围 0-89 + } else { + angle = random.nextInt(361); // sin/cos的角度范围 0-360 + } expr.append(func).append("(").append(angle).append(")"); - hasTrig = true; } else { expr.append(random.nextInt(100) + 1); } } - - if (!hasTrig) { - String func = functions[random.nextInt(functions.length)]; - int angle = random.nextInt(100); - char op = operators[random.nextInt(operators.length)]; - expr.append(" ").append(op).append(" "); - expr.append(func).append("(").append(angle).append(")"); - } - return expr.toString(); } @@ -224,15 +287,17 @@ public class QuestionGenerator { * @return 计算结果 */ private double evaluateExpression(String expression) { - String expr = expression.replace(" ", ""); - - expr = expr.replaceAll("pow\\((\\d+),2\\)", "($1*$1)"); - expr = expr.replaceAll("sqrt\\((\\d+)\\)", "Math.sqrt($1)"); - expr = expr.replaceAll("sin\\((\\d+)\\)", "Math.sin(Math.toRadians($1))"); - expr = expr.replaceAll("cos\\((\\d+)\\)", "Math.cos(Math.toRadians($1))"); - expr = expr.replaceAll("tan\\((\\d+)\\)", "Math.tan(Math.toRadians($1))"); - - return eval(expr); + // 预处理表达式,将自定义格式转换为标准格式 + String processedExpression = expression.replaceAll("√(\\d+)", "sqrt($1)"); + + try { + return eval(processedExpression); + } catch (Exception e) { + System.err.println("表达式求值失败: " + expression); + System.err.println("处理后: " + processedExpression); + e.printStackTrace(); + throw new IllegalArgumentException("无效的表达式: " + expression, e); + } } /** diff --git a/src/model/UserManager.java b/src/model/UserManager.java index c15d7e9..5f048a0 100644 --- a/src/model/UserManager.java +++ b/src/model/UserManager.java @@ -9,6 +9,7 @@ import java.util.Map; */ public class UserManager { private static final Map users = new HashMap<>(); + private static final Map usernameToEmail = new HashMap<>(); // 用于检查用户名唯一性 /** * 用户注册 @@ -16,13 +17,15 @@ public class UserManager { * @param email 用户邮箱 * @param password 密码 * @param gradeType 年级类型 + * @param username 用户名 * @return 注册是否成功 */ - public boolean register(String email, String password, GradeType gradeType) { - if (users.containsKey(email)) { + public boolean register(String email, String password, GradeType gradeType, String username) { + if (users.containsKey(email) || usernameToEmail.containsKey(username)) { return false; } - users.put(email, new UserInfo(email, password, gradeType)); + users.put(email, new UserInfo(email, password, gradeType, username)); + usernameToEmail.put(username, email); return true; } @@ -51,6 +54,16 @@ public class UserManager { return users.containsKey(email); } + /** + * 检查用户名是否存在 + * + * @param username 用户名 + * @return 用户名是否存在 + */ + public boolean usernameExists(String username) { + return usernameToEmail.containsKey(username); + } + /** * 修改密码 * @@ -76,6 +89,7 @@ public class UserManager { private final String email; private String password; private final GradeType gradeType; + private final String username; /** * 构造用户信息 @@ -83,11 +97,13 @@ public class UserManager { * @param email 邮箱 * @param password 密码 * @param gradeType 年级类型 + * @param username 用户名 */ - public UserInfo(String email, String password, GradeType gradeType) { + public UserInfo(String email, String password, GradeType gradeType, String username) { this.email = email; this.password = password; this.gradeType = gradeType; + this.username = username; } /** @@ -116,5 +132,14 @@ public class UserManager { public GradeType getGradeType() { return gradeType; } + + /** + * 获取用户名 + * + * @return 用户名 + */ + public String getUsername() { + return username; + } } } \ No newline at end of file diff --git a/src/ui/ChangePasswordDialog.java b/src/ui/ChangePasswordDialog.java index 0623981..f43e726 100644 --- a/src/ui/ChangePasswordDialog.java +++ b/src/ui/ChangePasswordDialog.java @@ -54,7 +54,10 @@ public class ChangePasswordDialog extends JDialog { gbc.fill = GridBagConstraints.HORIZONTAL; JLabel infoLabel = new JLabel("新密码要求:
" + - "长度6-10位,必须包含大小写字母和数字"); + "1. 长度 6-10位
" + + "2. 必须包含大写字母
" + + "3. 必须包含小写字母
" + + "4. 必须包含数字"); infoLabel.setFont(new Font("微软雅黑", Font.PLAIN, 11)); gbc.gridx = 0; gbc.gridy = 0; @@ -126,7 +129,7 @@ public class ChangePasswordDialog extends JDialog { if (!PASSWORD_PATTERN.matcher(newPassword1).matches()) { showError("新密码不符合要求:\n" + - "长度6-10位,必须包含大小写字母和数字"); + "长度6-10位, 必须包含大小写字母和数字"); return; } diff --git a/src/ui/PasswordSetupDialog.java b/src/ui/PasswordSetupDialog.java index 4d34c0b..084a6b8 100644 --- a/src/ui/PasswordSetupDialog.java +++ b/src/ui/PasswordSetupDialog.java @@ -10,6 +10,7 @@ import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPasswordField; +import javax.swing.JTextField; import java.awt.Dimension; import java.awt.Frame; import java.awt.Font; @@ -27,8 +28,9 @@ public class PasswordSetupDialog extends JDialog { @Serial private static final long serialVersionUID = 1L; private static final Pattern PASSWORD_PATTERN = - Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{6,10}$"); + Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z0-9]{6,10}$"); + private final JTextField usernameField; private final JPasswordField password1Field; private final JPasswordField password2Field; private final JComboBox gradeComboBox; @@ -45,12 +47,12 @@ public class PasswordSetupDialog extends JDialog { * @param email 用户邮箱 */ public PasswordSetupDialog(Frame parent, UserManager userManager, String email) { - super(parent, "设置密码", true); + super(parent, "设置密码和用户名", true); this.userManager = userManager; this.email = email; this.registrationComplete = false; - setSize(600, 380); + setSize(600, 420); setLocationRelativeTo(parent); setResizable(true); @@ -61,10 +63,11 @@ public class PasswordSetupDialog extends JDialog { gbc.fill = GridBagConstraints.HORIZONTAL; JLabel infoLabel = new JLabel("密码要求:
" + - "1. 长度6-10位
" + + "1. 长度 6-10位
" + "2. 必须包含大写字母
" + "3. 必须包含小写字母
" + - "4. 必须包含数字"); + "4. 必须包含数字
" + + "5. 不能包含其他特殊字符"); infoLabel.setFont(new Font("微软雅黑", Font.PLAIN, 11)); gbc.gridx = 0; gbc.gridy = 0; @@ -93,19 +96,29 @@ public class PasswordSetupDialog extends JDialog { gbc.gridx = 0; gbc.gridy = 3; + panel.add(new JLabel("设置用户名:"), gbc); + + usernameField = new JTextField(20); + gbc.gridx = 1; + gbc.weightx = 1.0; + panel.add(usernameField, gbc); + gbc.weightx = 0.0; + + gbc.gridx = 0; + gbc.gridy = 4; panel.add(new JLabel("选择年级:"), gbc); String[] grades = {"小学", "初中", "高中"}; - gradeComboBox = new JComboBox<>(grades); + gradeComboBox = new JComboBox<>(grades); gbc.gridx = 1; - gbc.weightx = 1.0; - panel.add(gradeComboBox, gbc); - gbc.weightx = 0.0; + gbc.weightx = 1.0; + panel.add(gradeComboBox, gbc); + gbc.weightx = 0.0; confirmButton = new JButton("确认注册"); confirmButton.setPreferredSize(new Dimension(120, 30)); gbc.gridx = 0; - gbc.gridy = 4; + gbc.gridy = 5; gbc.gridwidth = 2; gbc.anchor = GridBagConstraints.CENTER; panel.add(confirmButton, gbc); @@ -122,9 +135,15 @@ public class PasswordSetupDialog extends JDialog { private void handleConfirm() { String password1 = new String(password1Field.getPassword()); String password2 = new String(password2Field.getPassword()); + String username = usernameField.getText().trim(); + + if (username.isEmpty() || password1.isEmpty() || password2.isEmpty()) { + showError("用户名和密码不能为空"); + return; + } - if (password1.isEmpty() || password2.isEmpty()) { - showError("密码不能为空"); + if (userManager.usernameExists(username)) { + showError("该用户名已被使用,请更换一个"); return; } @@ -135,22 +154,22 @@ public class PasswordSetupDialog extends JDialog { if (!PASSWORD_PATTERN.matcher(password1).matches()) { showError("密码不符合要求:\n" + - "长度6-10位,必须包含大小写字母和数字"); + "长度6-10位, 必须包含大小写字母和数字, 且不能包含特殊字符"); return; } GradeType gradeType = getSelectedGradeType(); - boolean success = userManager.register(email, password1, gradeType); + boolean success = userManager.register(email, password1, gradeType, username); if (success) { JOptionPane.showMessageDialog(this, - "注册成功!", + "注册成功!请返回登录。", "成功", JOptionPane.INFORMATION_MESSAGE); registrationComplete = true; dispose(); } else { - showError("注册失败,请重试"); + showError("注册失败,该邮箱可能已被注册"); } } diff --git a/src/ui/QuizFrame.java b/src/ui/QuizFrame.java index c8f6adb..afa9ec2 100644 --- a/src/ui/QuizFrame.java +++ b/src/ui/QuizFrame.java @@ -82,9 +82,18 @@ public class QuizFrame extends JFrame { GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(10, 10, 10, 10); gbc.fill = GridBagConstraints.HORIZONTAL; + + // 新增:答案格式提示 + JLabel answerFormatLabel = new JLabel("注意:所有计算结果的答案均保留两位小数。", JLabel.CENTER); + answerFormatLabel.setFont(new Font("微软雅黑", Font.ITALIC, 12)); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 2; + centerPanel.add(answerFormatLabel, gbc); + + gbc.gridx = 0; + gbc.gridy = 1; + gbc.gridwidth = 2; questionLabel = new JLabel(); questionLabel.setFont(new Font("微软雅黑", Font.PLAIN, 18)); @@ -98,7 +107,7 @@ public class QuizFrame extends JFrame { optionButtons[i] = new JRadioButton(); optionButtons[i].setFont(new Font("微软雅黑", Font.PLAIN, 14)); optionGroup.add(optionButtons[i]); - gbc.gridy = i + 1; + gbc.gridy = i + 2; gbc.gridwidth = 2; centerPanel.add(optionButtons[i], gbc); gbc.gridwidth = 1; diff --git a/src/ui/RegisterDialog.java b/src/ui/RegisterDialog.java index f7c6213..e5f2414 100644 --- a/src/ui/RegisterDialog.java +++ b/src/ui/RegisterDialog.java @@ -31,7 +31,7 @@ import javax.mail.internet.MimeMessage; public class RegisterDialog extends JDialog { private static final long serialVersionUID = 1L; private static final Pattern EMAIL_PATTERN = - Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"); + Pattern.compile("^[A-Za-z0-9+_.-]+@qq\\.com$"); // 邮件配置 - 请根据实际情况修改 private static final String SMTP_HOST = "smtp.qq.com"; // QQ邮箱SMTP服务器 @@ -109,12 +109,12 @@ public class RegisterDialog extends JDialog { String email = emailField.getText().trim(); if (email.isEmpty()) { - showError("请输入邮箱地址"); + showError("邮箱不能为空"); return; } if (!EMAIL_PATTERN.matcher(email).matches()) { - showError("邮箱格式不正确"); + showError("请输入有效的QQ邮箱(以@qq.com结尾)"); return; } diff --git a/target/classes/model/QuestionGenerator$1.class b/target/classes/model/QuestionGenerator$1.class index cf26fd48ccc4d8d22bf147f8e88458273055c233..482bcc5ad3d3e871ae648bf6a74fa593d2412706 100644 GIT binary patch delta 283 zcmWN}&nv@m9LMq3GkmuhB55W+;zUwhwgW{-@}nIz=10-|x}Z5QCZ_o@KTCbC%3=S2 zlE1*km5Zz5qIPz1@jkr{uSd^fs2F-odgVk^MO3v!+=jR4(W`d)+?$tbpkE~n$Y)#4 zpz0Y?Bg1ND#LfHCHDfAeTmdE&Vp1K%+?OvCo>CccD^9D98MTtI+^jm8bHPBDEBIsK zB@;;#%O+M#teRLevHlbciu1=}=-%5$W9 zvU=cH1>0wGdf`N`oa&u3eQ>UC^7`RIzg+5%EBstj$qm)q(!w1*IE5vRx{BcEKej?R At^fc4 delta 283 zcmWN}J4-@g0LJnElX>)bOzdLE6P0KejFJp0E4t8KD-ePpC3r&4qL3@I#)qd37!a_$9<25!<9h zS{)23#IVBVBvR{k=~N6?9=_sCC}BP$S3wV9^^s7Dl={iaC$BV<3XJC#Og&l+GFD`* z$XPLB#i$iyR*XM-?v1Xe>}A2u)AqK=kY>qg&d&1`RidN?jPoX_;HCaHm!7 ywMO0cN$WgogBNY`rY+vJ&6jrg)-ElTX{(~B_SB_)C3T>Ts+!Ru0Z=w^@8cggeK6<% diff --git a/target/classes/model/QuestionGenerator.class b/target/classes/model/QuestionGenerator.class index b6b291e1a8a427895d2f11790cc3b3a7e4900fae..b94eedcba6dc09b07d1c0a66294c8e8db5f35d6f 100644 GIT binary patch literal 12348 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%0A(}I zM-t+Es3$F;YFVJFb@>S!sFzdTVJZP)y0K(l27==i1lOrx2rOCv+=_r#idZ<5d`G7f z-1SDN9bM&iOt5V)tngXj*MYXBcA8xS6JQ%UYb)<>z-eIff*pKd&u-tjrCS-NqnKw_ z2e}rY@hlqdOyhYpTvnsuVcsvH#}9oTivTeKmwhGpF2(Iv6~3(^LQaT8L8X7m>Jj`$ zVKH6fKcHL_zWyK|FVeZ$55G??x@|VcLwhn$FB`-!ck(L_;Mpn!)XE5AVp*#I(D`+Q z7Wt#|8?cz%eZPs8ga6EL;d?r2r+49ze^sCFsm~A8=SS-E6aF^>&|&U&khC3a_sX+V h^|;li=8!5IzmakH9EM{6LTVw}_~Ve9MHhA`{2!an=_CLE delta 5831 zcmZ`-34Bvk*8iV0$$L#-Xh{ieWU)n-q)m$;Q^$a~P?RbNQneNsCA6VL+NLHc0*X;U zMMVXkDB_B!bpru4AXUU=ToCttT+wlN#%0v`MxC$ozb|PieBY$~z1(~5z2}_!KmT*? zeR*{D#yZ!Y|J}I@z>)IPR#&~#so{J5(N{e#G?2nY0%y3bEz;U380fDF zn16El`s!FJkPbB1f+D9U4Pk$5;6izfuOnG4R&%` z+gmhT>p~-LG;kAcHfQ9HIn#q%4cvweg1pwq!sPL>SaT%Y%Gv(F3>P-yP7QYm`kWJ9 z5FXhaZfzPlC7hgR;4XAoY4KrB6E$q|3pfEH1H4n#Gtf= z;|W4f-c@^;YQGrxC$3?ZwS?zKCd67B!pXX5avoa=+D;~1@Zette#KAbOYYLtM!G5@ zHYy0uVbJaV>Oi$FcBav=hRTv*m80jn#3{NanxOE&;D#HRPln`*i=m;+x3>hPTFz?9s>qF#7L;fg7nQ!EWWUQHAFd%ibz|-5A>5*__B<_-N za*Q&0te|f;Z?fKw4bXv*9Ir-MfC~4IW|pdP!Zgv46I8*ov)Z-jGD+ZKy3DGal_;+) zQxi@yC1;y;ealO7B`gh^%;_E4k+q8w$w-SK zjS?}-jlpwV(j-w$=5_Oko2{8TabZKGO$F7EbCh{kQzSVhl1PM`A|B-67nih1OcR#N z4EeZd8f$x!wIULx@-`{wrrMOKxz*g>H!5Nd@(eKBv?8;_?KGd&z2-R{x6dwq6~L4s z7g;fFncoJ^Tw-qW49vMqR+xJ|!w4YF#8#r++cPU z7EiqKAR^Soqs$a)%+0U@ECIspiB< zxg6^>Bb{X=x5^2+>*GxHXdc7u3m`l919-bBU%H+bNqR?}OJWqyw z;;nVQBCl!ksyVhl52t_1>wb@v<&&u_k}HdBYc*uMd?-$&0sHJUmekp+>>a48P|}KB zl#Z!#^qNuS40|KV7q5N5hORwj!89&UW91f_%s~;KWjs@Xvly(i zQHa?n#~h4B1CHZicM4Jw%*0%rOTl79QOv26GXBDcL)gp1Lac(5=SU&iuo`P%qlznL*~%=KQ_x@gOx5oisIHQc~cel(Tv`b4Fr`GCx! zCWX<}X=pZB$E#xvN1>x+X35_UeXw9;59^n*$V19x$WwO!wY-i2j^^8NwAa2Kf6StP z1B!y4tpv`ic;*CLI((TRKT9PY)NxDOxUe%^03;osOS#n@&g z%UqRRGN?OQ#M7ND;_6A3AG66)iSJT)47(VyQDlqC8wXB6U;1`E+l{En=FM}MX0;qN zJ0Ux&a%lu|ySNp;?)2mmDKg}Dz6TXJeudNaJ0{D&2!W04?Iy@Xn#-k+B?|05|EB_# zq#m!Ww|kzbt#^2ystqZwSP6E4*Le#{dq+#lMu94_?D0A+!i@Ji*5fFjT^aD%RnZz9 z(t4s^r3Zanvdr^m6*ygmHOm;1vM^Yd;;LTt&&p47XSq^(>VZlvzF2dswBDZSSsio8CS^_1c-G{BT$y79uro!nJW8@WMzZX}v3Q)2KfzEu$y9xc#q4P`<5?#7b6A1r z8Oc3l#0zA?UZ(Vmoc#nxUS;bwypPxM1>V3nIvbZ-Gxq$Itk-@Hqz1 z&!H)Ni3)s0liyfqm1GQN(V}V8bDO+g;|QWPovLi=eJ1N*4S}*zsk;;3)|ZuU$KTWV zVZX&bma?CbE2puD{%jfOpIOjtz|QEbHXj=?(1xGQ_ePWt!vFNcZ}a=%-%Us9#rh6( z<*&O5{j;UYJj{Q1D#!5{a_Vymj`QlX*X$4n6UgWA>Z5i@UhNJks9mm$SJyUlz0oQC z>dSq0pXPOLm;U?9)Jfbv z9c+P|i)G@DV;vheQE;cUn;-d0PxO(fHZtITIfM|YEp^BM8A$FF;bxX6bsCrO{8BYX zI@%WW~zn zzX(2AiV?C50l5@o9Ro1V~LrMN?FL*7}$WEY-<%sJ&Q6o z_Mt!)$zt=W@}a3A@;mx!a()-(x!uQpr6xltQ-z;TbfFaPgT^?+8r5W`^&jF*0z9xP z>e&4idB^k1?e1bE57yefl9vx@N_DZu96Y1ju1da>aB>eDF0k$(t=wrIvHhV_x{0x5 zKQY#$ABl0{dbk;wLb;d`*}6lPh3r0ipyU_~mX= z=6(ir6AqWn{B30uj+F;^_HN~?%Qj}~gUr&0NSTMRmi>*g10VCf=zHlj_g0jrGIXiL zQ*s%#*m>q`rH1JQak5Hi5=UJI&Xmp6nTw|E72Cyw!6FHh^(=yIumTct)XElyBh2>2 z$om}u2D6JQ^SaqF&SK7Tb*)qsnyJlD{8-1uWxQDy!S!D!TJsbq4rEWyCG`N!7I(~7 zDt)JKt$zmgEp{e!Y~3$v(zb$Oud zX0;hkkazR-H@~s`fgc5Ph4(Nt2j1jhmK+^4XRqE|3cn2T(7SfTB>4T5{hcTi3y{E877ffy9L? zzXc>BBo6!leiUM69nvWAWoLHw?VC4m_s`#7zX3eLegPSQ`Y`A#uk|KU;Y;aDM}<3_ zANglN0Xc!nK)#bLPx?;lRd=9zv4Ek5()9$Y?aQ;1ICOpIvB1)WjH35J*cT`|q3o;E z4;M;cwVm{N_P@l?5jFDVkdE_DT;Gik1YR^2NmDBGWQ&kyM<91dvz3s=iit8R0@+5h zQv@kDVIa@hnu$V^t(#avk!x2?l#mx#X}i8U9u2!HJe6IKWLDcjPkJ30y1bthbMd(w z32aR!OmmWkEjucHJ+)@7(Oi^FplB9UOYwroGKp&Hqku(R^L`}#SW4n==_DA1J@wS( zDJnA(AMg_r<&p2J@X#ZHDk`8s54P|x=)w3R{|rixRTMuDq8PWxu`GS49I9+8Wf``V zVwDZmk?f>s5V8!D)+@C8OgMvL-TsMXdw+~o``#FqeSeIay_p+h<2#*Zu*n#G|BQM# z#CVQnxUevwv$u2xJWQBy4O_HhJS!18V=Wn-u^Lud=jSCZf$O+2QPZNxc*Fhy>l-CW zVq#qt0E delta 486 zcmZurJ5Iwu6r8mkCs|AY$C&>&1QG*EfkY@!8txE&B~U~P&_Hdj5cvRb0t6Bk5(V_! zhZZq!Z2>|wJF~O1Gjm_ME9&>pmsbF7tPS*yc6WOhy{nGG&fs>t-RvqjdzYtY8a65( zG)5HcMzdRn!kC8wTwzrY#f*)6D50D*)LZhQT52V!TU)UWUz{wl#7FeSMRfRCV~D56 zTc7U^F^HZq9IdAqjW$yF(PoO^k-CMDXUHsIpUwkj9HN3FRB?<6s!{eIlbGU-NzxlL zUZ_-ChDo_ibs95yb&DvjLi7axfh6m4jd)_Rz08njE6ie!itO&tEy1pA_J5XYqxNHt tI5!btX8WG!noZI?kA*z!_mbf6lIwq#*jO}sm#|FKj8UkePPS_F+80idCwu?^ diff --git a/target/classes/model/UserManager.class b/target/classes/model/UserManager.class index 8ee20a6c7a701431574defd95d61a78d1309021b..5db0483d550077924f1dfe2b0f21f4ff19a34c94 100644 GIT binary patch literal 2280 zcmb_dTUQfj6y0AkA&?Arp+>CMk}AW+^r9jLi7iD%xoANwyba-N7#k*ZCaLug^goop zP#&yZOO|!5u0HwD-_+IBeP$*X8d!ZPS!BM;x$M2qnUg>N{_S@F)7VTRrqI7v+0o_P z6JLAFwriKPmxQ6v_sss@&XsMqlv~|?ri)dDM2$ASLhn*=SF1YZ+_Jr&SLj-EO0He4 zd0L@x{B}0n27%V9p5vDCOKlmml6}$rrjnmyv|h>M+IxDvvan}6Wrgei9kU5H$|8|E zXNzUWb*gg;@iA*d!I&r6Bzj4^$>F~3?~+FfJ?J+v08^o3HgM~L!Wk0@bjWJhL>D@Q zzvJqa+TOPI*6r;wIS(vVigtO!_8i#E;)WxdkPQ6PSB~1 zQxxT%XYc6s7yCNj?qqGHaS@l2_&}k%$&vg_e27tnbg|-AZO8Q=>K6(_t$D*j=dGNaxr|za%J190 z|GeVuuy;#!HQ5wx0@JkKjns3kY8Stylu_9eYnX=YBl`gwDgTC3E&qQ2|M ztKZkc`Kr{M$}PIC_U6khiYDPsv5?`$s4Lp9E^C<_J}z;j#5ss#I42W^yJWEI88aDJ>+lbEqXSO(Dy3_8>^vTcoD;U{7waCX+BMy4Nk!ToNiH=9G{Bk ziSZ+3nr@O;oW(^acv-$5ti3*Jp%qCtqtCchQM#c@CULhQ}56-^%}P(Ut{h7 z3H6ej`Ij^c!3_j1V`Od-);KO;G5|InhH3yCZ2%jMfOTUS_i&$a1Wp%Xf8l%*S;4f3 z2N9+@ViFFihM1yDSjDg$H-dD-p;aSYDoUsD@T6EnVPXCq>&_{$L^Z*+gyjg=0rN?b ztyZmW85!dpdNW2-uJ~cbpkOO)I!GvDtrAguHdVda#{@0)O(mv~9fnfs$^eC*hE7v+Zo6>t^Z92p^ywYx3&bsB<$_^KG z|OTup{9z(GB*Uu&28RvnNYc!*5XK2vuw=`MPu2(m$*-P{IoppP0s6GYCBs==8`L) zCYIi4cf6*&W2>t>sK!J*q%NouQ>bOvmEMxW8c6c%Js2d6x+eW#RjQlsV}c_g&!NY= zqvitNMOr!Z^1By((796L$_&@kuk;4S<9(F>z|e0rb2!GQa^n_`hbt-=r%vox=UeR- zruT8;zb<;{Vnhcpf|EQb@Bv2oR9Sx}8jbJT?--hSg;P2Fib8%*S#MBzJTp7DkF&3E zE{|`uJ)X;laE3#l5zfDpC^Obsa#PTzqgZhsMuo{W1+GSZ(;>qeW--S&7s6f1$EA_ZH>3m-uw{C9Xb4LA;=`_#*UI;zVf9p&yeNW}4qMZB%=Ufl)1?nBN=KNb+7v^O4Z;2KBy)aiX3e#PbBHm|lv4c2k>O urY2Tm-A%0WD^LH^A!jYDK*)JKN)rP1xzs zE30L5_oLowcQzgFEnN>kb~QV6vz)9HKAVe4GgCA_d@^6<&8^(8?f=|zig%Vz@YR!C zYS+GN;x%fl4Wb)$+Lcn&+Eq1ogCs7}+$75_aIsUSkhIV*ZU)51pad9_0fr^Qh{Sjx3Bt0#L&?OF1Z|P*$WIyoJ1zZ5U(nKFwPpFPoP(d44j3nRkDY(xinWlcPh2_g{glJY!DwXK*J=a~sn9 zUfqjM>NT?=!|yhX>OJ|aP{0<2>{G-M#hg>ZC8b=GM z6Q)57m?RdnBw>+M8YP`(F=CZmTBHn{m}nC#?PA9+4mxC*PI1vCn{>-w3O(YZSI+2@ z3;N}j0rBIM2L|PdA#FMCw{46V#z|oUBa=#YN{LM?kr`^3#ljq|%wxlY124lYF`}a8 yS!IDWMb}wmL(x@5H`Uu>TkU{d?JeGw=tER?1jpz&L646pPBlkDr8u>lgzA5A*Hw}L diff --git a/target/classes/ui/PasswordSetupDialog.class b/target/classes/ui/PasswordSetupDialog.class index 9440c03fb88b4a941fd6df201a07206626e82e74..b1636f1844c1f747cd2f0ceaff815b0e22b64064 100644 GIT binary patch literal 6841 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 diff --git a/target/classes/ui/QuizFrame.class b/target/classes/ui/QuizFrame.class index e9cf7cf23b133bc6b1d7c6ecc02f3ab165ccfa12..4cfccf3ce6598072c2d73f074d79acc6fa7edd78 100644 GIT binary patch delta 2663 zcmZWr3s@A_75>lcV`gUuSQbH6z=AJieGoD6t%=5{2x=94tTE`qPH`1MVG;GqmnDXN z*7zmbUQHUCq(VrEFCtNP5qu>vG);_&rft%+3WTPQ@O~YP8Vl#AV{Jy|S73=yS-3Gz|4T(tNIm%_cE>6j*wq~Tuc!Q8E zmQ!+nL+OZyWVlqcAl~KLvwc!ZioRg#aiH1+{8?n$fLpg=tY4|<jeht7`Ph85Nalyn%dgv0f%R)w$k(5*(|%>%G}!-tyAyfQ zdFFDkOZ7^PG>Q>l*as_LQJh8&iWmL0+!iMzFJafnLTObRTDghG>*2@?z#K8OGUM z=`Ht_=>^rrYy1JjC|jfZFpgv3uexocP!1vS^6TL%wOhNl?d@u-?P}W>&A&qTbIou? z^fa~`?8ay`7T3g=F(YY`$cRm_Poyba9`qm~OPtdZ#0hc^%+1YOq|!v1s?juqpUV6e z`K$cJWjbeprfc+w*b+O7^2JB7DM}vAH4x^Bvsx0H$IFIs9!(V)afRkZ8jTPeu=VzmxfQ)jZUZWeeXZE*d3J+;mN=`gV$yi1iD56X(rx92|qfty# zP(t(JqY~&;j#8?@N(y2XeIKhypp5on4Yi`2PN0HLV=bM>I{K8?KSO}7Vm)0)jig|M zl!A@YNNkeE;c;myo{(k*Q7bLPX32x6@Mk8s37SzJxQH&E86%Yoh9V;kF_0poOGsch zGNke7Mi0!`L>F)wS71RW?Zj0cS@9ul!(Z@MF1W8r$KQ|yg=t^J-|;zYv>D6s4@Oy_ zGPmXUf=yI>$vaMl=@w?fB7;gPwpGMTkV+3sRn06LIW2Be-xmR{eP7^cLUP-17I-raV+*D3kNV92Qh-@_i-a1 z#T|Vb-oR`eMj;=fB7`|MZQqJPNpB1!cxfEtas%YnZIsqfiA^&ifsrCHNPzVQWFm)j z4Q9tT7{JkBMmI#9E6pgFEfsxe{OVbm&ra!}iN^b90AGXB_%@WUXk~`KOY#sDaMKfzv|WUt<24sRicpJVYh*Ys&j#XH|(J*}5@B1X^*nh8Gm$#Byw zrfp&qJLS@Baop7}n0JRqnC9dU<9)w-@4n7RCA`m7b%yu;04|)3?32X2z@IMBgY1Ax z^JxLtccXDc6OZxyG_))Xx$v$lRu%)b2Fz?ewh@h99M+}9w1gE*W} aWhL}IDy22tp~`73%Z*;Oj;g2{uKxk;oS8iU delta 2455 zcmZWr30PFu75>k>nR)ZxJYX2M83Y2zA_GVy#uyq&qgFsMMnTB9fWS;(ltmaQ#;+|V zwb3-j+TMO`O!Kv9Opp{qNyC5;sg1_ANn6tR3$^Am?I9r^0T1G{xh z;e^y!A>m&#kc?R>eju*clA=zbNlw3P;1&E>#A`)SQ_^D{PD_ukihHyo*Uve`s*axS z7M;ycJ2?x#Fz`#fA-=9HvrXaG27ZIziVNBz^BDtgiX8pCNV8Wa{hi?0-0aR! zrf!|AWK&5MbB#nrBVCjk*|sZW7!*a(qT8rQb{G_k6$CZt@2>W5>(((%aR$Xxf_TFy zv?dwkBDc_^mTEjP%b*lW6}3^hvxmvSm7;WmGO&?gXY(q5E4%djIJq?2pe%79YL#aW z7pA45-Ph``>S=5XF#a$V7*vRb9C9G|k&TUtL~?X;{5-BS*YVP!2}$G@gXZHsQ64?_ zrrS9QJ%OS~f|hkPwE1;fNT1*m(;b97Q5ln!RZ&rqS0lxx2Hh!H>CCDo5DYZ7`Z?8f zmqClgndtJY3PK`-m31}v{1FD6)EUrnS|LFzMMX@$Qck6!H>TQLWspalj=9&mjy9;Y zUKBcVm5o#LjFvheOWYy7D?y=zu9xl*V1|bF0cIz7_r+bgPz8Jmr~0r*{m8 zM=|Jm9)pwkjMw=&#o-*oju1XCMGl>xc!xfY<`BN^wn~{>4dLNQ46)_2B{q+G48x-s zQ5I+e@bdgff;Nd^p8RfAWK2x#c+F#YVGOA$<&;r!)im9hEG|);k(t0#eCw%l-_~{|sM|;pr zkE4b9d43RE=sC2}3AEFz=%91hO7Ei61O!bQdQ1-Vno@DUDFfSamc4I1xBxS@(_vi1C0KBZHsFukv*I*W;WCG#GTC$Z6aEYv zEk`~6!nPU{s>fehPvbCw5-8IsgGB|YxT4}8RH(uO-c=Up9}8KgqAvW~r(%d%UBz0a z^rqO7l+yPv;^W@N+5Gni=XV~zIY)8TgyWd5Oiyg-UMMU^f@}VXWh}k_ICY#Ww6^?LGJ+ zzKpN%bCyv&oM%Abt#D;>xTx8b!hB8<#-0w zIKmg&vz&q98zOC*iPXf)_*TZ{%ZRT?xqA9cY?=`c-xQ8C4%QEOosq-zKFp2}kjXJK zBfhHGDvkL)&D<>9F6I)=*~Ono&3ARg(}FGKxqC||X`wt>GWpF)l}guj#;Byk>^5^< z7kNVTNm<)kQ+TIl!p4J94mZT%jx)KVDCYJyOkfcvaTi{=A)LiC;Uu7tme5ir=7NVl z#o;JyVW(wOCblLg_myAgF-FTP^V#ppkNig5I>YPWMP5@U*!4-c@lx1LqTHMO*CDb# z9MI`*S_RIDJn3iha67kB%fgUrWGE3xD~o|%39}p#9Lo$2>ryqXWd((5qyg2^z1%vv bSI@Fd)I>ho%vZ`5YGb*)T-s?Xb;12#CE-Ft diff --git a/target/classes/ui/RegisterDialog.class b/target/classes/ui/RegisterDialog.class index ce0a1c4f4f3a360c1646eef55653ce85c109e3e8..24e8279f3e198dbfc9fe2e1f30850e9ef53e2140 100644 GIT binary patch delta 114 zcmaE1^W0{`Q${JNxM)Y+s6^c=16@n)cs<=%ZHL0b7`^2D+|43PS!}{WFPqjqU$^ne zj@}o|d!Ovs^?c>7$x}F{>FT^#zx~C&$xmCCKAY3|Y--2zSuKHq5Vaalb}t1Q0y5+I Q?#WL#?9<%rz^Ne$0LM5uC|ri&zQv~Ci-Ii z_80pmKW$z5vT5D(bsL|~+3<93!{i!{X=0)fk!K6`Jl)g(WJm9_wTquGT({YtQ$rL0 DPgFGk