1、课题概述
1、对于所有用户:
登录注册、修改密码以及实名认证。
2、对于教师:
填报教材信息、修改教材信息、删除教材信息、查看统计信息。
3、对于学生:
预定教材、查看已预定的教材信息。
2、系统设计
2.1、类的设计
类关系图
1、User类
User为用户类,包括id(学号或者工号)、name(姓名)、password(密码)、college(学院)、classes(班级)五个属性,以及五个属性对应的set和get方法。
图3-3-1 User类
2、Student类
Student类为学生类,继承User用户类。该类中包含两个构造方法,一个只含有id和password,用于注册;另一个包含name、college、classes、id,用于实现实名认证功能。
图3-3-2 Student类
3、Teacher类
Teacher类为教师类,继承User用户类。该类在父类的基础上增加了一个identity(身份)属性,包括讲师、教授、副教授、助教四种。教师可以在实名认证时选择自己的身份。含有四个构造方法以及identity的set和get方法,此外还重写了toString方法,用于打印教师的信息。
图3-3-3 Teacher类
4、Course类
Course类为课程类,包括name(课程名)、teacher(授课教师)、year(学年)、term(学期)、address(上课地点)、nature(课程性质)、classes(上课班级)七个属性。方法包括七个属性对应的get和set方法、全参和空参的构造方法以及重写的toString方法。
图3-3-4 Course类
5、Textbook类
Textbook类为教材类,包含title(书名)、author(作者)、press(出版社)、edition(版本)四个属性。方法包括四个属性对应的set和get方法、全参和空参的构造方法以及重写的toString方法。
图3-3-5 TextBook类
6、Project类
Project类为项目类,包括course(课程)、textBook(教材)、datestring(预定截止时间)、condition(状态)四个属性。方法包括四个属性的get和set方法、三个构造方法以及重写的toString方法。值得一提的是,getCondition方法把datastring与当前的时间相比较,将condition的值赋为“已截止”或“进行中”。
图3-3-6 Project类
7、HandleStudent类
HandleStudent类用于实现对学生数据的操作,并通过JDBC将学生数据更新到数据库。该类中包括register(学生注册方法)、login(学生登录方法)、identify(学生实名认证方法)、changePassword(学生修改密码方法)、getStudentFromDB(从数据库获取学生对象方法)五个方法。
图3-3-7 HandleProject类
HandleTeacher类用于实现对教师数据的操作,并通过JDBC将教师数据更新到数据库。该类中包括register(教师注册方法)、login(教师登录方法)、identify(教师实名认证方法)、changePassword(教师修改密码方法)、getTeacherFromDB(从数据库获取教师对象方法)五个方法。
图3-3-8 HandleTeacher类
9、HandleCourse类
HandleCourse类用于实现对课程数据增删查改的操作,并通过JDBC将教师数据更新到数据库。该类中包括addCourse(添加课程)、getCourseByTeacher(根据教师姓名查找课程)、getCourseByClasses(根据班级获取课程名称)、queryCourse(打印课程名称)、getCourseName(将下标转化为课程名)、courseExist(查询课程是否存在)、deleteCourse(通过课程名称删除课程)、getCourseByName(通过课程名称查找课程)、changeClasses(根据项目名称更改项目信息)九个方法。
图3-3-9 HandleCourse类
10、HandleTextBook
HandleTextBook类用于实现对教材数据的操作,并通过JDBC将教材数据更新到数据库。该类中包括addTextBook(添加教材)、deleteTextBook(通过教材名称删除教材)两个方法。
图3-3-8 HandleTextBook类
11、HandleProject
HandleProject类用于实现对项目数据的操作,并通过JDBC将项目数据更新到数据库。该类中包括addProject(添加项目)、deleteProject(通过课程名称删除教材)、两个方法。
图3-3-8 HandleProject类
2.2、数据库设计
1、teacher表
图3-4-1 teacher表
teacher表用于存储教师信息,每一列的含义与约束如下:
name:字符串类型,长度为20,用于表示教师的姓名。
id:字符串类型,长度为20,用于表示教师的工号。
password:字符串类型,用于表示教师的密码。id与password一起实现教师的注册与登录功能。
identity:字符串类型,长度为20,用于表示教师的身份(即教授、副教授、讲师、助教)。
college:字符串类型,长度为20,用于表示教师所在的学院。
2、student表
图3-4-2 student表
student表用于存储学生信息,每一列的含义与约束如下:
name:字符串类型,长度为20,用于表示学生的姓名。
id:字符串类型,长度为20,用于表示学生的工号。
password:字符串类型,用于表示学生的密码。id与password一起实现学生的注册与登录功能。
college:字符串类型,长度为20,用于表示学生所在的学院。
3、textbook表
图3-4-3 textbook表
textbook表用于存储教材信息,每一列的含义与约束如下:
title:字符串类型,长度为20,用于表示教材的书名。
author:字符串类型,长度为20,用于表示教材的作者。
press:字符串类型,长度为20,用于表示教材的出版社。
edition:字符串类型,长度为20,用于表示教材的版本。
4、course表
图3-4-4 course表
course表可与teacher表进行关联查询。
course表用于存储课程信息,每一列含义与约束如下:
name:字符串类型,长度为20,用于表示课程的名称。
year:字符串类型,长度为20,用于表示课程的学年。
term:int类型,用于表示课程的学期。
address:字符串类型,长度为20,用于表示课程的上课地点。
nature:字符串类型,长度为20,用于表示课程的性质(必修或选修)。
teacher:字符串类型,长度为20,用于表示课程的授课教师。
classes:字符串类型,长度为20,用于表示课程的班级。
5、project表
图3-4-5 project表
project表与course表、textbook表三者进行关联查询,可查询出该项目的所有信息。
project表用于存储项目信息,每一列含义与约束如下:
course:字符串类型,长度为20,用于表示项目的课程名称。
textbook:字符串类型,长度为20,用于表示项目的教材名称。
datestring:字符串类型,长度为20,用于表示项目的截止日期。
condition:字符串类型,长度为20,用于表示项目的状态(已截止或进行中)。
6、reserve表
图3-4-6 reserve表
reserve表与project、student表关联查询,可查询出教材预定的详细信息。
reserve表用于存储预定信息,每一列的含义和约束如下:
num:int类型,用于表示预定教材的数量。
project:字符串类型,长度为20,用于表示预定的课程名称。
student:字符串类型,长度为20,用于表示学生的姓名。
3、开发工具和编程语言
(1)开发环境:Intellij IDEA 2024.1,hsqldb;
(2)编程语言:Java语言.
关于数据库:hsqldb是一个java写的小型、嵌入式数据库,不用安装,使用方便。关于hsqldb的安装与使用,大家可以看我主页发布的另一个文章。链接附上:
https://blog.csdn.net/2301_77699925/article/details/140423149?spm=1001.2014.3001.5501
4、系统实现
4.1、用户注册
学生注册与教师注册的实现逻辑基本一致,这里以学生注册为例进行介绍。学生注册功能的实现主要依赖于register方法。该方法需要传入Student类对象s,获取s的id和password属性,通过相应的sql语句对数据库中的数据进行遍历比较,若该id已存在,则系统提示“该账号已存在,请直接登录!”。若该id不存在,则系统提示“注册成功”。
//学生注册
public static void register(Student s) throws SQLException {
Connection conn = JDBCUtil.getConnection();
PreparedStatement pst = conn.prepareStatement("insert into student(id,password) values(?,?)");
ResultSet rs;
Statement sta = conn.createStatement();
String sql1 = "select * from student";
rs = sta.executeQuery(sql1);
int r = 0;
while (rs.next())
{
String id = rs.getString("id");
if (s.getId().equals(id))
{
System.out.println("账号已存在,请直接登录!");
r = 1;
break;
}
}
if(r==0){
pst.setString(1, s.getId());
pst.setString(2, s.getPassword());
pst.executeUpdate();
JDBCUtil.close(pst, conn);
System.out.println("注册成功!!!");
}
}
4.2、用户登录
学生登录与教师登录的实现逻辑基本一致,这里以学生登录为例进行介绍。学生登录功能的实现主要依赖于login方法。该方法需要传入Student类对象s,获取s的id和password属性,通过相应的sql语句对数据库中的数据进行遍历比较,若id与password均相等,则系统提示“登录成功”,若数据库中有对应的id但password不相等,则系统提示“账号密码错误”,若数据库中没有对应的id,则系统提示“该账号不存在”。
//学生登录
public static boolean login(Student s) throws SQLException {
Connection conn = JDBCUtil.getConnection();
Statement sta = conn.createStatement();
ResultSet rs;
String sql = "select * from student";
rs = sta.executeQuery(sql);
int index = 0;
while (rs.next()) {
String id = rs.getString(1);
String password = rs.getString(3);
if (s.getId().equals(id) && s.getPassword().equals(password)) {
index = 1;
break;
}else if(id.equals(s.getId()) && !password.equals(s.getPassword())){
index = 2;
break;
}
}
if (index == 0) {
System.out.println("用户不存在");
}else if(index==1){
System.out.println("登录成功");
return true;
}else if(index == 2){
System.out.println("账号或密码错误");
}
return false;
}
4.3、用户修改密码
用户修改密码功能的实现主要依赖于changePassword方法,该方法需要传入Student对象s,获取s的id以及password属性,根据id在数据库中检索,使用update语句修改数据库中对应的password。
//学生修改密码
public static void changePassword(Student s) throws SQLException {
try {
Connection conn = JDBCUtil.getConnection();
PreparedStatement pst = conn.prepareStatement("update student set password=? where id = ?");
pst.setString(2, s.getId());
pst.setString(1, s.getPassword());
pst.executeUpdate();
JDBCUtil.close(pst, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
4.4、用户实名认证
用户实名认证功能的实现主要依赖于identify方法,该方法需要传入学生对象s,然后获取s的id,根据id在数据库中检索,使用update语句更新姓名、学院、班级等信息。
//学生实名认证
public static void identify(Student s) throws SQLException {
try {
Connection conn = JDBCUtil.getConnection();
PreparedStatement pst = conn.prepareStatement("update student set name = ?,college=?,classes=? where id = ?");
pst.setString(1, s.getName());
pst.setString(2, s.getCollege());
pst.setString(3, s.getClasses());
pst.setString(4, s.getId());
pst.executeUpdate();
JDBCUtil.close(pst, conn);
} catch (SQLException e) {
e.printStackTrace();
}
}
4.5、学生端主界面
学生登录成功后,进入学生端主界面,通过调用学生对象的班级和姓名输出问候语。学生用户可选择教材中心、个人中心或是退出系统。用户通过键盘输入数字,调用分级菜单,来选择接下来想要进行的操作。教材中心界面可以选择教材预定和查看已预定的教材。个人中心界面可以修改密码以及实名认证。
//学生主界面
public void menu1_1(Student s1) throws SQLException, ParseException {
System.out.println("***************");
System.out.println("\t教材管理系统\t");
System.out.println("\t学生端\t");
System.out.println("您好,"+s1.getClasses()+" "+s1.getName());
System.out.println("1、教材中心");
System.out.println("2、个人中心");
System.out.println("0、退出系统");
System.out.println("***************");
int choice = sc.nextInt();
switch (choice) {
case 1:
//教材中心
menu1_1_0(s1);
break;
case 2:
//个人中心
menu1_1_2(s1);
break;
case 0:
go=false;
System.out.println("欢迎下次使用!");
break;}}
4.6、学生预定教材
学生用户进入教材预定界面,系统会获取学生对象的班级、姓名、学号。判断学生对象的姓名是否为空,若为空,则证明学生未进行实名认证,系统输出“请先进行实名认证!”。然后根据学生的班级,从数据库中获取本班级开设的课程,供学生选择。学生选择某一课程之后,会输出该课程对应的教师、教材、预定截止时间等详细信息。若当前日期小于预定截止日期,则询问学生是否要预定,学生可通过键盘输入进行选择。
//学生-教材中心-教材预定
public void menu1_1_1(Student s1) throws SQLException, ParseException {
if(s1.getName()==null|| s1.getName().isEmpty())
{
System.out.println("请先完成实名认证!");
}
else {
System.out.println("***************");
System.out.println("\t教材管理系统-教材中心-教材预定\t");
System.out.println("您好," + s1.getClasses() + " " + s1.getName() + " " + s1.getId());
if (HandleCourse.getCourseByClasses("%" + s1.getClasses() + "%").isEmpty()) {
System.out.println("您暂无课程!");
}else{
System.out.println("请输入您要查看课程的详细信息");
HandleCourse.queryCourse(HandleCourse.getCourseByClasses("%" + s1.getClasses() + "%"));//根据学生班级显示所有课程名称
int i = sc.nextInt();
String courseName = HandleCourse.getCourseName(HandleCourse.getCourseByClasses("%"+s1.getClasses()+"%"), i); //查找指定课程的详细信息
System.out.println(HandleProject.getProjectByCourse(courseName)); //打印指定课程的详细信息
if (Objects.equals(HandleProject.getProjectByCourse(courseName).getCondition(), "进行中")) {
System.out.println("您是否要预定?(y/n)");
char f = sc.next().charAt(0);
if (f == 'y') {
HandleProject.addReserve(courseName,s1.getName());
System.out.println("预定成功!");
} else {
System.out.println("预定失败!");
}
} else {
System.out.println("不在预定时间内!");
}
System.out.println("***************");
}
}
}
4.7、学生查看已预定的教材
该功能的实现依赖于getReserveByStuName方法,参数为String类型的学生姓名,返回值为一个Project类的ArrayList数组。然后再通过void类型的queryReserve方法把学生预定的详细信息打印出来。
//获取指定学生的教材预定信息
public static ArrayList<Project> getReserveByStuName(String stuName) throws SQLException{
ArrayList<Project> list =new ArrayList<>();
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement("select project.course,textbook.* from textbook,student,reserve,project where reserve.student= ? AND student.name=reserve.student AND project.textbook=textbook.title AND reserve.project=project.course;");
ps.setString(1,stuName);
ResultSet rs=ps.executeQuery();
while (rs.next()) {
Project p=new Project();
TextBook tb=new TextBook();
Course c=new Course();
tb.setTitle(rs.getString("title"));
tb.setPress(rs.getString("press"));
tb.setEdition(rs.getString("edition"));
tb.setAuthor(rs.getString("author"));
c.setName(rs.getString("course"));
p.setCourse(c);
p.setTextBook(tb);
list.add(p);
}
JDBCUtil.close(rs,ps,conn);
return list;
}
//打印预定信息
public static void queryReserve(ArrayList<Project> list){
for (int i = 0; i < list.size(); i++) {
System.out.println((i+1)+"、"+list.get(i).getCourseName()+'\\'+list.get(i).getTextBookName()+'\\'+list.get(i).getTextBook().getAuthor()+'\\'+list.get(i).getTextBook().getPress()+'\\'+list.get(i).getTextBook().getEdition());}}
4.8教师端主界面
教师登录成功后,进入教师端主界面,通过调用教师对象的工号和姓名输出问候语。教师用户可选择教材中心、个人中心或是退出系统。用户通过键盘输入数字,调用分级菜单,来选择接下来想要进行的操作。教材中心界面可以选择填报、删除、修改教材信息以及查看统计信息。个人中心可以选择修改密码、实名认证以及退出登录。
//教师主界面
public void menu2_1(Teacher t1) throws SQLException, ParseException {
System.out.println("***************");
System.out.println("\t教材管理系统\t");
System.out.println("\t教师端\t");
System.out.println("您好,"+t1.getId()+t1.getName());
System.out.println("1、教材中心");
System.out.println("2、个人中心");
System.out.println("0、退出系统");
System.out.println("***************");
int choice = sc.nextInt();
switch (choice) {
case 1:
//教材中心
menu2_1_1(t1);
break;
case 2:
//个人中心
menu2_1_2(t1);
break;
case 0:
go=false;
System.out.println("欢迎下次使用!");
break;
}
}
4.9、教师填报教材信息
填报教材信息功能的实现主要依赖于addTextBook、addCourse、addProject三个方法。教师用户根据系统提示,输入项目信息,并将输入的值赋给 Course类的对象c、一个TextBook类的对象tb,一个Project类的对象p,然后调用三个add方法,使用sql语句中的insert语句,将数据添加到对应的数据库。
//添加课程
public static void addCourse(Course c) throws SQLException
{
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement("insert into course (name,year,term,address,nature,teacher,classes) values(?,?,?,?,?,?,?)");
ps.setString(1,c.getName());
ps.setString(2,c.getYear());
ps.setInt(3,c.getTerm());
ps.setString(4,c.getAddress());
ps.setString(5,c.getNature());
ps.setString(6,c.getTeacher().getName());
ps.setString(7,c.getClasses());
ps.executeUpdate();
JDBCUtil.close(ps, conn);
}
//添加项目
public static void addProject(Project p) throws SQLException
{
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement("insert into project (course,textbook,datestring) values(?,?,?)");
ps.setString(1,p.getCourseName());
ps.setString(2,p.getTextBookName());
ps.setString(3,p.getDatestring());
ps.executeUpdate();
JDBCUtil.close(ps, conn);
}
//添加教材
public static void addTextBook(TextBook b) throws SQLException
{
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement("insert into textbook (title,author,press,edition) values(?,?,?,?)");
ps.setString(1,b.getTitle());
ps.setString(2,b.getAuthor());
ps.setString(3,b.getPress());
ps.setString(4,b.getEdition());
ps.executeUpdate();
JDBCUtil.close(ps, conn);
}
4.10教师删除教材信息
删除教材信息的实现主要依赖于deleteCourse、deleteTextBook、deleteProject三个方法实现,参数均为String类型。根据传入的参数进行检索,使用sql语句中的delete语句实现对course、textbook、project三个数据库中数据的删除操作。
//通过课程名称删除课程
public static void deleteCourse(String c_name) throws SQLException {
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement("delete from course where name=?");
ps.setString(1,c_name);
ps.executeUpdate();
JDBCUtil.close(ps, conn);
}
//通过教材名称删除教材
public static void deleteTextBook(String b_name) throws SQLException {
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement("delete from textbook where title=?");
ps.setString(1,b_name);
ps.executeUpdate();
JDBCUtil.close(ps, conn);
}
//删除项目
public static void deleteProject(String p_c_name) throws SQLException {
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement("delete from project where course=?");
ps.setString(1,p_c_name);
ps.executeUpdate();
JDBCUtil.close(ps, conn);
}
5.11 教师修改教材信息
修改教材信息功能的实现主要依赖于changeCourse和changeDate两个方法。前者传入的参数为Course类的c对象,通过c对象的名称进行检索,然后把用户输入的信息更新到数据库中。后者传入的参数为String类型,根据要修改课程的名称进行检索,把用户输入的截止时间更新到数据库中。
public static void changeCourse(Course c) throws SQLException {
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement("update course set name=?,year=?,term=?,address=?,nature=?,classes=? where name=?");
ps.setString(1,c.getName());
ps.setString(1,c.getName());
ps.setString(2,c.getYear());
ps.setInt(3,c.getTerm());
ps.setString(4,c.getAddress());
ps.setString(5,c.getNature());
ps.setString(6,c.getClasses());
ps.setString(7,c.getName());
ps.executeUpdate();
JDBCUtil.close(ps, conn);
}
}
public static void changeDate(String courseName, String datestring) throws SQLException {
Connection conn = JDBCUtil.getConnection();
PreparedStatement ps = conn.prepareStatement("update project set datestring=? where course=?");
ps.setString(1,datestring);
ps.setString(2,courseName);
ps.executeUpdate();
JDBCUtil.close(ps, conn);
}
5.12教师查看统计信息
查看统计信息功能的实现主要依赖于getReserveStu方法,参数为String类型的courseName,使用selete语句以courseName为检索从数据库中获取学生信息,返回Student类的ArrayList数组。然后再把该Student数组传入queryReserveStu方法,打印预定某教材的所有学生信息。
//查询预定某教材的学生信息
public static ArrayList<Student> getReserveStu(String courseName) throws SQLException {
ArrayList<Student> list =new ArrayList<>();
Connection conn = JDBCUtil.getConnection();
//查询具体学生
PreparedStatementps=conn.prepareStatement("selectstudent.id,student.name,student.college,student.classes,reserve.num from textbook,student,reserve,project where reserve.project= ? AND student.name=reserve.studentANDproject.textbook=textbook.titleANDproject.course=reserve.project");
ps.setString(1, courseName);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
Student s = new Student();
s.setName(rs.getString("name"));
s.setId(rs.getString("id"));
s.setCollege(rs.getString("college"));
s.setClasses(rs.getString("classes"));
list.add(s);
}
JDBCUtil.close(rs,ps,conn);
return list;
}
//打印学生信息
public static void queryReserveStu(ArrayList<Student> list){
for (int i = 0; i < list.size(); i++) {
System.out.println((i+1)+"、"+list.get(i).getCollege()+'\\'+list.get(i).getClasses()+'\\'+list.get(i).getId()+'\\'+list.get(i).getName());
}
}
结束语
大家如果有没看懂的地方可以私信我!觉得有帮助的话可以给个一键三连哦。