diff --git a/README.md b/README.md deleted file mode 100644 index 9434cd8..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# student_studying - diff --git a/doc/说明文档.md b/doc/说明文档.md new file mode 100644 index 0000000..9d57fc2 --- /dev/null +++ b/doc/说明文档.md @@ -0,0 +1,159 @@ +# 🧮 数学出题系统说明文档 + +> **课程项目名称**:中小学数学卷子自动生成程序 +> **作者**:曹峻茂、周竞由 +> **版本**:V2.5(多文件结构 + 异步邮件 + 注册防重 + 页面跳转优化) +> **日期**:2025-10-11 + +--- + +## 一、项目概述 + +本项目是一个基于 **Java Swing 图形界面** 的数学出题系统,面向小学、初中、高中数学教师。 +系统支持 **用户注册登录、邮箱验证码验证、试题自动生成与保存、难度选择切换** 等功能。 +用户可通过图形界面生成随机不重复的数学题目卷子,并以时间命名的文件形式保存。 + +--- + +## 二、环境依赖 +- Oracle OpenJDK23 +- jakarta.activation-2.0.1.jar +- jakarta.mail-2.0.1.jar +--- +## 三、系统功能结构 + +### 1. 登录模块 +- 用户输入邮箱与密码登录 +- 若登录信息错误,提示重试 +- 登录成功后自动进入 **难度选择页面** + +### 2. 注册模块 +- 支持邮箱验证码验证 +- 密码要求:**6–10 位,包含大小写字母和数字** +- 新增用户名输入框,**防止重复用户名注册** +- 邮件发送使用异步线程,避免界面"未响应" +- 验证码通过 **腾讯云邮件推送** 或控制台调试输出 + +### 3. 出题模块 +- 支持小学 / 初中 / 高中三种难度 +- 每次生成题目数量在 10–30 之间 +- 同一用户新生成题目与已有文件不重复 +- 出题过程采用异步执行并带有进度提示(防止卡死) + +### 4. 界面模块 + +| 界面类 | 功能说明 | +|--------|-----------| +| `LoginPanel` | 用户登录 | +| `RegisterPanel` | 用户注册 | +| `DifficultyPanel` | 难度选择 | +| `QuizPanel` | 出题界面 | +| `AppController` | 控制界面切换 | +| `EmailUtil` | 邮件验证码发送 | +| `UserManager` | 用户文件管理 | + +--- + +## 四、项目结构说明 +- student_studying/ +- ├── controller/ +- │ ├── AppController.java # 主控制器,负责界面切换与业务调度 +- │ └── UserManager.java # 用户管理(注册、登录、重复校验) +- │ +- ├── model/ +- │ └── User.java # 用户实体类(邮箱、密码、用户名) +- │ +- ├── ui/ +- │ ├── LoginPanel.java # 登录界面 +- │ ├── RegisterPanel.java # 注册界面 +- │ ├── DifficultyPanel.java # 难度选择界面 +- │ └── QuizPanel.java # 出题界面 +- │ +- └── util/ +- └── EmailUtil.java # 邮件发送工具类(异步执行) +--- +## 五、关键功能实现 + +### (1)异步邮件发送 + +在 `EmailUtil` 中,使用线程池异步执行邮件发送任务: + +```java +ExecutorService executor = Executors.newSingleThreadExecutor(); + +public static String sendVerificationCode(String email) { + String code = generateCode(); + executor.submit(() -> { + try { + // 调用腾讯云邮件推送API或JakartaMail发送 + sendMail(email, code); + } catch (Exception e) { + e.printStackTrace(); + } + }); + return code; +} +``` +- 这样不会阻塞主线程,界面不会出现"未响应"状态。 +### (2)注册防重复用户名 +- 在 UserManager 中添加: +```java +public boolean isUsernameExists(String username) { + return users.values().stream() + .anyMatch(u -> u.getUsername().equalsIgnoreCase(username)); +} +``` +- 在注册按钮事件中调用: +```java +if (controller.getUserManager().isUsernameExists(username)) { + JOptionPane.showMessageDialog(this, "用户名已存在,请更换!"); + return; +} +``` +- 确保用户名全局唯一 +### (3)页面跳转逻辑优化 + - 原逻辑: + - "再做一次" 按钮 → 返回登录界面 + +- 新逻辑: +- "再做一次" 按钮 → 直接跳转回 难度选择页面 + +- 修改如下: +```java + retryButton.addActionListener(e -> controller.showDifficultyPanel()); +``` +- 在 AppController 中新增: +```java + public void showDifficultyPanel() { + frame.setContentPane(new DifficultyPanel(this)); + frame.revalidate(); +} +``` +--- +## 六、用户数据管理 +- 所有注册用户信息保存在本地 users.txt 文件中,结构如下: +- email,password,username +- teacher1@xx.com,Abc123,张三 +- teacher2@xx.com,Def456,李四 +--- +## 七、项目运行说明 + - 运行 AppController.main() 启动程序 +- 首次运行点击"注册"创建账户 +- 邮箱验证码可通过腾讯云邮件推送或控制台输出 +- 登录后选择难度并输入题目数量 +- 点击"再做一次"可返回难度选择页面重新生成 +- 点击退出退出程序 + +--- +## 八、总结 + - 本系统成功实现了: + +- 用户注册与登录 + +- 邮箱验证码验证 + +- 防止用户名重复 + +- 题目自动生成 + +- 多界面跳转与交互优化 \ No newline at end of file