324 lines
17 KiB
SQL
324 lines
17 KiB
SQL
-- ============================================================
|
|
-- 学生课程管理系统 - MySQL 数据库建表脚本
|
|
-- 使用方法: mysql -u root -p < mysql_tables.sql
|
|
-- 注意: 此脚本必须与 models.py 中的模型定义完全一致
|
|
-- ============================================================
|
|
|
|
CREATE DATABASE IF NOT EXISTS student_course DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
USE student_course;
|
|
|
|
-- 1. 角色表
|
|
CREATE TABLE IF NOT EXISTS roles (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(50) NOT NULL UNIQUE COMMENT '角色名称',
|
|
description VARCHAR(200) COMMENT '角色描述',
|
|
permissions TEXT COMMENT '权限列表(JSON格式)',
|
|
remark TEXT COMMENT '备注',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
|
|
|
|
-- 2. 用户表(管理员、老师等)
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
username VARCHAR(50) NOT NULL UNIQUE COMMENT '登录用户名',
|
|
password VARCHAR(200) NOT NULL COMMENT '密码(哈希)',
|
|
real_name VARCHAR(50) NOT NULL COMMENT '真实姓名',
|
|
role_id INT NOT NULL COMMENT '角色ID',
|
|
phone VARCHAR(20) COMMENT '手机号',
|
|
email VARCHAR(100) COMMENT '邮箱',
|
|
status TINYINT DEFAULT 1 COMMENT '1-启用, 0-禁用',
|
|
remark TEXT COMMENT '备注',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (role_id) REFERENCES roles(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
|
|
|
|
-- 3. 老师表
|
|
CREATE TABLE IF NOT EXISTS teachers (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT COMMENT '关联用户ID',
|
|
name VARCHAR(50) NOT NULL COMMENT '老师姓名',
|
|
phone VARCHAR(20) COMMENT '联系电话',
|
|
specialty VARCHAR(200) COMMENT '擅长科目',
|
|
status TINYINT DEFAULT 1 COMMENT '1-在职, 0-离职',
|
|
remark TEXT COMMENT '备注',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='老师表';
|
|
|
|
-- 4. 学员表
|
|
CREATE TABLE IF NOT EXISTS students (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(50) NOT NULL COMMENT '学员姓名',
|
|
gender VARCHAR(10) COMMENT '性别',
|
|
phone VARCHAR(20) COMMENT '联系电话',
|
|
parent_phone VARCHAR(20) COMMENT '家长电话',
|
|
birthday DATE COMMENT '出生日期',
|
|
address VARCHAR(200) COMMENT '地址',
|
|
remark TEXT COMMENT '备注',
|
|
status TINYINT DEFAULT 1 COMMENT '1-在读, 0-停课/离校',
|
|
source VARCHAR(50) DEFAULT '新学员' COMMENT '来源: 新学员/老带新/团报',
|
|
referrer_id INT COMMENT '推荐人学员ID(老带新)',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学员表';
|
|
|
|
-- 5. 课程表
|
|
CREATE TABLE IF NOT EXISTS courses (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL COMMENT '课程名称',
|
|
level VARCHAR(50) COMMENT '课程阶段/等级',
|
|
description TEXT COMMENT '课程描述',
|
|
price_per_hour DECIMAL(10,2) NOT NULL DEFAULT 0 COMMENT '每课时单价',
|
|
total_hours INT DEFAULT 0 COMMENT '总课时数',
|
|
material_fee DECIMAL(10,2) DEFAULT 0 COMMENT '材料费',
|
|
type VARCHAR(50) DEFAULT '一对一' COMMENT '课程类型: 一对一/小班/大班',
|
|
remark TEXT COMMENT '备注',
|
|
status TINYINT DEFAULT 1 COMMENT '1-启用, 0-停用',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程表';
|
|
|
|
-- 6. 班级表
|
|
CREATE TABLE IF NOT EXISTS classes (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL COMMENT '班级名称',
|
|
course_id INT NOT NULL COMMENT '课程ID',
|
|
teacher_id INT NOT NULL COMMENT '授课老师ID',
|
|
start_date DATE COMMENT '开班日期',
|
|
end_date DATE COMMENT '结课日期',
|
|
schedule VARCHAR(200) COMMENT '上课时间安排',
|
|
max_students INT DEFAULT 20 COMMENT '最大学员数',
|
|
current_students INT DEFAULT 0 COMMENT '当前学员数',
|
|
status TINYINT DEFAULT 1 COMMENT '1-进行中, 2-已结束, 0-未开始',
|
|
remark TEXT COMMENT '备注',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (course_id) REFERENCES courses(id),
|
|
FOREIGN KEY (teacher_id) REFERENCES teachers(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班级表';
|
|
|
|
-- 7. 班级学员关联表
|
|
CREATE TABLE IF NOT EXISTS class_students (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
class_id INT NOT NULL COMMENT '班级ID',
|
|
student_id INT NOT NULL COMMENT '学员ID',
|
|
join_date DATE NOT NULL COMMENT '入班日期',
|
|
status TINYINT DEFAULT 1 COMMENT '1-在读, 2-已转出, 3-已毕业',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (class_id) REFERENCES classes(id),
|
|
FOREIGN KEY (student_id) REFERENCES students(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班级学员关联表';
|
|
|
|
-- 8. 学员课时账户表
|
|
CREATE TABLE IF NOT EXISTS student_accounts (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
student_id INT NOT NULL COMMENT '学员ID',
|
|
course_id INT NOT NULL COMMENT '课程ID',
|
|
normal_hours DECIMAL(10,2) DEFAULT 0 COMMENT '正课剩余课时',
|
|
gifted_hours DECIMAL(10,2) DEFAULT 0 COMMENT '赠课剩余课时',
|
|
consumed_normal DECIMAL(10,2) DEFAULT 0 COMMENT '已消正课课时',
|
|
consumed_gifted DECIMAL(10,2) DEFAULT 0 COMMENT '已消赠课课时',
|
|
normal_validity VARCHAR(20) DEFAULT 'permanent' COMMENT '正课有效期: permanent/permanent',
|
|
normal_expiry_date DATE COMMENT '正课到期日期(NULL=永久)',
|
|
gifted_validity VARCHAR(20) DEFAULT 'permanent' COMMENT '赠课有效期: permanent/permanent',
|
|
gifted_expiry_date DATE COMMENT '赠课到期日期(NULL=永久)',
|
|
is_stopped TINYINT DEFAULT 0 COMMENT '是否停课保号: 0-否, 1-是',
|
|
stop_end_date DATE COMMENT '停课结束日期',
|
|
cumulative_amount DECIMAL(10,2) DEFAULT 0 COMMENT '累计充值金额(用于优惠触发)',
|
|
cumulative_start_date DATE COMMENT '累计周期起点日期',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (student_id) REFERENCES students(id),
|
|
FOREIGN KEY (course_id) REFERENCES courses(id),
|
|
UNIQUE KEY uk_student_course (student_id, course_id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学员课时账户表';
|
|
|
|
-- 9. 充值优惠活动表
|
|
CREATE TABLE IF NOT EXISTS recharge_activities (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(100) NOT NULL COMMENT '活动名称',
|
|
trigger_amount DECIMAL(10,2) NOT NULL COMMENT '优惠触发金额',
|
|
gifted_hours DECIMAL(10,2) DEFAULT 0 COMMENT '基础赠送课时',
|
|
gift_type VARCHAR(50) DEFAULT '课时' COMMENT '优惠赠送类型',
|
|
is_cumulative TINYINT DEFAULT 0 COMMENT '是否支持累计充值: 0-否, 1-是',
|
|
cumulative_window INT DEFAULT 0 COMMENT '累计时间窗口(天),0=不限制',
|
|
cumulative_clear TINYINT DEFAULT 0 COMMENT '超出时间窗口是否清零: 0-不清零, 1-清零',
|
|
allow_multi_trigger TINYINT DEFAULT 0 COMMENT '是否允许多次触发: 0-否, 1-是',
|
|
is_time_limited TINYINT DEFAULT 0 COMMENT '是否限制活动有效期: 0-否, 1-是',
|
|
start_date DATE COMMENT '活动开始日期',
|
|
end_date DATE COMMENT '活动结束日期',
|
|
target_audience VARCHAR(50) DEFAULT 'all' COMMENT '参与人群: all/new/old',
|
|
can_stack TINYINT DEFAULT 1 COMMENT '是否可与其他优惠叠加: 0-否, 1-是',
|
|
gift_cap DECIMAL(10,2) DEFAULT 0 COMMENT '赠送权益封顶,0=不限制',
|
|
group_discount TINYINT DEFAULT 0 COMMENT '是否有团报优惠: 0-否, 1-是',
|
|
group_min_people INT DEFAULT 0 COMMENT '团报最低人数',
|
|
group_extra_hours DECIMAL(10,2) DEFAULT 0 COMMENT '团报额外赠课',
|
|
referral_reward TINYINT DEFAULT 0 COMMENT '是否有老带新奖励: 0-否, 1-是',
|
|
referral_reward_hours DECIMAL(10,2) DEFAULT 0 COMMENT '老带新奖励课时',
|
|
reward_timing VARCHAR(50) DEFAULT 'immediate' COMMENT '奖励到账时效: immediate/manual',
|
|
status TINYINT DEFAULT 1 COMMENT '1-启用, 0-停用',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充值优惠活动表';
|
|
|
|
-- 10. 充值记录表
|
|
CREATE TABLE IF NOT EXISTS recharge_records (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
student_id INT NOT NULL COMMENT '学员ID',
|
|
course_id INT NOT NULL COMMENT '课程ID',
|
|
activity_id INT COMMENT '关联优惠活动ID',
|
|
amount DECIMAL(10,2) NOT NULL COMMENT '充值金额',
|
|
normal_hours DECIMAL(10,2) NOT NULL COMMENT '充值正课课时',
|
|
gifted_hours DECIMAL(10,2) DEFAULT 0 COMMENT '赠送课时',
|
|
payment_method VARCHAR(50) COMMENT '支付方式',
|
|
operator_id INT NOT NULL COMMENT '操作人ID',
|
|
remark TEXT COMMENT '备注',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (student_id) REFERENCES students(id),
|
|
FOREIGN KEY (course_id) REFERENCES courses(id),
|
|
FOREIGN KEY (activity_id) REFERENCES recharge_activities(id),
|
|
FOREIGN KEY (operator_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充值记录表';
|
|
|
|
-- 11. 消课记录表
|
|
CREATE TABLE IF NOT EXISTS consumption_records (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
student_id INT NOT NULL COMMENT '学员ID',
|
|
class_id INT COMMENT '班级ID',
|
|
course_id INT NOT NULL COMMENT '课程ID',
|
|
hours_consumed DECIMAL(10,2) NOT NULL COMMENT '消耗课时总数',
|
|
consume_type VARCHAR(20) NOT NULL COMMENT '消耗类型: normal/gifted/mixed',
|
|
normal_consumed DECIMAL(10,2) DEFAULT 0 COMMENT '消耗正课课时',
|
|
gifted_consumed DECIMAL(10,2) DEFAULT 0 COMMENT '消耗赠课课时',
|
|
operator_id INT NOT NULL COMMENT '操作人ID',
|
|
consume_date DATE NOT NULL COMMENT '上课日期',
|
|
is_makeup TINYINT DEFAULT 0 COMMENT '是否补录: 0-否, 1-是',
|
|
is_trial TINYINT DEFAULT 0 COMMENT '是否试听(不扣课): 0-否, 1-是',
|
|
remark TEXT COMMENT '备注',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (student_id) REFERENCES students(id),
|
|
FOREIGN KEY (class_id) REFERENCES classes(id),
|
|
FOREIGN KEY (course_id) REFERENCES courses(id),
|
|
FOREIGN KEY (operator_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消课记录表';
|
|
|
|
-- 12. 退费记录表
|
|
CREATE TABLE IF NOT EXISTS refund_records (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
student_id INT NOT NULL COMMENT '学员ID',
|
|
course_id INT NOT NULL COMMENT '课程ID',
|
|
refund_amount DECIMAL(10,2) NOT NULL COMMENT '退费金额',
|
|
remaining_normal_hours DECIMAL(10,2) COMMENT '剩余正课课时',
|
|
remaining_gifted_hours DECIMAL(10,2) COMMENT '剩余赠课课时',
|
|
deduct_gifted_hours DECIMAL(10,2) DEFAULT 0 COMMENT '扣回赠课课时',
|
|
consumed_hours_value DECIMAL(10,2) DEFAULT 0 COMMENT '已消课时按原价核算金额',
|
|
material_fee_per_quarter DECIMAL(10,2) DEFAULT 250 COMMENT '每季度材料费',
|
|
quarters INT DEFAULT 0 COMMENT '学习季度数',
|
|
total_deduct DECIMAL(10,2) DEFAULT 0 COMMENT '总扣除金额',
|
|
reason TEXT COMMENT '退费原因',
|
|
operator_id INT NOT NULL COMMENT '操作人ID',
|
|
status TINYINT DEFAULT 1 COMMENT '1-已退, 0-待审核',
|
|
remark TEXT COMMENT '备注',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (student_id) REFERENCES students(id),
|
|
FOREIGN KEY (course_id) REFERENCES courses(id),
|
|
FOREIGN KEY (operator_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='退费记录表';
|
|
|
|
-- 13. 转课记录表
|
|
CREATE TABLE IF NOT EXISTS transfer_records (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
from_student_id INT NOT NULL COMMENT '转出学员ID',
|
|
to_student_id INT COMMENT '转入学员ID(转赠时)',
|
|
from_course_id INT NOT NULL COMMENT '转出课程ID',
|
|
to_course_id INT COMMENT '转入课程ID(转课时)',
|
|
transfer_type VARCHAR(20) NOT NULL COMMENT '类型: transfer-转课, gift-转赠',
|
|
transfer_hours DECIMAL(10,2) NOT NULL COMMENT '转出课时数',
|
|
transfer_amount DECIMAL(10,2) COMMENT '转出金额(按剩余金额换算)',
|
|
operator_id INT NOT NULL COMMENT '操作人ID',
|
|
remark TEXT COMMENT '备注',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (from_student_id) REFERENCES students(id),
|
|
FOREIGN KEY (to_student_id) REFERENCES students(id),
|
|
FOREIGN KEY (from_course_id) REFERENCES courses(id),
|
|
FOREIGN KEY (to_course_id) REFERENCES courses(id),
|
|
FOREIGN KEY (operator_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='转课记录表';
|
|
|
|
-- 14. 停课记录表
|
|
CREATE TABLE IF NOT EXISTS stop_records (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
student_id INT NOT NULL COMMENT '学员ID',
|
|
course_id INT NOT NULL COMMENT '课程ID',
|
|
start_date DATE NOT NULL COMMENT '停课开始日期',
|
|
end_date DATE NOT NULL COMMENT '停课结束日期',
|
|
reason TEXT COMMENT '停课原因',
|
|
operator_id INT NOT NULL COMMENT '操作人ID',
|
|
status TINYINT DEFAULT 1 COMMENT '1-停课中, 2-已复课, 0-已取消',
|
|
remark TEXT COMMENT '备注',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (student_id) REFERENCES students(id),
|
|
FOREIGN KEY (course_id) REFERENCES courses(id),
|
|
FOREIGN KEY (operator_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='停课记录表';
|
|
|
|
-- 15. 考勤记录表
|
|
CREATE TABLE IF NOT EXISTS attendance_records (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
student_id INT NOT NULL COMMENT '学员ID',
|
|
class_id INT NOT NULL COMMENT '班级ID',
|
|
date DATE NOT NULL COMMENT '考勤日期',
|
|
status VARCHAR(20) NOT NULL COMMENT '出勤状态: present/absent/leave',
|
|
remark TEXT COMMENT '备注',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (student_id) REFERENCES students(id),
|
|
FOREIGN KEY (class_id) REFERENCES classes(id),
|
|
UNIQUE KEY uk_attendance (student_id, class_id, date)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考勤记录表';
|
|
|
|
-- 16. 操作日志表
|
|
CREATE TABLE IF NOT EXISTS operation_logs (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
user_id INT NOT NULL COMMENT '操作用户ID',
|
|
operation_type VARCHAR(50) NOT NULL COMMENT '操作类型',
|
|
operation_detail TEXT COMMENT '操作详情',
|
|
ip_address VARCHAR(50) COMMENT 'IP地址',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';
|
|
|
|
-- 17. 课程安排表
|
|
CREATE TABLE IF NOT EXISTS schedules (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
class_id INT NOT NULL COMMENT '班级ID',
|
|
date DATE NOT NULL COMMENT '上课日期',
|
|
start_time TIME NOT NULL COMMENT '开始时间',
|
|
end_time TIME NOT NULL COMMENT '结束时间',
|
|
teacher_id INT NOT NULL COMMENT '授课老师ID',
|
|
topic VARCHAR(200) COMMENT '课程主题',
|
|
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (class_id) REFERENCES classes(id),
|
|
FOREIGN KEY (teacher_id) REFERENCES teachers(id)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程安排表';
|
|
|
|
-- ============================================================
|
|
-- 初始化数据
|
|
-- ============================================================
|
|
|
|
-- 默认角色
|
|
INSERT INTO roles (name, description, permissions) VALUES
|
|
('超级管理员', '拥有所有权限', 'all'),
|
|
('校区管理员', '管理本校区的所有业务', 'student,course,class,recharge,consumption,refund,transfer,statistics'),
|
|
('财务', '管理充值、退费等财务相关业务', 'recharge,refund,statistics'),
|
|
('授课老师', '管理消课、考勤等教学相关业务', 'consumption,attendance,class');
|
|
|
|
-- 默认管理员账号 (密码: admin123)
|
|
-- 注意: 此哈希值由 werkzeug.security.generate_password_hash('admin123') 生成
|
|
-- 如果登录失败,请删除 users 表中 admin 记录后重启应用,让程序自动重建
|
|
INSERT INTO users (username, password, real_name, role_id, phone, status) VALUES
|
|
('admin', 'scrypt:32768:8:1$Mlf6DtqLw5isLOHE$8e59ad3d57ed6379aba2304122a139c15aa06e086631bdd886ee8fe83db640ed41adb7f847be1574f86e9676939cc38826100f6c22058f552166be8cd59976f0', '系统管理员', 1, '13800000000', 1);
|
|
|
|
-- 默认课程
|
|
INSERT INTO courses (name, level, description, price_per_hour, total_hours, material_fee, type, status) VALUES
|
|
('美术基础班', '初级', '美术基础课程,适合零基础学员', 100.00, 40, 250.00, '小班', 1),
|
|
('美术进阶班', '中级', '美术进阶课程,适合有基础学员', 120.00, 40, 250.00, '小班', 1),
|
|
('美术高级班', '高级', '美术高级课程,适合进阶提升', 150.00, 40, 250.00, '一对一', 1);
|