赞
踩
此程序是本人大二时期的数据库大作业,初学数据库后所编写的一个程序,是一个学生宿舍管理系统,可实现学生宿舍的管理。
本程序使用Java编写,使用eclipse进行开发,数据库使用MySQL数据库搭配Navicat进行数据管理,程序使用JDBC技术进行数据库连接,使用Java Swing开发图形化界面,整个系统界面美观、功能丰富。本系统点击首页的“更换外观”按钮可切换不同风格的外观,系统分为三个模式,学生模式、宿管模式和系统管理模式,分别面向学生、宿管和系统管理员,不同的模式有不同的功能,详细请见下方介绍。
本系统功能完善且丰富(可以将系统内的各种信息导出为excel文件哦),程序检错能力强,界面简洁好看(每个组件都经过细心调整),但当时偷懒,所以有些代码并没有经过优化,可能有些繁杂,且为了界面美观,有大部分代码都在调整界面组件,请勿介意,读者可自行取其精华去其糟粕。
程序源代码及程序设计说明书可点击下方链接进行下载,供各位需要的人学习参考。
下载链接:学生宿舍管理系统
本系统的数据库共有8张表格,数据库表格设计及ER图如下所示,详细数据设计请至文章开头处下载数据设计表或程序设计说明书,进行查看。
程序大概流程如下图:
本程序功能及细节颇多,在此仅展示部分功能,若想了解完整功能及细节,请至文章开头处下载程序,进行体验。
打开本程序,首先来到欢迎界面,在此可选择学生登录和管理员登录,点击右上角“更换外观”可更改系统整体外观,共有5种不同风格的外观。
在欢迎界面点击“学生登录”,然后输入学生账号密码,登录成功系统将进入学生模式;点击“管理员登录”,然后输入宿管账号密码,登录成功系统将进入宿管模式,若账号密码均输入“admin”,系统将进入系统管理模式。
学生模式面向的群体是学生,学生输入自己的账号(即学号)和密码后,即可进入学生模式的菜单界面,在此可选择相应功能,学生模式的功能较少,功能如下。
“个人信息”功能,可查看自己的个人详细信息。
“宿舍报修”功能,可在此界面进行宿舍报修,提交的信息将被保存到数据库中,并在宿管模式和系统管理模式的相应界面展示。
“建议与反馈”功能,可在此界面进行建议与反馈,提交的信息将被保存到数据库中,并在宿管模式和系统管理模式的相应界面展示。
“修改密码”功能,可在此界面修改自己的密码,需输入旧密码和两次新密码,输入错误会有相应的提示。
系统管理模式面向的群体是系统管理员,管理员输入指定的账号和密码(均为admin)后,即可进入系统管理模式的菜单界面,在此可选择相应功能,系统管理模式的功能最多最全,可对学生、宿管、宿舍等进行全面管理,具体功能如下。
系统管理模式下可对宿舍楼、宿舍、宿管、学生、住宿信息进行全面管理,包括增删改查等,下面以“学生管理”为例展示管理功能。
点击“学生管理”,来到学生管理界面,在此可看到所有学生的简易信息。
点击某个学生行的“查看”按钮,可查看该学生的详细信息,在此可进行学生信息的修改和删除。
如点击“修改学生信息”按钮,则进行学生信息的修改操作,修改完成点击“保存”,信息会在数据库同步更新。
在“学生管理”界面点击上方的“添加”按钮,可向系统中添加学生,输入完整的学生信息并确认添加后,信息将被保存至数据库,成功添加学生。
在“学生管理”界面点击上方的“导出”按钮,可将学生信息导出成excel表格文件。
在“学生管理”界面点击顶部的“查询”按钮,将来到学生信息的查询界面,输入指定条件并点击“查询”,系统将查询出符合条件的学生,如下查询所有2019级的学生。
以上展示了“学生管理”功能,其他管理功能与此类似。
“寝室分配”功能,可自动为学生分配寝室,代替手动分配,以节省人力,若想精确分配、按意愿分配寝室,则需手动在“住宿管理”界面进行分配。
“出入登记”功能,可登记学生出入宿舍楼的记录,可添加、删除、导出、查询出入记录,点击上方“登记”按钮,添加出入记录,输入相应信息,其中输入学号后将自动显示相应姓名,点击界面右侧的“获取当前时间”,可自动获取当前时间并自动输入。
“宿舍报修”功能,在此界面可查看到所有学生提交的宿舍报修信息,点击“查看”按钮,可查看详细的报修信息,报修详细界面中可处理报修、删除报修,宿舍报修信息亦可导出和查询。
“建议与反馈”功能,在此界面可查看到所有学生提交的建议与反馈,点击“查看”按钮,可进入详细界面查看详细内容,也可在此进行删除,建议与反馈亦可导出。
“删库跑路”功能,此功能需输入密码“ESCAPE”,然后点击“确认删库跑路”按钮,即可删除本系统的数据库进行跑路 ,此功能成功执行后,将自动退出程序,系统将无法继续使用。
宿管模式面向的群体是宿管,宿管输入自己的账号(即编号)和密码后,即可进入宿管模式的菜单界面,在此可选择相应功能,宿管模式的功能与系统管理模式类似,不同之处在于,宿管模式下宿管仅能对自己所管理的宿舍楼进行操作,由于两者功能类似,故在此不再展示宿管模式的功能,读者可下载程序自行进行体验。
本程序代码巨多且有详细注释,在此仅展示部分重要代码,完整代码请至文章开头处下载程序,进行了解。
为了系统界面的美观强迫症患者 ,所以本程序的很多代码都在调整界面组件,请别介意。
信息类,定义各种对象的类,如:宿舍、学生、宿管等。
import java.util.*; import java.text.*; //各种信息类 public class Info { } class Floor { //宿舍楼 String floor_num; //楼号 int layer_amount; //层数 int room_amount; //房间数 String category; //类别 String sex; //居住时间 String admin_num; //宿管编号 public Floor(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; } } class Dormitory { //宿舍 String floor_num; //楼号 int layer; //楼层 int room_num; //宿舍号 int bed_total; //总床位数 int bed_surplus; //剩余床位数 int price; //单价 public Dormitory(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); } } class Admin { //宿管 String admin_num; //编号 String password; //密码 String name; //姓名 String sex; //性别 String phone; //手机 public Admin(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; } } class Student { //学生 String stu_num; //学号 String password; //密码 String name; //姓名 String sex; //性别 int birth; //出生日期 int grade; //年级 String faculty; //院系 String clas; //班级 String phone; //手机号 String yes_no; //是否入住 public Student(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; } } class Stay { //住宿 String stu_num; //学号 String name; //姓名 String floor_num; //楼号 int layer; //楼层 int room_num; //宿舍号 Date time; //入住时间 public Stay(String stu_num, String name, String floor_num, String layer, String room_num, String time) { SimpleDateFormat timeFormat=new SimpleDateFormat("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(); } } } class InOut { //出入 String stu_num; //学号 String name; //姓名 String floor_num; //楼号 String category; //类别 Date time; //时间 public InOut(String stu_num, String name, String floor_num, String category, String time) { SimpleDateFormat timeFormat=new SimpleDateFormat("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(); } } } class Repair { //报修 String stu_num; //学号 String name; //姓名 String floor_num; //楼号 int layer; //楼层 int room_num; //宿舍号 String info; //报修详细 String yes_no; //是否处理 public Repair(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; } } class Advice { //建议与反馈 String stu_num; //学号 String name; //姓名 String info; //详细信息 public Advice(String stu_num, String name, String info) { this.stu_num=stu_num; this.name=name; this.info=info; } } class Stu { //学生,用于分配宿舍的信息 String stu_num; //学号 int grade; //年级 String faculty; //院系 String clas; //班级 public Stu(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; } } class Dor { //宿舍,用于分配宿舍的信息 String floor_num; //楼号 int layer; //楼层 int room_num; //宿舍号 int bed_surplus; //剩余床位数 public Dor(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); } }
主页类,main方法包含在此类中,是程序的入口,定义了系统的欢迎界面、登录界面和更换外观功能,以及JDBC操作等。
import java.sql.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class HomePage { //主页类 static JFrame mainJFrame=new JFrame("学生宿舍管理系统"); static Container con=mainJFrame.getContentPane(); static boolean flag; //是否为管理员 static int appearance=0; //当前外观 static JLabel lb_appearance=new JLabel("<html>当前外观:<br>默认</html>"); //当前外观 static Connection connection=null; public static void main(String[] args) { mainJFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainJFrame.setResizable(false); con.setLayout(null); welcomePage(); } public static void welcomePage() { //欢迎界面 mainJFrame.setSize(550,400); mainJFrame.setLocationRelativeTo(null); JPanel pn=new JPanel(); pn.setSize(550,400); pn.setLayout(null); JLabel lb1=new JLabel("欢迎使用"),lb2=new JLabel("学生宿舍管理系统"); JButton bt1=new JButton("学生登录"),bt2=new JButton("管理员登录"),bt_changeAppearance=new JButton("更换外观",new ImageIcon("image/更换外观.png")); lb1.setFont(new Font("黑体",0,35)); lb1.setBounds(200,30,150,100); lb2.setFont(new Font("黑体",0,35)); lb2.setBounds(128,100,300,80); bt1.setFont(new Font("黑体",0,22)); bt1.setBounds(70,210,170,70); bt1.setCursor(new Cursor(Cursor.HAND_CURSOR)); lb_appearance.setFont(new Font("黑体",0,17)); lb_appearance.setBounds(5,5,150,40); bt2.setFont(new Font("黑体",0,22)); bt2.setBounds(310,210,170,70); bt2.setCursor(new Cursor(Cursor.HAND_CURSOR)); bt_changeAppearance.setFont(new Font("黑体",0,17)); bt_changeAppearance.setBounds(420,10,130,25); bt_changeAppearance.setContentAreaFilled(false); bt_changeAppearance.setBorderPainted(false); bt_changeAppearance.setCursor(new Cursor(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(new ActionListener() { //进入学生登录界面 public void actionPerformed(ActionEvent e) { flag=false; con.remove(pn); mainJFrame.repaint(); loginPage(); mainJFrame.validate(); } }); bt2.addActionListener(new ActionListener() { //进入管理员登录界面 public void actionPerformed(ActionEvent e) { flag=true; con.remove(pn); mainJFrame.repaint(); loginPage(); mainJFrame.validate(); } }); bt_changeAppearance.addMouseListener(new MouseListener() { //更换整体界面外观 public void mouseEntered(MouseEvent arg0) { bt_changeAppearance.setForeground(Color.blue); } public void mouseExited(MouseEvent arg0) { bt_changeAppearance.setForeground(null); } public void mouseClicked(MouseEvent arg0) { try { appearance++; String lookAndFeel=null; switch(appearance) { case 1: //Windows风格 lookAndFeel="com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; lb_appearance.setText("<html>当前外观:<br>Windows</html>"); break; case 2: //Nimbus风格 lookAndFeel="com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel"; lb_appearance.setText("<html>当前外观:<br>Nimbus</html>"); break; case 3: //Windows Classic风格 lookAndFeel="com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel"; lb_appearance.setText("<html>当前外观:<br>Windows Classic</html>"); break; case 4://Motif风格 lookAndFeel="com.sun.java.swing.plaf.motif.MotifLookAndFeel"; lb_appearance.setText("<html>当前外观:<br>Motif</html>"); break; case 5: //默认风格 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); } } public void mousePressed(MouseEvent arg0){} public void mouseReleased(MouseEvent arg0){} }); } public static void loginPage() { //登录界面 mainJFrame.setSize(550,400); mainJFrame.setLocationRelativeTo(null); JPanel pn=new JPanel(); pn.setSize(550,400); pn.setLayout(null); JButton bt1=new JButton("返回",new ImageIcon("image/返回.png")),bt2=new JButton("登 录"); JTextField tf=new JTextField(); JPasswordField pf=new JPasswordField(); JLabel lb1,lb2=new JLabel("账号:"),lb3=new JLabel("密码:"); if(flag) { lb1=new JLabel("管理员登录"); lb1.setFont(new Font("黑体",0,35)); lb1.setBounds(185,30,180,100); } else { lb1=new JLabel("学生登录"); lb1.setFont(new Font("黑体",0,35)); lb1.setBounds(200,30,150,100); } lb2.setFont(new Font("黑体",0,25)); lb2.setBounds(100,100,80,100); lb3.setFont(new Font("黑体",0,25)); lb3.setBounds(100,150,80,100); tf.setFont(new Font("黑体",0,25)); tf.setBounds(170,130,230,40); pf.setFont(new Font(null,0,25)); pf.setBounds(170,180,230,40); bt2.setFont(new Font("黑体",0,25)); bt2.setBounds(200,250,150,60); bt2.setCursor(new Cursor(Cursor.HAND_CURSOR)); bt1.setFont(new Font("黑体",0,17)); bt1.setBounds(1,10,92,25); bt1.setContentAreaFilled(false); bt1.setBorderPainted(false); bt1.setCursor(new Cursor(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(new MouseListener() { //返回到欢迎界面 public void mouseEntered(MouseEvent arg0) { bt1.setForeground(Color.blue); } public void mouseExited(MouseEvent arg0) { bt1.setForeground(null); } public void mouseClicked(MouseEvent arg0) { con.remove(pn); mainJFrame.repaint(); welcomePage(); mainJFrame.validate(); } public void mousePressed(MouseEvent arg0){} public void mouseReleased(MouseEvent arg0){} }); bt2.addActionListener(new ActionListener() { //登录,连接数据库获取账号密码并检验,正确则进入功能界面 public void actionPerformed(ActionEvent e) { databaseConnection(); //连接MySQL数据库 if(flag) //进行管理员账号密码检验 new Login().adminLogin(tf.getText(),String.valueOf(pf.getPassword())); else //进行学生账号密码检验 new Login().studentLogin(tf.getText(),String.valueOf(pf.getPassword()));; } }); } public static void databaseConnection() { //连接MySQL数据库 final String JDBC_DRIVER="com.mysql.cj.jdbc.Driver"; //JDBC驱动名 final String DB_URL="jdbc:mysql://localhost:3306/dormitory_system?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; //数据库URL final String USER="root"; //数据库用户名 final String 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(); } } }
登录类,用于进行登录验证,包括学生、宿管、系统管理员的登录。
import java.sql.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Login { //登录类 JLabel lb_tips=new JLabel(); //提示窗口的内容 public void adminLogin(String account,String password) { //管理员登录(包括系统管理员和宿管) boolean flag=false; //是否查找到相应账号密码 if(account.equals("admin") && password.equals("admin")) { //检验是否为系统管理员账号密码,若是,则进入系统管理员功能界面 lb_tips.setText("登录成功!"); loginTips(); new SysAdminFunction(); 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(); new DorAdminFunction(admin_num); HomePage.mainJFrame.dispose(); } else { //若账号密码错误,则进行提示 lb_tips.setText("账号或密码错误!"); loginTips(); try { HomePage.connection.close(); //关闭数据库连接 } catch (SQLException e) { e.printStackTrace(); } } } } public void studentLogin(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(); new StudentFunction(stu_num); HomePage.mainJFrame.dispose(); } else { //若账号密码错误,则进行提示 lb_tips.setText("账号或密码错误!"); loginTips(); try { HomePage.connection.close(); //关闭数据库连接 } catch (SQLException e) { e.printStackTrace(); } } } public void loginTips() { //登录时弹出的提示信息窗口 JDialog tips=new JDialog(HomePage.mainJFrame," 提示",true); JPanel pn_tips=new JPanel(); JButton bt_tips=new JButton("确 定"); tips.setSize(450,200); tips.setLocationRelativeTo(null); tips.setResizable(false); tips.setLayout(null); pn_tips.setBounds(0,30,450,70); lb_tips.setFont(new Font("黑体",0,25)); bt_tips.setFont(new Font("黑体",0,20)); bt_tips.setBounds(175,100,100,50); bt_tips.setCursor(new Cursor(Cursor.HAND_CURSOR)); pn_tips.add(lb_tips); tips.add(pn_tips); tips.add(bt_tips); bt_tips.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { tips.dispose(); } }); tips.setVisible(true); } }
… …
其他代码请见程序源码!
本文章是为了记录下作者自己的过往,同时供各位学习参考,文章主要展示程序功能,详细程序代码及介绍请至文章开头处下载相应资源。
本程序仅供学习和参考,请勿抄袭或另作他用。
感谢观看,有什么问题可在下方评论区进行评论,若觉得本文章写得不错,还请点个赞呢。
关注我,收看更多精彩!( • ̀ω•́ )✧求点赞、评论、收藏、关注
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。