学生选课管理系统(SQL Server+Java 解决选课冲突问题+附源码)

数据库设计任务


(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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值