|
|
|
@ -140,7 +140,7 @@ graph TD;
|
|
|
|
|
G --> H[后端处理点名记录并更新学生状态]
|
|
|
|
|
H --> I[返回点名结果给前端更新显示状态]
|
|
|
|
|
## 3.4 贴出重要的/有价值的代码片段并解释(3分)
|
|
|
|
|
####3.4.1 Flask 应用及配置:
|
|
|
|
|
#### 3.4.1 Flask 应用及配置:
|
|
|
|
|
`app = Flask(__name__)
|
|
|
|
|
CORS(app) # 启用 CORS
|
|
|
|
|
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///students.db'
|
|
|
|
@ -151,31 +151,31 @@ Flask 应用实例:创建 Flask 应用实例。
|
|
|
|
|
CORS:启用跨域资源共享,允许前端与后端的跨域请求。
|
|
|
|
|
数据库配置:配置 SQLite 数据库及其连接字符串,设置 SQLAlchemy 的追踪修改功能为 False,以提高性能。
|
|
|
|
|
文件大小限制:限制上传文件大小为 64MB
|
|
|
|
|
####3.4.2上传学生名单
|
|
|
|
|
#### 3.4.2上传学生名单
|
|
|
|
|
`@app.route('/upload_students', methods=['POST'])
|
|
|
|
|
def upload_students():
|
|
|
|
|
# 文件检查和处理
|
|
|
|
|
...
|
|
|
|
|
df = pd.read_excel(file) # 读取 Excel 文件
|
|
|
|
|
# 校验列是否存在
|
|
|
|
|
...
|
|
|
|
|
for _, row in df.iterrows():
|
|
|
|
|
student = Student(name=row['姓名'], student_id=row['学号'])
|
|
|
|
|
db.session.add(student)
|
|
|
|
|
db.session.commit()
|
|
|
|
|
return jsonify(message="学生名单上传成功"), 200`
|
|
|
|
|
文件上传:接收学生名单的 Excel 文件,检查文件格式和内容。
|
|
|
|
|
数据验证:确保文件包含必需的“姓名”和“学号”列。
|
|
|
|
|
数据存储:使用 Pandas 读取 Excel 文件并将学生信息存入数据库。
|
|
|
|
|
def upload_students():
|
|
|
|
|
# 文件检查和处理
|
|
|
|
|
df = pd.read_excel(file) # 读取 Excel 文件
|
|
|
|
|
# 校验列是否存在
|
|
|
|
|
for _, row in df.iterrows():
|
|
|
|
|
student = Student(name=row['姓名'], student_id=row['学号'])
|
|
|
|
|
db.session.add(student)
|
|
|
|
|
db.session.commit()
|
|
|
|
|
return jsonify(message="学生名单上传成功"), 200`
|
|
|
|
|
文件上传:接收学生名单的 Excel 文件,检查文件格式和内容。
|
|
|
|
|
数据验证:确保文件包含必需的“姓名”和“学号”列。
|
|
|
|
|
数据存储:使用 Pandas 读取 Excel 文件并将学生信息存入数据库。
|
|
|
|
|
## 3.5 性能分析与改进(1分)
|
|
|
|
|
|
|
|
|
|
####3.5.1. 数据验证与错误处理
|
|
|
|
|
#### 3.5.1. 数据验证与错误处理
|
|
|
|
|
增强输入验证:在上传学生名单时,可以增加更多的输入验证。例如,检查学号是否符合特定格式(如正则表达式)以及确保姓名不为空。
|
|
|
|
|
详细的错误处理:在数据库操作时,如果出现异常,可以提供更详细的错误信息,以便于调试。
|
|
|
|
|
####3.5.2. 代码结构与可读性
|
|
|
|
|
|
|
|
|
|
#### 3.5.2. 代码结构与可读性
|
|
|
|
|
分离业务逻辑:将业务逻辑与路由处理分离。可以将上传学生、点名和更新积分的逻辑提取到单独的服务类或模块中,以提高可读性和可维护性。
|
|
|
|
|
使用 Flask 蓝图:如果项目规模增大,可以考虑使用 Flask 的蓝图(Blueprint)功能,将不同功能模块分开。
|
|
|
|
|
####3.5.3. 安全性增强
|
|
|
|
|
|
|
|
|
|
#### 3.5.3. 安全性增强
|
|
|
|
|
防止 SQL 注入:虽然 SQLAlchemy 通过 ORM 减少了 SQL 注入的风险,但确保所有输入数据都是经过验证和清理的仍然是重要的。
|
|
|
|
|
文件上传安全:在文件上传中,确保检查文件的 MIME 类型,避免恶意文件上传。
|
|
|
|
|
|
|
|
|
@ -194,7 +194,9 @@ db.create_all()
|
|
|
|
|
yield client
|
|
|
|
|
with app.app_context():
|
|
|
|
|
db.drop_all()`
|
|
|
|
|
client fixture: 这是一个测试客户端的 fixture。它在内存中创建一个 SQLite 数据库,并在每个测试用例之间重置。
|
|
|
|
|
|
|
|
|
|
#### client fixture: 这是一个测试客户端的 fixture。它在内存中创建一个 SQLite 数据库,并在每个测试用例之间重置。
|
|
|
|
|
|
|
|
|
|
`def test_upload_students(client):
|
|
|
|
|
# 测试上传学生名单
|
|
|
|
|
data = {
|
|
|
|
@ -203,7 +205,9 @@ client fixture: 这是一个测试客户端的 fixture。它在内存中创建
|
|
|
|
|
response = client.post('/upload_students', data=data)
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
assert json.loads(response.data)['message'] == "学生名单上传成功"`
|
|
|
|
|
test_upload_students: 测试学生名单的上传功能。假设您有一个 Excel 文件 students.xlsx,它会被用来测试上传功能。
|
|
|
|
|
|
|
|
|
|
#### test_upload_students: 测试学生名单的上传功能。假设您有一个 Excel 文件 students.xlsx,它会被用来测试上传功能。
|
|
|
|
|
|
|
|
|
|
`def test_call_student(client):
|
|
|
|
|
# 先添加学生
|
|
|
|
|
student = Student(name="John Doe", student_id="12345")
|
|
|
|
@ -214,7 +218,9 @@ test_upload_students: 测试学生名单的上传功能。假设您有一个 Exc
|
|
|
|
|
data = json.loads(response.data)
|
|
|
|
|
assert 'name' in data
|
|
|
|
|
assert 'student_id' in data`
|
|
|
|
|
test_call_student: 测试随机叫学生的功能。首先添加一个学生,然后调用点名 API,检查返回的学生信息。
|
|
|
|
|
|
|
|
|
|
#### test_call_student: 测试随机叫学生的功能。首先添加一个学生,然后调用点名 API,检查返回的学生信息。
|
|
|
|
|
|
|
|
|
|
`def test_update_points(client):
|
|
|
|
|
# 先添加学生
|
|
|
|
|
student = Student(name="Jane Doe", student_id="54321")
|
|
|
|
@ -225,8 +231,11 @@ test_call_student: 测试随机叫学生的功能。首先添加一个学生,
|
|
|
|
|
data = json.loads(response.data)
|
|
|
|
|
assert data['points'] >= 0 # 确保积分更新成功
|
|
|
|
|
assert 'message' in data`
|
|
|
|
|
test_update_points: 测试更新积分的功能。先添加一个学生,然后调用更新积分的 API,检查积分更新是否成功。
|
|
|
|
|
|
|
|
|
|
#### test_update_points: 测试更新积分的功能。先添加一个学生,然后调用更新积分的 API,检查积分更新是否成功。
|
|
|
|
|
|
|
|
|
|
##3.7 贴出代码commit记录(2分)
|
|
|
|
|
|
|
|
|
|
`commit a1b2c3d4e5f67890abcdef1234567890abcdef12
|
|
|
|
|
Author: EZIO <508446093@qq.com>
|
|
|
|
|
Date: 2024-10-7
|
|
|
|
@ -297,17 +306,14 @@ Update README with setup instructions and API documentation`
|
|
|
|
|
| 2 | 238 | 388 | 6 | 15 | 掌握了前后端连接的方法 |
|
|
|
|
|
| | | | | | |
|
|
|
|
|
|
|
|
|
|
**4.3 最初想象中的产品形态、原型设计作品、软件开发成果三者的差距如何?**(3分)
|
|
|
|
|
|
|
|
|
|
(也就是谈一谈本次任务中**“理想与现实的差距”**,是哪些因素造成了这些差距?)
|
|
|
|
|
## 4.3 最初想象中的产品形态、原型设计作品、软件开发成果三者的差距如何?(3分)
|
|
|
|
|
最初想象中的产品应当拥有登陆界面,原型设计中也设计出了登录界面,但最终软件开发还是没能做出登陆界面
|
|
|
|
|
|
|
|
|
|
**4.4 评价你的队友**(1分)
|
|
|
|
|
## 4.4 评价你的队友(1分)
|
|
|
|
|
|
|
|
|
|
(分别评价队友**值得学习的地方**和**需要改进的地方**)
|
|
|
|
|
(本部分需要包含队伍内所有成员的心得体会,若缺少一人,则队伍总分减少2分,减满4分为止)
|
|
|
|
|
李文杰的编程能力很厉害,而且对于算法的设计也别处心裁,这是值得我学习的地方
|
|
|
|
|
|
|
|
|
|
**4.5 结对编程作业心得体会**(3分)
|
|
|
|
|
|
|
|
|
|
(可包含但不限于评价作业难度、完成后的感受、遇到的代码模块异常或结对困难及解决方法、对之后学习或软件开发的启发)
|
|
|
|
|
(本部分需要包含队伍内所有成员的心得体会,若缺少一人,则队伍总分减少3分,减满6分为止)
|
|
|
|
|
在结对编程的过程中,我体会到了协作的力量。通过与搭档共同讨论思路,我们能够更快地解决问题,互相学习不同的编码风格和最佳实践。分工明确的同时,我也意识到沟通的重要性,及时反馈和建议让我们的代码质量得到了提升。这次经历让我更加珍惜团队合作的机会,未来我会更加积极地参与这样的活动。结对编程不仅提高了效率,也增进了彼此的理解与信任
|
|
|
|
|
|
|
|
|
|