您好,登录后才能下订单哦!
随着在线教育的普及,越来越多的学生和开发者选择通过在线刷题来提高自己的编程能力。一个高效、易用的刷题练习系统不仅可以帮助用户提升编程技能,还能通过数据分析帮助用户了解自己的学习进度和薄弱环节。本文将详细介绍如何基于Python编写一个刷题练习系统,涵盖从需求分析、系统设计到实现和优化的全过程。
用户管理
题目管理
练习模块
成绩统计
性能
安全性
可扩展性
系统采用前后端分离的架构,前端负责用户界面展示,后端负责业务逻辑处理和数据存储。前后端通过RESTful API进行通信。
用户表(User)
id
: 用户IDusername
: 用户名password
: 密码(加密存储)email
: 邮箱role
: 用户角色(普通用户、管理员)题目表(Problem)
id
: 题目IDtitle
: 题目名称description
: 题目描述difficulty
: 题目难度category
: 题目分类tags
: 题目标签提交记录表(Submission)
id
: 提交IDuser_id
: 用户IDproblem_id
: 题目IDcode
: 提交代码status
: 提交状态(通过、失败、待评测)time
: 提交时间成绩表(Score)
id
: 成绩IDuser_id
: 用户IDproblem_id
: 题目IDscore
: 得分time
: 提交时间用户管理模块
题目管理模块
练习模块
成绩统计模块
Python因其简洁、易读、丰富的库支持,成为本系统的首选编程语言。
安装Python
sudo apt-get install python3
安装虚拟环境
python3 -m venv venv
source venv/bin/activate
安装依赖
pip install flask flask-sqlalchemy flask-login flask-wtf
app = Flask(name) app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘sqlite:///test.db’ db = SQLAlchemy(app)
class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password = db.Column(db.String(120), nullable=False) email = db.Column(db.String(120), unique=True, nullable=False)
@app.route(‘/register’, methods=[‘POST’]) def register(): data = request.get_json() hashed_password = generate_password_hash(data[‘password’], method=‘sha256’) new_user = User(username=data[‘username’], password=hashed_password, email=data[‘email’]) db.session.add(new_user) db.session.commit() return jsonify({‘message’: ‘User registered successfully’}), 201
2. **用户登录**
```python
from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin, db.Model):
pass
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/login', methods=['POST'])
def login():
data = request.get_json()
user = User.query.filter_by(username=data['username']).first()
if user and check_password_hash(user.password, data['password']):
login_user(user)
return jsonify({'message': 'Logged in successfully'}), 200
return jsonify({'message': 'Invalid credentials'}), 401
@app.route(‘/add_problem’, methods=[‘POST’]) @login_required def add_problem(): data = request.get_json() new_problem = Problem(title=data[‘title’], description=data[‘description’], difficulty=data[‘difficulty’], category=data[‘category’], tags=data[‘tags’]) db.session.add(new_problem) db.session.commit() return jsonify({‘message’: ‘Problem added successfully’}), 201
2. **题目查询**
```python
@app.route('/problems', methods=['GET'])
def get_problems():
problems = Problem.query.all()
output = []
for problem in problems:
problem_data = {}
problem_data['id'] = problem.id
problem_data['title'] = problem.title
problem_data['description'] = problem.description
problem_data['difficulty'] = problem.difficulty
problem_data['category'] = problem.category
problem_data['tags'] = problem.tags
output.append(problem_data)
return jsonify({'problems': output}), 200
题目展示
@app.route('/problem/<int:problem_id>', methods=['GET'])
def get_problem(problem_id):
problem = Problem.query.get_or_404(problem_id)
problem_data = {}
problem_data['id'] = problem.id
problem_data['title'] = problem.title
problem_data['description'] = problem.description
problem_data['difficulty'] = problem.difficulty
problem_data['category'] = problem.category
problem_data['tags'] = problem.tags
return jsonify({'problem': problem_data}), 200
代码提交与评测 “`python import requests
@app.route(‘/submit’, methods=[‘POST’]) @login_required def submit(): data = request.get_json() problem_id = data[‘problem_id’] code = data[‘code’] language = data[‘language’]
# 调用评测系统API
response = requests.post('https://judge0.com/submissions', json={
'source_code': code,
'language_id': language,
'stdin': '',
'expected_output': ''
})
submission_id = response.json()['id']
return jsonify({'submission_id': submission_id}), 201
### 成绩统计模块
1. **成绩查询**
```python
class Score(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
problem_id = db.Column(db.Integer, db.ForeignKey('problem.id'), nullable=False)
score = db.Column(db.Integer, nullable=False)
time = db.Column(db.DateTime, nullable=False)
@app.route('/scores', methods=['GET'])
@login_required
def get_scores():
scores = Score.query.filter_by(user_id=current_user.id).all()
output = []
for score in scores:
score_data = {}
score_data['id'] = score.id
score_data['user_id'] = score.user_id
score_data['problem_id'] = score.problem_id
score_data['score'] = score.score
score_data['time'] = score.time
output.append(score_data)
return jsonify({'scores': output}), 200
@app.route('/leaderboard', methods=['GET'])
def get_leaderboard():
leaderboard = db.session.query(User.username, db.func.sum(Score.score).label('total_score')).join(Score).group_by(User.id).order_by(db.desc('total_score')).all()
output = []
for user in leaderboard:
user_data = {}
user_data['username'] = user.username
user_data['total_score'] = user.total_score
output.append(user_data)
return jsonify({'leaderboard': output}), 200
class TestUserManagement(unittest.TestCase): def setUp(self): self.app = app.test_client() self.app.testing = True
def test_register(self):
response = self.app.post('/register', json={'username': 'test', 'password': 'test', 'email': 'test@test.com'})
self.assertEqual(response.status_code, 201)
def test_login(self):
response = self.app.post('/login', json={'username': 'test', 'password': 'test'})
self.assertEqual(response.status_code, 200)
if name == ‘main’: unittest.main()
2. **集成测试**
```python
class TestProblemManagement(unittest.TestCase):
def setUp(self):
self.app = app.test_client()
self.app.testing = True
def test_add_problem(self):
response = self.app.post('/add_problem', json={'title': 'Test Problem', 'description': 'Test Description', 'difficulty': 'Easy', 'category': 'Test', 'tags': 'test'})
self.assertEqual(response.status_code, 201)
def test_get_problem(self):
response = self.app.get('/problem/1')
self.assertEqual(response.status_code, 200)
if __name__ == '__main__':
unittest.main()
数据库索引
user_id
、problem_id
等。缓存
异步任务
社交功能
移动端支持
辅助
本文详细介绍了如何基于Python编写一个刷题练习系统,从需求分析、系统设计到实现和优化,涵盖了系统的各个方面。通过本系统的开发,用户可以方便地进行在线刷题练习,提升编程能力。未来,系统可以进一步扩展功能,如引入辅助学习、支持多平台访问等,为用户提供更加丰富的学习体验。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。