# 1 实验描述
## 1.1 实验目的
1. 熟悉开发实现一个数据库应用系统的基本流程。
2. 熟悉数据库操作以及应用与数据库交互过程的编写。
3. 掌握使用数据库作为工具完成访问控制的方法。
4. 掌握防止SQL注入的基本方法。
5. 掌握数据库并发、数据备份与恢复等功能的实现
## 1.2 实验内容
1.对系统进行需求分析,主要针对数据库进行需求分析,可以采用数据流图、数据字典等方式。
2.对系统和数据库进行设计,根据需求分析的有关内容,画出系统的E-R图,并据此设计对应的数据库表结构,然后对系统进行简单范式分析等。
3. 设计实现一个数据库应用系统,Web、App等皆可,数据库、语言、平台、框架等可自选,推荐使用Linux+Apache+PHP+Mysql。有如下要求:
1)用户登录,至少两种不同类型的用户权限访问控制;
2)用户口令哈希存储;
3)体现数据库完整性检查;
4)体现防SQL注入;
5)进行系统并发测试;
6)具有数据备份与恢复功能。
## 1.3 实验步骤
1.根据自己所选的数据库、语言、框架以及实验要求,结合前面所学内容进行需求分析和数据库与系统设计。
2.根据需求分析和数据库设计,使用前面所学知识在数据库中建立数据库、数据表等。
3.根据所选的语言、框架设计前端页面
## 1.4 实验环境
Linux+Apache+PHP+Mysql
Ubuntu16.04.01+Apache/2.4.18+ PHP 5.6.40+ mysql Ver 14.14 Distrib 5.7.33
# 2 需求分析
根据实验针对要求,选择教务系统作为实现目标
## 2.1 数据流图
在教务系统中,学生的主要需求为查看所有课程以及选课科目成绩,选择选修课以及在教务系统中打印成绩;教师的主要需求为查看自己所教课程,并登记选修这一门课程的学生的成绩。初步的数据流图如下
在教务系统中,学生的主要需求为查看所有课程以及科目成绩,选择想要选修的课程以及成绩单的打印;教师的主要需求为查看自己任教课程的情况,并对自己课程下学生的成绩进行登记。初步的数据流图如下:
除了实现上述设计的部分以外,还要对学生和老师的个人信息进行处理,因此添加如下部分
数据项:
| **数据项名** | **含义说明** | **别名** | **数据类型** | **长度** | **取值域** | **取值含义** | **与其他数据项的逻辑关系** |
| ------------ | ------------------------ | -------- | ------------ | -------- | ------------- | ------------------------------------------------------------ | -------------------------- |
| 学号 | 唯一标识每一个学生 | 学生编号 | 字符型 | 13 | 0e12~1e13- 1 | 前四位为入学年份,中间四位为学院编号,后五位为学院内的顺序编号 | 主键或外键 |
| 姓名 | / | / | 字符型 | 10 | 非空 | 一个人的姓名 | |
| 性别 | / | / | 字符型 | 2 | 男/女 | 一个人的性别 | |
| 年龄 | / | / | 整型 | 2 | 1~99 | 一个人的年龄 | |
| 院系 | 所在的院系 | / | 字符型 | 30 | 非空 | 所在的院系 | |
| 专业 | 所在的专业 | / | 字符型 | 30 | 非空 | 所在的专业 | |
| 课程号 | 唯一标识每一门课程 | 课程编号 | 字符型 | 11 | 0e10~1e11- 1 | 前四位为开课年份 | 主键或外键 |
| 课程名 | 课程的名称 | 课程名称 | 字符型 | 30 | 非空 | 课程的名称 | |
| 工号 | 唯一标识每一个教师 | 教师编号 | 字符型 | 8 | 0e7~1e8-1 | 教师的编号 | 主键或外键 |
| 成绩 | 学生在某一面课程中的成绩 | 成绩 | 整型 | 3 | 0-100 | 学生在课程下的成绩 | |
| 学分 | 每一门课有不同的学分 | / | 整型 | 1 | 0~9 | | |
数据结构:
| **数据结构名** | **含义说明** | **组成** |
| -------------- | -------------------------------------------------- | ------------------------------------------------ |
| 学生 | 是学籍管理的主体数据结构,定义了一个学生的个人信息 | 学号、姓名、性别、年龄、院系、专业、加权平均成绩 |
| 教师 | 定义了一个教师的个人信息 | 工号、姓名、性别、年龄、院系 |
| 课程 | 定义了一门课程的信息,包括执教老师工号 | 课程号、课程名、学分、工号 |
| 成绩单 | 定义了一门学生成绩的有关信息 | 课程号、课程名、成绩 |
| 选课单 | 定义了一门课程的选课有关信息 | 学号、性别、院系、专业、成绩 |
数据流:
| **数据流名** | **说明** | **数据流来源** | **数据流去向** | **组成** |
| ------------ | ------------------------ | ---------------- | ---------------- | ---------------------------- |
| 学生 | 学生的唯一标识 | 学生 | “学生选课”处理 | 学号 |
| 学生 | 学生的个人信息 | 学生表 | “学生选课”处理 | 学号 |
| 课程 | 课程的信息 | 课程表 | “学生选课”处理 | 课程号 |
| 选课信息 | 学生所选课程信息 | “学生选课” 处理 | 学生选课表 | 学号、课程号 |
| 成绩 | 学生所选课程成绩信息 | 教师 | “成绩登记”处理 | 学号、课程号、成绩 |
| 选课信息 | 学生所选课程信息 | 学生选课表 | “成绩登记”处理 | 学号、课程号 |
| 成绩 | 所选所选课程成绩信息 | “成绩登记” 处理 | 学生选课表 | 学号、课程号、成绩 |
| 学生 | 学生的唯一标识 | 学生 | “打印成绩单”处理 | 课程号、课程名 |
| 课程 | 课程的信息 | 课程表 | “打印成绩单”处理 | 课程号、课程名 |
| 成绩 | 学生的课程成绩信息 | “打印成绩单”处理 | 成绩单 | 课程号、学号、成绩 |
| 学生成绩信息 | 学生所有课程的成绩信