更新:因为好多人说连不上数据库或者没有数据库表,所以现在更新了代码,从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();
}
@Override
public 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);
}
@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.当我们更新完数据,再次显示数据的时候会发现,上一次显示的并没有消失,而是会叠加
解决这个问题只需要再每次显示新数据的时候,把表格之前的数据都删除掉就行了
while(mm.getRowCount()>0){//获得当前表格的行数,如果大于0就删除
mm.removeRow(mm.getRowCount()-1);//列名不删除
}
2.SQL server的char 类型和varchar类型,一开始设计表的时候,字符全都是char类型,但是在登录时,即使信息输入正确还是没法登录,后来才知道char时定长的,如果你的字符长度不够,它会在后面用空格补充,所以在验证的时候即使信息看似正确了,但后面其实跟着空格,除非你能够确定你每个字符的长度,否则建议使用varchar,varchar是变长的,你保存的字符是多长,它就是多长,是可变的,这就让信息判断很方便准确了,
其他的操作都跟上面介绍的那个差不多,只是实现的功能不同,但界面都是相同的,我就不一一介绍了,有需要的就去我GitHub看看吧
GitHub
今天的文章java学生宿舍管理系统代码_学生宿舍管理系统数据库设计分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/77776.html