发行版1.04 #9

Merged
hnu202326010430 merged 6 commits from WuBaiXuan_Branch into develop 4 months ago

@ -10,16 +10,20 @@
</component>
<component name="ChangeListManager">
<list default="true" id="ad9e49ad-e421-455c-8a89-0f35a7a15146" name="Changes" comment="发行版1.01">
<change afterPath="$PROJECT_DIR$/src/main/java/com/util/AppDataDirectory.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/strategy/high/ArithmeticSequenceSumStrategy.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/strategy/high/DerivativeStrategy.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/strategy/high/FunctionExtremeStrategy.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/strategy/high/LogarithmStrategy.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/strategy/high/ProbabilityStrategy.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/strategy/middle/CircleAreaStrategy.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/strategy/middle/LinearEquationStrategy.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/strategy/middle/LinearFunctionStrategy.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/strategy/middle/QuadraticEquationStrategy.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/strategy/middle/TriangleAreaStrategy.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/Test.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/Test.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/service/FileIOService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/service/FileIOService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/service/QuizService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/service/QuizService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/service/UserService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/service/UserService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/ui/MainWindow.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/ui/MainWindow.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/util/FileUtils.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/util/FileUtils.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/util/PasswordValidator.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/util/PasswordValidator.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/pair/service/QuizService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/QuizService.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/factory/HighQuestionFactory.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/factory/HighQuestionFactory.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/factory/MiddleQuestionFactory.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/pair/service/question_generator/factory/MiddleQuestionFactory.java" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -36,20 +40,17 @@
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="WuBaiXuan_Branch" />
</map>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="KubernetesApiPersistence">{}</component>
<component name="KubernetesApiProvider">{
&quot;isMigrated&quot;: true
}</component>
<component name="MavenImportPreferences">
<option name="generalSettings">
<MavenGeneralSettings>
<option name="localRepository" value="C:\Users\28032\.m2\repository" />
<option name="userSettingsFile" value="C:\Users\28032\.m2\settings.xml" />
</MavenGeneralSettings>
</option>
</component>
<component name="ProblemsViewState">
<option name="selectedTabId" value="CurrentFile" />
</component>
@ -58,43 +59,48 @@
&quot;associatedIndex&quot;: 1
}</component>
<component name="ProjectId" id="33aD4Tx1DVbp880Km6dEp5mEUbo" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;Application.Test.executor&quot;: &quot;Run&quot;,
&quot;Application.TestMain.executor&quot;: &quot;Run&quot;,
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
&quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;LiangJunYaoBranch&quot;,
&quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;project.structure.last.edited&quot;: &quot;Artifacts&quot;,
&quot;project.structure.proportion&quot;: &quot;0.0&quot;,
&quot;project.structure.side.proportion&quot;: &quot;0.0&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;MavenSettings&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"Application.Test.executor": "Run",
"Application.TestMain.executor": "Run",
"Maven.MathQuizApp [clean].executor": "Run",
"Maven.MathQuizApp [compile].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"
}
}</component>
}]]></component>
<component name="RecentsManager">
<key name="MoveFile.RECENT_KEYS">
<recent name="C:\Users\28032\OneDrive\Desktop\PAIR\.idea" />
</key>
</component>
<component name="RunManager" selected="Application.Test">
<component name="RunManager" selected="应用程序.Test">
<configuration name="Test" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
<option name="MAIN_CLASS_NAME" value="com.Test" />
<option name="MAIN_CLASS_NAME" value="com.pair.Test" />
<module name="MathQuizApp" />
<extension name="coverage">
<pattern>
<option name="PATTERN" value="com.*" />
<option name="PATTERN" value="com.pair.*" />
<option name="ENABLED" value="true" />
</pattern>
</extension>
@ -109,18 +115,12 @@
<option name="Make" enabled="true" />
</method>
</configuration>
<recent_temporary>
<list>
<item itemvalue="Application.Test" />
<item itemvalue="Application.TestMain" />
</list>
</recent_temporary>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-jdk-9823dce3aa75-fdfe4dae3a2d-intellij.indexing.shared.core-IU-243.21565.193" />
<option value="bundled-js-predefined-d6986cc7102b-e768b9ed790e-JavaScript-IU-243.21565.193" />
<option value="bundled-jdk-9823dce3aa75-28b599e66164-intellij.indexing.shared.core-IU-242.23726.103" />
<option value="bundled-js-predefined-d6986cc7102b-5c90d61e3bab-JavaScript-IU-242.23726.103" />
</set>
</attachedChunks>
</component>
@ -140,6 +140,9 @@
<workItem from="1759745765663" duration="4945000" />
<workItem from="1759752200157" duration="6627000" />
<workItem from="1759758921108" duration="6306000" />
<workItem from="1759815278314" duration="2288000" />
<workItem from="1759817587775" duration="661000" />
<workItem from="1759821094678" duration="3421000" />
</task>
<task id="LOCAL-00001" summary="ui design v1">
<option name="closed" value="true" />

@ -1,3 +1,3 @@
Manifest-Version: 1.0
Main-Class: com.Test
Main-Class: com.pair.Test

@ -36,7 +36,7 @@
<configuration>
<transformers>
<transformer>
<mainClass>com.Test</mainClass>
<mainClass>com.pair.Test</mainClass>
</transformer>
<transformer />
</transformers>

@ -0,0 +1,11 @@
# 发行版1.03测试
## 新增功能:
- 可发送真实邮箱
## 待实现功能或待修改bug
- 点击注册时窗口界面会卡顿,感觉可以将发送动作放到后台
- 注册码发送提示还是错误图标新建一个弹窗提示不混用错误弹窗函数提示改为“已发送到邮箱10分钟内有效”
- 生成题目页面选择初中高中学段生成题目,做完题出来学段选择又变回小学了,页面初始化得根据用户学段调整
- 得分的%去掉,得分是按百分比计算,不是将百分比当作得分
- 注册码简单一点6为随机数字

@ -11,7 +11,7 @@
<packaging>jar</packaging>
<name>Math Quiz Application</name>
<description>å°<EFBFBD>åˆ<EFBFBD>高数学学习软ä»?- JavaFX版本</description>
<description>小初高数学学习软<EFBFBD>?- JavaFX版本</description>
<!-- 新增 JitPack 仓库配置 -->
<repositories>
@ -55,7 +55,16 @@
<artifactId>javafx-graphics</artifactId>
<version>${javafx.version}</version>
</dependency>
</dependencies>
<!-- JavaMail API -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
</dependencies>
<build>
<plugins>
@ -100,18 +109,18 @@
</executions>
</plugin>
<!-- 新增:支æŒ?mvn javafx:run å<>¯åŠ¨çš„æ<E2809E>ä»¶é…<C3A9>ç½?-->
<!-- 支æŒ<EFBFBD> mvn javafx:run å<>¯åŠ¨çš„æ<E2809E>ä»¶é…<C3A9>ç½?-->
<!-- 支æŒ<EFBFBD> mvn javafx:run å<>¯åŠ¨çš„æ<E2809E>ä»¶é…<C3A9>ç½?-->
<!-- 用通用çš?exec-maven-plugin å<>¯åЍ JavaFX ç¨åº<C3A5> -->
<!-- 新增<EFBFBD>?mvn javafx:run 启动的插件配<E4BBB6>?-->
<!-- 支持 mvn javafx:run 启动的插件配<E4BBB6>?-->
<!-- 支持 mvn javafx:run 启动的插件配<E4BBB6>?-->
<!-- 用通用<EFBFBD>?exec-maven-plugin 启动 JavaFX 程序 -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<!-- 指定你的å<EFBFBD>¯åŠ¨ç±»å…¨è·¯å¾„ï¼ˆå¿…é¡»ä¸Ž com.Test 一致) -->
<mainClass>com.Test</mainClass>
<!-- ä¼ é€?JVM å<>数:指定需è¦<C3A8>çš„ JavaFX 模å<C2A1> -->
<!-- 指定你的启动类全路径(必须与 com.pair.Test 一致) -->
<mainClass>com.pair.Test</mainClass>
<!-- <EFBFBD>?JVM 参数:指定需要的 JavaFX 模块 -->
<arguments>
<argument>--add-modules</argument>
<argument>javafx.controls,javafx.fxml,javafx.graphics,javafx.base</argument>

@ -1,4 +0,0 @@
package com.MathQuiz;
public class Main {
}

@ -0,0 +1,4 @@
package com.pair.MathQuiz;
public class Main {
}

@ -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;

@ -1,4 +1,4 @@
package com.model;
package com.pair.model;
import java.util.List;

@ -1,4 +1,4 @@
package com.model;
package com.pair.model;
public enum Grade {

@ -1,4 +1,4 @@
package com.model;
package com.pair.model;
import java.util.Date;

@ -1,4 +1,4 @@
package com.model;
package com.pair.model;
//答题结果

@ -1,4 +1,4 @@
package com.model;
package com.pair.model;
import java.util.Date;
import java.util.UUID;

@ -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;

@ -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();

@ -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("小学-")) {

@ -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.*;

@ -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;

@ -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

@ -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<QuestionStrategy> 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;
}
}

@ -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;
/**

@ -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;

@ -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 {

@ -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;

@ -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;

@ -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;

@ -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;

@ -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;
/**

@ -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;

@ -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<Double> options = generateNumericOptions(answer);
return new ChoiceQuestion(questionText, answer, options, grade);
}
@Override
public String getStrategyName() {
return "等差数列求和";
}
}

@ -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;

@ -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<Double> options = generateNumericOptions(answer);
return new ChoiceQuestion(questionText, answer, options, grade);
}
@Override
public String getStrategyName() {
return "导数计算";
}
}

@ -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<Double> options = generateNumericOptions(answer);
return new ChoiceQuestion(questionText, answer, options, grade);
}
@Override
public String getStrategyName() {
return "函数极值";
}
}

@ -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;
/**
*
* log8 + log9
*/
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<Double> options = generateNumericOptions(answer);
return new ChoiceQuestion(questionText, answer, options, grade);
}
@Override
public String getStrategyName() {
return "对数运算";
}
}

@ -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<Double> options = generateNumericOptions(answer);
return new ChoiceQuestion(questionText, answer, options, grade);
}
@Override
public String getStrategyName() {
return "概率计算";
}
}

@ -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;

@ -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;

@ -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;

@ -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<Double> options = generateNumericOptions(answer);
return new ChoiceQuestion(questionText, answer, options, grade);
}
@Override
public String getStrategyName() {
return "圆的面积";
}
}

@ -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<Double> options = generateNumericOptions(answer);
return new ChoiceQuestion(questionText, answer, options, grade);
}
@Override
public String getStrategyName() {
return "一元一次方程";
}
}

@ -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<Double> options = generateNumericOptions(answer);
return new ChoiceQuestion(questionText, answer, options, grade);
}
@Override
public String getStrategyName() {
return "一次函数求值";
}
}

@ -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;

@ -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<Double> options = generateNumericOptions(answer);
return new ChoiceQuestion(questionText, answer, options, grade);
}
@Override
public String getStrategyName() {
return "一元二次方程";
}
}

@ -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;

@ -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;
/**

@ -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;
/**

@ -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;

@ -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<Double> options = generateNumericOptions(answer);
return new ChoiceQuestion(questionText, answer, options, grade);
}
@Override
public String getStrategyName() {
return "三角形面积";
}
}

@ -0,0 +1,7 @@
package com.pair.ui;
import javafx.scene.layout.VBox;
public class GradeSelectPanel extends VBox {
}

@ -1,5 +1,5 @@
// com/ui/InfGenPage.java
package com.ui;
package com.pair.ui;
import javafx.geometry.Pos;
import javafx.scene.control.*;

@ -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;

@ -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;

@ -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;

@ -1,4 +1,4 @@
package com.ui;
package com.pair.ui;
public enum Panel {
START, // 开始页面

@ -1,5 +1,5 @@
// com/ui/PasswordModifyPage.java
package com.ui;
package com.pair.ui;
import javafx.geometry.Pos;
import javafx.scene.control.*;

@ -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;

@ -1,5 +1,5 @@
// com/ui/RegisterPage.java
package com.ui;
package com.pair.ui;
import javafx.geometry.Pos;
import javafx.scene.control.*;

@ -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;

@ -1,5 +1,5 @@
// com/ui/StartPage.java
package com.ui;
package com.pair.ui;
import javafx.geometry.Pos;
import javafx.scene.control.Button;

@ -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() {}

@ -1,6 +1,4 @@
package com.util;
import java.io.File;
package com.pair.util;
/**
*

@ -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 truefalse
*/
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);
// }
//}

@ -1,4 +1,4 @@
package com.util;
package com.pair.util;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

@ -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 "密码强度良好!";
// }
// }
}

@ -1,4 +1,4 @@
package com.util;
package com.pair.util;
import java.util.Collections;
import java.util.List;

@ -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<QuestionStrategy> 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;
}
}

@ -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 {
}

@ -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
* <dependency>
* <groupId>javax.mail</groupId>
* <artifactId>javax.mail-api</artifactId>
* <version>1.6.2</version>
* </dependency>
* <dependency>
* <groupId>com.sun.mail</groupId>
* <artifactId>javax.mail</artifactId>
* <version>1.6.2</version>
* </dependency>
*
* 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;
* }
* }
*/
Loading…
Cancel
Save