Java-学生宿舍管理系统
更新:因为好多人说连不上数据库或者没有数据库表,所以现在更新了代码,从SQL server改为MySQL,同时附有数据库表文件。同时有些同学GitHub登录不了,于是把资源放在了CSDN,有任何问题可以评论或者私信我
(GitHub还是有之前的代码)
2021-10-20
Java-学生宿舍管理系统
PS:登录报错的多半是没有MySQL驱动,把你下载下来的资源包中mysql的jar包加入到项目就行了
2021-12-22更新:
学生离校与返校的功能中,因为表名与数据库关键字重名里,因此插入会报错,你可以选择修改表名,或者如下图修改,给leave表名变成`leave`
这次记录的是最近完成的实训作业,学生宿舍管理系统,使用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)来构成界面主体,登录界面和操作界面之间使用卡片布局器进行切换,(控件的位置请忽略,因为我懒得弄好看了......)
正确输入用户名,密码之后切换到操作界面
操作界面使用选项卡布局器来操作不同的表
界面和操作界面代码(前面忘了说了,因为只是为了完成实训作业,并没有想着后期的维护,所以我的代码写的很烂,只是完成了功能,我会加上注释让你们尽可能的看明白,日后再把代码规范起来):
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();}@Overridepublic void actionPerformed(ActionEvent e) {boolean flag=false;//用来标志用户是否正确if (e.getSource() == loginButton) {ArrayList<Users> 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上
宿管对于宿舍信息的操作,当有学生换宿舍或者换专业的时候,宿管能够对该学生的宿舍信息进行修改并保存到数据库中,
代码:(再次声明,我的代码只是为了完成作业,不建议像我这样写代码,很杂乱,不仅难理解还难维护)
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);}@Overridepublic 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.当我们更新完数据,再次显示数据的时候会发现,上一次显示的并没有消失,而是会叠加
解决这个问题只需要再每次显示新数据的时候,把表格之前的数据都删除掉就行了
while(mm.getRowCount()>0){//获得当前表格的行数,如果大于0就删除mm.removeRow(mm.getRowCount()-1);//列名不删除}
2.SQL server的char 类型和varchar类型,一开始设计表的时候,字符全都是char类型,但是在登录时,即使信息输入正确还是没法登录,后来才知道char时定长的,如果你的字符长度不够,它会在后面用空格补充,所以在验证的时候即使信息看似正确了,但后面其实跟着空格,除非你能够确定你每个字符的长度,否则建议使用varchar,varchar是变长的,你保存的字符是多长,它就是多长,是可变的,这就让信息判断很方便准确了,
其他的操作都跟上面介绍的那个差不多,只是实现的功能不同,但界面都是相同的,我就不一一介绍了,有需要的就去我GitHub看看吧
GitHub
Java-学生宿舍管理系统相关推荐
- 计算机毕业设计Java学生宿舍管理系统(源码+系统+mysql数据库+lw文档)
计算机毕业设计Java学生宿舍管理系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java学生宿舍管理系统(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目架构:B/S架构 ...
- java学生宿舍管理系统-项目模板、毕业设计
下载地址:java学生宿舍管理系统项目模板.毕业设计-Web服务器文档类资源-CSDN下载 学生宿舍管理系统,带sql文件.可运行,欢迎下载 /* Navicat MySQL Data Transfe ...
- Java学生宿舍管理系统主要内容及特点
转载请注明出处:HPioneer http://www.cnblogs.com/HPioneer/p/6726356.html "学生宿舍管理系统"主要内容及特点 一, 个人基本 ...
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java学生宿舍管理系统15pjb
大部分步骤是 1.确定选题 选题的确定需要查阅大量的资料,要搞清楚自己大概想要研究的方向是什么.可以选择自己感兴趣的学科或者强势的学科进行研究,同时要多和毕业指导老师多交流,征求老师的意见和建议,最后 ...
- 基于java学生宿舍管理系统的设计和实现-毕业论文(可仅作参考)
学生宿舍管理系统的设计和实现-毕业论文(可仅作参考) 可以仅作参考宝子们 ,这个只有论文版本不包含代码哦~ 论文word版本我会上传到资源里面供宝子看 文章目录 学生宿舍管理系统的设计和实现-毕业论文 ...
- Java学生宿舍管理系统,即将毕业的兄弟有福了!
点击关注公众号,Java干货及时送达 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/ ...
- 【项目】Java学生宿舍管理系统,赠予即将毕业的兄弟!
程序员的成长之路 互联网/程序员/技术/资料共享 关注 阅读本文大概需要 2 分钟. 来自:https://blog.csdn.net/dkm123456/article/details/116272 ...
- 免费分享一个粉丝做的毕业设计学生宿舍管理系统!
前段时间五一放假,有网友出钱 2000,让我帮忙做一个 Java 学生宿舍管理系统.其实我前面已经分享了一个基于 SSM 实现的学生宿舍管理系统,可这位网友还未学过 SSM 框架,因此我又改了一个基于 ...
- 学生宿舍管理系统java课设_JAVA学生宿舍管理系统
需要的工具 1.SQL Server 2.Eclipse 3.JDBC连接数据库驱动 https://download.microsoft.com/download/A/F/B/AFB381FF-70 ...
- 基于java的学生宿舍管理系统(含源文件)
欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 学生宿舍管理系统 摘 要 随着电脑的普及与使用,现在的管理也提升了一个档次,渐渐实现了无纸化 ...
最新文章
- 微信跳一跳高分辅助踩坑
- 【PC工具】图片批量添加水印工具,绿色免安装工具软件,妈妈再也不用担心我.....
- MFC中混合使用Duilib制作界面
- Docker最全教程——MongoDB容器化(十三)
- [蓝桥杯][算法提高VIP]最小乘积(提高型)-排序
- 5 个给 Linux 新手的最佳包管理器
- python3.6 +tkinter GUI编程 实现界面化的文本处理工具
- Idea 格式化代码 Idea设置快捷键 格式化代码
- 软件工程导论复习知识点
- 图论 —— 最短路 —— Johnson 算法
- 【Ubuntu】Ubuntu16.04安装火狐浏览器中国版
- 盘点阿里巴巴 33 个牛逼的开源项目,你用过哪几个?
- 关于数字万用表你需要知道的知识
- slt mysql_SAP SLT操作手册 PDF 下载
- ionic给图片加水印
- 服务器怎么设置自动连接wifi,笔记本无线网络连接IP地址设置(自动获取IP)
- Unity基本认识——走进Unity
- 北大自考计算机与应用,北大自考计算机应用技术上机考试
- python eval函数的神奇魔法
- 使用VBA统一word文档表格样式
热门文章
- Fire Workflow 1.0正式版终于发布了
- 用JAVA编写MP3解码器
- ERROR 2002 (HY000) Can‘t connect to local MySQL server through socket ‘varrunmysqldmysqld.sock‘
- vite .env环境变量配置
- jasperReport 交叉表使用示例
- 角位移传感器 AS5040
- 如何在Windows 11中以管理员身份运行程序:10种方式可以选择
- 薛定谔 | 用药效团模型筛选药物
- SAS:主成分分析(Principal Component Analysis,PCA)
- 苹果CMSV10整合aliplayer播放器/带记忆播放