Java+数据库实现高校教材管理系统

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类

8、HandleTeacher

        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());
    }
}

结束语

        大家如果有没看懂的地方可以私信我!觉得有帮助的话可以给个一键三连哦。

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值