-- 1. 首先创建数据库
DROP DATABASE IF EXISTS course_system;
CREATE DATABASE course_system
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE course_system;
-- 2. 创建用户表
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
PASSWORD VARCHAR(255) NOT NULL,
real_name VARCHAR(50) NOT NULL,
ROLE ENUM('student','teacher','admin') NOT NULL,
email VARCHAR(100),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 3. 创建课程表
CREATE TABLE courses (
course_id INT AUTO_INCREMENT PRIMARY KEY,
course_name VARCHAR(100) NOT NULL,
DESCRIPTION TEXT,
teacher_id INT NOT NULL,
category VARCHAR(50),
STATUS ENUM('draft','published') DEFAULT 'draft',
FOREIGN KEY (teacher_id) REFERENCES users(user_id)
);
-- 4. 创建章节与作业表(包含video_duration字段)
CREATE TABLE chapters (
chapter_id INT AUTO_INCREMENT PRIMARY KEY,
course_id INT NOT NULL,
chapter_title VARCHAR(100) NOT NULL,
TYPE ENUM('video','text','assignment') DEFAULT 'video',
content TEXT,
assignment_desc TEXT,
assignment_deadline DATETIME,
max_score INT DEFAULT 100,
sort_order INT DEFAULT 0,
video_duration INT DEFAULT 0,
FOREIGN KEY (course_id) REFERENCES courses(course_id),
CHECK (max_score > 0)
);
-- 5. 创建学习与提交记录表
CREATE TABLE study_records (
record_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
chapter_id INT NOT NULL,
study_time INT DEFAULT 0,
is_completed BOOLEAN DEFAULT FALSE,
submit_content TEXT,
submit_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
score DECIMAL(5,2),
COMMENT TEXT,
grade_time DATETIME,
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (chapter_id) REFERENCES chapters(chapter_id),
UNIQUE (user_id, chapter_id)
);
-- 6. 创建存储过程
DELIMITER //
-- 学生选课并初始化学习记录
CREATE PROCEDURE EnrollStudent(IN p_user_id INT, IN p_course_id INT)
BEGIN
DECLARE v_chapter_id INT;
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT chapter_id FROM chapters WHERE course_id = p_course_id;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO v_chapter_id;
IF done THEN
LEAVE read_loop;
END IF;
-- 使用REPLACE而不是INSERT IGNORE,确保记录存在
REPLACE INTO study_records (user_id, chapter_id, study_time, is_completed)
VALUES (p_user_id, v_chapter_id, 0, FALSE);
END LOOP;
CLOSE cur;
-- 返回插入的记录数
SELECT ROW_COUNT() AS records_affected;
END //
-- 提交作业
CREATE PROCEDURE SubmitAssignment(
IN p_user_id INT,
IN p_chapter_id INT,
IN p_content TEXT
)
BEGIN
UPDATE study_records
SET submit_content = p_content,
submit_time = NOW()
WHERE user_id = p_user_id AND chapter_id = p_chapter_id;
SELECT ROW_COUNT() AS records_updated;
END //
-- 批改作业
CREATE PROCEDURE GradeAssignment(
IN p_user_id INT,
IN p_chapter_id INT,
IN p_score DECIMAL(5,2),
IN p_comment VARCHAR(255)
)
BEGIN
UPDATE study_records
SET score = p_score,
COMMENT = p_comment,
grade_time = NOW()
WHERE user_id = p_user_id AND chapter_id = p_chapter_id;
SELECT ROW_COUNT() AS records_updated;
END //
DELIMITER ;
-- 7. 创建触发器
DELIMITER //
-- 更新学习记录时自动判断是否完成(视频学习)
CREATE TRIGGER tr_check_completion
BEFORE UPDATE ON study_records
FOR EACH ROW
BEGIN
DECLARE v_duration INT DEFAULT 0;
DECLARE v_type ENUM('video','text','assignment');
SELECT video_duration, TYPE INTO v_duration, v_type
FROM chapters
WHERE chapter_id = NEW.chapter_id;
IF v_type = 'video' AND v_duration > 0 AND NEW.study_time >= v_duration THEN
SET NEW.is_completed = TRUE;
END IF;
END //
DELIMITER ;
-- 8. 创建视图
-- 学生学习进度视图
CREATE VIEW student_progress AS
SELECT
u.real_name AS 学生姓名,
c.course_name AS 课程名称,
COUNT(sr.record_id) AS 已学章节数,
SUM(sr.study_time) AS 总学习时长,
AVG(sr.is_completed) AS 完成率
FROM users u
JOIN study_records sr ON u.user_id = sr.user_id
JOIN chapters ch ON sr.chapter_id = ch.chapter_id
JOIN courses c ON ch.course_id = c.course_id
WHERE u.role = 'student'
GROUP BY u.user_id, c.course_id;
-- 作业提交情况视图
CREATE VIEW assignment_submission_status AS
SELECT
ch.chapter_title AS 作业名称,
COUNT(sr.record_id) AS 提交人数,
AVG(sr.score) AS 平均分
FROM chapters ch
LEFT JOIN study_records sr ON ch.chapter_id = sr.chapter_id
WHERE ch.type = 'assignment'
GROUP BY ch.chapter_id;
-- 9. 插入测试数据
-- 插入用户
INSERT INTO users (username, PASSWORD, real_name, ROLE, email) VALUES
('stu1', '123456', '学生一', 'student', 'stu1@edu.com'),
('tea1', '123456', '教师一', 'teacher', 'tea1@edu.com');
-- 插入课程
INSERT INTO courses (course_name, DESCRIPTION, teacher_id, category, STATUS) VALUES
('Python入门', 'Python基础语法', 2, '编程', 'published');
-- 插入章节(包含video_duration)
INSERT INTO chapters (course_id, chapter_title, TYPE, content, sort_order, video_duration) VALUES
(1, '第一章:Hello World', 'video', 'https://example.com/py1.mp4', 1, 300),
(1, '第二章:变量与数据类型', 'text', 'Python中的变量...', 2, 0),
(1, '第一次作业', 'assignment', '完成3道基础编程题', 100, 3);
-- 10. 测试存储过程和触发器
-- 测试选课(先检查存储过程是否正常工作)
CALL EnrollStudent(1, 1);
-- 验证学习记录是否创建成功
SELECT '验证学习记录创建' AS test_step;
SELECT * FROM study_records WHERE user_id = 1;
-- 测试作业提交
CALL SubmitAssignment(1, 3, 'test answer');
-- 测试批改作业
CALL GradeAssignment(1, 3, 95, '很好!');
-- 更新学习时长,触发自动完成判断
UPDATE study_records SET study_time = 600 WHERE user_id = 1 AND chapter_id = 1;
-- 11. 验证结果
-- 查询学习记录,is_completed应为TRUE(因为600 > 300)
SELECT '验证触发器效果' AS test_step;
SELECT study_time, is_completed FROM study_records WHERE user_id = 1 AND chapter_id = 1;
-- 12. 查看视图数据
SELECT '查看学生进度视图' AS test_step;
SELECT * FROM student_progress;
SELECT '查看作业提交情况视图' AS test_step;
SELECT * FROM assignment_submission_status;
检查这段代码
最新发布