基于Python实现的选课系统
1.1从ER图到表结构
实体集
- 课程信息 course (course_id, title, credits, dept_name)
- 开课信息 section (course_id, section_id, start, end, classroom_no, limit, day, lesson)
- 账户信息 account (ID, password, role)
- 学生信息 student(student_id,student_name, student_major, student_dept_name, student_total_credit)
- 教师信息 instructor (instructor_id, instructor_name, instructor_class, dept_name)
- 考试信息 exam (course_id, section_id, exam_classroom_no, exam_day, type, start_time, end_time, open_note_flag)
- 教室信息 classroom (classroom_no,capacity)
关系集
- 教师 & 开课 :教授 teaches (instructor_id, course_id, section_id)
- 学生 & 开课 :选课 takes (course_id, section_id, student_id, grade)
- 学生 & 开课:申请 application (course_id, section_id, student_id, status, application_reason, if_drop)
1.2表结构分析
- course: 用于存储和管理课程信息的数据库表,主键是课程编号course_id。
- section: 用于存储和管理本学期实际上开设的课程信息,是一个弱实体集。开课涉及到上课时间,如星期五 3-4这样的时间。为了保证原子性,
系统拆分成了三部分:day表示是一周的第几天,start表示这门课的开始节次,end表示这门课的结束节次。lesson作为导出属性而存在。section
作为弱实体集,它的主键由course_id和section_id联合组成。本数据库表引用了两个外键,一个是course的主键,一个是classroom的主键。针对这两个外键,数据库库表都设置了级联删除以及级联更新。
- account: 用于存储管理账户信息的数据库表,含有用户名,密码和角色。主键是用户名ID。
- student: 用于存储和管理学生的相关信息。信息主要包括学号,姓名,专业,院系和总学分。主键是学号student_id。总学分的默认值是0。
- instructor: 用于存储和管理教师的相关信息。信息主要包括教师编号,教师姓名,所属院系和职称。主键是教师编号。
- exam: 用于存储和管理课程考核的相关信息。含有属性课程编号,开课编号,考试类型(论文或者考试)等。其中教室,考试的开始时间以及是否开卷是在考核类型为考试时才有涵义。考核作为一个弱实体集,它的主键由课程编号和开课编号联合组成,与开课一一对应。本表引用了三个外键,分别是表section的联合主键和表classroom的主键。删除和更新都是级联执行。
- classroom: 教室信息。含有教室的编号以及容量。主键是教室编号。
- teaches: 教师教授课程关系集对应的数据库表。主键是course_id,section_id和instructor_id。相关外键的删除和更新都是级联的。
- takes: 学生选课关系集对应的数据库表。主键是course_id,section_id和student_id。相关外键的删除和更新都是级联的。
- application: 学生选课申请对应的数据库表。主键是course_id,section_id和student_id。相关外键的删除和更新都是级联的。特别的含有属性if_drop用来标志学生是否申请成功了改课程之后又退掉了。相关外键的删除和更新都是级联的。
1.3函数依赖与范式分析
- 所有关系的属性的域都是原子的,不包含任何组合属性,所以上述关系模式都属于第一范式。
- 没有任何非主属性部分依赖于键,所以也符合第二范式。
- 没有任何非主属性传递依赖于键,所以符合第三范式。
- 没有任何属性传递依赖于键,所以符合BC范式。
综上,我们设计的关系模式属于BC范式。
2.1选课
选退课功能开放后,学生才可以进行选课。学生选课,数据库需要先检查该课程的选课人数是否已经达到选课上限,并且检查选择的课程是否与已选课程具有时空冲突(包括上课和考试的时空冲突)。如果没超过上限并且没有冲突,则该学生可以选上该门课程。
2.2退课
选退课功能开放后,学生才可以进行退课。学生退课,如果学生已经选择这门课程,直接去掉选课表中的一行数据。注意,如果用户是通过选课申请选上该门课程,需要标记选课申请记录的退课标志使得该生不能再申请该门课程。
2.3选课申请
选退课功能开放后,学生才可以填写课程申请。当选课人数达到上限时,学生才能进行选课申请。当教室容量不允许多的人上课时或者该学生已经申请成功过这门课程但是退掉了的时候,系统会直接决绝掉他的选课申请。
2.4分数导入
登分系统开放后,任课老师需要将学生的成绩导入系统中。在分数登录的界面中,系统提供了分数的样例文件。教师课进行下载并填入相应条目。对于每条课程成绩,系统会先检查成绩中学生是否选过这门课程。没有选择过这门课程,系统会给出提示并拒绝导入这门成绩,但错误之前的成绩都会成功导入。如果成绩重复导入以后导入的为准。
2.5课程申请处理
学生进行选课申请,任课老师可以选择同意或者拒绝。如果同意,则会在takes数据库表中加入记录,并更新申请记录。如果拒绝,则只会更新选课申请记录未已拒绝。
2.6学生导入
导入学生时,系统会先检查学生的编号是否在student表中已经存在,即是否导入已经存在的学生信息。如果编号不存在,并且其他信息完整,则支持本次导入。
2.7老师导入
导入老师时,系统依旧只是检查相应的编号时否在instructor表中已经存在。如果不存在且其他信息填写完整,则可以导入。
2.8课程信息导入
导入课程时,统依旧只是检查相应的编号时否在course表中已经存在。如果不存在且其他信息填写完整规范,则可以导入。
2.9开课信息导入
开课信息的导入需要检查的信息繁多。首先需要在section表中检查该开课是否已经存在,同时需要检查course是否存在和老师是否存在。如果课程没有被重复开设,并且相应的course和老师都存在,则检查课程在老师和教室上是否存在时空冲突。如果有冲突,禁止导入并给出提示。
2.10考试信息导入
考试信息的导入是建立在课程已经开始的情况下,如果课程还没由开设当然需要拒绝导入。除此以外,需要检查对于同一门开课是否已经导入过考试信息。重复导入不被允许,系统提供过修改的接口。此外,系统还要检查考试是否具有时空冲突。对于考核方式为论文的考核,我们认为不存在任何的冲突。而对于考试,就需要仔细检查。
Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。
3.1选课系统后端API说明
说明:所有调用的成功状态由返回的 HTTP 状态码表示, 代表调用成功,返回的内容为各 API 自己的返回值, 代表调用失败,返回以下格式的 JSON:
OR
以下为通用message:
对于 GET 请求,参数放在 URL 中;对于 POST 请求,参数 放在 body 中。
所有 API 的参数若非特殊说明均为必选参数。
POST /selectCourse/login/
4.1参数列表
4.2返回值
4.3message
/selectCourse/logout/
5.1参数列表
不需要参数
5.2返回值
无返回值
5.3message
POST /selectCourse/select/
6.1参数列表
6.2返回值
无
6.3message
POST /selectCourse/drop/
7.1参数列表
7.2返回值
无
7.3message
POST /selectCourse/checkCourseTable
8.1参数列表
8.2返回值
8.3message
POST /selectCourse/checkAllCourses
9.1参数列表
9.2返回值
9.3message
无
POST /selectCourse/checkPersonalInfo
10.1参数列表
10.2返回值
对于学生
对于教师
10.3message
GET /selectCourse/search
11.1参数列表
11.2返回值
11.3message
POST /selectCourse/submitApplication
12.1参数列表
12.2返回值
无
12.3message
| can"t apply course which is already applied | 不能申请已申请课程|
| can"t apply selected course| 不能申请已选课程 |
| can"t apply dropped course| 不能申请已退的申请通过课程 |
| apply successfully| 提交成功 |
| can"t apply course with vacancy| 不能申请有余量课程 |
| exceed the classroom capacity| 不能申请人数已超过教室容量的课程 |
POST /selectCourse/handleApplication
13.1参数列表
13.2返回值
无
13.3message
学生和老师都可查看其对应的选课申请
POST /selectCourse/handleApplication
14.1参数列表
14.2返回值
14.3message
POST /selectCourse/checkTaughtCourses/
15.1参数列表
15.2返回值
15.3message
POST /selectCourse/checkCourseNameList/
16.1参数列表
16.2返回值
16.3message
POST /selectCourse/checkExamTable/
17.1参数列表
17.2返回值
17.3message
下载模版文件(老师)
GET /selectCourse/downloadFile
参数列表
增 Insert
手动导入课程信息
POST /selectCourse/insertCourse/
参数列表
返回值
None
message
手动导入开课信息
POST /selectCourse/insertSection/
参数列表
返回值
None
message
手动导入学生信息
POST /selectCourse/insertStudent/
参数列表
返回值
None
message
手动导入教师信息
POST /selectCourse/insertInstructor/
参数列表
返回值
None
message
手动导入教室信息
POST /selectCourse/insertClassroom/
参数列表
返回值
None
message
手动导入账户信息
POST /selectCourse/insertAccount/
参数列表
返回值
None
message
手动导入考试信息
POST /selectCourse/insertExam/
参数列表
返回值
None
message
删
删除课程信息
POST /selectCourse/deleteCourse/
参数列表
返回值
None
message
删除开课信息
POST /selectCourse/deleteSection/
参数列表
返回值
None
message
删除学生信息
POST /selectCourse/deleteStudent/
参数列表
返回值
None
message
删除教师信息
POST /selectCourse/deleteInstructor/
参数列表
返回值
None
message
删除教室信息
POST /selectCourse/deleteClassroom/
参数列表
返回值
None
message
删除账户信息
POST /selectCourse/deleteAccount/
参数列表
返回值
None
message
删除考试信息
POST /selectCourse/deleteExam/
参数列表
返回值
None
message
改
修改课程信息
POST /selectCourse/updateCourse/
参数列表
返回值
None
message
修改开课信息
POST /selectCourse/updateSection/
参数列表
返回值
None
message
修改学生信息
POST /selectCourse/updateStudent/
参数列表
返回值
None
message
修改教师信息
POST /selectCourse/updateInstructor/
参数列表
返回值
None
message
修改教室信息
POST /selectCourse/updateClassroom/
参数列表
返回值
None
message
修改账户信息
POST /selectCourse/updateAccount/
参数列表
返回值
None
message
修改考试信息
POST /selectCourse/updateExam/
参数列表
返回值
None
message
查
查看课程信息
POST /selectCourse/checkCourses/
参数列表
返回值
message
无
查看开课信息
POST /selectCourse/checkSections/
参数列表
返回值
message
无
查看学生信息
POST /selectCourse/checkStudents/
参数列表
返回值
message
无
查看教师信息
POST /selectCourse/checkInstructors/
参数列表
返回值
message
无
查看教室信息
POST /selectCourse/checkClassrooms/
参数列表
返回值
message
无
查看账户信息
POST /selectCourse/checkAccounts/
参数列表
返回值
message
无
查看考试信息
POST /selectCourse/checkExams/