山东大学项目实训——基于DeepSeek的智能写作与训练平台(七)

一、本阶段工作概述

本阶段主要围绕智能写作平台教师端和学生端进行开发,完成了教师端前端框架搭建,实现教师账号登录、注册功能;同时推进学生端部分功能开发,并完成前后端整合,实现关键业务流程贯通。

二、具体工作内容

(一)前端部分

  1. MainPage.vue:主界面采用flex布局,整合左侧菜单组件LeftMenu与右侧动态组件,通过监听菜单点击事件切换页面显示。
  2. LeftMenu.vue:基于Element UI构建左侧菜单,包含“作文批改”“班级看板”等菜单项,点击触发menu-click事件控制页面切换与菜单激活状态,底部设置退出按钮。
  3. 其他前端页面
    • LoginPage.vue:实现登录功能,含用户名、密码输入框及登录注册按钮,支持错误提示。
    • RegisterPage.vue:完成注册功能,包含用户名、密码、邮箱输入框,提供注册结果提示与返回登录页按钮。
    • HomePage.vue:作文批改提交界面,有输入区、提交按钮与结果展示区,支持提交状态显示与结果保存。
    • ClassViewPage.vueTopicSetPage.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

三、工作总结

(一)功能开发与设计

  1. 学生端
    • 完成账号注册绑定教师功能,设计student表建立学生与教师关联,实现学生注册接口。
    • 实现模拟考试作文提交保存功能,设计test_record表存储作文信息。
  2. 教师端
    • 页面设计

    • 待批改作文列表页面:完成设计,展示待批改作文基本信息并提供批改按钮。

    • 批改作文页面:完成设计,展示作文详细信息,提供批改区域及多种批改辅助功能。

    • 后端接口

      • 开发获取待批改作文接口,根据教师 ID 查询未批改作文信息。
      • 实现保存批改结果接口,将批改内容和时间更新到数据库。

(二)前后端整合

完成了前后端的整合工作,前端能够成功调用后端的识别作文修辞、错别字与标点、语法错误和病句以及一键辅助批改接口,并将批改结果保存到数据库的test_record表中。

四、运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐