在线课程管理系统通常需要实现课程信息维护、用户管理、选课记录存储等基础功能,结合MySQL作为数据存储工具、Python作为后端开发语言,可以快速搭建出轻量可用的系统。本文将以Flask框架为例,讲解完整的开发流程。

一、数据库设计
首先需要设计MySQL的表结构,核心需要三张表:用户表、课程表、选课记录表,表结构如下:
| 表名 | 字段 | 类型 | 说明 |
|---|---|---|---|
| user | id | INT PRIMARY KEY AUTO_INCREMENT | 用户ID |
| username | VARCHAR(50) NOT NULL | 用户名 | |
| role | VARCHAR(10) DEFAULT 'student' | 角色,student或teacher | |
| course | id | INT PRIMARY KEY AUTO_INCREMENT | 课程ID |
| course_name | VARCHAR(100) NOT NULL | 课程名称 | |
| teacher_id | INT NOT NULL | 授课教师ID,关联user表id | |
| status | VARCHAR(10) DEFAULT 'open' | 课程状态,open或closed | |
| enrollment | id | INT PRIMARY KEY AUTO_INCREMENT | 选课记录ID |
| user_id | INT NOT NULL | 用户ID,关联user表id | |
| course_id | INT NOT NULL | 课程ID,关联course表id |
创建表的SQL语句如下:
-- 创建用户表
CREATE TABLE IF NOT EXISTS user (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
role VARCHAR(10) DEFAULT 'student'
);
-- 创建课程表
CREATE TABLE IF NOT EXISTS course (
id INT PRIMARY KEY AUTO_INCREMENT,
course_name VARCHAR(100) NOT NULL,
teacher_id INT NOT NULL,
status VARCHAR(10) DEFAULT 'open',
FOREIGN KEY (teacher_id) REFERENCES user(id)
);
-- 创建选课记录表
CREATE TABLE IF NOT EXISTS enrollment (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
course_id INT NOT NULL,
FOREIGN KEY (user_id) REFERENCES user(id),
FOREIGN KEY (course_id) REFERENCES course(id)
);
二、Python环境准备
需要安装两个核心依赖库,分别是Flask用于搭建Web服务,pymysql用于连接MySQL数据库,执行以下命令安装:
pip install flask pymysql
三、数据库连接封装
首先封装MySQL的连接和查询方法,避免重复编写连接代码:
import pymysql
# 数据库配置信息
DB_CONFIG = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'password': 'your_password',
'db': 'course_management',
'charset': 'utf8mb4'
}
def get_db_connection():
"""获取数据库连接"""
connection = pymysql.connect(**DB_CONFIG)
return connection
def execute_query(sql, params=None, fetch_one=False, fetch_all=False):
"""执行SQL查询,返回结果"""
connection = get_db_connection()
cursor = connection.cursor(pymysql.cursors.DictCursor)
try:
cursor.execute(sql, params)
if fetch_one:
result = cursor.fetchone()
elif fetch_all:
result = cursor.fetchall()
else:
connection.commit()
result = cursor.lastrowid
return result
except Exception as e:
connection.rollback()
raise e
finally:
cursor.close()
connection.close()
四、核心功能接口实现
1. 添加课程接口
教师角色可以添加新的课程,接口逻辑如下:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/course/add', methods=['POST'])
def add_course():
# 获取请求参数
data = request.json
teacher_id = data.get('teacher_id')
course_name = data.get('course_name')
# 校验参数
if not all([teacher_id, course_name]):
return jsonify({'code': 400, 'msg': '参数缺失'})
# 校验用户是否为教师
check_sql = "SELECT role FROM user WHERE id = %s"
user_role = execute_query(check_sql, (teacher_id,), fetch_one=True)
if not user_role or user_role['role'] != 'teacher':
return jsonify({'code': 403, 'msg': '无权限操作'})
# 插入课程数据
insert_sql = "INSERT INTO course (course_name, teacher_id) VALUES (%s, %s)"
course_id = execute_query(insert_sql, (course_name, teacher_id))
return jsonify({'code': 200, 'msg': '课程添加成功', 'course_id': course_id})
2. 学生选课接口
学生可以选择状态为开放中的课程,接口逻辑如下:
@app.route('/enrollment/add', methods=['POST'])
def add_enrollment():
data = request.json
user_id = data.get('user_id')
course_id = data.get('course_id')
if not all([user_id, course_id]):
return jsonify({'code': 400, 'msg': '参数缺失'})
# 校验用户是否为学生
check_user_sql = "SELECT role FROM user WHERE id = %s"
user_role = execute_query(check_user_sql, (user_id,), fetch_one=True)
if not user_role or user_role['role'] != 'student':
return jsonify({'code': 403, 'msg': '无权限操作'})
# 校验课程状态是否为开放
check_course_sql = "SELECT status FROM course WHERE id = %s"
course_status = execute_query(check_course_sql, (course_id,), fetch_one=True)
if not course_status or course_status['status'] != 'open':
return jsonify({'code': 400, 'msg': '课程未开放选课'})
# 校验是否已经选过该课程
check_enroll_sql = "SELECT id FROM enrollment WHERE user_id = %s AND course_id = %s"
exist_enroll = execute_query(check_enroll_sql, (user_id, course_id), fetch_one=True)
if exist_enroll:
return jsonify({'code': 400, 'msg': '已经选过该课程'})
# 插入选课记录
insert_sql = "INSERT INTO enrollment (user_id, course_id) VALUES (%s, %s)"
enroll_id = execute_query(insert_sql, (user_id, course_id))
return jsonify({'code': 200, 'msg': '选课成功', 'enroll_id': enroll_id})
3. 查询课程列表接口
支持按课程状态筛选课程列表:
@app.route('/course/list', methods=['GET'])
def get_course_list():
status = request.args.get('status', 'open')
# 查询课程及对应的教师名称
query_sql = """
SELECT c.id, c.course_name, c.status, u.username as teacher_name
FROM course c
LEFT JOIN user u ON c.teacher_id = u.id
WHERE c.status = %s
"""
course_list = execute_query(query_sql, (status,), fetch_all=True)
return jsonify({'code': 200, 'msg': '查询成功', 'data': course_list})
五、启动服务
最后添加启动代码,运行Flask服务:
if __name__ == '__main__':
app.run(host='127.0.0.1', port=5000, debug=True)
以上就是一个简单的在线课程管理系统的完整实现,开发者可以根据实际需求扩展更多功能,比如课程删除、选课记录查询、用户注册登录等模块,核心逻辑都是基于MySQL数据存储和Python接口开发的组合实现。