上门家教 app 课程管理系统模块设计

一、逻辑分析

上门家教 app 的课程管理系统是整个应用的核心模块之一,它需要负责课程的创建、编辑、删除、查询以及与学生和教师的关联等功能。以下从不同角度进行逻辑分析:

  1. 课程创建逻辑:教师或者管理员需要能够在系统中创建新的课程。这涉及到填写课程的基本信息,如课程名称、课程描述、课程价格、课程时长、上课时间安排等。同时,需要关联授课教师信息,如果是教师自己创建课程,默认关联自己;如果是管理员创建,需要选择合适的教师。
  2. 课程编辑逻辑:当课程信息发生变化时,如价格调整、时间变动等,需要能够对已有的课程信息进行修改。这要求系统能够准确定位到要编辑的课程记录,并更新相应的字段。
  3. 课程删除逻辑:对于不再提供的课程,需要能够从系统中删除。但在删除课程时,需要考虑与该课程相关的学生报名记录等关联信息的处理,确保数据的一致性和完整性。
  4. 课程查询逻辑:学生和教师都有查询课程的需求。学生可能根据课程名称、科目、上课时间等条件来查找适合自己的课程;教师可能需要查询自己所授课程的信息。系统需要提供灵活的查询功能,以满足不同用户的需求。
  5. 课程与学生、教师的关联逻辑:学生报名课程后,系统需要记录学生与课程的关联关系,以便后续的教学安排和进度跟踪。教师与课程的关联则决定了教师的授课任务,系统需要确保教师只能对自己关联的课程进行相关操作。

二、程序框架结构化输出

(一)数据库设计

  1. 课程表(course)
    • course_id (主键,自增长整数):唯一标识每一门课程。
    • course_name (字符串):课程名称。
    • course_description (文本):课程描述。
    • course_price (浮点数):课程价格。
    • course_duration (整数):课程时长(以分钟为单位)。
    • class_time (字符串):上课时间安排,例如 “周一、周三、周五 19:00 - 20:30”。
    • teacher_id (整数,外键,关联教师表 teacher 的 teacher_id):授课教师的 ID。
  2. 教师表(teacher)
    • teacher_id (主键,自增长整数):唯一标识每一位教师。
    • teacher_name (字符串):教师姓名。
    • teacher_contact (字符串):教师联系方式。
    • teacher_qualification (文本):教师资质信息。
  3. 学生表(student)
    • student_id (主键,自增长整数):唯一标识每一位学生。
    • student_name (字符串):学生姓名。
    • student_contact (字符串):学生联系方式。
  4. 报名记录表(enrollment)
    • enrollment_id (主键,自增长整数):唯一标识每一条报名记录。
    • student_id (整数,外键,关联学生表 student 的 student_id):报名学生的 ID。
    • course_id (整数,外键,关联课程表 course 的 course_id):报名课程的 ID。
    • enrollment_date (日期):报名日期。
(二)前端设计

  1. 课程创建页面
    • 包含输入框用于填写课程名称、课程描述、课程价格、课程时长等信息。
    • 一个时间选择器用于选择上课时间安排。
    • 一个下拉框用于选择授课教师(如果是管理员创建课程)。
    • 一个 “创建课程” 按钮,点击后将数据发送到后端进行课程创建。
  2. 课程编辑页面
    • 显示课程的现有信息,如课程名称、描述、价格等,并且这些信息可编辑。
    • 同样有时间选择器和教师选择下拉框(如果适用)。
    • 一个 “保存修改” 按钮,点击后将修改后的数据发送到后端进行更新。
  3. 课程删除确认页面
    • 显示要删除课程的名称和描述等信息,以确认要删除的课程。
    • 有 “确认删除” 和 “取消” 两个按钮,“确认删除” 按钮点击后将删除请求发送到后端。
  4. 课程查询页面
    • 提供多个查询条件输入框,如课程名称、科目(可通过课程描述模糊查询)、上课时间范围等。
    • 一个 “查询” 按钮,点击后根据输入条件向后端发送查询请求,并在页面上显示查询结果。查询结果以列表形式展示,包含课程名称、授课教师、价格、上课时间等关键信息。
(三)后端设计

  1. 课程创建接口(CreateCourse API)
    • 接收前端发送的课程信息,包括课程名称、描述、价格、时长、上课时间、教师 ID 等。
    • 对接收到的数据进行合法性校验,如课程名称不能为空、价格必须为正数等。
    • 将课程信息插入到课程表(course)中。
    • 返回创建结果(成功或失败)以及新创建课程的 ID(如果成功)。
  2. 课程编辑接口(EditCourse API)
    • 接收前端发送的课程 ID 以及修改后的课程信息。
    • 根据课程 ID 查询数据库中的课程记录。
    • 对修改后的数据进行合法性校验。
    • 更新数据库中相应课程的记录。
    • 返回编辑结果(成功或失败)。
  3. 课程删除接口(DeleteCourse API)
    • 接收前端发送的课程 ID。
    • 先查询报名记录表(enrollment)中是否有该课程的报名记录,如果有,提示不能删除,因为有学生已报名。
    • 如果没有相关报名记录,删除课程表(course)中对应的课程记录。
    • 返回删除结果(成功或失败)。
  4. 课程查询接口(QueryCourse API)
    • 接收前端发送的查询条件,如课程名称、科目关键词、上课时间范围等。
    • 根据查询条件构建 SQL 查询语句,从课程表(course)中查询符合条件的课程记录。
    • 可能需要关联教师表(teacher)获取授课教师的信息。
    • 将查询结果返回给前端。

三、详细解决方案

(一)代码示例(以 Python + Flask 为例)

  1. 数据库连接与模型定义

python

from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] ='sqlite:///tutoring.db'
db = SQLAlchemy(app)


class Course(db.Model):
    course_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    course_name = db.Column(db.String(100))
    course_description = db.Column(db.Text)
    course_price = db.Column(db.Float)
    course_duration = db.Column(db.Integer)
    class_time = db.Column(db.String(100))
    teacher_id = db.Column(db.Integer, db.ForeignKey('teacher.teacher_id'))


class Teacher(db.Model):
    teacher_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    teacher_name = db.Column(db.String(100))
    teacher_contact = db.Column(db.String(100))
    teacher_qualification = db.Column(db.Text)
    courses = db.relationship('Course', backref='teacher')


class Student(db.Model):
    student_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    student_name = db.Column(db.String(100))
    student_contact = db.Column(db.String(100))


class Enrollment(db.Model):
    enrollment_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    student_id = db.Column(db.Integer, db.ForeignKey('student.student_id'))
    course_id = db.Column(db.Integer, db.ForeignKey('course.course_id'))
    enrollment_date = db.Column(db.Date)

代码解释:这段代码使用 Flask-SQLAlchemy 库定义了数据库模型。首先配置了数据库连接,使用 SQLite 数据库。然后定义了 CourseTeacherStudent 和 Enrollment 四个模型类,分别对应数据库中的课程表、教师表、学生表和报名记录表。每个模型类中的属性对应数据库表中的字段,通过 db.Column 定义,同时通过 db.ForeignKey 建立了表之间的关联关系。

  1. 课程创建接口实现

python

from flask import request, jsonify
from datetime import datetime


@app.route('/create_course', methods=['POST'])
def create_course():
    data = request.get_json()
    course_name = data.get('course_name')
    course_description = data.get('course_description')
    course_price = data.get('course_price')
    course_duration = data.get('course_duration')
    class_time = data.get('class_time')
    teacher_id = data.get('teacher_id')

    if not course_name or not course_price or not course_duration or not class_time or not teacher_id:
        return jsonify({'message': 'Missing required fields'}), 400

    new_course = Course(
        course_name=course_name,
        course_description=course_description,
        course_price=course_price,
        course_duration=course_duration,
        class_time=class_time,
        teacher_id=teacher_id
    )

    try:
        db.session.add(new_course)
        db.session.commit()
        return jsonify({'message': 'Course created successfully', 'course_id': new_course.course_id}), 201
    except Exception as e:
        db.session.rollback()
        return jsonify({'message': f'Error creating course: {str(e)}'}), 500

代码解释:这个接口接收前端发送的 JSON 数据,从中提取课程相关信息。首先检查是否缺少必要的字段,如果缺少则返回错误信息。然后创建一个新的 Course 对象,并将其添加到数据库会话中。如果添加成功,提交会话并返回成功消息和新创建课程的 ID;如果出现异常,回滚会话并返回错误消息。

  1. 课程编辑接口实现

python

@app.route('/edit_course/<int:course_id>', methods=['PUT'])
def edit_course(course_id):
    data = request.get_json()
    course = Course.query.get(course_id)

    if not course:
        return jsonify({'message': 'Course not found'}), 404

    course_name = data.get('course_name')
    course_description = data.get('course_description')
    course_price = data.get('course_price')
    course_duration = data.get('course_duration')
    class_time = data.get('class_time')
    teacher_id = data.get('teacher_id')

    if course_name:
        course.course_name = course_name
    if course_description:
        course.course_description = course_description
    if course_price:
        course.course_price = course_price
    if course_duration:
        course.course_duration = course_duration
    if class_time:
        course.class_time = class_time
    if teacher_id:
        course.teacher_id = teacher_id

    try:
        db.session.commit()
        return jsonify({'message': 'Course edited successfully'}), 200
    except Exception as e:
        db.session.rollback()
        return jsonify({'message': f'Error editing course: {str(e)}'}), 500

代码解释:该接口接收课程 ID 和前端发送的 JSON 数据。首先根据课程 ID 查询数据库中的课程记录,如果未找到则返回错误消息。然后从 JSON 数据中提取要修改的信息,并更新课程对象的相应属性。最后尝试提交会话,如果成功返回成功消息,否则回滚会话并返回错误消息。

  1. 课程删除接口实现

python

@app.route('/delete_course/<int:course_id>', methods=['DELETE'])
def delete_course(course_id):
    course = Course.query.get(course_id)

    if not course:
        return jsonify({'message': 'Course not found'}), 404

    enrollment_count = Enrollment.query.filter_by(course_id=course_id).count()
    if enrollment_count > 0:
        return jsonify({'message': 'Cannot delete course as there are enrolled students'}), 400

    try:
        db.session.delete(course)
        db.session.commit()
        return jsonify({'message': 'Course deleted successfully'}), 200
    except Exception as e:
        db.session.rollback()
        return jsonify({'message': f'Error deleting course: {str(e)}'}), 500

代码解释:这个接口接收课程 ID,首先查询数据库中是否存在该课程。然后检查报名记录表中是否有该课程的报名记录,如果有则返回错误消息。如果没有报名记录,则尝试从数据库中删除该课程记录,提交会话成功则返回成功消息,否则回滚会话并返回错误消息。

  1. 课程查询接口实现

python

@app.route('/query_course', methods=['GET'])
def query_course():
    course_name = request.args.get('course_name')
    subject_keyword = request.args.get('subject_keyword')
    start_time = request.args.get('start_time')
    end_time = request.args.get('end_time')

    query = Course.query

    if course_name:
        query = query.filter(Course.course_name.contains(course_name))
    if subject_keyword:
        query = query.filter(Course.course_description.contains(subject_keyword))
    if start_time and end_time:
        query = query.filter(Course.class_time.between(start_time, end_time))
    elif start_time:
        query = query.filter(Course.class_time >= start_time)
    elif end_time:
        query = query.filter(Course.class_time <= end_time)

    courses = query.all()
    result = []
    for course in courses:
        teacher_name = course.teacher.teacher_name if course.teacher else '未分配教师'
        course_info = {
            'course_id': course.course_id,
            'course_name': course.course_name,
            'course_description': course.course_description,
            'course_price': course.course_price,
            'course_duration': course.course_duration,
            'class_time': course.class_time,
            'teacher_name': teacher_name
        }
        result.append(course_info)

    return jsonify(result), 200

代码解释:该接口接收前端发送的查询参数,如课程名称、科目关键词、上课时间范围等。通过构建 SQLAlchemy 查询对象,根据不同的查询条件进行过滤。查询到课程记录后,遍历这些记录并将课程信息和授课教师信息(如果有)整理成字典形式,最后将结果以 JSON 格式返回给前端。

(二)总结

本文围绕上门家教 app 的课程管理系统模块设计,从逻辑分析、程序框架结构化输出以及详细解决方案三个方面进行了阐述。在逻辑分析部分,对课程管理系统涉及的创建、编辑、删除和查询等核心逻辑进行了深入剖析,明确了各个功能的需求和关联。程序框架结构化输出环节,从数据库设计、前端设计和后端设计三个角度构建了系统的整体框架,数据库设计定义了数据存储结构,前端设计规划了用户界面交互,后端设计确定了接口实现和业务逻辑处理方式。详细解决方案部分提供了基于 Python + Flask 的代码示例,包括数据库连接与模型定义以及各个接口的具体实现,每个代码示例都配有详细的解释,便于理解和扩展。通过这些内容,能够较为完整地实现上门家教 app 课程管理系统的基本功能,为实际开发提供了有力的参考。在实际应用中,可以根据具体需求进一步优化和完善系统,如增加更多的查询条件、优化用户界面等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值