山东大学项目实训——基于DeepSeek的智能写作与训练平台(七)
·
山东大学项目实训——基于DeepSeek的智能写作与训练平台(七)
一、本阶段工作概述
本阶段主要围绕智能写作平台教师端和学生端进行开发,完成了教师端前端框架搭建,实现教师账号登录、注册功能;同时推进学生端部分功能开发,并完成前后端整合,实现关键业务流程贯通。
二、具体工作内容
(一)前端部分
- MainPage.vue:主界面采用
flex
布局,整合左侧菜单组件LeftMenu
与右侧动态组件,通过监听菜单点击事件切换页面显示。 - LeftMenu.vue:基于
Element UI
构建左侧菜单,包含“作文批改”“班级看板”等菜单项,点击触发menu-click
事件控制页面切换与菜单激活状态,底部设置退出按钮。 - 其他前端页面
- LoginPage.vue:实现登录功能,含用户名、密码输入框及登录注册按钮,支持错误提示。
- RegisterPage.vue:完成注册功能,包含用户名、密码、邮箱输入框,提供注册结果提示与返回登录页按钮。
- HomePage.vue:作文批改提交界面,有输入区、提交按钮与结果展示区,支持提交状态显示与结果保存。
- ClassViewPage.vue与TopicSetPage.vue:完成框架搭建,后续补充具体功能。
(二)后端部分
1. 教师登录方法
此方法用于处理教师登录请求,接收前端传来的用户名和密码,查询数据库验证用户信息。若验证成功,设置会话信息并返回成功响应;若失败,则返回相应错误信息。
# 教师登录方法,复制到auth_routes.py中,前端调用即可
auth_bp = Blueprint('auth', __name__)
@auth_bp.route('/login-teacher', methods=['POST'])
def teacher_login():
data = request.get_json()
if not data:
return jsonify({'status': 'error', 'message': '缺少请求数据'}), 400
username = data.get('username')
password = data.get('password')
if not username or not password:
return jsonify({'status': 'error', 'message': '用户名和密码不能为空'}), 400
try:
cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
cursor.execute(
'SELECT teacher_id, username FROM teacher WHERE username = %s AND password = %s',
(username, password)
)
account = cursor.fetchone()
cursor.close() # 重要:关闭游标
if account:
session['loggedin'] = True
session['id'] = account['teacher_id']
session['username'] = account['username']
return jsonify({
'status': 'success',
'message': '登录成功',
'user': {
'id': account['teacher_id'],
'username': account['username']
}
})
else:
return jsonify({'status': 'error', 'message': '用户名/密码错误'}), 401
2. 教师注册方法
该方法用于处理教师注册请求,接收前端传来的用户名、密码和邮箱,先检查用户名是否已存在,若不存在则插入新教师信息到数据库。注册成功返回成功响应,失败则返回相应错误信息。
# 教师注册,复制到auth_routes.py中,前端调用即可
@auth_bp.route('/register-teacher', methods=['POST'])
def teacher_register():
data = request.get_json()
if not data:
return jsonify({'status': 'error', 'message': '缺少请求数据'}), 400
username = data.get('username')
password = data.get('password')
email = data.get('email')
if not username or not password:
return jsonify({'status': 'error', 'message': '用户名和密码不能为空'}), 400
try:
cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
# 检查用户名是否已存在
cursor.execute('SELECT teacher_id FROM teacher WHERE username = %s', (username,))
existing_account = cursor.fetchone()
if existing_account:
cursor.close()
return jsonify({'status': 'error', 'message': '用户名已存在,请选择其他用户名'}), 409
# 插入新教师信息
cursor.execute(
'INSERT INTO teacher (username, password, email) VALUES (%s, %s, %s)',
(username, password, email)
)
mysql.connection.commit()
new_teacher_id = cursor.lastrowid
cursor.close()
return jsonify({
'status': 'success',
'message': '注册成功',
'user': {
'id': new_teacher_id,
'username': username
}
})
3. 学生注册接口
完成了学生端账号注册并绑定教师的功能开发,设计了student
数据库表,实现学生与教师的多对一关系。
CREATE TABLE `student` (
`student_id` int NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`email` varchar(255) DEFAULT NULL,
`teacher_id` int DEFAULT NULL,
PRIMARY KEY (`student_id`),
KEY `teacher_id` (`teacher_id`),
CONSTRAINT `student_ibfk_1` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`teacher_id`)
);
相关的学生注册接口代码如下:
@auth_bp.route('/register-student', methods=['POST'])
def student_register():
data = request.get_json()
if not data:
return jsonify({'status': 'error', 'message': '缺少请求数据'}), 400
username = data.get('username')
password = data.get('password')
email = data.get('email')
teacher_id = data.get('teacher_id')
if not username or not password:
return jsonify({'status': 'error', 'message': '用户名和密码不能为空'}), 400
try:
cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
# 检查用户名是否已存在
cursor.execute('SELECT student_id FROM student WHERE username = %s', (username,))
existing_account = cursor.fetchone()
if existing_account:
cursor.close()
return jsonify({'status': 'error', 'message': '用户名已存在,请选择其他用户名'}), 409
# 插入新学生信息
cursor.execute(
'INSERT INTO student (username, password, email, teacher_id) VALUES (%s, %s, %s, %s)',
(username, password, email, teacher_id)
)
mysql.connection.commit()
new_student_id = cursor.lastrowid
cursor.close()
return jsonify({
'status': 'success',
'message': '注册成功',
'user': {
'id': new_student_id,
'username': username
}
})
4. 模拟考试作文提交相关
实现了模拟考试作文提交保存功能,设计了test_record
数据库表用于存储作文相关信息。
CREATE TABLE `test_record` (
`record_id` int NOT NULL AUTO_INCREMENT,
`essay_topic` varchar(666) NOT NULL,
`essay_text` longtext NOT NULL,
`essay_rate` longtext,
`teacher_id` int DEFAULT NULL,
`student_id` int DEFAULT NULL,
`rate_time` datetime DEFAULT NULL,
PRIMARY KEY (`record_id`),
KEY `teacher_id` (`teacher_id`),
KEY `student_id` (`student_id`),
CONSTRAINT `test_record_ibfk_1` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`teacher_id`),
CONSTRAINT `test_record_ibfk_2` FOREIGN KEY (`student_id`) REFERENCES `student` (`student_id`)
);
5. 获取待批改作文后端接口
实现了教师端获取待批改作文的后端接口,根据教师 ID 查询test_record
表中未批改的作文信息。
# 教师端获取待批改作文
rater_bp = Blueprint('rater', __name__)
@rater_bp.route('/get-ungraded-essays', methods=['POST'])
def get_ungraded_essays():
try:
data = request.get_json()
teacher_id = data.get('teacherId')
if not teacher_id:
return jsonify({
'status': 'error',
'message': '缺少必要参数: teacher_id'
}), 400
cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
# 查询 test_record 表中 teacher_id 等于前端发送的 teacher_id 且 essay_rate 为 null 的数据
# 同时根据 student_id 从 student 表中获取 username
query = """
SELECT tr.record_id, tr.essay_topic, tr.essay_text, tr.student_id, s.username
FROM test_record tr
JOIN student s ON tr.student_id = s.student_id
WHERE tr.teacher_id = %s AND tr.essay_rate IS NULL
"""
cursor.execute(query, (teacher_id,))
ungraded_essays = cursor.fetchall()
cursor.close()
return jsonify({
'status': 'success',
'message': '获取待批改作文信息成功',
'ungraded_essays': ungraded_essays
})
6. 保存批改结果后端接口
实现了保存教师批改结果到test_record
表的后端接口。
# 保存批改
@rater_bp.route('/save-result', methods=['POST'])
def save_result():
try:
data = request.get_json()
record_id = data.get('recordId')
essay_rate = data.get('essay_rate')
if not record_id or not essay_rate:
return jsonify({"error": "缺少必要参数"}), 400
# 获取当前时间
current_time = datetime.now()
# 连接数据库并获取游标
cursor = mysql.connection.cursor(MySQLdb.cursors.DictCursor)
# 构建更新语句,根据 record_id 更新 essay_rate 和 rate_time
update_query = "UPDATE test_record SET essay_rate = %s, rate_time = %s WHERE record_id = %s"
cursor.execute(update_query, (essay_rate, current_time, record_id))
# 提交事务
mysql.connection.commit()
# 关闭游标
cursor.close()
return jsonify({
"status": "success",
"message": "结果保存成功"
}), 200
三、工作总结
(一)功能开发与设计
- 学生端
- 完成账号注册绑定教师功能,设计
student
表建立学生与教师关联,实现学生注册接口。 - 实现模拟考试作文提交保存功能,设计
test_record
表存储作文信息。
- 完成账号注册绑定教师功能,设计
- 教师端
-
页面设计
-
待批改作文列表页面:完成设计,展示待批改作文基本信息并提供批改按钮。
-
批改作文页面:完成设计,展示作文详细信息,提供批改区域及多种批改辅助功能。
-
后端接口
- 开发获取待批改作文接口,根据教师 ID 查询未批改作文信息。
- 实现保存批改结果接口,将批改内容和时间更新到数据库。
-
(二)前后端整合
完成了前后端的整合工作,前端能够成功调用后端的识别作文修辞、错别字与标点、语法错误和病句以及一键辅助批改接口,并将批改结果保存到数据库的test_record
表中。
四、运行截图
更多推荐
所有评论(0)