Java+Jsp+MySQL高校选课系统设计与实现(附源码下载地址)
@
目录
01 源码下载
温馨提示:关注微信公众号【IT学长
】,回复关键词“20221022
”下载高校选课系统(courseSelection)完整源码
02 系统概述
学生选课系统是一个学校不可缺少的部分,它能为用户提供充足的信息和快捷的查询手段。管理员可以通过超级用户身份登录,对系统进行全面的管理。学生可以登录系统进行个人信息查询、网上选课等等。
本文设计的高校选课系统是在J2EE平台下开发完成的,采用了B/S模式、MySQL数据库和Tomcat服务器。其具有用户界面简洁友好,操作简单易用,运行稳定可靠,易维护,可扩展等特点,基本达到了设计要求,对同类系统的设计与实现具有一定的参考价值。
03 开发工具及技术选型
- 数据表现层:Jsp+JavaScript+CSS
- 业务逻辑层:Java+Struts
- 数据持久层:MySQL+Hibernate
- 开发工具:IDEA / Eclipse
04 运行环境
JDK1.8 + Tomcat9.0+ MySQL5.7
05 用户分析
本系统主要使用人群为系统管理员、普通读者。
- 系统管理员:管理整个系统的各项功能,如:专业管理、课程管理、信息统计。
- 普通读者:查询基本信息、选择新课程、查询已选课程、修改登录密码。
06 功能分析
系统管理员:
- 专业管理。 列表显示专业编号、专业名称、开设年份、专业学制、是否结业等专业信息。点击添加新专业按钮,填写入学年份、专业名称、学制录入新专业。
- 课程管理。 列表显示专业名称、课程名称 、上课时间、上课地点、课程学分、授课教师、学生是否可选等课程信息。点击增加新课程按钮,填写专业、课程名称、上课时间、上课地点、课程学分、课程介绍、授课教师、教师介绍录入新课程。输入专业、教师名称、课程名称进行条件搜索。
- 统计信息。 统计每个专业下学生选课情况,并且可以导出PDF、Excel文档。
- 修改登录密码。 对个人的登录密码进行修改操作。
- 退出系统。 退出当前登录用户,跳转待登录界面。
普通读者:
- 查询基本信息。 对专业、入学年份、学制、学号、出生日期、联系电话、现住址、家庭地址等基本信息进行查询。
- 选择新课程。 对自己专业下的课程进行选课。
- 查询已选课程。 对已经选择的课程进行查询,按列表显示课程名称、授课教师、学分、上课时间、上课地点等信息。
- 修改登录密码。 对个人的登录密码进行修改操作。
- 退出系统。 退出当前登录用户,跳转待登录界面。
07 数据库设计
tb_course: 用于存储课程信息
字段名称 | 类型 | 是否为NULL | 是否主键 | 说明 |
---|---|---|---|---|
id | int | 否 | 是 | 课程编号 |
name | varchar | 否 | 否 | 课程名称 |
schooltime | varchar | 否 | 否 | 上课时间 |
addr | varchar | 否 | 否 | 上课地点 |
credit | decimal | 否 | 否 | 课程学分 |
courseInfo | varchar | 否 | 否 | 课程介绍 |
teacherName | varchar | 否 | 否 | 老师姓名 |
teacherInfo | varchar | 否 | 否 | 老师介绍 |
isFinish | bit | 否 | 否 | 是否可选 |
specialtyId | int | 否 | 否 | 所属专业编号 |
tb_specialty: 用于存储专业信息
字段名称 | 类型 | 是否为NULL | 是否主键 | 说明 |
---|---|---|---|---|
id | int | 否 | 是 | 专业编号 |
enterYear | varchar | 否 | 否 | 开设年份 |
name | varchar | 否 | 否 | 专业名称 |
langthYear | varchar | 否 | 否 | 专业学制 |
isFinish | bit | 否 | 否 | 是否结业 0:未结业 1:结业 |
tb_stucourse: 用于映射学生与课程之间的关系
字段名称 | 类型 | 是否为NULL | 是否主键 | 说明 |
---|---|---|---|---|
id | int | 否 | 是 | 主键编号 |
stuID | int | 否 | 否 | 学生编号 |
courseID | int | 否 | 否 | 课程编号 |
tb_stuuser: 用于存储学生信息
字段名称 | 类型 | 是否为NULL | 是否主键 | 说明 |
---|---|---|---|---|
id | int | 否 | 是 | 学生编号 |
stuName | varchar | 否 | 否 | 学生姓名 |
stuNo | varchar | 否 | 否 | 学生学号 |
specialtyId | int | 否 | 否 | 学生所学专业编号 |
stuSex | varchar | 否 | 否 | 学生性别 |
birthday | varchar | 否 | 否 | 学生出生年月日 |
homeAddr | varchar | 否 | 否 | 学生家庭地址 |
tel | varchar | 否 | 否 | 学生电话 |
addr | varchar | 否 | 否 | 学生当前居住地址 |
tb_userlogin: 用于存储用户信息
字段名称 | 类型 | 是否为NULL | 是否主键 | 说明 |
---|---|---|---|---|
id | int | 否 | 是 | 用户编号 |
loginName | varchar | 否 | 否 | 用户名 |
pwd | varchar | 否 | 否 | 密码 |
type | varchar | 否 | 否 | 用户类型 1:管理员 2:学生 |
varchar | 否 | 否 | 邮箱 |
08 项目工程结构及说明
工程结构:
目录说明:
目录 | 说明 |
---|---|
com.cya.action | 存放action类,接收前端发来的请求,并将响应结果返回给前端 |
com.cya.dao | 存放dao层接口 |
com.cya.dto | 存放实体类 |
com.cya.tools | 存放工具类 |
WebContent/images | 存放项目所需要的图片文件 |
WebContent/manager | 存放管理员端Jsp文件 |
WebContent/stu | 存放普通用户端(学生)Jsp文件 |
09 部分功能展示及源码
9.1 管理员端--首页
9.2 管理员端--专业管理
专业列表:
添加新专业:
部分源码:
package com.cya.action; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; import org.apache.struts.actions.DispatchAction; import com.cya.dao.ISpecialtyDao; import com.cya.dto.Specialty; /** * @author 公众号【IT学长】 */ public class SpecialtyAction extends DispatchAction { private ISpecialtyDao specialtyDao; public void setSpecialtyDao(ISpecialtyDao specialtyDao) { this.specialtyDao = specialtyDao; } public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { DynaActionForm specialtyForm = (DynaActionForm) form; Specialty specialty = new Specialty(); specialty.setIsFinish(false); // 设置是否结业,默认为否 specialty.setName(specialtyForm.getString("name")); specialty.setEnterYear(specialtyForm.getString("enterYear")); specialty.setLangthYear(specialtyForm.getString("langthYear")); specialtyDao.insert(specialty); findAll(mapping, specialtyForm, request, response); return mapping.findForward("showSpecialty"); } /** * 将专业设置为已结业 * @param mapping * @param form * @param request * @param response * @return */ public ActionForward updateIsFinish(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Integer id = Integer.valueOf(request.getParameter("id")); specialtyDao.updateIsFinish(id); return findAll(mapping, form, request, response); } public ActionForward findAll(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { List list = specialtyDao.findByAll(); request.setAttribute("list", list); return mapping.findForward("showSpecialty"); } }
9.3 管理员--课程管理
课程列表:
添加新课程:
部分源码:
package com.cya.action; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; import org.apache.struts.actions.DispatchAction; import com.cya.dao.ICourseDao; import com.cya.dao.ISpecialtyDao; import com.cya.dto.Course; import com.cya.dto.Specialty; /** * @author 公众号【IT学长】 */ public class CourseAction extends DispatchAction { private ISpecialtyDao specialtyDao; private ICourseDao courseDao; /** * @param specialtyDao the specialtyDao to set */ public void setSpecialtyDao(ISpecialtyDao specialtyDao) { this.specialtyDao = specialtyDao; } /** * @param courseDao the courseDao to set */ public void setCourseDao(ICourseDao courseDao) { this.courseDao = courseDao; } public ActionForward insert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { DynaActionForm courseForm = (DynaActionForm) form; Course course = new Course(); course.setName(courseForm.getString("name")); course.setSchooltime(courseForm.getString("schooltime")); course.setAddr(courseForm.getString("addr")); course.setCredit((Short)courseForm.get("credit")); course.setCourseInfo(courseForm.getString("courseInfo")); course.setTeacherName(courseForm.getString("teacherName")); course.setTeacherInfo(courseForm.getString("teacherInfo")); course.setIsFinish(true); //是否可以选课,默认为可以 course.setSpecialtyId((Integer)courseForm.get("specialtyId")); courseDao.insert(course); return findBySearch(mapping, courseForm, request, response); } public ActionForward updateIsFinish(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Integer id = Integer.valueOf(request.getParameter("id")); courseDao.updateIsFinish(id); return courseInfo(mapping, form, request, response); } public ActionForward findBySearch(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { List<Specialty> sList = specialtyDao.findByAll(); Map<String,String> map = new HashMap<String,String>(); if(request.getParameter("specialtyId")!=null&&!request.getParameter("specialtyId").equals("-1")){ map.put("specialtyId", request.getParameter("specialtyId")); } if(request.getParameter("name")!=null&&!request.getParameter("name").equals("")){ map.put("name", request.getParameter("name")); } if(request.getParameter("teacherName")!=null&&!request.getParameter("teacherName").equals("")){ map.put("teacherName", request.getParameter("teacherName")); } List<Object> clist = courseDao.findBySearch(map); request.setAttribute("sList", sList); request.setAttribute("cList", clist); return mapping.findForward("showCourse"); } /** * 进入添加新课程页面 * @param mapping * @param form * @param request * @param response * @return */ public ActionForward showInsert(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { List<Specialty> list = specialtyDao.findByAll(); request.setAttribute("list", list); return mapping.findForward("addCourse"); } public ActionForward courseInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { Integer id = Integer.valueOf(request.getParameter("id")); Course course = courseDao.findByID(id); Specialty specialty = specialtyDao.findById(course.getSpecialtyId()); request.setAttribute("course", course); request.setAttribute("specialty", specialty); return mapping.findForward("courseInfo"); } }
9.4 管理员端--统计信息
信息列表:
选课人员列表:
导出PDF文档:
导出Excel文档:
9.5 普通用户端--基本信息
部分源码:
<%@ page language="java" pageEncoding="utf-8"%> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html:html lang="true"> <head> <title>welcome.jsp</title> <link rel="stylesheet" type="text/css" href="images/style.css"> </head> <body> <table width="845" border="0" cellspacing="0" align="center"> <tr> <td height="124" colspan="2" background="images/topU.gif"> </td> </tr> <tr> <td width="145" height="500" align="left" valign="top" bgcolor="#E4F0D8"> <jsp:include page="left.jsp"/> </td> <td width="700" align="left" valign="top"> <table cellspacing="0" width="600px" align="center"> <tr> <td height="20" colspan="2"></td> </tr> <tr> <td width="14" background="images/jiantou.jpg"> </td> <td width="585"><span class="STYLE2">当前位置:</span>用户基本信息</td> </tr> <tr> <td height="8" colspan="2"></td> </tr> <tr> <td height="3" colspan="2" bgcolor="#b1de69"></td> </tr> <tr> <td height="20" colspan="2"></td> </tr> </table> <table width="500" align="center" cellspacing="0"> <tr> <td height="30" align="right" bgcolor="#e4f0d8" class="td0" width="114">专业名称:</td> <td align="right" bgcolor="#e4f0d8" class="td0" width="10"> </td> <td width="9" height="30" align="left" bgcolor="#e4f0d8" class="td0"> </td> <td width="357" align="left" bgcolor="#e4f0d8" class="td0">${specialty.name}</td> </tr> <tr> <td height="30" align="right" class="td1">入学年份:</td> <td height="30" align="right" class="td1"> </td> <td height="30" class="td2"> </td> <td height="30" class="td1">${specialty.enterYear}年</td> </tr> <tr> <td height="30" align="right" class="td1">学制:</td> <td height="30" align="right" class="td1"> </td> <td height="30" class="td2"> </td> <td height="30" class="td1">${specialty.langthYear}年</td> </tr> <tr> <td height="30" align="right" class="td1">姓名:</td> <td height="30" align="right" class="td1"> </td> <td height="30" class="td2"> </td> <td height="30" class="td1">${stuUser.stuName}</td> </tr> <tr> <td height="30" align="right" class="td1">学号:</td> <td height="30" align="right" class="td1"> </td> <td height="30" class="td2"> </td> <td height="30" class="td1">${stuUser.stuNo}</td> </tr> <tr> <td height="30" align="right" class="td1">性别:</td> <td height="30" align="right" class="td1"> </td> <td height="30" class="td2"> </td> <td height="30" class="td1">${stuUser.stuSex}</td> </tr> <tr> <td height="30" align="right" class="td1">出生日期:</td> <td height="30" align="right" class="td1"> </td> <td height="30" class="td2"> </td> <td height="30" class="td1">${stuUser.birthday}</td> </tr> <tr> <td height="30" align="right" class="td1">联系电话:</td> <td height="30" align="right" class="td1"> </td> <td height="30" class="td2"> </td> <td height="30" class="td1">${stuUser.tel}</td> </tr> <tr> <td height="30" align="right" class="td1">现住址:</td> <td height="30" align="right" class="td1"> </td> <td height="30" class="td2"> </td> <td height="30" class="td1">${stuUser.addr}</td> </tr> <tr> <td height="30" align="right" class="td1">家庭地址:</td> <td height="30" align="right" class="td1"> </td> <td height="30" class="td2"> </td> <td height="30" class="td1">${stuUser.homeAddr}</td> </tr> </table> <p> </td> </tr> <tr> <td style="font-weight: bold;color: green;font-size: 18px;" height="85" colspan="2" align="center" background="images/bottomU.gif"> 【IT学长】,几十套毕业设计项目源码、百G Java面试题</td> </tr> </table> </body> </html:html>
9.6 普通用户端--已选课程
部分源码:
<%@ page language="java" pageEncoding="utf-8"%> <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html:html lang="true"> <head> <title>selected.jsp</title> <link rel="stylesheet" type="text/css" href="images/style.css"> </head> <body> <table width="845" cellspacing="0" align="center"> <tr> <td height="124" colspan="2" background="images/topU.gif"> </td> </tr> <tr> <td width="150" height="500" align="left" valign="top" bgcolor="#E4F0D8"> <jsp:include page="left.jsp"/> </td> <td align="left" valign="top"> <table cellspacing="0" width="600px" align="center"> <tr> <td height="20" colspan="2"></td> </tr> <tr> <td width="14" background="images/jiantou.jpg"> </td> <td width="585"><span class="STYLE2">当前位置:</span>查询已选课程</td> </tr> <tr> <td height="8" colspan="2"></td> </tr> <tr> <td height="3" colspan="2" bgcolor="#b1de69"></td> </tr> <tr> <td height="20" colspan="2"></td> </tr> </table> <table width="500" align="center" cellspacing="0"> <tr> <td height="30" align="center" class="td0"><strong>课程名称</strong></td> <td align="center" class="td0"><strong>授课教师</strong></td> <td align="center" class="td0"><strong>学分</strong></td> <td align="center" class="td0"><strong>上课时间</strong></td> <td align="center" class="td0"><strong>上课地点</strong></td> </tr> <logic:iterate id="list" name="list"> <tr> <td height="30" align="center" class="td1"> <html:link page="/stuUser.do?method=courseInfo&id=${list[1].id}&path=selected"> ${list[1].name}</html:link></td> <td align="center" class="td1">${list[1].teacherName}</td> <td align="center" class="td1">${list[1].credit }</td> <td align="center" class="td1">${list[1].schooltime}</td> <td align="center" class="td1">${list[1].addr}</td> </tr> </logic:iterate> </table> </td> </tr> <tr> <td style="font-weight: bold;color: green;font-size: 18px;" height="85" colspan="2" align="center" background="images/bottomU.gif"> 【IT学长】,几十套毕业设计项目源码、百G Java面试题</td> </tr> </table> </body> </html:html>
9.7 用户登录
部分源码:
package com.cya.action; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; import com.cya.dao.ISpecialtyDao; import com.cya.dao.IStuUserDao; import com.cya.dao.IUserLoginDao; import com.cya.dto.Specialty; import com.cya.dto.StuUser; import com.cya.dto.UserLogin; /** * @author 公众号【IT学长】 */ public class UserLoginAction extends Action { private IUserLoginDao userLoginDao; private IStuUserDao stuUserDao; private ISpecialtyDao specialtyDao; public void setSpecialtyDao(ISpecialtyDao specialtyDao) { this.specialtyDao = specialtyDao; } public void setStuUserDao(IStuUserDao stuUserDao) { this.stuUserDao = stuUserDao; } public void setUserLoginDao(IUserLoginDao userLoginDao) { this.userLoginDao = userLoginDao; } /** * Method execute * * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { DynaActionForm userLoginForm = (DynaActionForm) form; UserLogin userLogin = userLoginDao.findbyNameAndPwd(userLoginForm .getString("loginName"), userLoginForm.getString("pwd")); if (userLogin == null) { request.setAttribute("error", "用户登录失败,用户名或密码不正确!"); return mapping.findForward("index"); } else { request.getSession().setAttribute("loginName", userLogin.getLoginName()); request.getSession().setAttribute("id", userLogin.getId()); if (userLogin.getType().equals("1")) { System.out.println("管理员登录"); return mapping.findForward("manager"); } else { // 判断学生有没有填写过基本信息 StuUser stuUser = stuUserDao.findById(userLogin.getId()); if (stuUser == null) { List<Specialty> list = specialtyDao.findStuByAll(); request.setAttribute("list", list); return mapping.findForward("addStuInfo"); } else { Specialty specialty = specialtyDao.findById(stuUser .getSpecialtyId()); request.setAttribute("specialty", specialty); request.setAttribute("stuUser", stuUser); return mapping.findForward("welcome"); } } } } }
10 运行教程
- 下载安装Java(JDK1.8)、MySQL(MySQL5.7)、Tomcat(Tomcat9.0)
- 下载本系统源代包
- 将源码包中
db_course_selection.sql
导入MySQL - 将下载好的源码导入Eclipse/IDEA开发工具中
- 修改
courseSelection/WebContent/applicationContext.xml
- 配置Tomcat
- 启动服务,浏览器输入
http://localhost:8080/courseSelection
本期内容就到这里,感谢你的阅读,下载本系统完整源码请微信搜索下方名片
,回复“20221022
”。关键词一定要输完整、输对哦!!
最后,推荐加入学长的知识星球,里面有十几套Java精选项目,适合用于毕业设计、课程设计、程序小白入门级练手项目。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具