From fbe8c170dfe6230af6e402a35fb2c0fa829a1ed3 Mon Sep 17 00:00:00 2001 From: psoyzuart <3227921895@qq.com> Date: Sun, 12 Oct 2025 13:21:42 +0800 Subject: [PATCH 1/9] Delete 'README.md' --- README.md | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 8a4459c..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# partner_project - -- 2.34.1 From a26ecc5c97f8e18791f3f02ed124899adfc9f186 Mon Sep 17 00:00:00 2001 From: hnu202326010422 <2810672597@qq.com> Date: Sun, 12 Oct 2025 19:06:14 +0800 Subject: [PATCH 2/9] ADD file via upload --- src/Main.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/Main.java diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..c58f279 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,8 @@ +import ui.MainApplication; + +public class Main { + public static void main(String[] args) { + // R1: 启动图形化界面应用 (JavaFX) + MainApplication.launch(MainApplication.class, args); + } +} \ No newline at end of file -- 2.34.1 From e32cb288bda8c662f2884683f133d02e7b3a1814 Mon Sep 17 00:00:00 2001 From: hnu202326010422 <2810672597@qq.com> Date: Sun, 12 Oct 2025 19:06:34 +0800 Subject: [PATCH 3/9] ADD file via upload --- src/auth/AuthService.java | 206 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 src/auth/AuthService.java diff --git a/src/auth/AuthService.java b/src/auth/AuthService.java new file mode 100644 index 0000000..8a06ce2 --- /dev/null +++ b/src/auth/AuthService.java @@ -0,0 +1,206 @@ +package auth; + +import util.ModifyUtils; +import util.EmailService; +import java.io.*; +import java.util.*; +import java.util.regex.Pattern; + +public class AuthService { + private static final String USER_FILE_PATH = "user.txt"; + private final EmailService emailService = new EmailService(); + + + + + public AuthService() { + // 检查用户文件是否存在 + File userFile = new File(USER_FILE_PATH); + if (!userFile.exists()) { + System.err.println("用户文件不存在: " + USER_FILE_PATH); + try { + // 尝试创建文件 + if (userFile.createNewFile()) { + System.out.println("已创建用户文件: " + USER_FILE_PATH); + } + } catch (IOException e) { + System.err.println("创建用户文件失败: " + e.getMessage()); + } + } + + } + + + + // --- 校验和辅助方法 --- + + private static final Pattern EMAIL_PATTERN = + Pattern.compile("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}$"); + + // R3: 密码校验: 6-10 位, 必须含大小写字母和数字 + public static boolean isPasswordValid(String password) { + if (password == null || password.length() < 6 || + password.length() > 10) { + return false; + } + Pattern pattern = + Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d).{6,10}$"); + return pattern.matcher(password).matches(); + } + + public boolean validateEmail(String email) { + if (email == null){ + return false; + } + return EMAIL_PATTERN.matcher(email).matches(); + } + + // --- 用户加载和保存 --- + + private User parseLine(String line, int lineNumber) { + line = line.trim(); + if (line.isEmpty()) { + return null; + } + + String[] parts = line.split("\\s+"); + if (parts.length != 4) { + System.out.println("警告: 第" + lineNumber + + "行数据格式不正确,需要4个数据。"); + return null; + } + return new User(parts[0], parts[1], parts[2], parts[3]); + } + + public List loadUsers() { + List users = new ArrayList<>(); + int lineNumber = 1; + + try (BufferedReader br = new BufferedReader(new FileReader(USER_FILE_PATH))) { + String line; + while ((line = br.readLine()) != null) { + User user = parseLine(line, lineNumber); + if (user != null) { + users.add(user); + } + lineNumber++; + } + } catch (IOException e) { + System.out.println("读取文件时发生错误: " + e.getMessage()); + } + + return users; + } + + // --- 认证和注册 --- + + public User login(String username, String password) { + List users = loadUsers(); + + for (User user : users) { + if ((user.getUsername().equals(username) || user.getEmail().equals(username)) && + user.getPassword().equals(password)) { + return user; + } + } + + return null; + } + + public boolean isUsernameOrEmailTaken(String username, String email) { + List users = loadUsers(); + for (User user : users) { + if ((username != null && user.getUsername().equals(username)) || + (email != null && user.getEmail().equals(email))) { + return true; + } + } + return false; + } + + // R2: 实际发送验证邮件 + public String sendVerificationCode(String email) { + if (!validateEmail(email) || isUsernameOrEmailTaken(null, email)) { + return null; + } + String code = emailService.generateVerificationCode(); + if (emailService.sendVerificationEmail(email, code)) { + return code; + } + return null; + } + + private void writeUserData(String userData) throws IOException { + try (BufferedWriter writer = + new BufferedWriter(new FileWriter(USER_FILE_PATH, true))) { + writer.write(userData); + writer.newLine(); + } + } + + // R2: 注册用户 + public boolean registerUser(String username, String password, String email) { + if (isUsernameOrEmailTaken(username, email)) { + return false; + } + + // 格式: username password type email + String userData = username + " " + password + " 小学 " + email; + try { + writeUserData(userData); + return true; + } catch (IOException e) { + System.out.println("写入文件时发生错误: " + e.getMessage()); + return false; + } + } + + // --- 用户修改 --- + + public boolean updatePassword(String username, String newPassword) { + // 索引 1 是密码 + int result = ModifyUtils.modifyFileField(USER_FILE_PATH, username, 1, newPassword); + return result != -1; + } + + public boolean updateDifficulty(String username, String newDifficulty) { + List lines = new ArrayList<>(); + boolean found = false; + + try (BufferedReader br = new BufferedReader(new FileReader(USER_FILE_PATH))) { + String line; + while ((line = br.readLine()) != null) { + String[] parts = line.trim().split("\\s+"); + + if (parts.length >= 4 && parts[0].equals(username)) { + // 找到目标用户,更新难度 + parts[2] = newDifficulty; + line = String.join(" ", parts); + found = true; + } + lines.add(line); + } + } catch (IOException e) { + System.err.println("读取用户文件错误: " + e.getMessage()); + return false; + } + + if (!found) { + System.err.println("未找到用户: " + username); + return false; + } + + // 写回文件 + try (BufferedWriter bw = new BufferedWriter(new FileWriter(USER_FILE_PATH))) { + for (String line : lines) { + bw.write(line); + bw.newLine(); + } + return true; + } catch (IOException e) { + System.err.println("写入用户文件错误: " + e.getMessage()); + return false; + } + } + +} \ No newline at end of file -- 2.34.1 From 10999ea5816d6420fefb4b99cbe0f6907b9e76c6 Mon Sep 17 00:00:00 2001 From: hnu202326010422 <2810672597@qq.com> Date: Sun, 12 Oct 2025 19:06:54 +0800 Subject: [PATCH 4/9] ADD file via upload --- src/auth/User.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/auth/User.java diff --git a/src/auth/User.java b/src/auth/User.java new file mode 100644 index 0000000..835b8ac --- /dev/null +++ b/src/auth/User.java @@ -0,0 +1,20 @@ +package auth; + +public class User { + private String username; + private String password; + private String type; + private String email; + + public User(String username, String password, String type, String email) { + this.username = username; + this.password = password; + this.type = type; + this.email = email; + } + + public String getUsername() { return username; } + public String getPassword() { return password; } + public String getType() { return type; } + public String getEmail() { return email; } +} -- 2.34.1 From ed43bc5856365656e4b6e77bd7cce543b373da20 Mon Sep 17 00:00:00 2001 From: hnu202326010422 <2810672597@qq.com> Date: Sun, 12 Oct 2025 19:07:07 +0800 Subject: [PATCH 5/9] ADD file via upload --- src/auth/UserManager.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/auth/UserManager.java diff --git a/src/auth/UserManager.java b/src/auth/UserManager.java new file mode 100644 index 0000000..c12a1c8 --- /dev/null +++ b/src/auth/UserManager.java @@ -0,0 +1,13 @@ +package auth; + +public class UserManager { + private final AuthService authService; + + public UserManager() { + this.authService = new AuthService(); + } + + public User login(String username, String password) { + return authService.login(username, password); + } +} -- 2.34.1 From 35b99fedec70186a846402660c18f3e54b94ebc1 Mon Sep 17 00:00:00 2001 From: hnu202326010422 <2810672597@qq.com> Date: Sun, 12 Oct 2025 19:07:31 +0800 Subject: [PATCH 6/9] ADD file via upload --- src/generator/HighGenerator.java | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/generator/HighGenerator.java diff --git a/src/generator/HighGenerator.java b/src/generator/HighGenerator.java new file mode 100644 index 0000000..333fc24 --- /dev/null +++ b/src/generator/HighGenerator.java @@ -0,0 +1,28 @@ +package generator; + +import util.ExpressionUtils; +import java.util.*; + +public class HighGenerator implements ProblemGenerator { + @Override + public List generateProblems(int count) { + List problems = new ArrayList<>(); + int attempts = 0; + final int maxAttempts = count * 3; // 最多尝试3倍数量 + + while (problems.size() < count && attempts < maxAttempts) { + Problem problem = ExpressionUtils.generateHighExpr(); + if (problem != null) { + problems.add(problem); + } + attempts++; + } + + // 如果无法生成足够题目,用简单题目填充 + while (problems.size() < count) { + problems.add(ExpressionUtils.createProblem("sin(30) + " + (problems.size() + 1))); + } + + return problems; + } +} \ No newline at end of file -- 2.34.1 From 60d36d950f20e2d91b87ce8f13423cb09676ba6b Mon Sep 17 00:00:00 2001 From: hnu202326010422 <2810672597@qq.com> Date: Sun, 12 Oct 2025 19:07:43 +0800 Subject: [PATCH 7/9] ADD file via upload --- src/generator/MiddleGenerator.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/generator/MiddleGenerator.java diff --git a/src/generator/MiddleGenerator.java b/src/generator/MiddleGenerator.java new file mode 100644 index 0000000..93c4c60 --- /dev/null +++ b/src/generator/MiddleGenerator.java @@ -0,0 +1,15 @@ +package generator; + +import util.ExpressionUtils; +import java.util.*; + +public class MiddleGenerator implements ProblemGenerator { + @Override + public List generateProblems(int count) { + List problems = new ArrayList<>(); + for (int i = 0; i < count; i++) { + problems.add(ExpressionUtils.generateMiddleExpr()); + } + return problems; + } +} \ No newline at end of file -- 2.34.1 From a84d3d178e7a07f2ec4fb347909fa045bb9b17f1 Mon Sep 17 00:00:00 2001 From: hnu202326010422 <2810672597@qq.com> Date: Sun, 12 Oct 2025 19:07:56 +0800 Subject: [PATCH 8/9] ADD file via upload --- src/generator/PrimaryGenerator.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/generator/PrimaryGenerator.java diff --git a/src/generator/PrimaryGenerator.java b/src/generator/PrimaryGenerator.java new file mode 100644 index 0000000..5818c4b --- /dev/null +++ b/src/generator/PrimaryGenerator.java @@ -0,0 +1,15 @@ +package generator; + +import util.ExpressionUtils; +import java.util.*; + +public class PrimaryGenerator implements ProblemGenerator { + @Override + public List generateProblems(int count) { + List problems = new ArrayList<>(count); + for (int i = 0; i < count; i++) { + problems.add( ExpressionUtils.generatePrimaryExpr()); + } + return problems; + } +} \ No newline at end of file -- 2.34.1 From fb8a754954a1c701d99710e3875716a21b4c53ee Mon Sep 17 00:00:00 2001 From: hnu202326010422 <2810672597@qq.com> Date: Sun, 12 Oct 2025 19:08:11 +0800 Subject: [PATCH 9/9] ADD file via upload --- src/generator/Problem.java | 61 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/generator/Problem.java diff --git a/src/generator/Problem.java b/src/generator/Problem.java new file mode 100644 index 0000000..bd6e44b --- /dev/null +++ b/src/generator/Problem.java @@ -0,0 +1,61 @@ +package generator; + +import java.util.List; +import java.util.Collections; + +public class Problem { + private final String expression; + private final double result; + private final List options; + private final String correctAnswerOption; + + public Problem(String expression, double result, List options, + String correctAnswerOption) { + this.expression = expression; + this.result = result; + this.options = options; + this.correctAnswerOption = correctAnswerOption; + } + + public String getQuestionText() { + return "计算: " + expression + " = ?"; + } + + public String getExpression() { + return expression; + } + + public List getOptions() { + return Collections.unmodifiableList(options); + } + + public String getCorrectAnswerOption() { + return formatResult(result); + } + + private String formatResult(double result) { + if (Double.isNaN(result)) { + return "Error"; + } + if (Math.abs(result - Math.round(result)) < 0.0001) { + return String.valueOf((int) Math.round(result)); + } + return String.format("%.2f", result); + } + + public double getResult() { + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getQuestionText()).append("\n"); + char optionChar = 'A'; + for (String option : options) { + sb.append(optionChar++).append(". ").append(option).append(" "); + } + sb.append("\n正确答案: ").append(correctAnswerOption); + return sb.toString(); + } +} \ No newline at end of file -- 2.34.1