基于java的职工考勤管理信息系统.pdf
小型应用系统学年设计任务书小型应用系统学年设计任务书学院课程名称完成期限计算机与信息工程学院小型应用系统设计专业题目网络工程职工考勤管理信息系统自 2016 年 7 月 26 日至 2016 年 8 月 26 日共四周一、项目的目的采用 Java 和 MySQL 数据库技术,设计一个小型应用系统实现职工考勤管理信息。锻炼在软件设计过程中的业务逻辑和业务流程设计能力、以及图形化的用户界面设计和数据库的使用能力。二、项目任务的主要内容和要求采用 Java 和 MySQL 数据库技术,设计一个小型的应用系统实现职工考勤信息的管理,有图形化的用户界面。内容及要求如下:(1)职工信息,包括职工编号、职工姓名、性别、年龄、职称等;(2)出勤记录信息,包括上班打卡时间,下班打开时间,缺勤记录内(3)出差信息,包括出差起始时间、结束时间、统计总共天数等;容及任务先期设计数据库,画出数据库的 E-R 图,设计员工表,出差表,出勤表,加班表,请假表.然后设计和制作分别完成各个小项的功能,如员工表的增加、删除、查询、修改以及其他表格的查询.在各个小功能都完善后,接入数据库,再考虑设计一个主界面,将软件的各项功能集成在一起。小系统达成后,进行调试与界面编辑设计,最终完成设计。四、具体成果形式和要求(1)设计完成一个职工考勤管理信息系统.要求能对 MySQL 数据库进行增、删、改、查操作,并且具备图形化的用户界面.(2)完成和提交一份职工考勤管理信息设计报告文档。等;(4)请假信息,包括请假开始时间,结束时间,统计请假天数等;(5)加班信息,包括加班开始时间、结束时间、统计加班总时间。三、项目设计(研究)思路1进度安排起止日期工作内容2016。7。258。根据软件设计要求,查询相关 Java、数据库知10识。2016。8.118.23构建数据库结构,编写程序应用界面。2016.8。248。调试程序,完善功能,完成学年设计报告。261。王诚。JAVA 实用编程技术M.北京:人民邮电出版社,2012.2。王雨竹。MySQL 入门经典M。北京:机械工业出版社,2013。主要参考资料2007。6.美Herbert Schildt 著.马海军,景丽等译。Java 实用教程(第三版)。北京:清华大学出版社.2005。指导教师意见系(教研室)(签字):年月日主任意见(签字):年月日4.王德永。数据库原理与应用M.北京:人民邮电出版社,2011。5。美Bruce Eckel.Java 编程思想M。北京:机械工业出版社,3.张逸。软件设计精要与模式 M.北京:电子工业出版社,2007。2职工考勤管理信息系统设计说明书职工考勤管理信息系统设计说明书(封面)封面)学院名称:计算机与信息工程学院班级名称:网络工程 14 级 2 班学生姓名:朱赛赛学号:2014211585题目:职工考勤管理信息系统指导教师姓名:任倩起止日期:2016.7。26 2016.8。26目录目录第一部分:正文部分.1一、选题背景.1二、方案论证(或设计理念).1三、过程论述.13.1 相关知识介绍.13。2 系统功能模块图.23.3 系统流程图.23。4 数据库设计.23.5 系统的各部分功能模块设计.33。5。1 系统管理部分设计.33.5。2 职工信息管理部分设计.83。5.3 出勤信息查询.123.5.4 出差信息查询.133。5.5 请假信息查询.143.5。6 加班信息查询.153。5。7 系统主界面集成设计.16四、结果分析.204。1 登录系统测试.204.2 员工管理测试.204。3 出勤信息查询测试.204.4 出差信息查询测试.204.5 请假信息查询测试.214.6 加班信息查询测试.21五、结论(或总结).错错误误!未定义书签。未定义书签。第二部分:参考文献.21第三部分:指导教师评语.22第四部分:成绩评定.22第一部分:正文部分第一部分:正文部分一、选题背景一、选题背景计算机网络技术的发展,给信息时代的人们带来了很大的便利。如今在互联网上,随处可见各种类型的信息管理系统。随着信息技术的发展已经深入到社会的各个角落,各个大小企业都充分认识到传统的手工管理模式已经不能顺应时代的发展,为了企业更好的发展,纷纷开发适合自己的管理系统.相对于手工管理模式的效率低,易出错,手续繁琐,耗费大量的人力,物力,财力来说,职工考勤管理信息系统能够通过电脑化管理实现职工信息增加,删除,修改,以及出勤信息,出差信息,请假信息,加班信息的查询。二、方案论证(或设计理念)二、方案论证(或设计理念)由于该系统所要满足的硬件是计算机,软件方面是采用 JDK1.8 开发环境、Eclipse 开发工具和 MySQL 数据库,这些设备和软件易于实现和满足。采用的语言是 Java 语言,具有可移植性,功能易于实现,界面比较美观,操作简单,能够移植到其他计算机上运行,与平台无关,能够满足更多的用户,使得该系统能被很多家庭所接受和使用.因此采用该 Java+MySQL 方案来设计职工考勤管理信息系统.三、过程论述三、过程论述3 3。1 1 相关知识介绍相关知识介绍MySQL 是一个关系型数据库管理系统,MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL 是最好的RDBMS(Relational DatabaseManagement System,关系数据库管理系统)应用软件之一。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 所使用的SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,其体积小、速度快、总体拥有成本低,致使其被广泛应用。Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse附带了一个标准的插件集,包括 Java 开发工具(Java Development Kit,JDK)。13 3。2 2 系统功能模块图系统功能模块图在该小型应用系统中,用户可以直接执行管理员权限,对员工信息进行增删,修改,保存,实现出勤信息,出差信息,加班信息,请假信息的查询.系统功能如图 3-1 所示.图 31 系统功能模块图3 3。3 3 系统流程图系统流程图在该系统中,用户可以通过可以运行程序进入主界面,在主界面中可以管理各个功能模块,进而通过各个功能模块对后台数据库进行数据操作和管理。系统流程图如图 3-2 所示.图 32 系统流程图3.43.4 数据库设计数据库设计根据实体类型、属性和联系的方法,绘制职工,出勤,出差,加班,请假实体集间的实体-联系图。如图 33 所示。图 33ER 图本系统的基本功能是设计职工考勤管理信息,因此设置了 5 张表,分别是表Yuangong、表Chuqin、表Chuchai、表Qingjia、表Jiaban。对数据的增、删、改、查,主要在这四个表上进行.(1)员工表用来记录员工的基本信息,表结构如表 31 所示。表 3-1 员工表属性名IdNameSexAgeZhichen类型intcharcharintchar长度54224字段约束not nullnot nullchecknot nullnull含义编号姓名性别年龄职称(2)出勤表用来记录出勤的基本信息,表结构如表 32 所示。表 3-2 出勤表属性名IdAm0Pm0Am1类型intdatedatedate长度50002字段约束not nullnullnullnull含义编号上午开始打卡下午开始打卡上午结束打卡Pm1Judgedateint05nullnull下午结束打卡缺勤记录(3)出差表用来记录出差的基本信息,表结构如表 3-3 所示。表 3-3 出差表属性名IdBegindayEnddayDays类型intdatedateint长度5005字段约束not nullnullnullnull含义编号开始时间结束时间总时间(4)请假表用来记录请假的基本信息,表结构如表 3-4 所示。表 34 请假表属性名IdBegindayEnddayDays类型intdatedateint长度5005字段约束not nullnullnullnull含义编号开始时间结束时间总时间(5)加班表用来记录加班的基本信息,表结构如表 35 所示。表 35 加班表属性名IdBeginTimeEndTimeSumTime类型intdatedatedouble长度5006字段约束not nullnullnullnull含义编号开始时间结束时间总时间3.53.5 系统的各部分功能模块设计系统的各部分功能模块设计3。5。1 系统管理部分设计系统管理模块的主要功能有:用户登录、退出.该模块可以实现用户的登录,在程序中主要涉及的类为 CheckPassword,在系统核对用户名和密码时需对数据库 test 中的 user1 表进行查询对比。登录界面如图 34 所示。图 3-4 用户登录界面具体代码如下:public static void main(String args)try 3UIManager。setLookAndFeel(com.sun.java。swing。plaf.nimbus.NimbusLookAndFeel”);catch(Throwable e)e。printStackTrace();EventQueue。invokeLater(new Runnable()public void run()try ExpandFrame frame=new ExpandFrame();frame.setVisible(true);catch(Exception e)e.printStackTrace(););public ExpandFrame()this.setTitle(”登录窗体”);addWindowListener(new WindowAdapter()Overridepublic void windowOpened(WindowEvent e)do_this_windowOpened(e););setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,0,221);contentPane=new JPanel();contentPane.setBackground(new Color(135,206,250);contentPane.setBorder(new EmptyBorder(5,5,5,5));4setContentPane(contentPane);contentPane。setLayout(null);JLabel label=new JLabel(登录模块);label。setOpaque(true);label.setBackground(new Color(245,222,179);label.setHorizontalAlignment(SwingConstants.CENTER);label.setFont(new Font(SansSerif”,Font.PLAIN,label。setBounds(6,6,422,72);contentPane。add(label);JLabel label_1=new JLabel(”用户名:”);label_1.setBounds(31,90,55,18);contentPane.add(label_1);JLabel label_2=new JLabel(”密码:”);label_2。setBounds(31,134,55,18);contentPane。add(label_2);textField=new JTextField();textField.setBounds(83,84,184,30);contentPane。add(textField);textField。setColumns(10);textField_1=new JTextField();textField_1。setBounds(83,128,184,30);contentPane。add(textField_1);textField_1。setColumns(10);JButton button=new JButton(登录);button.setBounds(304,84,90,30);contentPane.add(button);button。addActionListener(new Enter());JButton button_1=new JButton(关闭”);button_1。setBounds(304,128,90,30);contentPane.add(button_1);setLocationRelativeTo(null);530);button_1.addActionListener(new Close();class Enter implements ActionListenerpublic void actionPerformed(ActionEvent e)setVisible(false);trycatch(ClassNotFoundException e1)System。out。println(加载驱动程序失败!);tryConnection con=DriverManager.getConnection(”jdbc:mysql:/localhost:3306/test,root”,root”);Statement sql=con.createStatement();String uname=textField。getText()。trim();String Mima=textField_1。getText().trim();String queryMima=select from user1 where 用户名=”+uname+and 密码=+Mima+”;ResultSet rs=sql。executeQuery(queryMima);Class.forName(com。mysql.jdbc。Driver”);if(rs.next()JOptionPane。showMessageDialog(null,登录成功!”,”,JOptionPane。YES_NO_OPTION);MainFrame sf=new MainFrame();sf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);sf.show();elseJOptionPane。showMessageDialog(null,该用户不存在”,提示!,JOptionPane.YES_NO_OPTION);textField.setText(”);6textField_1。setText(”);catch(SQLException g)System。out.println(E Code”+g。getErrorCode());System。out.println(E M+g。getMessage());class Close implements ActionListenerOverridepublic void actionPerformed(ActionEvent e)/TODO Autogenerated method stubSystem.exit(0);class winClose extends WindowAdapterpublic void windowClosing(WindowEvent e)(e.getWindow().dispose();System.exit(0);protected void do_this_windowOpened(WindowEvent e)final int height=getHeight();/记录窗体高度new Thread()/创建新线程public void run()Rectangle rec=getBounds();for(int i=0;i frameWidth;i+=10)窗体7/循环拉伸setBounds(rec.x i/2,rec。y,i,height);/不断try Thread.sleep(10);/线程休眠 10 毫秒 catch(InterruptedException e1)e1.printStackTrace();.start();/启动线程public static void DISPOSE_ON_CLOSE()3.5.2 职工信息管理部分设计职工信息管理部分有员工信息增添、查询、职工出差信息查询、职工请假信息查询、职工加班信息查询四个主模块。如图 3-5 所示。图 3-5 职工信息查询选项员工资料管理部分有查看所有员工信息,添加员工信息,修改员工信息,删除员工信息五个模块.主要通过类来对数据库进行操作,如添加员工信息。如图36 所示。图 36 添加员工信息具体代码如下:public static int InsertYuangongInfo(Yuangong yuangong)Connection conn=getConn();int i=0;String sql=Insert into Yuangong(ID,Name,Sex,Age,Zhichen)values(?,?,?,?,?)”;/TODO Auto-generated method stubPreparedStatement pstmt;try pstmt=(PreparedStatement)conn。prepareStatement(sql);8pstmt.setInt(1,yuangong。getId();pstmt。setString(2,yuangong.getName());pstmt。setString(3,yuangong。getSex();pstmt。setInt(4,yuangong。getAge());pstmt.setString(5,yuangong.getZhichen();i=pstmt.executeUpdate();pstmt。close();conn。close();catch(SQLException e)e.printStackTrace();return i;查询员工信息。如图 37 所示。图 37 查询员工信息具体代码如下:public static Yuangong getYuangongInfo(int id)Connection conn=getConn();String sql=”Select from Yuangong where id=+id+”;PreparedStatement pstmt;try pstmt=(PreparedStatement)conn。prepareStatement(sql);ResultSet rs=pstmt。executeQuery();Yuangong yuangong=new Yuangong();while(rs.next()return yuangong;9yuangong。setId(rs。getInt(”ID”);yuangong。setName(rs。getString(Name”);yuangong.setSex(rs。getString(”Sex”));yuangong。setAge(rs。getInt(Age);yuangong。setZhichen(rs.getString(Zhichen”));catch(SQLException e)e。printStackTrace();return null;删除员工信息.如图 3-8 所示。图 38 删除员工信息具体代码如下:public static int DeleteYuangongInfo(int id)修改员工信息.如图 39 所示。图 39 修改员工信息具体代码如下:public static int UpdateYuangongInfo(Yuangong yuangong)Connection conn=getConn();int i=0;String sql=Update Yuangong set Name=”+yuangong.getName()+,Sex=+yuangong。getSex()+,Age=”+yuangong.getAge()1 0Connection conn=getConn();int i=0;String sql=”Delete from Yuangong where ID=+id+”;PreparedStatement pstmt;try pstmt=(PreparedStatement)conn.prepareStatement(sql);i=pstmt.executeUpdate();System。out.println(”resutl:+i);pstmt。close();conn。close();catch(SQLException e)e.printStackTrace();return i;+”,Zhichen=”+yuangong.getZhichen()+where ID=”+yuangong。getId()+”;查询所有员工信息。如图 310 所示。图 3-10 查询所有员工信息具体代码如下:public static Yuangong getAllYuangongInfo()Connection conn=getConn();String sql=”Select from Yuangong;PreparedStatement pstmt;try pstmt=(PreparedStatement)conn。prepareStatement(sql);ResultSet rs=pstmt.executeQuery();rs.last();/移到最后一行int rows=rs。getRow();/得到当前行号,也就是记录数rs.beforeFirst();/如果还要用结果集,就把指针再移到初始化PreparedStatement pstmt;try pstmt=(PreparedStatement)conn。prepareStatement(sql);i=pstmt。executeUpdate();pstmt.close();conn.close();catch(SQLException e)e.printStackTrace();return i;的位置Yuangong yuangong=new Yuangongrows;int i=0;while(rs。next()yuangongi=new Yuangong();yuangongi。setId(rs.getInt(ID”);yuangongi.setName(rs.getString(Name));1 1yuangongi。setSex(rs.getString(Sex);yuangongi.setAge(rs。getInt(Age);yuangongi.setZhichen(rs.getString(Zhichen”)i+;return yuangong;catch(SQLException e)e.printStackTrace();return null;3.5。3 出勤信息查询查询所有员工的出勤信息。如图 3-11 所示。图 311 出勤信息查询具体代码如下:public static Chuqin getAllChuqinInfo()throws ParseException Connection conn=getConn();String sql=SELECT a。Name,b。AM0,b.AM1,b。PM0,b。PM1,b.Judge,a.ID FROM Yuangong a,Chuqin b WHERE a.ID=b。ID;PreparedStatement pstmt;try SimpleDateFormat sdf=new SimpleDateFormat(”yyyyMMddHH:mm:ss”);置Chuqin chuqin=new Chuqinrows;1 2pstmt=(PreparedStatement)conn。prepareStatement(sql);ResultSet rs=pstmt.executeQuery();rs。last();/移到最后一行int rows=rs.getRow();/得到当前行号,也就是记录数rs.beforeFirst();/如果还要用结果集,就把指针再移到初始化的位int i=0;while(rs.next())chuqini=new Chuqin();chuqini。setId(rs。getInt(7);chuqini.setAMdate0(sdf。parse(rs。getDate(2)+”+rs.getTime(2));chuqini。setAMdate1(sdf。parse(rs。getDate(3)+rs。getTime(3);chuqini。setPMdate0(sdf。parse(rs.getDate(4)+”+rs。getTime(4);chuqini。setPMdate1(sdf.parse(rs.getDate(5)+”+rs。getTime(5)));chuqini。setJudge(rs.getString(6);i+;return chuqin;catch(SQLException e)e。printStackTrace();return null;3。5.4 出差信息查询查询所有员工的出差信息。如图 3-12 所示。图 312 出差信息查询具体代码如下:public static Chuchai getAllChuchaiInfo()throws ParseException Connection conn=getConn();String sql=”SELECT a.Name,b。BeginDay,b.EndDay,b.Days,a.IDFROM Yuangong a,Chuchai b WHERE a.ID=b.ID”;PreparedStatement pstmt;try 1 3pstmt=(PreparedStatement)conn.prepareStatement(sql);ResultSet rs=pstmt。executeQuery();rs.last();/移到最后一行int rows=rs。getRow();/得到当前行号,也就是记录数rs.beforeFirst();/如果还要用结果集,就把指针再移到初始化的位置Chuchai chuchai=new Chuchairows;int i=0;while(rs.next())return chuchai;catch(SQLException e)e。printStackTrace();chuchaii=new Chuchai();chuchaii。setId(rs。getInt(5);chuchaii.setBeginDay(rs.getDate(2);chuchaii.setEndDay(rs。getDate(3);chuchaii。setDays(rs。getInt(4));i+;return null;3.5。5 请假信息查询查询所有员工的请假信息。如图 313 所示.图 313 请假信息查询具体代码如下:public static Qingjia getAllQingjiaInfo()throws ParseException Connection conn=getConn();String sql=”SELECT a。Name,b.BeginDay,b。EndDay,b。Days,a.IDFROM Yuangong a,Qingjia b WHERE a.ID=b。ID;PreparedStatement pstmt;1 4try pstmt=(PreparedStatement)conn.prepareStatement(sql);ResultSet rs=pstmt.executeQuery();rs.last();/移到最后一行int rows=rs.getRow();/得到当前行号,也就是记录数rs。beforeFirst();Qingjia qingjia=new Qingjiarows;int i=0;while(rs.next())return qingjia;catch(SQLException e)e。printStackTrace();qingjiai=new Qingjia();qingjiai。setId(rs.getInt(5);qingjiai.setBeginDay(rs。getDate(2));qingjiai.setEndDay(rs。getDate(3));qingjiai.setDays(rs.getInt(4));i+;return null;3。5.6 加班信息查询查询所有员工的加班信息。如图 314 所示。图 3-14 加班信息查询具体代码如下:public static Jiaban getAllJiabanInfo()throws ParseException Connection conn=getConn();String sql=SELECT a。Name,b.BeginTime,b。EndTime,b.SumTime,a.ID FROM Yuangong a,Jiaban b WHERE a.ID=b.ID”;PreparedStatement pstmt;1 5try SimpleDateFormat sdf=new SimpleDateFormat(yyyyMMddHH:mm:ss);pstmt=(PreparedStatement)conn.prepareStatement(sql);ResultSet rs=pstmt。executeQuery();rs。last();/移到最后一行int rows=rs。getRow();/得到当前行号,也就是记录数rs。beforeFirst();Jiaban jiaban=new Jiabanrows;int i=0;while(rs.next()jiabani=new Jiaban();jiabani.setId(rs。getInt(5));jiabani。setBeginTime(sdf。parse(rs.getDate(2)+rs。getTime(2)));jiabani.setEndTime(sdf。parse(rs.getDate(3)+”+rs.getTime(3)));jiabani.setSumTime(rs。getInt(4);i+;return jiaban;catch(SQLException e)e.printStackTrace();return null;3。5.7 系统主界面集成设计在分别完成各小模块设计后,需要把所有的功能模块整合到主界面上,以便于用户操作使用。在主界面设计中,主要涉及到菜单栏和菜单项以及相应的事件反应机制的设计。系统主界面完善后如图 315 所示。1 6图 3-15 系统主界面具体代码如下:public MainFrame()setTitle(职工考勤管理系统);setDefaultCloseOperation(JFrame。EXIT_ON_CLOSE);setBounds(100,100,491,332);contentPane=new JPanel();contentPane.setBackground(new Color(102,204,255));setContentPane(contentPane);JMenuBar menuBar=new JMenuBar();setJMenuBar(menuBar);JMenu menu=new JMenu(”员工);menuBar.add(menu);JMenuItem menuItem_2=new JMenuItem(”添加员工信息);menuItem_2.addActionListener(new ActionListener());menu。add(menuItem_2);JMenuItem menuItem=new JMenuItem(查询员工信息);menuItem.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)String in=(String)JOptionPane.showInputDialog(null,”请输入员工编号:n”,查询员工信息”,JOptionPane。PLAIN_MESSAGE,null,null,”在这输入”);public void actionPerformed(ActionEvent arg0)YuangongGUI yuangonggui=new YuangongGUI(-1);yuangonggui.setVisible(true););int id=Integer。parseInt(in);YuangongGUI yuangonggui=new YuangongGUI(id);yuangonggui.setVisible(true);1 7menu。add(menuItem);JMenuItem menuItem_1=new JMenuItem(查询所有员工信息”);menuItem_1。addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)try Table table=new Table(5,1);table。setVisible(true);catch(ParseException e1)e1.printStackTrace(););menu。add(menuItem_1);JMenu menu_1=new JMenu(出勤”);menuBar。add(menu_1);JMenuItem menuItem_7=new JMenuItem(查询所有出勤);menuItem_7。addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)try Table table=new Table(2,-1);table。setVisible(true);catch(ParseException e1)e1.printStackTrace(););menu_1.add(menuItem_7);JMenu menu_2=new JMenu(”出差”);menuBar.add(menu_2);JMenuItem menuItem_8=new JMenuItem(”查询所有出差);menuItem_8。addActionListener(new ActionListener()1 8public void actionPerformed(ActionEvent e)try Table table=new Table(1,1);table.setVisible(true);catch(ParseException e1)e1。printStackTrace(););menu_2.add(menuItem_8);JMenu menu_3=new JMenu(请假”);menuBar.add(menu_3);JMenuItem me