diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index fba0cc0..1c8d371 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -10,16 +10,20 @@
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
+
+
+
@@ -36,20 +40,17 @@
+
{}
{
"isMigrated": true
}
-
-
-
@@ -58,43 +59,48 @@
"associatedIndex": 1
}
+
+
+
- {
- "keyToString": {
- "Application.Test.executor": "Run",
- "Application.TestMain.executor": "Run",
- "RunOnceActivity.ShowReadmeOnStart": "true",
- "RunOnceActivity.git.unshallow": "true",
- "SHARE_PROJECT_CONFIGURATION_FILES": "true",
- "git-widget-placeholder": "LiangJunYaoBranch",
- "kotlin-language-version-configured": "true",
- "node.js.detected.package.eslint": "true",
- "node.js.detected.package.tslint": "true",
- "node.js.selected.package.eslint": "(autodetect)",
- "node.js.selected.package.tslint": "(autodetect)",
- "nodejs_package_manager_path": "npm",
- "project.structure.last.edited": "Artifacts",
- "project.structure.proportion": "0.0",
- "project.structure.side.proportion": "0.0",
- "settings.editor.selected.configurable": "MavenSettings",
- "vue.rearranger.settings.migration": "true"
+
+}]]>
-
+
-
+
-
+
@@ -109,18 +115,12 @@
-
-
-
-
-
-
-
-
+
+
@@ -140,6 +140,9 @@
+
+
+
diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF
index 996d6dc..0010825 100644
--- a/META-INF/MANIFEST.MF
+++ b/META-INF/MANIFEST.MF
@@ -1,3 +1,3 @@
Manifest-Version: 1.0
-Main-Class: com.Test
+Main-Class: com.pair.Test
diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml
index e0b5756..c3f5f6b 100644
--- a/dependency-reduced-pom.xml
+++ b/dependency-reduced-pom.xml
@@ -36,7 +36,7 @@
- com.Test
+ com.pair.Test
diff --git a/doc/测试文档/发行版1.03测试.md b/doc/测试文档/发行版1.03测试.md
new file mode 100644
index 0000000..75e8118
--- /dev/null
+++ b/doc/测试文档/发行版1.03测试.md
@@ -0,0 +1,11 @@
+# 发行版1.03测试
+
+## 新增功能:
+- 可发送真实邮箱
+
+## 待实现功能或待修改bug:
+- 点击注册时窗口界面会卡顿,感觉可以将发送动作放到后台
+- 注册码发送提示还是错误图标,新建一个弹窗提示,不混用错误弹窗函数,提示改为“已发送到邮箱,10分钟内有效”
+- 生成题目页面选择初中高中学段生成题目,做完题出来学段选择又变回小学了,页面初始化得根据用户学段调整
+- 得分的%去掉,得分是按百分比计算,不是将百分比当作得分
+- 注册码简单一点,6为随机数字
diff --git a/pom.xml b/pom.xml
index 2464e3f..42620cf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,7 @@
jar
Math Quiz Application
- 小初高数学学习软?- JavaFX版本
+ 小初高数学学习软�?- JavaFX版本
@@ -55,7 +55,16 @@
javafx-graphics
${javafx.version}
-
+
+
+
+
+ com.sun.mail
+ javax.mail
+ 1.6.2
+
+
+
@@ -100,18 +109,18 @@
-
-
-
-
+
+
+
+
org.codehaus.mojo
exec-maven-plugin
3.1.0
-
- com.Test
-
+
+ com.pair.Test
+
--add-modules
javafx.controls,javafx.fxml,javafx.graphics,javafx.base
diff --git a/src/main/java/com/MathQuiz/Main.java b/src/main/java/com/MathQuiz/Main.java
deleted file mode 100644
index 49ac2f4..0000000
--- a/src/main/java/com/MathQuiz/Main.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.MathQuiz;
-
-public class Main {
-}
diff --git a/src/main/java/com/pair/MathQuiz/Main.java b/src/main/java/com/pair/MathQuiz/Main.java
new file mode 100644
index 0000000..f94bf8e
--- /dev/null
+++ b/src/main/java/com/pair/MathQuiz/Main.java
@@ -0,0 +1,4 @@
+package com.pair.MathQuiz;
+
+public class Main {
+}
diff --git a/src/main/java/com/Test.java b/src/main/java/com/pair/Test.java
similarity index 88%
rename from src/main/java/com/Test.java
rename to src/main/java/com/pair/Test.java
index 4b5337e..0a83bb8 100644
--- a/src/main/java/com/Test.java
+++ b/src/main/java/com/pair/Test.java
@@ -1,7 +1,7 @@
-// src/main/java/com/Main.java
-package com;
+package com.pair;// src/main/java/com/Main.java
-import com.ui.MainWindow;
+
+import com.pair.ui.MainWindow;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
diff --git a/src/main/java/com/model/ChoiceQuestion.java b/src/main/java/com/pair/model/ChoiceQuestion.java
similarity index 98%
rename from src/main/java/com/model/ChoiceQuestion.java
rename to src/main/java/com/pair/model/ChoiceQuestion.java
index e4b0b54..d18b867 100644
--- a/src/main/java/com/model/ChoiceQuestion.java
+++ b/src/main/java/com/pair/model/ChoiceQuestion.java
@@ -1,4 +1,4 @@
-package com.model;
+package com.pair.model;
import java.util.List;
diff --git a/src/main/java/com/model/Grade.java b/src/main/java/com/pair/model/Grade.java
similarity index 96%
rename from src/main/java/com/model/Grade.java
rename to src/main/java/com/pair/model/Grade.java
index 9d8be2e..65bcee9 100644
--- a/src/main/java/com/model/Grade.java
+++ b/src/main/java/com/pair/model/Grade.java
@@ -1,4 +1,4 @@
-package com.model;
+package com.pair.model;
public enum Grade {
diff --git a/src/main/java/com/model/QuizHistory.java b/src/main/java/com/pair/model/QuizHistory.java
similarity index 98%
rename from src/main/java/com/model/QuizHistory.java
rename to src/main/java/com/pair/model/QuizHistory.java
index 5bad9d0..98b7558 100644
--- a/src/main/java/com/model/QuizHistory.java
+++ b/src/main/java/com/pair/model/QuizHistory.java
@@ -1,4 +1,4 @@
-package com.model;
+package com.pair.model;
import java.util.Date;
diff --git a/src/main/java/com/model/QuizResult.java b/src/main/java/com/pair/model/QuizResult.java
similarity index 98%
rename from src/main/java/com/model/QuizResult.java
rename to src/main/java/com/pair/model/QuizResult.java
index 6153306..ee7b82d 100644
--- a/src/main/java/com/model/QuizResult.java
+++ b/src/main/java/com/pair/model/QuizResult.java
@@ -1,4 +1,4 @@
-package com.model;
+package com.pair.model;
//答题结果
diff --git a/src/main/java/com/model/User.java b/src/main/java/com/pair/model/User.java
similarity index 99%
rename from src/main/java/com/model/User.java
rename to src/main/java/com/pair/model/User.java
index 9a0d3d3..cd93200 100644
--- a/src/main/java/com/model/User.java
+++ b/src/main/java/com/pair/model/User.java
@@ -1,4 +1,4 @@
-package com.model;
+package com.pair.model;
import java.util.Date;
import java.util.UUID;
diff --git a/src/main/java/com/service/FileIOService.java b/src/main/java/com/pair/service/FileIOService.java
similarity index 98%
rename from src/main/java/com/service/FileIOService.java
rename to src/main/java/com/pair/service/FileIOService.java
index a04118a..d420587 100644
--- a/src/main/java/com/service/FileIOService.java
+++ b/src/main/java/com/pair/service/FileIOService.java
@@ -1,9 +1,9 @@
-package com.service;
+package com.pair.service;
-import com.model.*;
-import com.util.AppDataDirectory;
-import com.util.FileUtils;
+import com.pair.model.*;
+import com.pair.util.AppDataDirectory;
+import com.pair.util.FileUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
diff --git a/src/main/java/com/service/QuizService.java b/src/main/java/com/pair/service/QuizService.java
similarity index 98%
rename from src/main/java/com/service/QuizService.java
rename to src/main/java/com/pair/service/QuizService.java
index ea153ab..917c91d 100644
--- a/src/main/java/com/service/QuizService.java
+++ b/src/main/java/com/pair/service/QuizService.java
@@ -1,7 +1,7 @@
-package com.service;
+package com.pair.service;
-import com.model.*;
-import com.service.question_generator.QuestionFactoryManager;
+import com.pair.model.*;
+import com.pair.service.question_generator.QuestionFactoryManager;
import java.io.IOException;
import java.util.*;
@@ -38,6 +38,7 @@ public class QuizService {
// ==================== 答题会话管理 ====================
+ //开始生成
public void startNewQuiz(User user, int questionCount) throws IOException {
currentQuestions.clear();
userAnswers.clear();
diff --git a/src/main/java/com/service/UserService.java b/src/main/java/com/pair/service/UserService.java
similarity index 96%
rename from src/main/java/com/service/UserService.java
rename to src/main/java/com/pair/service/UserService.java
index bc5e550..9e1be91 100644
--- a/src/main/java/com/service/UserService.java
+++ b/src/main/java/com/pair/service/UserService.java
@@ -1,23 +1,21 @@
-package com.service;
+package com.pair.service;
-import com.model.Grade;
-import com.model.User;
-import com.ui.NavigablePanel;
-import com.util.FileUtils;
-import com.util.PasswordValidator;
+import com.pair.model.Grade;
+import com.pair.model.User;
+import com.pair.util.EmailUtil;
+import com.pair.util.FileUtils;
+import com.pair.util.PasswordValidator;
import java.io.File;
import java.io.IOException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+
+import static com.pair.util.EmailUtil.validateEmail;
/**
* 用户服务(包含所有用户相关业务逻辑)
@@ -31,7 +29,7 @@ public class UserService {
// private static final Pattern USERNAME_PATTERN = Pattern.compile("^(小学|初中|高中)-([\\u4e00-\\u9fa5a-zA-Z]+)$");
// [用户名]@[域名主体].[顶级域名]
- private static final Pattern EMAIL_PATTERN = Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$");
+ //private static final Pattern EMAIL_PATTERN = Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$");
// ==================== 构造方法 ====================
@@ -69,6 +67,9 @@ public class UserService {
System.out.println(expiryTime);
saveRegistrationCodeToFile(email, code, expiryTime);
+ //发送注册码邮件
+ EmailUtil.sendRegistrationCode(email, code);
+
// 打印注册码(实际项目中可以发邮件)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("========================================");
@@ -484,7 +485,7 @@ public class UserService {
return fileIOService.findUserByUsername(username);
}
- // ==================== 业务逻辑方法====================
+ // ==================== 业务逻辑方法===================
// /**
// * 从用户名提取真实姓名
@@ -552,14 +553,14 @@ public class UserService {
// return matcher.matches();
// }
- private boolean validateEmail(String email) {
- if (email == null || email.trim().isEmpty()) {
- return false;
- }
-
- Matcher matcher = EMAIL_PATTERN.matcher(email);
- return matcher.matches();
- }
+// private boolean validateEmail(String email) {
+// if (email == null || email.trim().isEmpty()) {
+// return false;
+// }
+//
+// Matcher matcher = EMAIL_PATTERN.matcher(email);
+// return matcher.matches();
+// }
// private Grade extractGradeFromUsername(String username) {
// if (username.startsWith("小学-")) {
diff --git a/src/main/java/com/service/question_generator/QuestionFactoryManager.java b/src/main/java/com/pair/service/question_generator/QuestionFactoryManager.java
similarity index 82%
rename from src/main/java/com/service/question_generator/QuestionFactoryManager.java
rename to src/main/java/com/pair/service/question_generator/QuestionFactoryManager.java
index 1036792..e6abdbc 100644
--- a/src/main/java/com/service/question_generator/QuestionFactoryManager.java
+++ b/src/main/java/com/pair/service/question_generator/QuestionFactoryManager.java
@@ -1,11 +1,11 @@
-package com.service.question_generator;
+package com.pair.service.question_generator;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
-import com.service.question_generator.factory.ElementaryQuestionFactory;
-import com.service.question_generator.factory.HighQuestionFactory;
-import com.service.question_generator.factory.MiddleQuestionFactory;
-import com.service.question_generator.factory.QuestionFactory;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.factory.ElementaryQuestionFactory;
+import com.pair.service.question_generator.factory.HighQuestionFactory;
+import com.pair.service.question_generator.factory.MiddleQuestionFactory;
+import com.pair.service.question_generator.factory.QuestionFactory;
import java.util.*;
diff --git a/src/main/java/com/service/question_generator/factory/ElementaryQuestionFactory.java b/src/main/java/com/pair/service/question_generator/factory/ElementaryQuestionFactory.java
similarity index 78%
rename from src/main/java/com/service/question_generator/factory/ElementaryQuestionFactory.java
rename to src/main/java/com/pair/service/question_generator/factory/ElementaryQuestionFactory.java
index 40c341f..16b4629 100644
--- a/src/main/java/com/service/question_generator/factory/ElementaryQuestionFactory.java
+++ b/src/main/java/com/pair/service/question_generator/factory/ElementaryQuestionFactory.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.factory;
+package com.pair.service.question_generator.factory;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
-import com.service.question_generator.strategy.elementary.*;
-import com.util.RandomUtils;
-import com.service.question_generator.strategy.*;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.elementary.*;
+import com.pair.util.RandomUtils;
+import com.pair.service.question_generator.strategy.*;
import java.util.ArrayList;
import java.util.List;
diff --git a/src/main/java/com/service/question_generator/factory/HighQuestionFactory.java b/src/main/java/com/pair/service/question_generator/factory/HighQuestionFactory.java
similarity index 58%
rename from src/main/java/com/service/question_generator/factory/HighQuestionFactory.java
rename to src/main/java/com/pair/service/question_generator/factory/HighQuestionFactory.java
index 4357c0f..f3cd5ad 100644
--- a/src/main/java/com/service/question_generator/factory/HighQuestionFactory.java
+++ b/src/main/java/com/pair/service/question_generator/factory/HighQuestionFactory.java
@@ -1,13 +1,10 @@
-package com.service.question_generator.factory;
+package com.pair.service.question_generator.factory;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
-import com.service.question_generator.strategy.QuestionStrategy;
-import com.service.question_generator.strategy.high.CosStrategy;
-import com.service.question_generator.strategy.high.SinStrategy;
-import com.service.question_generator.strategy.high.TanStrategy;
-import com.service.question_generator.strategy.high.TrigIdentityStrategy;
-import com.util.RandomUtils;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.QuestionStrategy;
+import com.pair.service.question_generator.strategy.high.*;
+import com.pair.util.RandomUtils;
import java.util.ArrayList;
import java.util.List;
@@ -26,6 +23,11 @@ public class HighQuestionFactory implements QuestionFactory {
strategies.add(new CosStrategy());
strategies.add(new TanStrategy());
strategies.add(new TrigIdentityStrategy());
+ strategies.add(new DerivativeStrategy());
+ strategies.add(new ArithmeticSequenceSumStrategy());
+ strategies.add(new LogarithmStrategy());
+ strategies.add(new ProbabilityStrategy());
+ strategies.add(new FunctionExtremeStrategy());
}
@Override
diff --git a/src/main/java/com/pair/service/question_generator/factory/MiddleQuestionFactory.java b/src/main/java/com/pair/service/question_generator/factory/MiddleQuestionFactory.java
new file mode 100644
index 0000000..205254f
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/factory/MiddleQuestionFactory.java
@@ -0,0 +1,50 @@
+package com.pair.service.question_generator.factory;
+
+
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.elementary.ParenthesesAddStrategy;
+import com.pair.service.question_generator.strategy.elementary.ParenthesesMultiplyStrategy;
+import com.pair.service.question_generator.strategy.middle.*;
+import com.pair.util.RandomUtils;
+import com.pair.service.question_generator.strategy.QuestionStrategy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 初中题目工厂
+ */
+public class MiddleQuestionFactory implements QuestionFactory {
+
+ private final List strategies;
+
+ public MiddleQuestionFactory() {
+ strategies = new ArrayList<>();
+ // 注册所有初中题目生成策略
+ strategies.add(new SquareStrategy());
+ strategies.add(new SquareAddStrategy());
+ strategies.add(new SqrtStrategy());
+ strategies.add(new SqrtAddStrategy());
+ strategies.add(new MixedSquareSqrtStrategy());
+ strategies.add(new ParenthesesAddStrategy());
+ strategies.add(new ParenthesesMultiplyStrategy());
+ strategies.add(new LinearEquationStrategy());
+ strategies.add(new QuadraticEquationStrategy());
+ strategies.add(new TriangleAreaStrategy());
+ strategies.add(new CircleAreaStrategy());
+ strategies.add(new LinearFunctionStrategy());
+ }
+
+ @Override
+ public ChoiceQuestion createQuestion() {
+ QuestionStrategy strategy = RandomUtils.randomChoice(strategies);
+ return strategy.generate();
+ }
+
+ @Override
+ public Grade getSupportedGrade() {
+ return Grade.MIDDLE;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/service/question_generator/factory/QuestionFactory.java b/src/main/java/com/pair/service/question_generator/factory/QuestionFactory.java
similarity index 61%
rename from src/main/java/com/service/question_generator/factory/QuestionFactory.java
rename to src/main/java/com/pair/service/question_generator/factory/QuestionFactory.java
index 4878dc6..3311f6c 100644
--- a/src/main/java/com/service/question_generator/factory/QuestionFactory.java
+++ b/src/main/java/com/pair/service/question_generator/factory/QuestionFactory.java
@@ -1,7 +1,7 @@
-package com.service.question_generator.factory;
+package com.pair.service.question_generator.factory;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
/**
diff --git a/src/main/java/com/service/question_generator/strategy/AbstractQuestionStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/AbstractQuestionStrategy.java
similarity index 97%
rename from src/main/java/com/service/question_generator/strategy/AbstractQuestionStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/AbstractQuestionStrategy.java
index d3dc40d..b376e19 100644
--- a/src/main/java/com/service/question_generator/strategy/AbstractQuestionStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/AbstractQuestionStrategy.java
@@ -1,7 +1,7 @@
-package com.service.question_generator.strategy;
+package com.pair.service.question_generator.strategy;
-import com.model.Grade;
-import com.util.RandomUtils;
+import com.pair.model.Grade;
+import com.pair.util.RandomUtils;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/src/main/java/com/service/question_generator/strategy/QuestionStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/QuestionStrategy.java
similarity index 63%
rename from src/main/java/com/service/question_generator/strategy/QuestionStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/QuestionStrategy.java
index e9306d3..baa8cb8 100644
--- a/src/main/java/com/service/question_generator/strategy/QuestionStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/QuestionStrategy.java
@@ -1,5 +1,5 @@
-package com.service.question_generator.strategy;
-import com.model.ChoiceQuestion;
+package com.pair.service.question_generator.strategy;
+import com.pair.model.ChoiceQuestion;
//题目生成题型接口
public interface QuestionStrategy {
diff --git a/src/main/java/com/service/question_generator/strategy/elementary/AdditionStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/elementary/AdditionStrategy.java
similarity index 72%
rename from src/main/java/com/service/question_generator/strategy/elementary/AdditionStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/elementary/AdditionStrategy.java
index 913e104..574898d 100644
--- a/src/main/java/com/service/question_generator/strategy/elementary/AdditionStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/elementary/AdditionStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.elementary;
+package com.pair.service.question_generator.strategy.elementary;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/service/question_generator/strategy/elementary/DivisionStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/elementary/DivisionStrategy.java
similarity index 74%
rename from src/main/java/com/service/question_generator/strategy/elementary/DivisionStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/elementary/DivisionStrategy.java
index f702d43..2ff79f0 100644
--- a/src/main/java/com/service/question_generator/strategy/elementary/DivisionStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/elementary/DivisionStrategy.java
@@ -1,11 +1,11 @@
-package com.service.question_generator.strategy.elementary;
+package com.pair.service.question_generator.strategy.elementary;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/service/question_generator/strategy/elementary/MultiplicationStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/elementary/MultiplicationStrategy.java
similarity index 73%
rename from src/main/java/com/service/question_generator/strategy/elementary/MultiplicationStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/elementary/MultiplicationStrategy.java
index 10a9266..697b853 100644
--- a/src/main/java/com/service/question_generator/strategy/elementary/MultiplicationStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/elementary/MultiplicationStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.elementary;
+package com.pair.service.question_generator.strategy.elementary;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/service/question_generator/strategy/elementary/ParenthesesAddStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/elementary/ParenthesesAddStrategy.java
similarity index 76%
rename from src/main/java/com/service/question_generator/strategy/elementary/ParenthesesAddStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/elementary/ParenthesesAddStrategy.java
index 8050541..9e7daa4 100644
--- a/src/main/java/com/service/question_generator/strategy/elementary/ParenthesesAddStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/elementary/ParenthesesAddStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.elementary;
+package com.pair.service.question_generator.strategy.elementary;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/service/question_generator/strategy/elementary/ParenthesesMultiplyStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/elementary/ParenthesesMultiplyStrategy.java
similarity index 79%
rename from src/main/java/com/service/question_generator/strategy/elementary/ParenthesesMultiplyStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/elementary/ParenthesesMultiplyStrategy.java
index d5e8792..d70c4b9 100644
--- a/src/main/java/com/service/question_generator/strategy/elementary/ParenthesesMultiplyStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/elementary/ParenthesesMultiplyStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.elementary;
+package com.pair.service.question_generator.strategy.elementary;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
/**
diff --git a/src/main/java/com/service/question_generator/strategy/elementary/SubtractionStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/elementary/SubtractionStrategy.java
similarity index 76%
rename from src/main/java/com/service/question_generator/strategy/elementary/SubtractionStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/elementary/SubtractionStrategy.java
index 1170b06..87f83f7 100644
--- a/src/main/java/com/service/question_generator/strategy/elementary/SubtractionStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/elementary/SubtractionStrategy.java
@@ -1,9 +1,9 @@
-package com.service.question_generator.strategy.elementary;
+package com.pair.service.question_generator.strategy.elementary;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/pair/service/question_generator/strategy/high/ArithmeticSequenceSumStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/high/ArithmeticSequenceSumStrategy.java
new file mode 100644
index 0000000..f703f08
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/strategy/high/ArithmeticSequenceSumStrategy.java
@@ -0,0 +1,41 @@
+package com.pair.service.question_generator.strategy.high;
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * 等差数列求和策略
+ * 例如:首项 3,公差 2,求前 10 项和
+ */
+public class ArithmeticSequenceSumStrategy extends AbstractQuestionStrategy {
+
+ public ArithmeticSequenceSumStrategy() {
+ super(Grade.HIGH);
+ }
+
+ @Override
+ public ChoiceQuestion generate() {
+ int a1 = RandomUtils.nextInt(1, 10); // 首项
+ int d = RandomUtils.nextInt(1, 5); // 公差
+ int n = RandomUtils.nextInt(5, 15); // 项数
+
+ String questionText = "等差数列首项为 " + a1 + ",公差为 " + d +
+ ",求前 " + n + " 项和";
+
+ // Sn = n * a1 + n(n-1)/2 * d
+ double answer = n * a1 + n * (n - 1) / 2.0 * d;
+
+ List options = generateNumericOptions(answer);
+
+ return new ChoiceQuestion(questionText, answer, options, grade);
+ }
+
+ @Override
+ public String getStrategyName() {
+ return "等差数列求和";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/service/question_generator/strategy/high/CosStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/high/CosStrategy.java
similarity index 85%
rename from src/main/java/com/service/question_generator/strategy/high/CosStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/high/CosStrategy.java
index 6aba6ee..2d744f4 100644
--- a/src/main/java/com/service/question_generator/strategy/high/CosStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/high/CosStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.high;
+package com.pair.service.question_generator.strategy.high;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/pair/service/question_generator/strategy/high/DerivativeStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/high/DerivativeStrategy.java
new file mode 100644
index 0000000..d2161cc
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/strategy/high/DerivativeStrategy.java
@@ -0,0 +1,40 @@
+package com.pair.service.question_generator.strategy.high;
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * 导数计算策略
+ * 例如:f(x) = 3x² + 2x,求 f'(2)
+ */
+public class DerivativeStrategy extends AbstractQuestionStrategy {
+
+ public DerivativeStrategy() {
+ super(Grade.HIGH);
+ }
+
+ @Override
+ public ChoiceQuestion generate() {
+ int a = RandomUtils.nextInt(2, 8);
+ int b = RandomUtils.nextInt(1, 6);
+ int x = RandomUtils.nextInt(1, 5);
+
+ String questionText = "f(x) = " + a + "x² + " + b + "x,求 f'(" + x + ")";
+
+ // f'(x) = 2ax + b
+ double answer = 2 * a * x + b;
+
+ List options = generateNumericOptions(answer);
+
+ return new ChoiceQuestion(questionText, answer, options, grade);
+ }
+
+ @Override
+ public String getStrategyName() {
+ return "导数计算";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/pair/service/question_generator/strategy/high/FunctionExtremeStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/high/FunctionExtremeStrategy.java
new file mode 100644
index 0000000..e094caa
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/strategy/high/FunctionExtremeStrategy.java
@@ -0,0 +1,41 @@
+package com.pair.service.question_generator.strategy.high;
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * 函数极值策略
+ * 例如:f(x) = -x² + 4x + 1,求最大值
+ */
+public class FunctionExtremeStrategy extends AbstractQuestionStrategy {
+
+ public FunctionExtremeStrategy() {
+ super(Grade.HIGH);
+ }
+
+ @Override
+ public ChoiceQuestion generate() {
+ int a = -1; // 开口向下
+ int b = RandomUtils.nextInt(2, 8) * 2; // 偶数,方便计算
+ int c = RandomUtils.nextInt(1, 10);
+
+ String questionText = "f(x) = -x² + " + b + "x + " + c + ",求最大值";
+
+ // 顶点坐标 x = -b/(2a), y = (4ac - b²)/(4a)
+ double xVertex = -b / (2.0 * a);
+ double answer = (4.0 * a * c - b * b) / (4.0 * a);
+
+ List options = generateNumericOptions(answer);
+
+ return new ChoiceQuestion(questionText, answer, options, grade);
+ }
+
+ @Override
+ public String getStrategyName() {
+ return "函数极值";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/pair/service/question_generator/strategy/high/LogarithmStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/high/LogarithmStrategy.java
new file mode 100644
index 0000000..2fad434
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/strategy/high/LogarithmStrategy.java
@@ -0,0 +1,55 @@
+package com.pair.service.question_generator.strategy.high;
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * 对数运算策略
+ * 例如:log₂8 + log₃9
+ */
+public class LogarithmStrategy extends AbstractQuestionStrategy {
+
+ private static final int[][] LOG_PAIRS = {
+ {2, 4, 2}, // log₂4 = 2
+ {2, 8, 3}, // log₂8 = 3
+ {2, 16, 4}, // log₂16 = 4
+ {3, 9, 2}, // log₃9 = 2
+ {3, 27, 3}, // log₃27 = 3
+ {5, 25, 2}, // log₅25 = 2
+ {10, 100, 2} // log₁₀100 = 2
+ };
+
+ public LogarithmStrategy() {
+ super(Grade.HIGH);
+ }
+
+ @Override
+ public ChoiceQuestion generate() {
+ int index1 = RandomUtils.nextInt(0, LOG_PAIRS.length - 1);
+ int index2 = RandomUtils.nextInt(0, LOG_PAIRS.length - 1);
+
+ int base1 = LOG_PAIRS[index1][0];
+ int num1 = LOG_PAIRS[index1][1];
+ int result1 = LOG_PAIRS[index1][2];
+
+ int base2 = LOG_PAIRS[index2][0];
+ int num2 = LOG_PAIRS[index2][1];
+ int result2 = LOG_PAIRS[index2][2];
+
+ String questionText = "log₍" + base1 + "₎" + num1 + " + log₍" + base2 + "₎" + num2;
+ double answer = result1 + result2;
+
+ List options = generateNumericOptions(answer);
+
+ return new ChoiceQuestion(questionText, answer, options, grade);
+ }
+
+ @Override
+ public String getStrategyName() {
+ return "对数运算";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/pair/service/question_generator/strategy/high/ProbabilityStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/high/ProbabilityStrategy.java
new file mode 100644
index 0000000..0c47aef
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/strategy/high/ProbabilityStrategy.java
@@ -0,0 +1,40 @@
+package com.pair.service.question_generator.strategy.high;
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * 概率计算策略
+ * 例如:袋中有 5 个红球,3 个白球,随机抽一个,抽到红球的概率是多少?
+ */
+public class ProbabilityStrategy extends AbstractQuestionStrategy {
+
+ public ProbabilityStrategy() {
+ super(Grade.HIGH);
+ }
+
+ @Override
+ public ChoiceQuestion generate() {
+ int red = RandomUtils.nextInt(3, 8);
+ int white = RandomUtils.nextInt(2, 6);
+ int total = red + white;
+
+ String questionText = "袋中有 " + red + " 个红球," + white +
+ " 个白球,随机抽一个,抽到红球的概率是多少?(保留两位小数)";
+
+ double answer = Math.round((double) red / total * 100.0) / 100.0;
+
+ List options = generateNumericOptions(answer);
+
+ return new ChoiceQuestion(questionText, answer, options, grade);
+ }
+
+ @Override
+ public String getStrategyName() {
+ return "概率计算";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/service/question_generator/strategy/high/SinStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/high/SinStrategy.java
similarity index 85%
rename from src/main/java/com/service/question_generator/strategy/high/SinStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/high/SinStrategy.java
index c0fec5f..f510c62 100644
--- a/src/main/java/com/service/question_generator/strategy/high/SinStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/high/SinStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.high;
+package com.pair.service.question_generator.strategy.high;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.*;
import java.util.List;
diff --git a/src/main/java/com/service/question_generator/strategy/high/TanStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/high/TanStrategy.java
similarity index 84%
rename from src/main/java/com/service/question_generator/strategy/high/TanStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/high/TanStrategy.java
index 4e0a26a..8c6890e 100644
--- a/src/main/java/com/service/question_generator/strategy/high/TanStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/high/TanStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.high;
+package com.pair.service.question_generator.strategy.high;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/service/question_generator/strategy/high/TrigIdentityStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/high/TrigIdentityStrategy.java
similarity index 79%
rename from src/main/java/com/service/question_generator/strategy/high/TrigIdentityStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/high/TrigIdentityStrategy.java
index 0af4b9e..05232d1 100644
--- a/src/main/java/com/service/question_generator/strategy/high/TrigIdentityStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/high/TrigIdentityStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.high;
+package com.pair.service.question_generator.strategy.high;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/pair/service/question_generator/strategy/middle/CircleAreaStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/middle/CircleAreaStrategy.java
new file mode 100644
index 0000000..136438c
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/strategy/middle/CircleAreaStrategy.java
@@ -0,0 +1,36 @@
+package com.pair.service.question_generator.strategy.middle;
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * 圆的面积策略
+ * 例如:半径为 5cm 的圆,面积是多少?(π取3.14)
+ */
+public class CircleAreaStrategy extends AbstractQuestionStrategy {
+
+ public CircleAreaStrategy() {
+ super(Grade.MIDDLE);
+ }
+
+ @Override
+ public ChoiceQuestion generate() {
+ int radius = RandomUtils.nextInt(3, 10);
+
+ String questionText = "半径为 " + radius + "cm 的圆,面积是多少?(π取3.14)";
+ double answer = 3.14 * radius * radius;
+
+ List options = generateNumericOptions(answer);
+
+ return new ChoiceQuestion(questionText, answer, options, grade);
+ }
+
+ @Override
+ public String getStrategyName() {
+ return "圆的面积";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/pair/service/question_generator/strategy/middle/LinearEquationStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/middle/LinearEquationStrategy.java
new file mode 100644
index 0000000..0453906
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/strategy/middle/LinearEquationStrategy.java
@@ -0,0 +1,39 @@
+package com.pair.service.question_generator.strategy.middle;
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * 一元一次方程策略
+ * 例如:2x + 5 = 13,求 x
+ */
+public class LinearEquationStrategy extends AbstractQuestionStrategy {
+
+ public LinearEquationStrategy() {
+ super(Grade.MIDDLE);
+ }
+
+ @Override
+ public ChoiceQuestion generate() {
+ int a = RandomUtils.nextInt(2, 10); // 系数
+ int x = RandomUtils.nextInt(1, 10); // 真实的 x 值
+ int b = RandomUtils.nextInt(1, 15); // 常数项
+ int result = a * x + b;
+
+ String questionText = a + "x + " + b + " = " + result + ",求 x";
+ double answer = x;
+
+ List options = generateNumericOptions(answer);
+
+ return new ChoiceQuestion(questionText, answer, options, grade);
+ }
+
+ @Override
+ public String getStrategyName() {
+ return "一元一次方程";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/pair/service/question_generator/strategy/middle/LinearFunctionStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/middle/LinearFunctionStrategy.java
new file mode 100644
index 0000000..b15aeb3
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/strategy/middle/LinearFunctionStrategy.java
@@ -0,0 +1,41 @@
+package com.pair.service.question_generator.strategy.middle;
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * 一次函数求值策略
+ * 例如:函数 y = 2x + 3,当 x = 5 时,y 的值是多少?
+ */
+public class LinearFunctionStrategy extends AbstractQuestionStrategy {
+
+ public LinearFunctionStrategy() {
+ super(Grade.MIDDLE);
+ }
+
+ @Override
+ public ChoiceQuestion generate() {
+ int k = RandomUtils.nextInt(2, 8);
+ int b = RandomUtils.nextInt(-5, 10);
+ int x = RandomUtils.nextInt(1, 10);
+
+ String questionText = "函数 y = " + k + "x " +
+ (b >= 0 ? "+ " : "") + b +
+ ",当 x = " + x + " 时,y 的值是多少?";
+
+ double answer = k * x + b;
+
+ List options = generateNumericOptions(answer);
+
+ return new ChoiceQuestion(questionText, answer, options, grade);
+ }
+
+ @Override
+ public String getStrategyName() {
+ return "一次函数求值";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/service/question_generator/strategy/middle/MixedSquareSqrtStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/middle/MixedSquareSqrtStrategy.java
similarity index 77%
rename from src/main/java/com/service/question_generator/strategy/middle/MixedSquareSqrtStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/middle/MixedSquareSqrtStrategy.java
index 739e2b3..95163cb 100644
--- a/src/main/java/com/service/question_generator/strategy/middle/MixedSquareSqrtStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/middle/MixedSquareSqrtStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.middle;
+package com.pair.service.question_generator.strategy.middle;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/pair/service/question_generator/strategy/middle/QuadraticEquationStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/middle/QuadraticEquationStrategy.java
new file mode 100644
index 0000000..45745e8
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/strategy/middle/QuadraticEquationStrategy.java
@@ -0,0 +1,44 @@
+package com.pair.service.question_generator.strategy.middle;
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * 一元二次方程策略(求较大根)
+ * 例如:x² - 5x + 6 = 0,求较大的根
+ */
+public class QuadraticEquationStrategy extends AbstractQuestionStrategy {
+
+ public QuadraticEquationStrategy() {
+ super(Grade.MIDDLE);
+ }
+
+ @Override
+ public ChoiceQuestion generate() {
+ // 生成两个根
+ int root1 = RandomUtils.nextInt(1, 6);
+ int root2 = RandomUtils.nextInt(1, 6);
+
+ // 根据韦达定理:x² - (root1+root2)x + (root1*root2) = 0
+ int b = -(root1 + root2);
+ int c = root1 * root2;
+
+ String questionText = "x² " + (b >= 0 ? "+ " : "") + b + "x " +
+ (c >= 0 ? "+ " : "") + c + " = 0,求较大的根";
+
+ double answer = Math.max(root1, root2);
+
+ List options = generateNumericOptions(answer);
+
+ return new ChoiceQuestion(questionText, answer, options, grade);
+ }
+
+ @Override
+ public String getStrategyName() {
+ return "一元二次方程";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/service/question_generator/strategy/middle/SqrtAddStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/middle/SqrtAddStrategy.java
similarity index 75%
rename from src/main/java/com/service/question_generator/strategy/middle/SqrtAddStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/middle/SqrtAddStrategy.java
index ed32748..880eeb5 100644
--- a/src/main/java/com/service/question_generator/strategy/middle/SqrtAddStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/middle/SqrtAddStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.middle;
+package com.pair.service.question_generator.strategy.middle;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/service/question_generator/strategy/middle/SqrtStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/middle/SqrtStrategy.java
similarity index 76%
rename from src/main/java/com/service/question_generator/strategy/middle/SqrtStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/middle/SqrtStrategy.java
index 8cc2eff..c567201 100644
--- a/src/main/java/com/service/question_generator/strategy/middle/SqrtStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/middle/SqrtStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.middle;
+package com.pair.service.question_generator.strategy.middle;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
/**
diff --git a/src/main/java/com/service/question_generator/strategy/middle/SquareAddStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/middle/SquareAddStrategy.java
similarity index 74%
rename from src/main/java/com/service/question_generator/strategy/middle/SquareAddStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/middle/SquareAddStrategy.java
index 51e5516..d0e8dd8 100644
--- a/src/main/java/com/service/question_generator/strategy/middle/SquareAddStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/middle/SquareAddStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.middle;
+package com.pair.service.question_generator.strategy.middle;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
/**
diff --git a/src/main/java/com/service/question_generator/strategy/middle/SquareStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/middle/SquareStrategy.java
similarity index 75%
rename from src/main/java/com/service/question_generator/strategy/middle/SquareStrategy.java
rename to src/main/java/com/pair/service/question_generator/strategy/middle/SquareStrategy.java
index 8cf8b05..f84c01a 100644
--- a/src/main/java/com/service/question_generator/strategy/middle/SquareStrategy.java
+++ b/src/main/java/com/pair/service/question_generator/strategy/middle/SquareStrategy.java
@@ -1,10 +1,10 @@
-package com.service.question_generator.strategy.middle;
+package com.pair.service.question_generator.strategy.middle;
-import com.model.ChoiceQuestion;
-import com.model.Grade;
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
-import com.service.question_generator.strategy.AbstractQuestionStrategy;
-import com.util.RandomUtils;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
import java.util.List;
diff --git a/src/main/java/com/pair/service/question_generator/strategy/middle/TriangleAreaStrategy.java b/src/main/java/com/pair/service/question_generator/strategy/middle/TriangleAreaStrategy.java
new file mode 100644
index 0000000..b01c675
--- /dev/null
+++ b/src/main/java/com/pair/service/question_generator/strategy/middle/TriangleAreaStrategy.java
@@ -0,0 +1,37 @@
+package com.pair.service.question_generator.strategy.middle;
+
+import com.pair.model.ChoiceQuestion;
+import com.pair.model.Grade;
+import com.pair.service.question_generator.strategy.AbstractQuestionStrategy;
+import com.pair.util.RandomUtils;
+
+import java.util.List;
+
+/**
+ * 三角形面积计算策略
+ * 例如:底 6cm,高 8cm 的三角形面积
+ */
+public class TriangleAreaStrategy extends AbstractQuestionStrategy {
+
+ public TriangleAreaStrategy() {
+ super(Grade.MIDDLE);
+ }
+
+ @Override
+ public ChoiceQuestion generate() {
+ int base = RandomUtils.nextInt(4, 15);
+ int height = RandomUtils.nextInt(4, 15);
+
+ String questionText = "底为 " + base + "cm,高为 " + height + "cm 的三角形面积是多少?";
+ double answer = (base * height) / 2.0;
+
+ List options = generateNumericOptions(answer);
+
+ return new ChoiceQuestion(questionText, answer, options, grade);
+ }
+
+ @Override
+ public String getStrategyName() {
+ return "三角形面积";
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/pair/ui/GradeSelectPanel.java b/src/main/java/com/pair/ui/GradeSelectPanel.java
new file mode 100644
index 0000000..83c9d8c
--- /dev/null
+++ b/src/main/java/com/pair/ui/GradeSelectPanel.java
@@ -0,0 +1,7 @@
+package com.pair.ui;
+
+import javafx.scene.layout.VBox;
+
+public class GradeSelectPanel extends VBox {
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ui/InfGenPage.java b/src/main/java/com/pair/ui/InfGenPage.java
similarity index 99%
rename from src/main/java/com/ui/InfGenPage.java
rename to src/main/java/com/pair/ui/InfGenPage.java
index 98ca26e..48bf3d0 100644
--- a/src/main/java/com/ui/InfGenPage.java
+++ b/src/main/java/com/pair/ui/InfGenPage.java
@@ -1,5 +1,5 @@
// com/ui/InfGenPage.java
-package com.ui;
+package com.pair.ui;
import javafx.geometry.Pos;
import javafx.scene.control.*;
diff --git a/src/main/java/com/ui/LoginPage.java b/src/main/java/com/pair/ui/LoginPage.java
similarity index 95%
rename from src/main/java/com/ui/LoginPage.java
rename to src/main/java/com/pair/ui/LoginPage.java
index e10a539..0f5d9d8 100644
--- a/src/main/java/com/ui/LoginPage.java
+++ b/src/main/java/com/pair/ui/LoginPage.java
@@ -1,9 +1,6 @@
// com/ui/LoginPage.java
-package com.ui;
+package com.pair.ui;
-import com.model.User;
-import com.service.UserService;
-import javafx.concurrent.Task;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
diff --git a/src/main/java/com/ui/MainWindow.java b/src/main/java/com/pair/ui/MainWindow.java
similarity index 98%
rename from src/main/java/com/ui/MainWindow.java
rename to src/main/java/com/pair/ui/MainWindow.java
index 3c1d226..d8bfe51 100644
--- a/src/main/java/com/ui/MainWindow.java
+++ b/src/main/java/com/pair/ui/MainWindow.java
@@ -1,13 +1,10 @@
// com/ui/MainWindow.java
-package com.ui;
+package com.pair.ui;
-import com.model.ChoiceQuestion;
-import com.model.User;
-import com.service.QuizService;
-import com.service.UserService;
-import javafx.application.Platform;
+import com.pair.model.User;
+import com.pair.service.QuizService;
+import com.pair.service.UserService;
import javafx.scene.Scene;
-import javafx.scene.control.Alert;
import javafx.scene.control.Toggle;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
diff --git a/src/main/java/com/ui/NavigablePanel.java b/src/main/java/com/pair/ui/NavigablePanel.java
similarity index 95%
rename from src/main/java/com/ui/NavigablePanel.java
rename to src/main/java/com/pair/ui/NavigablePanel.java
index dc2e4af..c3ac589 100644
--- a/src/main/java/com/ui/NavigablePanel.java
+++ b/src/main/java/com/pair/ui/NavigablePanel.java
@@ -1,12 +1,10 @@
// com/ui/NavigablePanel.java
-package com.ui;
+package com.pair.ui;
import javafx.application.Platform;
-import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
-import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
diff --git a/src/main/java/com/ui/Panel.java b/src/main/java/com/pair/ui/Panel.java
similarity index 94%
rename from src/main/java/com/ui/Panel.java
rename to src/main/java/com/pair/ui/Panel.java
index e3dfbe7..84ed60e 100644
--- a/src/main/java/com/ui/Panel.java
+++ b/src/main/java/com/pair/ui/Panel.java
@@ -1,4 +1,4 @@
-package com.ui;
+package com.pair.ui;
public enum Panel {
START, // 开始页面
diff --git a/src/main/java/com/ui/PasswordModifyPage.java b/src/main/java/com/pair/ui/PasswordModifyPage.java
similarity index 99%
rename from src/main/java/com/ui/PasswordModifyPage.java
rename to src/main/java/com/pair/ui/PasswordModifyPage.java
index 06197fe..0288673 100644
--- a/src/main/java/com/ui/PasswordModifyPage.java
+++ b/src/main/java/com/pair/ui/PasswordModifyPage.java
@@ -1,5 +1,5 @@
// com/ui/PasswordModifyPage.java
-package com.ui;
+package com.pair.ui;
import javafx.geometry.Pos;
import javafx.scene.control.*;
diff --git a/src/main/java/com/ui/QuizPage.java b/src/main/java/com/pair/ui/QuizPage.java
similarity index 98%
rename from src/main/java/com/ui/QuizPage.java
rename to src/main/java/com/pair/ui/QuizPage.java
index 8acfbe8..f4ce292 100644
--- a/src/main/java/com/ui/QuizPage.java
+++ b/src/main/java/com/pair/ui/QuizPage.java
@@ -1,14 +1,13 @@
// com/ui/QuizPage.java
-package com.ui;
+package com.pair.ui;
-import com.model.ChoiceQuestion;
-import com.service.QuizService;
+import com.pair.model.ChoiceQuestion;
+import com.pair.service.QuizService;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.layout.*;
-import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
diff --git a/src/main/java/com/ui/RegisterPage.java b/src/main/java/com/pair/ui/RegisterPage.java
similarity index 99%
rename from src/main/java/com/ui/RegisterPage.java
rename to src/main/java/com/pair/ui/RegisterPage.java
index df3585a..f8ff1a1 100644
--- a/src/main/java/com/ui/RegisterPage.java
+++ b/src/main/java/com/pair/ui/RegisterPage.java
@@ -1,5 +1,5 @@
// com/ui/RegisterPage.java
-package com.ui;
+package com.pair.ui;
import javafx.geometry.Pos;
import javafx.scene.control.*;
diff --git a/src/main/java/com/ui/ResultPage.java b/src/main/java/com/pair/ui/ResultPage.java
similarity index 96%
rename from src/main/java/com/ui/ResultPage.java
rename to src/main/java/com/pair/ui/ResultPage.java
index 8417f0a..c82b922 100644
--- a/src/main/java/com/ui/ResultPage.java
+++ b/src/main/java/com/pair/ui/ResultPage.java
@@ -1,8 +1,8 @@
// com/ui/ResultPage.java
-package com.ui;
+package com.pair.ui;
-import com.model.QuizResult;
-import com.service.QuizService;
+import com.pair.model.QuizResult;
+import com.pair.service.QuizService;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
diff --git a/src/main/java/com/ui/StartPage.java b/src/main/java/com/pair/ui/StartPage.java
similarity index 98%
rename from src/main/java/com/ui/StartPage.java
rename to src/main/java/com/pair/ui/StartPage.java
index d340334..e0c34ab 100644
--- a/src/main/java/com/ui/StartPage.java
+++ b/src/main/java/com/pair/ui/StartPage.java
@@ -1,5 +1,5 @@
// com/ui/StartPage.java
-package com.ui;
+package com.pair.ui;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
diff --git a/src/main/java/com/ui/UIConstants.java b/src/main/java/com/pair/ui/UIConstants.java
similarity index 98%
rename from src/main/java/com/ui/UIConstants.java
rename to src/main/java/com/pair/ui/UIConstants.java
index d41f9f0..75527b4 100644
--- a/src/main/java/com/ui/UIConstants.java
+++ b/src/main/java/com/pair/ui/UIConstants.java
@@ -1,8 +1,7 @@
// UIConstants.java
-package com.ui;
+package com.pair.ui;
import javafx.geometry.Insets;
-import javafx.scene.paint.Color;
public final class UIConstants {
private UIConstants() {}
diff --git a/src/main/java/com/util/AppDataDirectory.java b/src/main/java/com/pair/util/AppDataDirectory.java
similarity index 97%
rename from src/main/java/com/util/AppDataDirectory.java
rename to src/main/java/com/pair/util/AppDataDirectory.java
index 38377cc..5b20b1a 100644
--- a/src/main/java/com/util/AppDataDirectory.java
+++ b/src/main/java/com/pair/util/AppDataDirectory.java
@@ -1,6 +1,4 @@
-package com.util;
-
-import java.io.File;
+package com.pair.util;
/**
* 应用数据目录管理器
diff --git a/src/main/java/com/pair/util/EmailUtil.java b/src/main/java/com/pair/util/EmailUtil.java
new file mode 100644
index 0000000..e38f235
--- /dev/null
+++ b/src/main/java/com/pair/util/EmailUtil.java
@@ -0,0 +1,123 @@
+package com.pair.util;
+
+import javax.mail.*;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+import java.util.Properties;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 邮件工具类
+ * 用于发送注册码邮件(可选功能)
+ * 注意:当前项目需求中,注册码是直接显示在界面上的,
+ * 不需要发送邮件,所以这个类暂时保留为空实现。
+ * 如果将来需要发送邮件,可以使用JavaMail库实现。
+ */
+public class EmailUtil {
+
+
+ // [用户名]@[域名主体].[顶级域名]
+ public static final Pattern EMAIL_PATTERN = Pattern.compile("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$");
+
+ //验证邮箱格式
+ public static boolean validateEmail(String email) {
+ if (email == null || email.trim().isEmpty()) {
+ return false;
+ }
+
+ Matcher matcher = EMAIL_PATTERN.matcher(email);
+ return matcher.matches();
+ }
+
+
+ // ==================== 邮箱配置 ====================
+ private static final String SENDER_EMAIL = "2936213174@qq.com"; // 我的QQ邮箱
+ private static final String SENDER_PASSWORD = "gxfjdzqviasuddci"; // QQ邮箱授权码
+ private static final String SMTP_HOST = "smtp.qq.com"; // QQ邮箱SMTP服务器
+ private static final String SMTP_PORT = "587"; // 端口
+
+ /**
+ * 发送注册码到指定邮箱
+ * @param toEmail 收件人邮箱
+ * @param registrationCode 注册码
+ * @return true表示发送成功,false表示发送失败
+ */
+ public static boolean sendRegistrationCode(String toEmail, String registrationCode) {
+ try {
+ // 1. 配置邮件服务器
+ Properties props = new Properties();
+ props.put("mail.smtp.auth", "true");
+ props.put("mail.smtp.starttls.enable", "true");
+ props.put("mail.smtp.host", SMTP_HOST);
+ props.put("mail.smtp.port", SMTP_PORT);
+
+ // 2. 创建会话
+ Session session = Session.getInstance(props, new Authenticator() {
+ @Override
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(SENDER_EMAIL, SENDER_PASSWORD);
+ }
+ });
+
+ // 3. 创建邮件
+ Message message = new MimeMessage(session);
+ message.setFrom(new InternetAddress(SENDER_EMAIL));
+ message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail));
+ message.setSubject("注册验证码");
+
+ // 邮件内容
+ String content = "您的注册验证码是:" + registrationCode + "\n" +
+ "验证码有效期为10分钟,请尽快使用。\n" +
+ "如非本人操作,请忽略此邮件。";
+ message.setText(content);
+
+ // 4. 发送邮件
+ Transport.send(message);
+
+ System.out.println("✓ 验证码已发送到:" + toEmail);
+ return true;
+
+ } catch (Exception e) {
+ System.err.println("✗ 邮件发送失败:" + e.getMessage());
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+
+ /**
+ * 发送密码重置邮件(预留接口)
+ *
+ * @param toEmail 收件人邮箱
+ * @param newPassword 新密码
+ * @return true表示发送成功
+ */
+ public static boolean sendPasswordReset(String toEmail, String newPassword) {
+ // TODO: 将来如果需要"找回密码"功能,可以在这里实现
+
+ System.out.println("【模拟】发送密码重置邮件");
+ System.out.println("收件人: " + toEmail);
+ System.out.println("新密码: " + newPassword);
+
+ return true;
+ }
+
+}
+
+ /**
+ * 验证邮箱格式
+ * @param email 邮箱地址
+ * @return true表示格式正确
+ */
+// public static boolean isValidEmail(String email) {
+// if (email == null || email.trim().isEmpty()) {
+// return false;
+// }
+//
+// // 简单的邮箱格式验证
+// String emailRegex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$";
+// return email.matches(emailRegex);
+// }
+//}
+
diff --git a/src/main/java/com/util/FileUtils.java b/src/main/java/com/pair/util/FileUtils.java
similarity index 99%
rename from src/main/java/com/util/FileUtils.java
rename to src/main/java/com/pair/util/FileUtils.java
index 0a46661..0b9d560 100644
--- a/src/main/java/com/util/FileUtils.java
+++ b/src/main/java/com/pair/util/FileUtils.java
@@ -1,4 +1,4 @@
-package com.util;
+package com.pair.util;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
diff --git a/src/main/java/com/util/PasswordValidator.java b/src/main/java/com/pair/util/PasswordValidator.java
similarity index 76%
rename from src/main/java/com/util/PasswordValidator.java
rename to src/main/java/com/pair/util/PasswordValidator.java
index f5a8be3..c54b2e5 100644
--- a/src/main/java/com/util/PasswordValidator.java
+++ b/src/main/java/com/pair/util/PasswordValidator.java
@@ -1,8 +1,7 @@
-package com.util;
+package com.pair.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
-import java.security.SecureRandom;
/**
* 密码验证和加密工具类
@@ -39,67 +38,33 @@ public class PasswordValidator {
}
if (password.length() > MAX_LENGTH) {
- throw new IllegalArgumentException ("密码长度不能超过 " + MAX_LENGTH + " 位!");
+ throw new IllegalArgumentException("密码长度不能超过 " + MAX_LENGTH + " 位!");
}
if (password.contains(" ")) {
- throw new IllegalArgumentException ("密码不能包含空格!");
+ throw new IllegalArgumentException("密码不能包含空格!");
}
// 检查是否包含小写字母
boolean hasLowerLetter = password.matches(".*[a-z].*");
if (!hasLowerLetter) {
- throw new IllegalArgumentException ("必须包含小写字母!");
+ throw new IllegalArgumentException("必须包含小写字母!");
}
// 检查是否包含大写字母
boolean hasUpperLetter = password.matches(".*[A-Z].*");
if (!hasUpperLetter) {
- throw new IllegalArgumentException ("必须包含大写字母!");
+ throw new IllegalArgumentException("必须包含大写字母!");
}
// 检查是否包含数字
boolean hasDigit = password.matches(".*\\d.*");
if (!hasDigit) {
- throw new IllegalArgumentException ("密码必须包含数字!");
+ throw new IllegalArgumentException("密码必须包含数字!");
}
}
-// /**
-// * 检查密码强度等级
-// *
-// * @param password 密码
-// * @return 强度等级:弱、中、强
-// */
-// public static String getPasswordStrength(String password) {
-// if (password == null || password.length() < MIN_LENGTH) {
-// return "弱";
-// }
-//
-// int score = 0;
-//
-// // 长度加分
-// if (password.length() >= 8) score++;
-// if (password.length() >= 12) score++;
-//
-// // 包含小写字母
-// if (password.matches(".*[a-z].*")) score++;
-//
-// // 包含大写字母
-// if (password.matches(".*[A-Z].*")) score++;
-//
-// // 包含数字
-// if (password.matches(".*\\d.*")) score++;
-//
-// // 包含特殊字符
-// if (password.matches(".*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>/?].*")) score++;
-//
-// if (score <= 2) return "弱";
-// if (score <= 4) return "中";
-// return "强";
-// }
-
// ==================== 密码加密 ====================
/**
@@ -135,7 +100,7 @@ public class PasswordValidator {
/**
* 验证密码是否匹配
*
- * @param plainPassword 明文密码
+ * @param plainPassword 明文密码
* @param encryptedPassword 加密后的密码
* @return true表示匹配
*/
@@ -287,34 +252,4 @@ public class PasswordValidator {
//
// return false;
// }
-
-// /**
-// * 生成密码建议
-// *
-// * @param password 密码
-// * @return 建议文本
-// */
-// public static String getPasswordSuggestion(String password) {
-// if (password == null || password.isEmpty()) {
-// return "请输入密码";
-// }
-//
-// String error = validatePassword(password);
-// if (error != null) {
-// return error;
-// }
-//
-// String strength = getPasswordStrength(password);
-//
-// if ("弱".equals(strength)) {
-// return "密码强度较弱,建议:\n" +
-// "• 使用至少8位字符\n" +
-// "• 同时包含大小写字母、数字\n" +
-// "• 添加特殊字符";
-// } else if ("中".equals(strength)) {
-// return "密码强度中等,可以考虑添加特殊字符提高安全性";
-// } else {
-// return "密码强度良好!";
-// }
-// }
}
\ No newline at end of file
diff --git a/src/main/java/com/util/RandomUtils.java b/src/main/java/com/pair/util/RandomUtils.java
similarity index 99%
rename from src/main/java/com/util/RandomUtils.java
rename to src/main/java/com/pair/util/RandomUtils.java
index 94c4635..dd87f32 100644
--- a/src/main/java/com/util/RandomUtils.java
+++ b/src/main/java/com/pair/util/RandomUtils.java
@@ -1,4 +1,4 @@
-package com.util;
+package com.pair.util;
import java.util.Collections;
import java.util.List;
diff --git a/src/main/java/com/service/question_generator/factory/MiddleQuestionFactory.java b/src/main/java/com/service/question_generator/factory/MiddleQuestionFactory.java
deleted file mode 100644
index 4352566..0000000
--- a/src/main/java/com/service/question_generator/factory/MiddleQuestionFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.service.question_generator.factory;
-
-
-
-import com.model.ChoiceQuestion;
-import com.model.Grade;
-import com.service.question_generator.strategy.middle.*;
-import com.util.RandomUtils;
-import com.service.question_generator.strategy.QuestionStrategy;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 初中题目工厂
- */
-public class MiddleQuestionFactory implements QuestionFactory {
-
- private final List strategies;
-
- public MiddleQuestionFactory() {
- strategies = new ArrayList<>();
- // 注册所有初中题目生成策略
- strategies.add(new SquareStrategy());
- strategies.add(new SquareAddStrategy());
- strategies.add(new SqrtStrategy());
- strategies.add(new SqrtAddStrategy());
- strategies.add(new MixedSquareSqrtStrategy());
- }
-
- @Override
- public ChoiceQuestion createQuestion() {
- QuestionStrategy strategy = RandomUtils.randomChoice(strategies);
- return strategy.generate();
- }
-
- @Override
- public Grade getSupportedGrade() {
- return Grade.MIDDLE;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/ui/GradeSelectPanel.java b/src/main/java/com/ui/GradeSelectPanel.java
deleted file mode 100644
index 391a409..0000000
--- a/src/main/java/com/ui/GradeSelectPanel.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.ui;
-
-import com.model.Grade;
-import com.service.QuizService;
-import javafx.geometry.Insets;
-import javafx.scene.control.Button;
-import javafx.scene.control.TextInputDialog;
-import javafx.scene.layout.VBox;
-
-public class GradeSelectPanel extends VBox {
-
-}
\ No newline at end of file
diff --git a/src/main/java/com/util/EmailUtil.java b/src/main/java/com/util/EmailUtil.java
deleted file mode 100644
index ff915ac..0000000
--- a/src/main/java/com/util/EmailUtil.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.util;
-
-/**
- * 邮件工具类
- * 用于发送注册码邮件(可选功能)
- * 注意:当前项目需求中,注册码是直接显示在界面上的,
- * 不需要发送邮件,所以这个类暂时保留为空实现。
- * 如果将来需要发送邮件,可以使用JavaMail库实现。
- */
-public class EmailUtil {
-
- /**
- * 发送注册码邮件(预留接口)
- * @param toEmail 收件人邮箱
- * @param registrationCode 注册码
- * @return true表示发送成功
- */
- public static boolean sendRegistrationCode(String toEmail, String registrationCode) {
- // TODO: 暂不实现邮件发送功能
- // 原因:项目需求是直接在界面显示注册码,不需要发邮件
-
- System.out.println("【模拟】发送注册码邮件");
- System.out.println("收件人: " + toEmail);
- System.out.println("注册码: " + registrationCode);
-
- return true;
- }
-
- /**
- * 发送密码重置邮件(预留接口)
- * @param toEmail 收件人邮箱
- * @param newPassword 新密码
- * @return true表示发送成功
- */
- public static boolean sendPasswordReset(String toEmail, String newPassword) {
- // TODO: 将来如果需要"找回密码"功能,可以在这里实现
-
- System.out.println("【模拟】发送密码重置邮件");
- System.out.println("收件人: " + toEmail);
- System.out.println("新密码: " + newPassword);
-
- return true;
- }
-
- /**
- * 验证邮箱格式
- * @param email 邮箱地址
- * @return true表示格式正确
- */
- public static boolean isValidEmail(String email) {
- if (email == null || email.trim().isEmpty()) {
- return false;
- }
-
- // 简单的邮箱格式验证
- String emailRegex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$";
- return email.matches(emailRegex);
- }
-}
-
-/*
- * 如果将来需要真正实现邮件发送,可以参考以下代码:
- *
- * 1. 在pom.xml添加依赖:
- *
- * javax.mail
- * javax.mail-api
- * 1.6.2
- *
- *
- * com.sun.mail
- * javax.mail
- * 1.6.2
- *
- *
- * 2. 实现代码示例:
- *
- * import javax.mail.*;
- * import javax.mail.internet.*;
- * import java.util.Properties;
- *
- * public static boolean sendEmail(String toEmail, String subject, String content) {
- * try {
- * Properties props = new Properties();
- * props.put("mail.smtp.auth", "true");
- * props.put("mail.smtp.starttls.enable", "true");
- * props.put("mail.smtp.host", "smtp.qq.com");
- * props.put("mail.smtp.port", "587");
- *
- * Session session = Session.getInstance(props, new Authenticator() {
- * protected PasswordAuthentication getPasswordAuthentication() {
- * return new PasswordAuthentication("your-email@qq.com", "your-password");
- * }
- * });
- *
- * Message message = new MimeMessage(session);
- * message.setFrom(new InternetAddress("your-email@qq.com"));
- * message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail));
- * message.setSubject(subject);
- * message.setText(content);
- *
- * Transport.send(message);
- * return true;
- * } catch (Exception e) {
- * e.printStackTrace();
- * return false;
- * }
- * }
- */
\ No newline at end of file