Compare commits

..

No commits in common. 'main' and 'develop' have entirely different histories.

@ -1,154 +0,0 @@
# 🎓 潘俊晖-符晋康结对项目
> 一个基于 **Python + PySide6** 的图形化应用,支持用户登录/注册、选择难度等级(小学 / 初中 / 高中),并自动生成随机数学题目进行答题与评分。
> 项目包含完整的用户管理系统(注册验证、密码加密、登录验证)、多级题库生成器与答题评测功能。
---
## 📁 项目结构
## 🚀 程序入口:`main.py`
```Python
if __name__ == "__main__":
appwin = AppWindow()
appwin.run()
```
### 主要职责
- 初始化 Qt 应用 (`QApplication`)
- 创建 `AppController` 控制器
- 初始化所有窗口(登录、注册、等级选择、答题、结果)
- 控制各个窗口的切换逻辑(如登录后进入题目选择界面)
---
## 🧠 控制器层:`AppController`
负责协调用户管理与题库模块,是整个应用的业务中枢。
主要方法:
|方法|功能|
|---|---|
|`send_registration_code(email)`|发送邮箱验证码|
|`register_with_code(email, code, username, password)`|注册新用户|
|`login(identifier, password)`|用户登录(邮箱或用户名)|
|`change_password(old_pw, new_pw)`|修改密码|
|`start_quiz(level, n_questions)`|启动一个新测验|
|`get_current_question()`|获取当前题目|
|`submit_answer(index, selected_option)`|提交用户答案|
|`finish_quiz_and_score()`|计算并返回测验结果|
---
## 👥 用户管理模块:`UserManager`
负责:
- 用户注册 / 登录 / 密码修改
- 邮箱验证码发送
- 安全的密码加密与验证
### 核心逻辑
#### 🔐 密码加密
使用 `PBKDF2-HMAC-SHA256` 算法进行多次迭代哈希:
`dk = hashlib.pbkdf2_hmac("sha256", password.encode(), salt, 120_000)`
#### ✉️ 注册验证码
在Windows上运行程序时发送注册码似乎会变得很慢请耐心等待。
- 生成 6 位随机验证码
- 使用 SMTP 发送邮件
- 有效期 5 分钟
## 📘 题库模块:`QuestionBank`
负责自动生成题目,支持小学、初中、高中三级难度。
### 🎯 主要功能
- 从三个不同难度的题目生成器中(`ElementaryGenerator`、`MiddleGenerator`、`HighGenerator`)创建题目
- 自动避免重复题目(通过 `existing_stems` 集合)
- 每道题包含随机生成的选项与正确答案索引
---
## 🖥️ 图形化界面模块:`views/`
### 主要窗口说明
|窗口类|说明|
|---|---|
|`LoginWindow`|登录界面,输入邮箱/用户名 + 密码|
|`RegisterWindow`|注册界面,填写邮箱、用户名、密码,获取验证码|
|`LevelSelectWindow`|选择题目难度(小学 / 初中 / 高中)|
|`QuizWindow`|答题界面,显示题目与选项,支持上一题/下一题|
|`ResultWindow`|显示测验成绩与正确率,支持重新测验|
---
## 💡 项目运行
### ▶️ 运行程序
运行可执行文件 `main.py`
程序启动后将显示登录窗口:
1. 注册新用户(邮箱验证码验证)
2. 登录后选择难度
3. 自动生成题目答题
4. 提交并查看分数
---
## 🧭 项目设计亮点
- **MVC 架构清晰**
`models` 负责数据,`controllers` 管逻辑,`views` 管界面。
- **可扩展性强**
可轻松添加新的题型生成器(例如“大学”级别)。
- **安全可靠**
使用 PBKDF2 密码哈希,防止明文存储。
- **用户体验好**
多窗口图形界面流畅切换,支持注册验证与分数展示。
---
## 📜 未来改进方向
- 支持错题本与历史成绩记录
- 增加“倒计时模式”
- 增加更多题型(如分数、小数、方程)
- 提供数据统计分析功能

@ -12,6 +12,7 @@ class AppController:
self.current_answers = []
self.current_index = 0
# 注册相关
def send_registration_code(self, email: str) -> (bool, str):
from utils.validators import is_valid_email
if not is_valid_email(email):
@ -36,6 +37,7 @@ class AppController:
return False, "未登录"
return self.user_manager.change_password(self.current_user, old_pw, new_pw)
# TODO 出题与答题
def start_quiz(self, level: str, n_questions: int):
self.current_paper = self.question_bank.generate_paper(level, n_questions)
self.current_index = 0

Loading…
Cancel
Save