(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括:
1.学生端整体界面布局
2.模拟考场与部分个人画像流程的串联
3.整体学生端逻辑
一、学生端
在主界面可以选择自己的用户角色
选择学生则进入学生登录界面
整体的布局如图所示:
二、模拟考场的整体逻辑
在模拟考场界面,点击生成题目后,系统会调用DeepSeek API来获取符合要求的三个题目并返回给前端,前端可以选择其中一个进行模拟。如下图所示:
在作答界面则可以填写作文标题,填写作文内容,选择提交后,前端会调用后端的save-record接口,该接口会保存文章。
@teacher_bp.route('/save-record', methods=['POST'])
def save_record():"""保存考试所写作文"""from main import mysqluser_model = UserModel(mysql)try:data = request.get_json()print(data)student_id = data.get('student_id')teacher_id = data.get('teacher_id')essay_topic = data.get('essay_topic')essay_text = data.get('essay_text')essay_title = data.get('essay_title')if not all([student_id, essay_text, essay_topic, teacher_id]):return jsonify({"error": "缺少必要参数"}), 400# 使用create_essay方法创建作文记录essay_id = user_model.create_essay(student_id=student_id,content=essay_text,topic=essay_topic, # 使用topic字段存储题目title=essay_title # 标题暂时为空,可以后续添加)# 保存test_record时加入essay_idrecord = user_model.save_test_record(student_id=student_id,teacher_id=teacher_id,essay_id=essay_id # 添加essay_id参数)return jsonify({"message": "作文保存成功", "essay_id": essay_id,"record_id": record}), 200except Exception as e:logger.error(f"Error in save_record: {str(e)}")return jsonify({"error": "服务器内部错误"}), 500
在该方法中会先创建作文记录插入到essay表,之后创建个人记录保存到test_record表,该表以essay_id为外键。
在作文记录查询界面,即可查看到自己刚才已经提交的作文
点击立即批改则会调用后端update_profile接口
@profile_bp.route('/update-profile', methods=['POST'])
@login_required # 确保此路由需要登录
def update_profile():"""接收作文,进行全面分析并更新学生各项数据"""data = request.get_json()print(data)if not data:return jsonify({"error": "Request body must be JSON"}), 400# --- Start Debug ---current_app.logger.info(f"收到的请求数据: {data}")current_app.logger.info(f"当前登录的用户信息: student_id={getattr(current_user, 'id', 'N/A')}")# --- End Debug ---student_id = data.get('student_id')essay_id =data.get('essay_id')title = data.get('essay_title')topic = data.get('essay_topic')content = data.get('essay_content')record_id=data.get('record_id')# 增加对当前用户身份的验证if not current_user.id or current_user.id != student_id:return jsonify({"error": "提交的学生ID与当前登录用户不匹配"}), 403if not all([student_id, content]):return jsonify({"error": "缺少必需字段:student_id 和 essay_content"}), 400from main import mysqltry:user_model = UserModel(mysql) # Needs mysql and UserModel# 1. 创建作文记录essay_id = essay_idprint("")# 2. 分析作文 (使用增强版分析)analysis_result = analyze_essay_comprehensive(content, student_id)# 3. 更新学生画像 (基础得分)user_model.update_writing_profile(student_id, essay_id, analysis_result['scores'])# 4. 保存写作风格特征if 'style_features' in analysis_result:user_model.save_writing_style_features(essay_id, analysis_result['style_features'])# 5. 保存错误模式if 'error_patterns' in analysis_result:user_model.save_error_patterns(student_id, essay_id, analysis_result['error_patterns'])# 6. 分析进步情况progress_result = user_model.analyze_and_record_progress(student_id, essay_id)# 7. 更新学习路径建议for dimension, suggestion in analysis_result.get('suggestions', {}).items():# 根据评分决定优先级score = analysis_result['scores'].get(dimension, 0)current_priority = LearningPathPriority.LOW # 默认低优先级if score < 70:current_priority = LearningPathPriority.HIGH # 高优先级elif score < 85:current_priority = LearningPathPriority.MEDIUM # 中优先级user_model.create_learning_path(student_id, dimension, suggestion,priority=current_priority, # 使用计算出的优先级created_by='AI',essay_id=essay_id)# 8. 如果包括了历史数据分析,更新学习风格偏好if 'continuous_analysis' in analysis_result:learning_preferences = {'preferred_topics': analysis_result.get('continuous_analysis', {}).get('preferred_topics', ''),'strength_areas': analysis_result.get('continuous_analysis', {}).get('strength_areas', ''),'improvement_areas': analysis_result.get('continuous_analysis', {}).get('improvement_areas', ''),'learning_patterns': analysis_result.get('continuous_analysis', {}).get('learning_patterns', ''),'response_to_feedback': analysis_result.get('continuous_analysis', {}).get('response_to_feedback', '')}user_model.update_learning_preferences(student_id, learning_preferences)success = user_model.save_essay_rate(record_id)return jsonify({"message": "Profile updated successfully","profile": analysis_result,"progress": progress_result})except Exception as e:current_app.logger.error(f"更新个人画像失败: {str(e)}")return jsonify({"error": str(e)}), 500
该接口进行学生文章多维度的评分与记录,批改完成后,学生可从个人画像界面查看批改结果。
如上图所示。
三、学生端逻辑
经小组再次讨论,确认学生端的整体逻辑。学生端主要有三种作文,一种是模拟考场作文,一种是智能训练作文,一种是老师发布的命题作文了,这三种作文首先都会存到essay表,老师发布的作文还会有一个发布表,同时为了能查出该作文是否已经批改,还加入了一个test_record表,这样整体逻辑就是学生可以使用ai批改自己的训练作文,能获得自己每次训练的个人画像,之后还能获得成长路线