0


数据库大作业-学生宿舍管理系统

简介

此程序是本人大二时期的数据库大作业,初学数据库后所编写的一个程序,是一个学生宿舍管理系统,可实现学生宿舍的管理。

本程序使用Java编写,使用eclipse进行开发,数据库使用MySQL数据库搭配Navicat进行数据管理,程序使用JDBC技术进行数据库连接,使用Java Swing开发图形化界面,整个系统界面美观、功能丰富。本系统点击首页的“更换外观”按钮可切换不同风格的外观,系统分为三个模式,学生模式、宿管模式和系统管理模式,分别面向学生、宿管和系统管理员,不同的模式有不同的功能,详细请见下方介绍。

本系统功能完善且丰富(可以将系统内的各种信息导出为excel文件哦),程序检错能力强,界面简洁好看(每个组件都经过细心调整),但当时偷懒,所以有些代码并没有经过优化,可能有些繁杂,且为了界面美观,有大部分代码都在调整界面组件,请勿介意,读者可自行取其精华去其糟粕。

程序源代码及程序设计说明书可在下方GitHub链接处进行下载,供各位需要的人学习参考。

GitHub链接:学生宿舍管理系统

目录

数据设计

本系统的数据库共有8张表格,数据库表格设计及ER图如下所示,详细数据设计请至开头处GitHub链接处下载数据设计表或程序设计说明书,进行查看。
总数据表
总ER图

程序流程

程序大概流程如下图:
程序流程图

功能展示

本程序功能及细节颇多,在此仅展示部分功能,若想了解完整功能及细节,请至文章开头处GitHub链接下载程序,进行体验。

欢迎界面-更换外观

打开本程序,首先来到欢迎界面,在此可选择学生登录和管理员登录,点击右上角“更换外观”可更改系统整体外观,共有5种不同风格的外观。

更换外观

登录

在欢迎界面点击“学生登录”,然后输入学生账号密码,登录成功系统将进入学生模式;点击“管理员登录”,然后输入宿管账号密码,登录成功系统将进入宿管模式,若账号密码均输入“admin”,系统将进入系统管理模式。

学生登录
管理员登录

学生模式

学生模式面向的群体是学生,学生输入自己的账号(即学号)和密码后,即可进入学生模式的菜单界面,在此可选择相应功能,学生模式的功能较少,功能如下。

学生模式

个人信息

“个人信息”功能,可查看自己的个人详细信息。

个人信息

宿舍报修

“宿舍报修”功能,可在此界面进行宿舍报修,提交的信息将被保存到数据库中,并在宿管模式和系统管理模式的相应界面展示。

宿舍报修

建议与反馈

“建议与反馈”功能,可在此界面进行建议与反馈,提交的信息将被保存到数据库中,并在宿管模式和系统管理模式的相应界面展示。

建议与反馈

修改密码

“修改密码”功能,可在此界面修改自己的密码,需输入旧密码和两次新密码,输入错误会有相应的提示。

修改密码

系统管理模式

系统管理模式面向的群体是系统管理员,管理员输入指定的账号和密码(均为admin)后,即可进入系统管理模式的菜单界面,在此可选择相应功能,系统管理模式的功能最多最全,可对学生、宿管、宿舍等进行全面管理,具体功能如下。

系统管理模式

管理功能

系统管理模式下可对宿舍楼、宿舍、宿管、学生、住宿信息进行全面管理,包括增删改查等,下面以“学生管理”为例展示管理功能。

点击“学生管理”,来到学生管理界面,在此可看到所有学生的简易信息。
学生管理

点击某个学生行的“查看”按钮,可查看该学生的详细信息,在此可进行学生信息的修改和删除。
学生管理-查看

如点击“修改学生信息”按钮,则进行学生信息的修改操作,修改完成点击“保存”,信息会在数据库同步更新。
学生管理-修改

在“学生管理”界面点击上方的“添加”按钮,可向系统中添加学生,输入完整的学生信息并确认添加后,信息将被保存至数据库,成功添加学生。
学生管理-添加

在“学生管理”界面点击上方的“导出”按钮,可将学生信息导出成excel表格文件。
学生管理-导出
学生管理-导出成功

在“学生管理”界面点击顶部的“查询”按钮,将来到学生信息的查询界面,输入指定条件并点击“查询”,系统将查询出符合条件的学生,如下查询所有2019级的学生。
学生管理-查询
学生管理-查询成功

以上展示了“学生管理”功能,其他管理功能与此类似。

寝室分配

“寝室分配”功能,可自动为学生分配寝室,代替手动分配,以节省人力,若想精确分配、按意愿分配寝室,则需手动在“住宿管理”界面进行分配。

寝室分配

出入登记

“出入登记”功能,可登记学生出入宿舍楼的记录,可添加、删除、导出、查询出入记录,点击上方“登记”按钮,添加出入记录,输入相应信息,其中输入学号后将自动显示相应姓名,点击界面右侧的“获取当前时间”,可自动获取当前时间并自动输入。

出入登记
出入登记-登记

宿舍报修

“宿舍报修”功能,在此界面可查看到所有学生提交的宿舍报修信息,点击“查看”按钮,可查看详细的报修信息,报修详细界面中可处理报修、删除报修,宿舍报修信息亦可导出和查询。

宿舍报修
宿舍报修-查看

建议与反馈

“建议与反馈”功能,在此界面可查看到所有学生提交的建议与反馈,点击“查看”按钮,可进入详细界面查看详细内容,也可在此进行删除,建议与反馈亦可导出。

建议与反馈
建议与反馈-查看

删库跑路

“删库跑路”功能,此功能需输入密码“ESCAPE”,然后点击“确认删库跑路”按钮,即可删除本系统的数据库进行跑路 ,此功能成功执行后,将自动退出程序,系统将无法继续使用。

删库跑路

宿管模式

宿管模式面向的群体是宿管,宿管输入自己的账号(即编号)和密码后,即可进入宿管模式的菜单界面,在此可选择相应功能,宿管模式的功能与系统管理模式类似,不同之处在于,宿管模式下宿管仅能对自己所管理的宿舍楼进行操作,由于两者功能类似,故在此不再展示宿管模式的功能,读者可下载程序自行进行体验。

宿管模式

代码展示

本程序代码巨多且有详细注释,在此仅展示部分重要代码,完整代码请至文章开头处GitHub链接下载程序,进行了解。

为了系统界面的美观强迫症患者 ,所以本程序的很多代码都在调整界面组件,请别介意。

Info类

信息类,定义各种对象的类,如:宿舍、学生、宿管等。

importjava.util.*;importjava.text.*;//各种信息类publicclassInfo{}classFloor{//宿舍楼String floor_num;//楼号int layer_amount;//层数int room_amount;//房间数String category;//类别String sex;//居住时间String admin_num;//宿管编号publicFloor(String floor_num,String layer_amount,String room_amount,String category,String sex,String admin_num){this.floor_num=floor_num;this.layer_amount=Integer.parseInt(layer_amount);this.room_amount=Integer.parseInt(room_amount);this.category=category;this.sex=sex;this.admin_num=admin_num;}}classDormitory{//宿舍String floor_num;//楼号int layer;//楼层int room_num;//宿舍号int bed_total;//总床位数int bed_surplus;//剩余床位数int price;//单价publicDormitory(String floor_num,String layer,String room_num,String bed_total,String bed_surplus,String price){this.floor_num=floor_num;this.layer=Integer.parseInt(layer);this.room_num=Integer.parseInt(room_num);this.bed_total=Integer.parseInt(bed_total);this.bed_surplus=Integer.parseInt(bed_surplus);this.price=Integer.parseInt(price);}}classAdmin{//宿管String admin_num;//编号String password;//密码String name;//姓名String sex;//性别String phone;//手机publicAdmin(String admin_num,String password,String name,String sex,String phone){this.admin_num=admin_num;this.password=password;this.name=name;this.sex=sex;this.phone=phone;}}classStudent{//学生String stu_num;//学号String password;//密码String name;//姓名String sex;//性别int birth;//出生日期int grade;//年级String faculty;//院系String clas;//班级String phone;//手机号String yes_no;//是否入住publicStudent(String stu_num,String password,String name,String sex,String birth,String grade,String faculty,String clas,String phone,String yes_no){this.stu_num=stu_num;this.password=password;this.name=name;this.sex=sex;this.birth=Integer.parseInt(birth);this.grade=Integer.parseInt(grade);this.faculty=faculty;this.clas=clas;this.phone=phone;this.yes_no=yes_no;}}classStay{//住宿String stu_num;//学号String name;//姓名String floor_num;//楼号int layer;//楼层int room_num;//宿舍号Date time;//入住时间publicStay(String stu_num,String name,String floor_num,String layer,String room_num,String time){SimpleDateFormat timeFormat=newSimpleDateFormat("yyyy-MM-dd");this.stu_num=stu_num;this.name=name;this.floor_num=floor_num;this.layer=Integer.parseInt(layer);this.room_num=Integer.parseInt(room_num);try{this.time=timeFormat.parse(time);}catch(ParseException e){
            e.printStackTrace();}}}classInOut{//出入String stu_num;//学号String name;//姓名String floor_num;//楼号String category;//类别Date time;//时间publicInOut(String stu_num,String name,String floor_num,String category,String time){SimpleDateFormat timeFormat=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss");this.stu_num=stu_num;this.name=name;this.floor_num=floor_num;this.category=category;try{this.time=timeFormat.parse(time);}catch(ParseException e){
            e.printStackTrace();}}}classRepair{//报修String stu_num;//学号String name;//姓名String floor_num;//楼号int layer;//楼层int room_num;//宿舍号String info;//报修详细String yes_no;//是否处理publicRepair(String stu_num,String name,String floor_num,String layer,String room_num,String info,String yes_no){this.stu_num=stu_num;this.name=name;this.floor_num=floor_num;this.layer=Integer.parseInt(layer);this.room_num=Integer.parseInt(room_num);this.info=info;this.yes_no=yes_no;}}classAdvice{//建议与反馈String stu_num;//学号String name;//姓名String info;//详细信息publicAdvice(String stu_num,String name,String info){this.stu_num=stu_num;this.name=name;this.info=info;}}classStu{//学生,用于分配宿舍的信息String stu_num;//学号int grade;//年级String faculty;//院系String clas;//班级publicStu(String stu_num,String grade,String faculty,String clas){this.stu_num=stu_num;this.grade=Integer.parseInt(grade);this.faculty=faculty;this.clas=clas;}}classDor{//宿舍,用于分配宿舍的信息String floor_num;//楼号int layer;//楼层int room_num;//宿舍号int bed_surplus;//剩余床位数publicDor(String floor_num,String layer,String room_num,String bed_surplus){this.floor_num=floor_num;this.layer=Integer.parseInt(layer);this.room_num=Integer.parseInt(room_num);this.bed_surplus=Integer.parseInt(bed_surplus);}}

HomePage类

主页类,main方法包含在此类中,是程序的入口,定义了系统的欢迎界面、登录界面和更换外观功能,以及JDBC操作等。

importjava.sql.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassHomePage{//主页类staticJFrame mainJFrame=newJFrame("学生宿舍管理系统");staticContainer con=mainJFrame.getContentPane();staticboolean flag;//是否为管理员staticint appearance=0;//当前外观staticJLabel lb_appearance=newJLabel("<html>当前外观:<br>默认</html>");//当前外观staticConnection connection=null;publicstaticvoidmain(String[] args){
        mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainJFrame.setResizable(false);
        con.setLayout(null);welcomePage();}publicstaticvoidwelcomePage(){//欢迎界面
        mainJFrame.setSize(550,400);
        mainJFrame.setLocationRelativeTo(null);JPanel pn=newJPanel();
        pn.setSize(550,400);
        pn.setLayout(null);JLabel lb1=newJLabel("欢迎使用"),lb2=newJLabel("学生宿舍管理系统");JButton bt1=newJButton("学生登录"),bt2=newJButton("管理员登录"),bt_changeAppearance=newJButton("更换外观",newImageIcon("image/更换外观.png"));
        lb1.setFont(newFont("黑体",0,35));
        lb1.setBounds(200,30,150,100);
        lb2.setFont(newFont("黑体",0,35));
        lb2.setBounds(128,100,300,80);
        bt1.setFont(newFont("黑体",0,22));
        bt1.setBounds(70,210,170,70);
        bt1.setCursor(newCursor(Cursor.HAND_CURSOR));
        lb_appearance.setFont(newFont("黑体",0,17));
        lb_appearance.setBounds(5,5,150,40);
        bt2.setFont(newFont("黑体",0,22));
        bt2.setBounds(310,210,170,70);
        bt2.setCursor(newCursor(Cursor.HAND_CURSOR));
        bt_changeAppearance.setFont(newFont("黑体",0,17));
        bt_changeAppearance.setBounds(420,10,130,25);
        bt_changeAppearance.setContentAreaFilled(false);
        bt_changeAppearance.setBorderPainted(false);
        bt_changeAppearance.setCursor(newCursor(Cursor.HAND_CURSOR));
        pn.add(lb1);
        pn.add(lb2);
        pn.add(lb_appearance);
        pn.add(bt1);
        pn.add(bt2);
        pn.add(bt_changeAppearance);
        con.add(pn);
        mainJFrame.setVisible(true);
        bt1.addActionListener(newActionListener(){//进入学生登录界面publicvoidactionPerformed(ActionEvent e){
                flag=false;
                con.remove(pn);
                mainJFrame.repaint();loginPage();
                mainJFrame.validate();}});
        bt2.addActionListener(newActionListener(){//进入管理员登录界面publicvoidactionPerformed(ActionEvent e){
                flag=true;
                con.remove(pn);
                mainJFrame.repaint();loginPage();
                mainJFrame.validate();}});
        bt_changeAppearance.addMouseListener(newMouseListener(){//更换整体界面外观publicvoidmouseEntered(MouseEvent arg0){
                bt_changeAppearance.setForeground(Color.blue);}publicvoidmouseExited(MouseEvent arg0){
                bt_changeAppearance.setForeground(null);}publicvoidmouseClicked(MouseEvent arg0){try{
                    appearance++;String lookAndFeel=null;switch(appearance){case1://Windows风格
                        lookAndFeel="com.sun.java.swing.plaf.windows.WindowsLookAndFeel";
                        lb_appearance.setText("<html>当前外观:<br>Windows</html>");break;case2://Nimbus风格
                        lookAndFeel="com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel";
                        lb_appearance.setText("<html>当前外观:<br>Nimbus</html>");break;case3://Windows Classic风格
                        lookAndFeel="com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel";
                        lb_appearance.setText("<html>当前外观:<br>Windows Classic</html>");break;case4://Motif风格
                        lookAndFeel="com.sun.java.swing.plaf.motif.MotifLookAndFeel";
                        lb_appearance.setText("<html>当前外观:<br>Motif</html>");break;case5://默认风格
                        lookAndFeel="javax.swing.plaf.metal.MetalLookAndFeel";
                        lb_appearance.setText("<html>当前外观:<br>默认</html>");break;}UIManager.setLookAndFeel(lookAndFeel);SwingUtilities.updateComponentTreeUI(mainJFrame);if(appearance==5)
                        appearance=0;}catch(Exception ex){System.out.println(ex);}}publicvoidmousePressed(MouseEvent arg0){}publicvoidmouseReleased(MouseEvent arg0){}});}publicstaticvoidloginPage(){//登录界面
        mainJFrame.setSize(550,400);
        mainJFrame.setLocationRelativeTo(null);JPanel pn=newJPanel();
        pn.setSize(550,400);
        pn.setLayout(null);JButton bt1=newJButton("返回",newImageIcon("image/返回.png")),bt2=newJButton("登  录");JTextField tf=newJTextField();JPasswordField pf=newJPasswordField();JLabel lb1,lb2=newJLabel("账号:"),lb3=newJLabel("密码:");if(flag){
            lb1=newJLabel("管理员登录");
            lb1.setFont(newFont("黑体",0,35));
            lb1.setBounds(185,30,180,100);}else{
            lb1=newJLabel("学生登录");
            lb1.setFont(newFont("黑体",0,35));
            lb1.setBounds(200,30,150,100);}
        lb2.setFont(newFont("黑体",0,25));
        lb2.setBounds(100,100,80,100);
        lb3.setFont(newFont("黑体",0,25));
        lb3.setBounds(100,150,80,100);
        tf.setFont(newFont("黑体",0,25));
        tf.setBounds(170,130,230,40);
        pf.setFont(newFont(null,0,25));
        pf.setBounds(170,180,230,40);
        bt2.setFont(newFont("黑体",0,25));
        bt2.setBounds(200,250,150,60);
        bt2.setCursor(newCursor(Cursor.HAND_CURSOR));
        bt1.setFont(newFont("黑体",0,17));
        bt1.setBounds(1,10,92,25);
        bt1.setContentAreaFilled(false);
        bt1.setBorderPainted(false);
        bt1.setCursor(newCursor(Cursor.HAND_CURSOR));
        pn.add(lb1);
        pn.add(lb2);
        pn.add(lb3);
        pn.add(tf);
        pn.add(pf);
        pn.add(bt1);
        pn.add(bt2);
        con.add(pn);
        bt1.addMouseListener(newMouseListener(){//返回到欢迎界面publicvoidmouseEntered(MouseEvent arg0){
                bt1.setForeground(Color.blue);}publicvoidmouseExited(MouseEvent arg0){
                bt1.setForeground(null);}publicvoidmouseClicked(MouseEvent arg0){
                con.remove(pn);
                mainJFrame.repaint();welcomePage();
                mainJFrame.validate();}publicvoidmousePressed(MouseEvent arg0){}publicvoidmouseReleased(MouseEvent arg0){}});
        bt2.addActionListener(newActionListener(){//登录,连接数据库获取账号密码并检验,正确则进入功能界面publicvoidactionPerformed(ActionEvent e){databaseConnection();//连接MySQL数据库if(flag)//进行管理员账号密码检验newLogin().adminLogin(tf.getText(),String.valueOf(pf.getPassword()));else//进行学生账号密码检验newLogin().studentLogin(tf.getText(),String.valueOf(pf.getPassword()));;}});}publicstaticvoiddatabaseConnection(){//连接MySQL数据库finalString JDBC_DRIVER="com.mysql.cj.jdbc.Driver";//JDBC驱动名finalString DB_URL="jdbc:mysql://localhost:3306/dormitory_system?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";//数据库URLfinalString USER="root";//数据库用户名finalString PASS="root";//数据库密码try{Class.forName(JDBC_DRIVER);//加载JDBC驱动
            connection=DriverManager.getConnection(DB_URL,USER,PASS);//连接数据库}catch(SQLException e){
            e.printStackTrace();}catch(Exception e){
            e.printStackTrace();}}}

Login类

登录类,用于进行登录验证,包括学生、宿管、系统管理员的登录。

importjava.sql.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassLogin{//登录类JLabel lb_tips=newJLabel();//提示窗口的内容publicvoidadminLogin(String account,String password){//管理员登录(包括系统管理员和宿管)boolean flag=false;//是否查找到相应账号密码if(account.equals("admin")&& password.equals("admin")){//检验是否为系统管理员账号密码,若是,则进入系统管理员功能界面
            lb_tips.setText("登录成功!");loginTips();newSysAdminFunction();HomePage.mainJFrame.dispose();}else{//若不是,则进行宿管账号密码检测String admin_num=null, pass;//宿管账号密码try{String sql="SELECT admin_num, password FROM admin";//SQL语句PreparedStatement ps;//创建PreparedStatement类对象ps,用来执行SQL语句
                ps=HomePage.connection.prepareStatement(sql);//把操作数据库返回的结果保存到ps中ResultSet rs=ps.executeQuery(sql);//ResultSet类,用来存放获取的结果集while(rs.next()){//遍历结果集
                    admin_num=rs.getString("admin_num");
                    pass=rs.getString("password");if(account.equals(admin_num)&& password.equals(pass)){
                        flag=true;break;}}
                rs.close();
                ps.close();}catch(SQLException e){
                e.printStackTrace();}if(flag){//若宿管账号密码正确,则进入宿管功能界面
                lb_tips.setText("登录成功!");loginTips();newDorAdminFunction(admin_num);HomePage.mainJFrame.dispose();}else{//若账号密码错误,则进行提示
                lb_tips.setText("账号或密码错误!");loginTips();try{HomePage.connection.close();//关闭数据库连接}catch(SQLException e){
                    e.printStackTrace();}}}}publicvoidstudentLogin(String account,String password){//学生登录boolean flag=false;//是否查找到相应账号密码String stu_num=null, pass;//学生账号密码try{String sql="SELECT stu_num, password FROM student";//SQL语句PreparedStatement ps;//创建PreparedStatement类对象ps,用来执行SQL语句
            ps=HomePage.connection.prepareStatement(sql);//把操作数据库返回的结果保存到ps中ResultSet rs=ps.executeQuery(sql);//ResultSet类,用来存放获取的结果集while(rs.next()){//遍历结果集
                stu_num=rs.getString("stu_num");
                pass=rs.getString("password");if(account.equals(stu_num)&& password.equals(pass)){
                    flag=true;break;}}
            rs.close();
            ps.close();}catch(SQLException e){
            e.printStackTrace();}if(flag){//若学生账号密码正确,则进入学生功能界面
            lb_tips.setText("登录成功!");loginTips();newStudentFunction(stu_num);HomePage.mainJFrame.dispose();}else{//若账号密码错误,则进行提示
            lb_tips.setText("账号或密码错误!");loginTips();try{HomePage.connection.close();//关闭数据库连接}catch(SQLException e){
                e.printStackTrace();}}}publicvoidloginTips(){//登录时弹出的提示信息窗口JDialog tips=newJDialog(HomePage.mainJFrame,"  提示",true);JPanel pn_tips=newJPanel();JButton bt_tips=newJButton("确 定");
        tips.setSize(450,200);
        tips.setLocationRelativeTo(null);
        tips.setResizable(false);
        tips.setLayout(null);
        pn_tips.setBounds(0,30,450,70);
        lb_tips.setFont(newFont("黑体",0,25));
        bt_tips.setFont(newFont("黑体",0,20));
        bt_tips.setBounds(175,100,100,50);
        bt_tips.setCursor(newCursor(Cursor.HAND_CURSOR));
        pn_tips.add(lb_tips);
        tips.add(pn_tips);
        tips.add(bt_tips);
        bt_tips.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvent e){
                tips.dispose();}});
        tips.setVisible(true);}}

… …
其他代码请见程序源码!

后记

本文章是为了记录下作者自己的过往,同时供各位学习参考,文章主要展示程序功能,详细程序代码及介绍请至文章开头处GitHub链接下载相应资源。

本程序仅供学习和参考,请勿抄袭或另作他用。

感谢观看,有什么问题可在下方评论区进行评论,若觉得本文章写得不错,还请点个赞呢。

关注我,收看更多精彩!( • ̀ω•́ )✧求点赞、评论、收藏、关注

标签: java 开发语言 sql

本文转载自: https://blog.csdn.net/XiuMu_0216/article/details/125859958
版权归原作者 朽木冰天 所有, 如有侵权,请联系我们删除。

“数据库大作业-学生宿舍管理系统”的评论:

还没有评论