Java-学生宿舍管理系统

Java-学生宿舍管理系统这次记录的是最近完成的实训作业 学生宿舍管理系统 使用 Javaswing 完成界面设计 数据库用的是 SQLserver IDE 使用的是 IDEA 学生宿舍管理系统的用户有宿管和学生 宿管有最高的权限 学生只有部分权限 一 宿舍楼管理员 a 信息要求 宿舍楼管理员能查询上面提到的宿舍楼的所有相关信息 包括某一学号的学生在宿舍楼中住宿的详细信息 快件收发的所有信息 报修的所有信息

更新:因为好多人说连不上数据库或者没有数据库表,所以现在更新了代码,从SQL server改为MySQL,同时附有数据库表文件。同时有些同学GitHub登录不了,于是把资源放在了CSDN,有任何问题可以评论或者私信我

(GitHub还是有之前的代码)

                                                                                                                                        2021-10-20

Java-学生宿舍管理系统

PS:登录报错的多半是没有MySQL驱动,把你下载下来的资源包中mysql的jar包加入到项目就行了

2021-12-22更新:

学生离校与返校的功能中,因为表名与数据库关键字重名里,因此插入会报错,你可以选择修改表名,或者如下图修改,给leave表名变成`leave`

Java-学生宿舍管理系统

 

这次记录的是最近完成的实训作业,学生宿舍管理系统,使用Java swing完成界面设计,数据库用的是SQL server,IDE使用的是IDEA

学生宿舍管理系统的用户有宿管和学生,宿管有最高的权限,学生只有部分权限,

一、宿舍楼管理员:
    a.

信息要求:

宿舍楼管理员能查询上面提到的宿舍楼的所有相关信息,包括某一学号的学生在宿舍楼中住宿的详细信息,快件收发的所有信息,报修的所有信息,夜归的详细信息和学生离返校的信息。以利于对整个宿舍楼的全面管理。

b.处理要求:

当学生基本信息发生变化时,宿舍楼管理员能对其进行修改。比如,某些同学搬到其他的宿舍中去,他们在本宿舍楼中相应的记录就应该删去;或者学生转换专业,他们记录中院系的信息也要作相应的修改等等。

当宿舍楼的电话号码发生变更时,宿舍楼管理员能根据有关证明做出修改。

当快件到达本宿舍楼时,宿舍楼管理员应依据到达快件的相关信息在快件信息中插入一条记录,当同学们接收快件后,管理员应登记快件的接收时间,表明该信件已成功到达收信人的手中。

当宿舍财产报修及时解决后,管理员应登记解决时间,表明该报修问题已成功解决。

二、本宿舍楼的学生:

    a.信息要求:

本宿舍楼的学生能查询其所在的宿舍的所有信息,能查询本楼的指定宿舍的电话号码以利于同楼宿舍间的通信。能查询自己的快件信息。能查询自己的夜归记录和离返校记录。

b.处理要求:

本宿舍楼的学生能在报修信息表中插入报修信息,表示本宿舍的财产发生了损毁需要学校派人维修。·

学生离校时,能在离返校记录表中插入离校时间;学生返校后,能在离返校记录表中插入返校时间,表示已经回校。

根据下面来建立表

住宿学生数据字典:

属性名

存储代码

类型

长度

备注

学号

Sno

char

20

住宿学生学号

姓名

Sname

char

20

住宿学生姓名

性别

Ssex

char

4

专业

Sdept

char

40

学生专业

宿舍号

Dno

char

6

住宿学生宿舍号

入住时间

Scheckin

date

8

新生搬入时间

宿舍数据字典:

属性名

存储代码

类型

长度

备注

宿舍号

Dno

char

6

宿舍电话

Dphone

char

15

宿舍财产数据字典:

属性名

存储代码

类型

长度

备注

物品号

Pno

Int

2

宿舍物品编号

物品名

Pname

char

20

宿舍物品名

邮件快递数据字典:

属性名

存储代码

类型

长度

备注

姓名

Sname

char

20

收件人姓名

宿舍号

Dno

char

6

收件人宿舍号

到达时间

Marrive

date

8

邮件快递到达时间

接收时间

Mreceive

date

8

收件人接收时间

邮件数量

Mnumber

tinyint

2

学生收到邮件数量

报修数据字典:

属性名

存储代码

类型

长度

备注

宿舍号

Dno

char

6

报修人宿舍号

物品号

Pno

Int

2

报修物品编号

提交日期

Rsubmit

date

8

报修提交日期

解决日期

Rsolve

date

8

问题解决日期

报修原因

Rreason

char

50

物品损坏原因

晚归数据字典:

属性名

存储代码

类型

长度

备注

学号

Sno

char

20

晚归学生姓名

宿舍号

Dno

char

6

晚归学生宿舍号

晚归时间

Btime

timestamp

14

学生晚归时间

晚归原因

Breasonr

Char

10

学生晚归原因

离校数据字典:

属性名

存储代码

类型

长度

备注

学号

Sno

char

20

离校学生姓名

宿舍号

Dno

char

6

离校学生宿舍号

离校时间

Ltime

date

8

学生离校时间

返回时间

Lreturn

date

8

学生返校时间

用户数据字典:

属性名

存储代码

类型

长度

备注

用户ID

Uname

char

20

用户密码

Upassword

char

20

用户类型

Utype

tnyint

1

普通或超级用户

本次使用了卡片布局器(CardLayout)和选项卡布局器(JTabbedPane)来构成界面主体,登录界面和操作界面之间使用卡片布局器进行切换,(控件的位置请忽略,因为我懒得弄好看了……)

Java-学生宿舍管理系统

正确输入用户名,密码之后切换到操作界面

Java-学生宿舍管理系统

Java-学生宿舍管理系统

操作界面使用选项卡布局器来操作不同的表

Java-学生宿舍管理系统

界面和操作界面代码(前面忘了说了,因为只是为了完成实训作业,并没有想着后期的维护,所以我的代码写的很烂,只是完成了功能,我会加上注释让你们尽可能的看明白,日后再把代码规范起来):

public class login extends JFrame implements ActionListener { JLabel user, password; JTextField username; JPasswordField passwordField; JButton loginButton; CardLayout cardLayout = new CardLayout(); JPanel card; JPanel cardPanel; JTabbedPane jTabbedPane; int type=1; Users users; public login() { init(); } private void init() {//初始化界面 setTitle("宿舍管理系统"); setLayout(new BorderLayout()); user = new JLabel("用户名"); password = new JLabel("密码"); card = new JPanel(cardLayout); JPanel panel1 = new JPanel(new BorderLayout()); username = new JTextField(); passwordField = new JPasswordField(); loginButton = new JButton("登录"); loginButton.addActionListener(this); JPanel titlepanel = new JPanel(new FlowLayout());//标题面板 JLabel title = new JLabel("学生宿舍管理系统"); titlepanel.add(title); JPanel loginpanel = new JPanel();//登录面板 loginpanel.setLayout(null); user.setBounds(50, 20, 50, 20); password.setBounds(50, 60, 50, 20); username.setBounds(110, 20, 120, 20); passwordField.setBounds(110, 60, 120, 20); loginpanel.add(user); loginpanel.add(password); loginpanel.add(username); loginpanel.add(passwordField); panel1.add(titlepanel, BorderLayout.NORTH); panel1.add(loginpanel, BorderLayout.CENTER); panel1.add(loginButton, BorderLayout.SOUTH); card.add(panel1, "login"); //card.add(cardPanel, "info"); add(card); setBounds(600, 200, 900, 600); setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new login(); } @Override public void actionPerformed(ActionEvent e) { boolean flag=false;//用来标志用户是否正确 if (e.getSource() == loginButton) { ArrayList 
  
    list = new CheckUsers().getUsers();//获得所有用户信息 for (int i = 0; i < list.size(); i++) {//遍历所有用户信息,以此来判断输入的信息是否正确 users = list.get(i); String passwordStr = new String(passwordField.getPassword()); if (username.getText().equals(users.getName()) && passwordStr.equals(users.getPassword())) { if(users.getType()==1){//如果时学生 type=users.getType(); JOptionPane.showMessageDialog(null, "欢迎登录(学生)", "学生宿舍管理系统", JOptionPane.PLAIN_MESSAGE); }else{//如果时宿管 type=users.getType(); System.out.println(type); JOptionPane.showMessageDialog(null, "欢迎登录(宿管)", "学生宿舍管理系统", JOptionPane.PLAIN_MESSAGE); } flag = true; break;//如果信息正确就退出遍历,提高效率 } } if(!flag){//信息不正确,重新输入 JOptionPane.showMessageDialog(null, "请输入正确的用户名或密码", "警告",JOptionPane.WARNING_MESSAGE); username.setText(""); passwordField.setText(""); }else{ //当输入的信息正确时,就开始加载选项卡界面,并把选项卡界面加入到卡片布局器中 DormitoryInfo dormitoryInfo = new DormitoryInfo(users,type);//宿舍信息 Express express = new Express(type,users);//快件信息 Renovation renovation = new Renovation(type,users);//维修信息 OutAndIn outAndIn = new OutAndIn(type,users);//学生离校和回校信息 Things things=new Things(type,users);//宿舍物品信息 Later later = new Later(type,users);//晚归信息 cardPanel = new JPanel(); jTabbedPane = new JTabbedPane(JTabbedPane.LEFT); jTabbedPane.add("宿舍信息", dormitoryInfo); jTabbedPane.add("快件信息", express); jTabbedPane.add("维修信息", renovation); jTabbedPane.add("学生离校与返校", outAndIn); jTabbedPane.add("晚归记录", later); jTabbedPane.add("宿舍物品", things); cardPanel.add(jTabbedPane); card.add(cardPanel, "info"); cardLayout.show(card, "info");//输入信息正确就显示操作界面,否则重新输入正确信息 } } } } 
  

数据库的数据显示:我用的是表格来显示数据,这样能够看起来整齐点

 JTable table=new JTable(); String[] col = { "学号", "姓名", "性别","专业","宿舍号","入住时间" }; DefaultTableModel mm = new DefaultTableModel(col, 0); // 定义一个表的模板 while (resultSet.next()){//把数据库中的数据添加到表格中 String Sno=resultSet.getString(1); String Sname=resultSet.getString(2); String Ssex=resultSet.getString(3); String Sdept=resultSet.getString(4); String Dno=resultSet.getString(5); String Scheckin=resultSet.getString(6); String[] data={Sno,Sname,Ssex,Sdept,Dno,Scheckin}; mm.addRow(data); }

SQL server连接

SQL server的下载。和SQL server的JDBC怎么搞,我这里就不多说了,网上教程很多,也不难

public class GetConnection { private Connection con=null; public Connection GetConnection(){ String URL="jdbc:sqlserver://localhost:1433;DatabaseName=students"; String USER="sa"; String KEY=""; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); con= DriverManager.getConnection(URL, USER, KEY); } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return con; } }

因为代码不少,全部放上来有点太长了,所以我这里只写其中一个,其他的都是大同小异无非就是对数据库的增删改查,源码我会放在我的Github上

宿管对于宿舍信息的操作,当有学生换宿舍或者换专业的时候,宿管能够对该学生的宿舍信息进行修改并保存到数据库中,

Java-学生宿舍管理系统

Java-学生宿舍管理系统

代码:(再次声明,我的代码只是为了完成作业,不建议像我这样写代码,很杂乱,不仅难理解还难维护)

public class DormitoryInfo extends JPanel implements ActionListener { Connection connection = new GetConnection().GetConnection(); Users users;//当前用户 int type;//用户类型 String Dno="";//宿舍号 JTable table=new JTable(); String[] col = { "学号", "姓名", "性别","专业","宿舍号","入住时间" }; DefaultTableModel mm = new DefaultTableModel(col, 0); // 定义一个表的模板 JLabel Sdept,suse,name; JTextField SdeptText,suseText,nameText; JButton submit; JPanel suguan; public DormitoryInfo(Users users,int type){//从登录界面传回,用户名和用户类型 this.type=type; this.users=users; setLayout(new FlowLayout()); table.setModel(mm); table.setRowSorter(new TableRowSorter<>(mm));//排序 JPanel jPanel=new JPanel(new FlowLayout()); JScrollPane js=new JScrollPane(table); jPanel.add(js); add(jPanel); search(); } private void search(){ PreparedStatement state; ResultSet resultSet; if(type==1){//如果是学生,只显示学生自己宿舍的信息 try { inquire(); String select="select Dno from student where Sname"+"="+"'"+users.getName()+"'"; state=connection.prepareStatement(select); resultSet=state.executeQuery(); while (resultSet.next()){ Dno=resultSet.getString("Dno"); } System.out.println(users.getName()+users.getName().length()); select="select*from student where Dno"+"="+"'"+Dno+"'"; state=connection.prepareStatement(select); resultSet = state.executeQuery(); while (resultSet.next()){ String Sno=resultSet.getString(1); String Sname=resultSet.getString(2); String Ssex=resultSet.getString(3); String Sdept=resultSet.getString(4); String Dno=resultSet.getString(5); String Scheckin=resultSet.getString(6); String[] data={Sno,Sname,Ssex,Sdept,Dno,Scheckin}; mm.addRow(data); } } catch (SQLException e) { e.printStackTrace(); } }else if(type==2){//如果是宿管,则显示全部学生的宿舍 try { xiugai(); state=connection.prepareStatement("select *from student"); resultSet = state.executeQuery(); while (resultSet.next()){ String Sno=resultSet.getString(1); String Sname=resultSet.getString(2); String Ssex=resultSet.getString(3); String Sdept=resultSet.getString(4); String Dno=resultSet.getString(5); String Scheckin=resultSet.getString(6); String[] data={Sno,Sname,Ssex,Sdept,Dno,Scheckin}; mm.addRow(data); } }catch (Exception e){ e.printStackTrace(); } } } private void inquire(){//学生只能查询任意宿舍的电话 suse=new JLabel("宿舍号"); suseText=new JTextField(10); submit=new JButton("查询"); submit.addActionListener(this); suguan=new JPanel(new GridLayout(2, 2)); suguan.add(suse);suguan.add(suseText);suguan.add(submit); add(suguan); } private void xiugai(){//宿管修改学生的宿舍信息 Sdept=new JLabel("学院"); suse=new JLabel("宿舍号"); SdeptText=new JTextField(10); suseText=new JTextField(10); name=new JLabel("名字"); nameText=new JTextField(10); suguan=new JPanel(new GridLayout(4, 2)); submit=new JButton("提交"); submit.addActionListener(this); suguan.add(name);suguan.add(nameText); suguan.add(Sdept);suguan.add(SdeptText); suguan.add(suse);suguan.add(suseText); add(suguan); suguan.add(submit); } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==submit&&type==2){//如果点击按钮的是宿管 try { if (suseText.getText().length()>0&&SdeptText.getText().length()==0){//只修改宿舍号 Statement statement = connection.createStatement(); String sql="update student set Dno="+"'"+suseText.getText()+"'"+"where Sname"+"="+"'"+nameText.getText()+"'"; statement.executeUpdate(sql); PreparedStatement state; ResultSet resultSet; state=connection.prepareStatement("select *from student"); resultSet = state.executeQuery(); while(mm.getRowCount()>0){//把表格进行刷新,下次显示的时候重头开始显示 //System.out.println(model.getRowCount()); mm.removeRow(mm.getRowCount()-1); } while (resultSet.next()){//把更新后的数据重新显示到表格中,下同 String Sno=resultSet.getString(1); String Sname=resultSet.getString(2); String Ssex=resultSet.getString(3); String Sdept=resultSet.getString(4); String DDno=resultSet.getString(5); String Scheckin=resultSet.getString(6); String[] data={Sno,Sname,Ssex,Sdept,DDno,Scheckin}; mm.addRow(data); } } if(suseText.getText().length()==0&&SdeptText.getText().length()>0){//只修改所在系 Statement statement = connection.createStatement(); String sql="update student set Sdept="+"'"+SdeptText.getText()+"'"+"where Sname"+"="+"'"+nameText.getText()+"'"; statement.executeUpdate(sql); PreparedStatement state; ResultSet resultSet; state=connection.prepareStatement("select *from student"); resultSet = state.executeQuery(); while(mm.getRowCount()>0){//把表格进行刷新,下次显示的时候重头开始显示 //System.out.println(model.getRowCount()); mm.removeRow(mm.getRowCount()-1); } while (resultSet.next()){ String Sno=resultSet.getString(1); String Sname=resultSet.getString(2); String Ssex=resultSet.getString(3); String Sdept=resultSet.getString(4); String DDno=resultSet.getString(5); String Scheckin=resultSet.getString(6); String[] data={Sno,Sname,Ssex,Sdept,DDno,Scheckin}; mm.addRow(data); } } if(suseText.getText().length()>0&&SdeptText.getText().length()>0){//同时修改专业和宿舍 Statement statement = connection.createStatement(); String sql="update student set Sdept="+"'"+SdeptText.getText()+"'"+", Dno="+ "'"+suseText.getText()+"'" +"where Sname"+"="+"'"+nameText.getText()+"'"; statement.executeUpdate(sql); PreparedStatement state; ResultSet resultSet; state=connection.prepareStatement("select *from student"); resultSet = state.executeQuery(); while(mm.getRowCount()>0){//把表格进行刷新,下次显示的时候重头开始显示 //System.out.println(model.getRowCount()); mm.removeRow(mm.getRowCount()-1); } while (resultSet.next()){ String Sno=resultSet.getString(1); String Sname=resultSet.getString(2); String Ssex=resultSet.getString(3); String Sdept=resultSet.getString(4); String DDno=resultSet.getString(5); String Scheckin=resultSet.getString(6); String[] data={Sno,Sname,Ssex,Sdept,DDno,Scheckin}; mm.addRow(data); } } } catch (Exception e1) { e1.printStackTrace(); } } if(e.getSource()==submit&&type==1){//如果是学生的身份进入 PreparedStatement state; ResultSet resultSet; try { state=connection.prepareStatement("select Dphone from Dormitory where Dno ="+"'"+suseText.getText()+"'"); resultSet = state.executeQuery(); while (resultSet.next()){ //suse.setText("电话"); suseText.setText(resultSet.getString("Dphone")); } } catch (SQLException e1) { e1.printStackTrace(); } } } }

这里提几个可能会遇到的问题,至少是我遇到的问题

1.当我们更新完数据,再次显示数据的时候会发现,上一次显示的并没有消失,而是会叠加Java-学生宿舍管理系统

解决这个问题只需要再每次显示新数据的时候,把表格之前的数据都删除掉就行了

 while(mm.getRowCount()>0){//获得当前表格的行数,如果大于0就删除 mm.removeRow(mm.getRowCount()-1);//列名不删除 }

2.SQL server的char 类型和varchar类型,一开始设计表的时候,字符全都是char类型,但是在登录时,即使信息输入正确还是没法登录,后来才知道char时定长的,如果你的字符长度不够,它会在后面用空格补充,所以在验证的时候即使信息看似正确了,但后面其实跟着空格,除非你能够确定你每个字符的长度,否则建议使用varchar,varchar是变长的,你保存的字符是多长,它就是多长,是可变的,这就让信息判断很方便准确了,

其他的操作都跟上面介绍的那个差不多,只是实现的功能不同,但界面都是相同的,我就不一一介绍了,有需要的就去我GitHub看看吧

GitHub

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175708.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午11:36
下一篇 2026年3月26日 下午11:37


相关推荐

  • ubuntu修改root密码命令_手机怎么修改wifi密码

    ubuntu修改root密码命令_手机怎么修改wifi密码进入终端,输入sudopasswdroot然后输入当前用户的密码,之后就可以改密码了。需当前用户在sudoersfile里,一般如果是自己电脑的话,就都会在的。

    2026年4月17日
    5
  • GRPC Connection Backoff Protocol「建议收藏」

    GRPC Connection Backoff Protocol「建议收藏」GRPCConnectionBackoffProtocol当我们向一个失败的后端进行连接时,通常不希望立即重试(为了避免请求flooding网络或者服务器),而是去做一些某种形式的指数backoff。我们有几个参数:INITINAL_BACKOFF(第一次失败后的重试需要等待多长时间)MULTIPLIER(在一次失败的重试后,backoff的乘回因子)JITTER(随机backoffs的程度)MAX_BACKOFF(backoff的上界)MIN_CONNECT_TIMEOUT(我们

    2022年6月17日
    35
  • Binary Exponential Backoff

    Binary Exponential Backoff一、CSMA/CD过程      CSMA/CD就像在没有主持人的座谈会中,所有的参加者都通过一个共同的媒介(空气)来相互交谈。每个参加者在讲话前,都礼貌地等待别人把话讲完。如果两个客人同时开始讲话,那么他们都停下来,分别随机等待一段时间再开始讲话。这时,如果两个参加者等待的时间不同,冲突就不会出现。如果传输失败超过一次,将采用退避指数增长时间的方法(退避的时间通过截断二进制

    2022年6月15日
    24
  • 笔记本打印机显示服务器脱机,打印机显示脱机状态怎么办 打印机显示脱机状态解决方法【详解】…

    笔记本打印机显示服务器脱机,打印机显示脱机状态怎么办 打印机显示脱机状态解决方法【详解】…打印机这个工具相比是大家比较熟悉的设备 而且打印机对于我们办公室的办公者来说是比较重要的 而打印机的出现也提高了我们的办公效率 不过打印机的种类有很多 不管什么类型的打印机多多少少都会出现脱机的状态 那么出现这样的现象我们应该怎么办呢 今天小编就给大家介绍一下关于打印机显示脱机状态怎么办 以及打印机怎么使用 一 打印机脱机状态怎么办 1 任务栏右下角打印机图标不会消失 可却也没有红色叹号显示

    2026年3月26日
    1
  • 卷积神经网络如何进行图像识别的

    卷积神经网络如何进行图像识别的在机器视觉的概念中,图像识别是指软件具有分辨图片中的人物、位置、物体、动作以及笔迹的能力。计算机可以应用机器视觉技巧,结合人工智能以及摄像机来进行图像识别。 什么是图像识别?为什么要进行图像识别? 在机器视觉的概念中,图像识别是指软件具有分辨图片中的人物、位置、物体、动作以及笔迹的能力。计算机可以应用机器视觉技巧,结合人工智能以及摄像机来进行图像识别。 …

    2022年6月10日
    41
  • PHP程序连接Redis报read error on connection问题

    PHP程序连接Redis报read error on connection问题

    2021年10月27日
    58

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号