# 中小学数学卷子自动生成程序 ## 项目简介 本项目提供一个命令行工具,为小学、初中和高中三个难度层级的教师批量生成数学试题。程序支持账号登录、难度切换、去重出题与试卷归档,便于教师快速准备不同难度的练习卷。 ## 核心特性 - 登录鉴权:内置九个教师账号,登录后自动匹配题目难度。 - 统一接口:`QuestionGenerator` 接口抽象题目生成行为,三种学段实现类分别负责小学、初中、高中题目生成,便于扩展新的学段。 - 去重出题:`QuestionGenerationService` 在题目生成前加载账号历史题库,并在生成过程中对照 `Set` 做查重,确保同一账号生成的题目不重复。 - 多轮出题:同一账号可在一次登录会话中多次生成试题,历史集合会随着新题目更新,避免再生成到旧题。 - 结果持久化:`QuestionStorageService` 以 `generated_questions/<用户名>/` 为根目录,按时间戳创建 `YYYY-MM-DD-HH-mm-ss.txt` 文件保存题目,格式包含题号与空行。 - 难度切换:输入 `切换为小学|初中|高中` 即可在登录状态下转换出题难度。 ## 运行指南 首先确保您当前电脑正确配置 java 环境并且要求 JDK 版本在 21 及以上 进入可执行 jar 包 smarthomework.jar 所在的目录 - **macOS (zsh)** ```bash java -jar smarthomework.jar ``` - **Linux (Bash/zsh)** ```bash java -jar smarthomework.jar ``` - **Windows 命令提示符 (CMD)** 1. 打开 CMD,切换编码并锁定 UTF-8: ```cmd chcp 65001 set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 ``` 2. 进入项目根目录并运行应用: ```cmd java -jar smarthomework.jar ``` - **Windows PowerShell** ```powershell [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 [Console]::InputEncoding = [System.Text.Encoding]::UTF8 $env:JAVA_TOOL_OPTIONS = '-Dfile.encoding=UTF-8' java -jar smarthomework.jar ``` 登录后按提示输入“用户名 密码”(空格分隔),示例:`张三1 123`。随后根据提示输入题目数量(10-30 之间)生成试卷,或输入 `切换为小学|初中|高中` 调整难度,输入 `-1` 退出当前账号。程序会在 `generated_questions/<用户名>/` 目录下生成文本文件,可重复登录查看或继续生成。 ## 模块结构概览 - `com.personalproject.MathExamApplication`:程序入口,负责登录流程、命令解析与服务编排。 - `com.personalproject.auth`:账户仓库与账号模型,封装登录验证逻辑。 - `com.personalproject.generator`:题目生成接口与各学段实现。 - `com.personalproject.service.QuestionGenerationService`:批量生成题目、查重与尝试次数控制。 - `com.personalproject.storage.QuestionStorageService`:题目读取、去重资源加载与结果落盘。 - `com.personalproject.model.DifficultyLevel`:难度枚举,提供展示名称与解析能力。 ## 查重原理 1. 登录成功后,应用调用 `QuestionStorageService.loadExistingQuestions(username)`,读取该账号历史文件,去除题号后存入集合。 2. 生成新题目时,`QuestionGenerationService.generateUniqueQuestions` 会在每次生成后检查: - 是否出现在历史集合; - 是否在当前批次已出现。 不满足条件的题目将被丢弃并重新生成,最多尝试 10,000 次。 3. 成功生成题目后,应用写入文件并将新题加入历史集合,确保后续批次继续去重。 ## 目录结构 ``` src/ Java 源码(遵循 Google Java Style) doc/README.md 项目说明文档 generated_questions/ 程序运行后生成的题目文件夹 ```