基于JavaSwing的学生考勤管理系统设计与实现

article/2025/11/6 11:28:40

目录
前言 7
一、系统开发环境及相关技术 8
(一)系统设计思想及处理流程 8
(二)运行环境 8
(三)开发技术及开发工具简介 8
三、需求分析 10
(一)学生用户需求 10
(二)老师用户需求 10
(三)班主任用户需求 10
二、可行性分析 11
(一)技术可行性 11
(二)经济可行性 11
(三)法律可行性 11
(四)操作可行性 11
四、系统总体设计 12
(一)系统功能结构图 12
(二)用户信息管理 12
(三)考勤信息管理 13
(四)系统总体流程 14
五、数据库设计 15
(一)概念结构设计 15
(二)数据库分析 16
(三)数据库表 16
六、输入/输出设计 19
(一)登录界面 19
(二)学生操作界面 20
(三)老师操作界面 21
(四)班主任操作界面 22
七、系统的测试与维护 23
(一)系统的测试 23
(二)系统的维护 24
八、总结 25
致谢 26
附录 27
参考文献 29
三、需求分析
(一)学生用户需求
在部分高校中,老师已经把学生的出勤率作为期末考试分数的参考了,因此学生对自己的出勤情况也比较在意。而在过去,几乎都是使用纸质的方式记录考勤结果,这种方式不但效率比较低,而且也不利于当今倡导的环保主题。
本系统的开发,恰恰解决了这种弊端。学生可以及时的查询自己的出勤率,以便掌控自己的期末考试,也能提醒学生不要逃课,有利于教学。同时,由于本系统的出现,大大节约了纸张的使用,从某种意义上说也有利于环保。
(二)老师用户需求
老师是本系统的主要用户。鉴于平时老师考勤多是自己或是让考勤班长用本子记录,这样既浪费了时间又不利于环保,有时甚至连老师自己都嫌麻烦。本系统的开发恰恰解决了这种难题。首先,避免了纸张的浪费现象,在一定程度上节约了时间。
老师可以通过本系统管理本班学生的上课出勤情况。老师考勤时,及时的把考勤情况录入到系统中即可。
(三)班主任用户需求
班主任老师以系统管理员的身份拥有系统的最高权限,负责系统所需所有数据的动态同步更新以及维护,根据系统针对各用户的设计,基本功能是管理系统所有用户的添加、删除、修改等。
平时,由于班主任的工作比较繁杂,可能没有太多的时间去管理自己的班级。有了本系统,班主任可以随时动态的查看本班同学平时上课的出勤情况,以便及时了解本班情况,从而更好的管理本班。

二、可行性分析
(一)技术可行性
经过两年多的在校学习,我基本了解了java技术的使用,这帮助了我进一步了解本系统的难易程度。在实训期间,进一步巩固了我对java知识的了解,并且学会了如何开发一个比较小的系统。结合在校期间学的SQL数据库知识和实训期间学到的Oracle数据库知识,帮助我制作了后台数据库服务器。况且在网络如此发达的今天,相对的难点完全能够在网上找到相应的解决方式。
总上所述,开发本系统,在技术上完全是可行的。
(二)经济可行性
开发该系统只需要一台主机,加上java和Oracle等知识,并且了解windows操作系统,在开发时间内(三个月),所需的成本不多。
本系统的开发,完全由本人一人独自完成,不需要对开发人员支付工资,也不会产生各种开发经费。
综上所述,本系统的开发,在经济上完全是可行的。
(三)法律可行性
本系统的开发完全是独立完成的,没有借鉴任何非法书籍或是非法产品,因此就不存在版权问题。
由于本系统并没有打算投放市场,不会存在非法交易等违法行为。
总上所述,本系统的开发,在法律上也是可行的。
(四)操作可行性
本系统的开发是基于Windows操作环境下开发的,所有的操作都是Windows环境的基本操作,所以在操作方面完全没有任何技术含量。
本系统的开发是面向高校的考勤而开发,而在当今社会,各高校的学生或工作人员都有一定的电脑操作技术,操作本系统完全是轻而易举的事。
综上所述,本系统的开发,在操作上也是完全可行的。

四、系统总体设计
(一)系统功能结构图
基于java的学生考勤管理系统是提供给班主任、老师和学生使用的信息管理系统。其功能结构图如下:
在这里插入图片描述
图4-1 系统功能结构图

package com.java.view;import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;import com.java.bean.TeacherInfo;
import com.java.dao.STDao;
import com.java.service.TeacherLogic;public class TeacherView extends JFrame {private JLabel lblNo;private JLabel lblName;private JLabel lblCourse;private JLabel lblVTN;private JLabel lblTAN;private JLabel lblLN;private JLabel lblLEN;private JLabel lblNull;private JLabel lblNull2;private JLabel lblNull3;private JTextField tfdNo;private JTextField tfdName;private JTextField tfdCourse;private JTextField tfdVTN;private JTextField tfdTAN;private JTextField tfdLN;private JTextField tfdLEN;private JButton btnAdd;private JButton btnSelect;private JButton btnUpdate;private JTable tblInfo;private DefaultTableModel model;private JPanel panel;private JPanel plMain;private JPanel pl1;private JPanel pl2;private JPanel pl3;private JPanel pl4;private JPanel pl5;private JPanel pl6;private JPanel pl7;private JPanel pl8;private JPanel pl9;private JPanel pl0;private TeacherLogic tlg;public TeacherView(){init();}private void init() {tlg = new TeacherLogic(this);lblNo = new JLabel("学号:",JLabel.RIGHT);lblName = new JLabel("姓名:",JLabel.RIGHT);lblCourse = new JLabel("课程编号:",JLabel.RIGHT);lblVTN = new JLabel("请假次数:",JLabel.RIGHT);lblTAN = new JLabel("旷课次数:",JLabel.RIGHT);lblLN = new JLabel("迟到次数:",JLabel.RIGHT);lblLEN = new JLabel("早退次数:",JLabel.RIGHT);lblNull = new JLabel(" ");lblNull2 = new JLabel(" ");lblNull3 = new JLabel("    ");tfdNo = new JTextField(8);tfdName = new JTextField(8);tfdCourse = new JTextField(8);tfdVTN = new JTextField(8);tfdTAN = new JTextField(8);tfdLN = new JTextField(8);tfdLEN = new JTextField(8);btnAdd = new JButton("添加");btnSelect = new JButton("查询");btnUpdate = new JButton("更新");model = new DefaultTableModel();model.addColumn("学号");model.addColumn("姓名");model.addColumn("课程名称");model.addColumn("旷课次数");model.addColumn("请假次数");model.addColumn("迟到次数");model.addColumn("早退次数");tblInfo = new JTable(model);panel = new JPanel();plMain  = new JPanel();pl1 = new JPanel();pl2 = new JPanel();pl3 = new JPanel();pl4 = new JPanel();pl5 = new JPanel();pl6 = new JPanel();pl7 = new JPanel();pl8 = new JPanel();pl9 = new JPanel();pl0 = new JPanel();pl1.setLayout(new GridLayout(3,1,5,15));pl2.setLayout(new GridLayout(3,1,5,10));pl3.setLayout(new GridLayout(3,1,5,15));pl4.setLayout(new GridLayout(3,1,5,10));pl5.setLayout(new GridLayout(3,1,5,15));pl6.setLayout(new GridLayout(3,1,5,10));pl7.setLayout(new FlowLayout(FlowLayout.LEFT,10,20));pl7.setBorder(new TitledBorder(new EtchedBorder(),"查询信息"));pl8.setBorder(new TitledBorder(new EtchedBorder(),"查询结果"));pl8.setLayout(new BorderLayout(5,5));pl9.setLayout(new GridLayout(3,1,5,10));pl0.setLayout(new BorderLayout(5,5));panel.setLayout(new BorderLayout(5,5));plMain.setLayout(new BorderLayout(5,5));pl1.add(lblNo);pl1.add(lblName);pl1.add(lblCourse);pl2.add(tfdNo);pl2.add(tfdName);pl2.add(tfdCourse);pl3.add(lblVTN);pl3.add(lblTAN);pl4.add(tfdVTN);pl4.add(tfdTAN);pl5.add(lblLN);pl5.add(lblLEN);pl6.add(tfdLN);pl6.add(tfdLEN);pl7.add(pl1);pl7.add(pl2);pl7.add(pl3);pl7.add(pl4);pl7.add(pl5);pl7.add(pl6);pl8.add(new JScrollPane(tblInfo),BorderLayout.CENTER);pl9.add(btnAdd);pl9.add(btnUpdate);pl9.add(btnSelect);pl0.add(pl9,BorderLayout.SOUTH);panel.add(pl7,BorderLayout.NORTH);panel.add(pl8,BorderLayout.CENTER);plMain.add(panel,BorderLayout.CENTER);plMain.add(pl0,BorderLayout.EAST);plMain.add(lblNull,BorderLayout.NORTH);plMain.add(lblNull2,BorderLayout.SOUTH);plMain.add(lblNull3,BorderLayout.WEST);this.setTitle("学生考勤管理系统——老师");this.setSize(610, 450);this.add(plMain);this.setResizable(false);this.setLocationRelativeTo(null);this.setVisible(true);Toolkit kit = Toolkit.getDefaultToolkit();// 取得图片Image img = kit.getImage("src/image/5.jpg");// 设置窗体的标题图标this.setIconImage(img);this.addWindowListener(new WindowListener(){@Overridepublic void windowClosing(WindowEvent e) {int option = JOptionPane.showConfirmDialog(null, "确定退出?","删除",JOptionPane.YES_OPTION,JOptionPane.WARNING_MESSAGE,null);switch (option) {case JOptionPane.YES_OPTION:System.exit(0);case JOptionPane.NO_OPTION:new TeacherView();}}@Overridepublic void windowOpened(WindowEvent e) {}@Overridepublic void windowClosed(WindowEvent e) {}@Overridepublic void windowIconified(WindowEvent e) {}@Overridepublic void windowDeiconified(WindowEvent e) {}@Overridepublic void windowActivated(WindowEvent e) {}@Overridepublic void windowDeactivated(WindowEvent e) {}});btnAdd.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {check(tfdNo.getText(),tfdCourse.getText());clean();}});btnUpdate.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {chack(tfdNo.getText(),tfdName.getText(),tfdCourse.getText());clean();}});btnSelect.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {tlg.getSearch();}});}public void tableChange(ArrayList<TeacherInfo> teaf){Vector data = new Vector();for(int i = 0; i < teaf.size(); i++){TeacherInfo tf = teaf.get(i);Vector dataRow = new Vector();dataRow.add(tf.getStuNo());dataRow.add(tf.getStuName());dataRow.add(tf.getCsName());dataRow.add(tf.getTAN());dataRow.add(tf.getVTN());dataRow.add(tf.getLN());dataRow.add(tf.getLEN());data.add(dataRow);}Vector c = new Vector();c.add("学号");c.add("姓名");c.add("课程名称");c.add("旷课次数");c.add("请假次数");c.add("迟到次数");c.add("早退次数");DefaultTableModel dt = new DefaultTableModel(data, c);tblInfo.setModel(dt);}public void clean(){tfdNo.setText("");tfdName.setText("");tfdCourse.setText("");tfdVTN.setText("");tfdTAN.setText("");tfdLN.setText("");tfdLEN.setText("");}public String[] getTacInfo(){String[] str = new String[7];str[0] = tfdNo.getText().trim();str[1] = tfdName.getText().trim();str[2] = tfdCourse.getText().trim();str[3] = tfdVTN.getText().trim();str[4] = tfdTAN.getText().trim();str[5] = tfdLN.getText().trim();str[6] = tfdLEN.getText().trim();return str;}// 更新判断public String chack(String str,String str1,String str2){STDao std = new STDao();Connection conn = std.getConnection();PreparedStatement pst=null;ResultSet rs=null;String stuNo = null;String stuName = null;String csNo = null;String sql = "select stuno,stuname,csno from tb_kaoqin where stuno = " + str + " and stuname = '" + str1 + "' and csno = " + str2;if("".equals(str)){JOptionPane.showOptionDialog(null, "学号不能为空!", "提示", JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null, null, null);return null;}if("".equals(str1)){JOptionPane.showOptionDialog(null, "姓名不能为空!", "提示", JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null, null, null);return null;}if("".equals(str2)){JOptionPane.showOptionDialog(null, "课程编号不能为空!", "提示", JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null, null, null);return null;}try {pst = conn.prepareStatement(sql);rs = pst.executeQuery();while(rs.next()){stuNo = rs.getString(1);stuName = rs.getString(2);csNo = rs.getString(3);}if(str.equals(stuNo) && str1.equals(stuName) && str2.equals(csNo)){tlg.teaUpdate();}  else {JOptionPane.showOptionDialog(null, "信息不存在,请添加!", "提示", JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null, null, null);}} catch (SQLException e) {e.printStackTrace();} finally {std.close();std.closeOthers(pst, rs);}return null;}// 添加判断public String check(String str1,String str2){STDao std = new STDao();Connection conn = std.getConnection();PreparedStatement pst=null;ResultSet rs=null;String stuNo = null;String csNo = null;String sql = "select stuno, csno from tb_kaoqin where stuno = " + str1 + " and csno = " + str2;if("".equals(str1)){JOptionPane.showOptionDialog(null, "学号不能为空!", "提示", JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null, null, null);return null;}if("".equals(str2)){JOptionPane.showOptionDialog(null, "课程编号不能为空!", "提示", JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null, null, null);return null;}try {pst = conn.prepareStatement(sql);rs = pst.executeQuery();while(rs.next()){stuNo = rs.getString(1);csNo = rs.getString(2);}if(!str1.equals(stuNo) || !str2.equals(csNo)){tlg.teaAdd();} else {JOptionPane.showOptionDialog(null, "信息已存在,请更新!", "提示", JOptionPane.DEFAULT_OPTION,JOptionPane.INFORMATION_MESSAGE, null, null, null);}} catch (SQLException e) {e.printStackTrace();}return null;}}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/PRjYimFk.shtml

相关文章

《学生考勤信息管理系统》数据库课程设计

目录 一、 需求分析 前台功能模块 后台功能模块 1.1 功能模块的划分及介绍 1.2 实体及重要属性 1.3 业务流程图 二、 概念结构设计 2.1. E-R图的设计 三 、逻辑结构设计 表设计 User1-用户表 Student-学生信息表 College-院系信息表 Attendance personnel 考勤人员表 C…

多个div在同一行显示

使用float:left&#xff0c;也可以使用display : inline-block&#xff0c;可以使多个div在同一行显示。 <div class"search_row"><div class"form-group" style"float:left" > <%-- 通过左浮动使多个div在一行显示--%&g…

HTML如何让两个div并排在一行,如何实现两个或多个div并列于一行

div是块状元素&#xff0c;默认是独占据一行。 但是&#xff0c;如何让两个或多个块区域并列于一行&#xff1f; 块状元素有一个很重要的“float”属性&#xff0c;可以达成这种效果。float 属性也被称为浮动属性&#xff0c;这个词非常形象。 对前面的div元素设置浮动属性后&a…

两个div在一行显示

原因&#xff1a;div为块级元素&#xff0c;默认占一行高度 解决方法1&#xff1a;两个div都添加样式 display&#xff1a;inline-block&#xff1b;&#xff08;如值为inline&#xff0c;设置宽高失效&#xff0c;div靠内容撑起&#xff09; 代码&#xff1a; <style>…

html如何在同一行显示两个div?

代码&#xff1a; <div style"background: blue;float:left">aaa </div> <div style"background: green;float:left">bbb </div>效果&#xff1a;

在HTML中如何让两个图像(div)不换行的显示在一起

代码如下 示意图如下 在两个box后面加入float即可

怎么把两个div一左一右放

怎么把两个div一左一右放 1.代码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><title>Title</title> </head> <body> <div style"width:150px;height:50px;margin:0…

css 并排放置两个div

写代码时遇到了并排放置两个div的需求&#xff0c;于是总结了一下&#xff0c;有以下几种方法可以实现&#xff1a; &#xff08;1&#xff09;设置浮动&#xff1a; a&#xff09;两个div都设置为左浮动&#xff1a; <!DOCTYPE html> <html> <head><…

【HTML】把两个div的内容放置在同一行

使用float属性把两个div的内容放置在同一行&#xff1a; <html> <head> </head> <body><div ><div style"float:right;">我在右侧</div><div>我在左侧</div></div> </body> </html>结果图&…

css如何让两个div并列在同一行

让两个Div并排显示的方法有很多&#xff0c;使用display的inline属性、通过设置float来让Div并排显示都可以实现&#xff0c;感兴趣的朋友可以参考下本文 让两个Div并排显示 一、使用display的inline属性 代码如下 二、通过设置float来让Div并排显示 代码如下 三、对于两个d…

Web前端培训:两个div在同一行可以实现吗?

我们在写页面的时候经常会遇到需要将两个div盒子同行显示的情况&#xff0c;那么“两个Div同行显示”该如何显示呢?一般两个div同行显示可以用float: left和display: inline_block来实现&#xff0c;下面我们分别介绍。 首先我们先来看&#xff0c;没有同行显示的两个div什么…

将两个或多个div放在同一行

1.先画出三个大盒子 2.1在style属性中添加display:inline-block,结果如图&#xff1a; 但是使用该方法盒子与盒子间的默认缝隙是不能修改的&#xff0c;通常我们会使用以下的方法实现两个以上的盒子的摆放 2.2在style属性中添加float&#xff1a;left&#xff1b;将元素移到左…

如何让两个div处于一行

我们知道 div是块级元素,是独占一行的.一般情况下,两个相邻的div是不会处于一行的 例如: Html代码 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>让两个div处于同一行</title&…

1、RH850时钟源及配置

一、时钟源 系统时钟源有5种&#xff1a; 外部主晶振8M-24M。(main osc) 外部副晶振32.768KHz。 &#xff08;sub osc&#xff09; 内部高速晶振8M。(high speed int osc) 内部低速晶振240KHz。(low speed int osc) PLL倍频器。 Note 1. 外部副晶振只有 144 pin and 17…

【经验】RH850 RS-CANFD接收滤波配置

芯片型号&#xff1a;RH850/F1KM-S1 不同PIN封装形式所支持的CAN通道数量不同&#xff0c;RS-CAN通道数量最多可支持6路。 目录 一、FLECCTR&#xff08;接收规则Entry控制寄存器&#xff09; 二、FLCFG0&#xff08;接收规则配置寄存器0&#xff09; 三、FLCFG1&#xff08…

瑞萨RH850 CS+环境下设置堆和栈空间

目录 1、设置栈空间 2、设置堆空间 嵌入式软件开发离不开对堆和栈的操作。 栈由操作系统自动分配和释放 &#xff0c;存放函数的参数值、局部变量的值等。通常都是被调用时处于存储空间中&#xff0c;调用完毕立即释放。 堆由开发者手动分配和释放&#xff0c; 若开发者不释…

基于IAR for RH850的瑞萨RH850 FCL库用法介绍(二)

版权声明 email&#xff1a;1256153255qq.com website for get 瑞萨RH850F1x开发板和瑞萨E1仿真器 认真的朋友会发现&#xff0c;我的上一篇博文《基于IAR for RH850的瑞萨RH850 FCL库用法介绍》在最后留下了一个bug&#xff0c;就是当FCL执行ERASE或WRITE时&#xff0c;返回的…

5、RH850 F1 定时器TAUJ功能和配置

TAUJ定时器为RH850较为常用的定时器&#xff1a; &#xff08;1&#xff09;定时器计时是通过计数来实现的&#xff0c;定时器内部有一个计数器&#xff0c;这个计数器根据时钟&#xff08;这个时钟来自于ARM的APB总线&#xff09;来工作。每隔一个时钟周期&#xff0c;计数器…

13、RH850 F1 选项字节和看门狗

前言: 选项字OPTION配置是RH850的一项重点&#xff0c;用户手册对选项字的配置介绍很少&#xff0c;这篇文章将主要针对选项字和看门狗的配置进行讲解。 一、选项字特性 闪存的选项字节是一个扩展区域&#xff0c;并保存用户为各种目的指定的数据。由选项字节指定的外围模块等的…