数据库设计任务
:
(1) 实现学生信息、课程信息、教师信息管理;
(2) 实现学生选课、退课功能;
(3) 实现教师及任课信息管理;
(4) 实现教师开课、录入成绩功能
(5) 实现管理员创建和删除学生和教师用户;
(6) 实现选课登记,要保证学生不能选修重复的课程(实用触发器实现);
(7) 创建存储过程统计各学生指定学期选修课程的总学分数;
(8) 创建视图查询2006-2007学年,没有被选修的课程;
(9) 创建存储过程统计各教师任课的学生人数;
(10) 具有数据备份和数据恢复功能。*
功能:
1.用户的需求:
学生:查询个人信息、修改密码、查询课程、选课、查询已选课程、查学期学分、查成绩
教师:查询个人信息、修改密码、开设课程、录入学生成绩、查询自己的课程、 加入或退出别的课程、取消开设的课程
管理员:添加教师用户和学生用户、删除教师和学生、查询教师和学生、选课通知
2.不允许重复的学号和工号;
3.学生完善个人信息后所在班级人数自动加减;
4.学生选课后该课程选课人数自动加减;
5.课程达到人数上限后,学生无法选此课;
6.选课人数未达到要求,教师可选择取消此门课
7.创建用户后自动添加到登陆表里
实体之间的联系
根据需求分析,归结出合适的联系:
1、一个学生能够选多门课,一门课可以被多个学生选;
2、一个老师能教多门课,一门课可以被多个老师教授;
3、一个学生属于一个班级,一个班级可以有多名学生
局部E-R图
(1)学生课程联系E-R图
(2)学生班级联系E-R图
(3)教师课程联系E-R图
总E-R图
数据字典
用户界面
---------2019.9.30更新-----------------------------
关于解决时间地点冲突的算法
这是我后来在写web端时的一套实现方法,这里我就不详细说明了,各位可以参考参考
其核心思想就是设置一套有规则地编码,根据这个编码分部分判断
public boolean judgeExist(String Sno, String CourseCode, String CourseCodeSC) {
String halfTerm1 = CourseCode.substring(0, 13);
String halfTerm2 = CourseCode.substring(13, 26);
String halfTermSC1 = CourseCodeSC.substring(0, 13);
String halfTermSC2 = CourseCodeSC.substring(13, 26);
if (judgeTerm(halfTerm1, halfTermSC1) || judgeTerm(halfTerm2, halfTermSC2)) {
System.out.println(halfTerm1 + "," + halfTerm2 + "," + halfTermSC1 + "," + halfTermSC2);
return true;
}
return false;
}
public boolean judgeTerm(String halfTerm, String halfTermSC) {
String place1 = halfTerm.substring(8, 13);
String place2 = halfTermSC.substring(8, 13);
String course1 = halfTerm.substring(2, 5);
String course2 = halfTerm.substring(5, 8);
String courseSC1 = halfTermSC.substring(2, 5);
String courseSc2 = halfTermSC.substring(5, 8);
String week = halfTerm.substring(0, 2);
String weekSC = halfTermSC.substring(0, 2);
if ((!halfTerm.equals("zz00000000000")) && (!halfTermSC.equals("zz00000000000")) && place(place1, place2)
&& week(week, weekSC) && course(course1, course2, courseSC1, courseSc2)) {
return true;
}
return false;
}
public boolean place(String place1, String place2) {
if (place1.equals(place2)) {
System.out.println(place1 + "," + place2);
return true;
}
return false;
}
public boolean week(String week, String weekSC) {
char beginWeek = week.substring(0, 1).charAt(0);
char beginWeekSC = weekSC.substring(0, 1).charAt(0);
char endWeek = week.substring(1, 2).charAt(0);
char endWeekSC = weekSC.substring(1, 2).charAt(0);
if ((beginWeek <= endWeekSC && beginWeek >= beginWeekSC)
|| (beginWeekSC <= endWeek && beginWeekSC >= beginWeek)) {
System.out.println(beginWeek + "," + endWeek + "," + beginWeekSC + "," + endWeekSC);
return true;
}
return false;
}
public boolean course(String course1, String course2, String courseSC1, String courseSC2) {
if (course1.equals(courseSC1) || course2.equals(courseSC2)) {
System.out.println(course1 + "," + courseSC1 + "," + course2 + "," + courseSC2);
return true;
}
return false;
}
public class ChooseServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String userAccount = request.getParameter("userAccount");
String CourseNo = request.getParameter("courseNo");//要选的课的课程号
String CourseCode = request.getParameter("CourseCode");//要选的课的课程编码
StudentDao dao = new StudentDao();
CourseDao cdao = new CourseDao();
Student student = dao.findOneStudent(userAccount);
String Sno = student.getSno();
List<SC> scs = cdao.findSCDetails(Sno);
SC sc2 = cdao.findChosen(Sno,CourseNo);
Course course = cdao.findOneCourse(CourseNo);//改where
System.out.println(course);
int courseMaxnum = course.getCourseMaxnum();
int courseChosennum = course.getCourseChoosennum();
System.out.println(courseMaxnum+","+courseChosennum);
if(sc2 !=null) {
request.setAttribute("conflict", "该课程已选!");
request.getRequestDispatcher("selectCourse.jsp").forward(request, response);
}else {
if(courseMaxnum == courseChosennum) {
request.setAttribute("conflict", "该课程已达到选课人数上限!");
request.getRequestDispatcher("selectCourse.jsp").forward(request, response);
}else {
if(scs.size()==0) {
cdao.chooseCourse(Sno,CourseNo);
request.setAttribute("conflict", "选课成功!");
request.getRequestDispatcher("selectCourse.jsp").forward(request, response);
}else {
for (int i =0;i<scs.size();i++) {
SC sc = scs.get(i);
String CourseCodeSC = sc.getCourseCode();
if(!cdao.judgeExist(Sno,CourseCode,CourseCodeSC)) {
cdao.chooseCourse(Sno,CourseNo);
request.setAttribute("conflict", "选课成功!");
request.getRequestDispatcher("selectCourse.jsp").forward(request, response);
}else {
request.setAttribute("conflict", "地点或时间冲突");
request.getRequestDispatcher("selectCourse.jsp").forward(request, response);
break;
}
}
}
}
}
}
}
源码
本人花了很多时间做这个课程设计,若是有需求的用户可以移步下载区:
用户界面中由于要链接数据库,所以登陆数据库的账号和密码在代码中按自己的修改!
https://download.csdn.net/download/qq_43284141/11289235
其中包括近3000行的用户界面代码和51页课程设计报告
如果只是想参考代码,请移步GitHub
https://github.com/pengchenyu111/ChooseCourse
web版
https://github.com/pengchenyu111/ChooseCourseWeb
2020/4/14更新
建议大家别看我的代码了,在现在看起来当时写的代码就是一坨SHIT,我现在觉得汗颜~大家看看报告混混学分还行。
数据库文件地址:
非web版:db-file
web版:db-file