资源描述
课程设计
总结报告
设计题目:公司员工考勤管理系统设计
学院 数学与计算科学学院
专业 信息与计算科学
班级 14信计四班
学号 14070204**
姓名 黎*文
指导老师 彭*辉
时间 2016年11月20日
摘要
公司考勤系统
项目描述:
开发背景:在公司内,员工的考勤通常缺乏方便且有效的管理手段,针对此需求需要开发一套考勤管理系统。
价值:公司考勤系统他类别与普通的系统更方便,更简洁,更容易上手,能更直观的反应出每个员工的考勤,对员工的管理就更有效率。这个系统适用于所有公司。
开发工具:oracle 11g,Eclipse
开发语言:Java
核心技术:JOBC对数据库的操作,操作界面的设计,各种布局方式和插件
(1)使用JFrame控件进行界面设计
(2)使用静态字段实现窗体间的数据传递
(3)使用代码方式向容器控件中添加控件
需求分析: (1)登录主界面(2)功能主窗口(3)设置工作时间:只限管理员 (4)修改密码(5)员工管理信息(只限管理员):(只限管理员)(6)考勤信息管理:只限管理员 (7)考勤登记:只限员工 (8)重新登录(9)退出(10)关于帮助
功能模块的难点技术和实现思路:
考勤信息管理:只限管理员 在界面中显示考勤信息,并作出相应更改,以及数据的输入。
一. 需求分析:
公司需要存储雇员的编号、姓名、性别、所在部门,级别,。其 中,雇员分为经理、技术人员、销售人员和销售经理。销售经理能够管理所有人的信息,其他人只能查看自己的信息,采用以往的方式,显得复杂和麻烦,现在,我们开发出员工考勤管理的系统,对员工的考勤进行动态的管理。随着现代科技的进步,用计算机来进行考勤的管理也成为现代化企业运作必不 可少的一部分。在过去我们的考勤工作都是人工完成的,不仅浪费了很多的人力跟物力,而且无法保证其准确性和透明度;给企业的管理带来了许多的不便。现在利用计算机来管理我们的考勤工作,大大降低了工作人员的工作量,提高了工作效率,使原 本复杂和枯燥无味的工作变得简单而轻松了。 计算机技术特别是数据库技术的发展为企业建立管理信息系统,甚至对改变管 理思想起着不可估量的作用。实践证明信息技术已在企业的管理层面扮演越来越重 要的角色。
二. 概要设计
设计本考勤系统目的是为企业解决员工考勤的繁琐工作,减轻企业负担,减少 不必要的劳动力、金钱的损耗,提高工作效率,为企业创造更多效益,实现单位考勤管理的系统化、规范化和自动化。因此本系统主要需要实现以下几个功能:
管理员登录及信息维护,员工信息维护,数据采集,基本数据(请假类型,和数据)维护,数据库管理,查询功能,,请假、休假记录等。具体分析见下:
2.1登录系统:
包括用户登录、修改密码、退出系统等。登录分为两种形式,客户和管理员。用户名或密码不知道或者错误时将自动以客户登录,除了系统模块外的所有模块都呈现不可激活状态,不能进行操作。
2.2基本操作:
(1)添加功能:程序能够任意添加记录,,要求员工的编号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并转化为修改。
(2)查询功能:可根据编号、姓名等信息对已添加的员工信息和休假信息进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息;
(3)显示功能:可显示当前系统中所有记录,每条记录占据一行。
(4)编辑功能:可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。
(5)删除功能:主要实现对已添加的人员记录和休假记录进行删除。如果当前系统中没有相应的人员记录,则提示“记录为空!”并返回操作。
(6)统计功能:能对所有人员进行统计。
(7)保存功能:可将当前系统中各类人员记录和休假记录存入文件中,存入方式任意。
(8)读取功能:可将保存在数据库中的信息读入到当前系统中,供用户进行使用。
三. 详细设计
3.1 使用到的类的介绍:
(1) AddMenu: 实现添加菜单功能的类。
(2) BoxPanel: 继承JPanel类,有 JLabel ;JTextField 两个变量,显示主界面中的变量名和内容。
(4) Boxpanelpass: 继承JPanel类,JPasswordField,有JPasswordField变量,实现密码的输入。
(5)DateBaseConn: 数据库连接类,有一个连接数据库的函数 returnConn();
(6)DeleteMenu: 删除功能的实现
(7)LeaveB: 一个抽象类,继承JDialog类 ,显示的作用。
(8)LeaveBL: 继承LeaveB类,实现请假的功能。
(9)LeaveBV: 继承LeaveB类,实现休假的功能。
(10)Logpage: 登录界面的类。
(11)Operatepage: 操作界面的类
(12)SaveMenu: 实现保存菜单的类
(13)ShowAll: 实现统计菜单中子菜单显示所有子菜单的类
(14)ShowStaffMenu: 实现显示菜单的类
(15)Staff: 记录员工信息的类
3.2 登录系统的设计:
(1)导入了以下类,
import javax.swing.JButton;
import javax.naming.spi.DirStateFactory.Result;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
通过布局使界面如下:
3.3 操作界面的设计:
使用以下导入的类进行界面设计:
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
最终效果如下:
3.4 难点部分:
(1)登录密码的实现:
if (e.getSource()==bConfirm) {
try {
//连接数据库
Connection conn = (Connection) DateBaseConn.returnConn();
//数据库操作
PreparedStatement sts=conn.prepareStatement(
"select ENUM from CSAS123L where ENUM=? and EPASSWORD = ?" );
if(administratorbp.text.getText().equals("1407020415")){
sts.setString(1,administratorbp.text.getText() );
}
else{
sts.setString(1,staffpb.text.getText() );
}
sts.setString(2,new String (passworbp.text.getPassword()) );
ResultSet rs = sts.executeQuery();
//通过查找,对应密码和编号的员工是否存在
if(rs.next())
{
//若果是管理员账号,进入管理员界面
if(rs.getString("ENUM").trim().equals("1407020415"))
{
System.out.println(rs.getString("ENUM").trim());
a = new Operatepage(rs.getString("ENUM").trim());
menuSetEnable(a,true);
}
else
{
a = new Operatepage(rs.getString("ENUM").trim());
menuSetEnable(a,false);
a.menu8.setEnabled(true);
}
}
else
JOptionPane.showMessageDialog(confpanel, "请输入正确的账号和密码!");
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException | SQLException e1) {
e1.printStackTrace();
System.out.println("连接失败!!");
}
}
(2) 数据库的连接类:(直接也有部分错误的抛出没实现)
package com.Listen;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DateBaseConn {
public static Connection returnConn() throws InstantiationException,
IllegalAccessException,ClassNotFoundException, SQLException
{ try {
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
new oracle.jdbc.driver.OracleDriver();
Class.forName("oracle.jdbc.driver.OracleDriver");
//这个Driver的实例化在构建过程中会自动向DriverManager自动注册
//连接数据库
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:"
+ "@127.0.0.1:1521:orcl","scott","Kyq020520");
return conn;
} catch (SQLException e) {
System.out.println("数据库连接失败,请联系管理员。");
}
return null;
}
}
四.设计和调试分析
1. 此系统只有一个管理员,能对数据进行,添加,查询,修改,显示,编辑,删除,和统计。
2. 用户只能根据密码和对应账号进行登录查询,以及请假和休假操作。
五.用户手册
1. 针对管理员
(1) 输入账号密码即可登录,可以使用菜单中所有功能。
(2) 管理员默认密码是“12345678”。
2. 针对普通用户,
(1) 仅可使用请假和休假功能。
(2) 用户默认密码是“12345678”。
3. 要使用本套需要创建数据库文件。
(1) 建立表
表名字为:CSAS123L;
(2)数据的插入。
六.测试结果
(1)登录界面:
(2)查看界面:
(3)查询界面:
(4)请假界面:
其他不在详细描述。
七.设计心得
1. 操作界面过于简单,没有背景图片,应该适当插入部分图片。
2. 人机交互缺乏,对错误的抛出处理不当,考虑到的情况不够全面。
3. 对于数据库的连接仅限于本机,无法实现联网工作,所以对于软件的可移植性不够。虽然用文件的方式操作能够解决这一问题,但是对于数据处理太繁琐。
4. 对于系统设计方面的问题,一定要有计划和流程图,不能想一步做一步,最后会导致问题的处理不够全面。
5. 应该该有一个良好的编码习惯,类的定义,方法的定义,一定要有一套规则,方便检查调试,使别人能够轻易地看懂。
八.附录
AddMenu类
package com.Listen;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class AddMenu {
//清理数据函数,清理显示的信息。
public void clear(Operatepage a){
a.name.text.setText("");
a.number.text.setText("");
a.department.text.setText("");
a.post.text.setText("");
a.sickDay.text.setText("");
a.sickDayOff.text.setText("");
a.offDay.text.setText("");
a.offDayOff.text.setText("");
}
public AddMenu(Operatepage a) {
a.setEnable(a, true);
}
}
Boxpanel类:
package com.Listen;
import java.awt.Font;
import javax.swing.Box;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing. JTextField;
public class BoxPanel extends JPanel{
JTextField text;
JLabel label;
Box box;
public BoxPanel(String s,int n ) {
box = Box.createHorizontalBox();
label = new JLabel (s);
text = new JTextField("",n);
text.setHorizontalAlignment(JTextField.LEFT);
//设置文本格式
// text.setFont(new Font("Arial", Font.BOLD, 14));
box.add(label);
box.add(text);
add(box);
}
//设置密码格式
private void changefont() {
}
}
BoxPanelll类:
package com.Listen;
import javax.swing.Box;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class BoxPanelll extends JPanel{
JLabel label1,lable2;
Box box;
public BoxPanelll(String s,String n ) {
box = Box.createHorizontalBox();
label1 = new JLabel (s);
lable2 = new JLabel (n);
box.add(label1);
box.add(lable2);
add(box);
}
}
DateBaseConn类:
package com.Listen;
import javax.swing.Box;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class BoxPanelll extends JPanel{
JLabel label1,lable2; Box box;
public BoxPanelll(String s,String n ) {
box = Box.createHorizontalBox();
label1 = new JLabel (s); lable2 = new JLabel (n);
box.add(label1);
box.add(lable2); add(box);
}
}
DeleteMenu类:
package com.Listen;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class DeleteMenu{
public static void delete(Operatepage a) throws InstantiationException,
IllegalAccessException, ClassNotFoundException, SQLException {
Connection conn = DateBaseConn.returnConn();
int i = 0;
String sql = "delete from CSAS123L where ENUM='" + a.number.text.getText().trim() + "'";
PreparedStatement sts;
try {
sts = (PreparedStatement) conn.prepareStatement(sql);
i = sts.executeUpdate();
if(i>0)
JOptionPane.showMessageDialog( a.panel1, "删除成功,请继续操作!");
else
JOptionPane.showMessageDialog( a.panel1, "删除失败,请确认后再操作!");
sts.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
AddMenu a1 = new AddMenu( a);
a1.clear(a);
}
}
LeaveB类:
package com.Listen;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
public class LeaveB extends JDialog implements ActionListener{
JPanel topPanel;
JButton sureB,exitB;
public LeaveB() {
setBounds(200,350,200,100);
setVisible(true);
setLayout(new GridLayout(2, 1));
topPanel = new JPanel();
sureB = new JButton("确定");
exitB = new JButton("取消");
topPanel.add(sureB);
topPanel.add(exitB);
sureB.addActionListener(this);
exitB.addActionListener(this);
add(topPanel);
}
public void save(Operatepage a){
SaveMenu a1 = new SaveMenu();
a.sickDay.text.getText();
try {
a1.SaveDate(null);
} catch (InstantiationException | IllegalAccessException |
ClassNotFoundException | SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==exitB){
dispose();
}
}
}
LeavaBL类:
package com.Listen;
import java.awt.event.ActionEvent;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class LeaveBL extends LeaveB{
Operatepage a;
public void save(Operatepage a){
int i1,i2;
SaveMenu a1 = new SaveMenu();
i1=Integer.parseInt(a.sickDay.text.getText());
i1++;
a.sickDay.text.setText(String.valueOf(i1));
i2=Integer.parseInt(a.sickDayOff.text.getText());
i2--;
a.sickDayOff.text.setText(String.valueOf(i2));
try {
a1.UpdataDate(a);
} catch (InstantiationException | IllegalAccessException |
ClassNotFoundException | SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
JOptionPane.showMessageDialog(topPanel, "病假天数:"+a.sickDay.text.getText()+"\n"
+"剩余病假天数:"+a.sickDayOff.text.getText());
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==sureB){
save(a);
a.button1.setEnabled(false);
dispose();
}
else if (e.getSource()==exitB){
dispose();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new LeaveBL();
}
}
LeaveBV类:
package com.Listen;
import java.awt.event.ActionEvent;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class LeaveBV extends LeaveB {
Operatepage a;
public LeaveBV() {
}
public void save(Operatepage a){
int i1,i2;
SaveMenu a1 = new SaveMenu();
i1=Integer.parseInt(a.offDay.text.getText());
++i1;
a.offDay.text.setText(String.valueOf(i1));
i2=Integer.parseInt(a.offDayOff.text.getText());
--i2;
a.offDayOff.text.setText(String.valueOf(i2));
try {
a1.UpdataDate(a);
} catch (InstantiationException | IllegalAccessException |
ClassNotFoundException | SQLException e1) {
e1.printStackTrace();
}
JOptionPane.showMessageDialog(topPanel,
a.name.text.getText()+"\n"+
"带薪休假天数:"+a.offDay.text.getText()+"\n"
+"剩余带薪休假天数:"+a.offDayOff.text.getText());
}
public void actionPerformed(ActionEvent e) {
if (e.getSource()==sureB){
save(a);
a.button2.setEnabled(false);
dispose();
}
else if (e.getSource()==exitB){
dispose();
}
}
}
Logpage类:
package com.Listen;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JButton;
import javax.naming.spi.DirStateFactory.Result;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Logpage extends JFrame implements ActionListener{
JPanel topPanel,confpanel,logPanel;
JLabel topLabel;
BoxPanel staffpb ,administratorbp;
boxpanelpass passworbp;
JButton bConfirm;
JPanel imagePanel;
Operatepage a;
public Logpage() {
super("公司员工考勤管理系统");
setLayout(new GridLayout(3, 1));
//添加上部分
topLabel = new JLabel(" 公司员工考勤管理系统登录界面");
topLabel.setFont(new Font("宋体", Font.BOLD, 30));
topPanel = new JPanel();
topPanel.setLayout(new BorderLayout());
topPanel.add("Center",topLabel);
add(topPanel);
//添加中部分
logPanel = new JPanel();
logPanel.setLayout(new GridLayout(3, 1));
staffpb = new BoxPanel("员工账号: ",15);
administratorbp = new BoxPanel("管理员账号:",15);
passworbp = new boxpanelpass("账号密码: ", 14);
logPanel.add(staffpb);
logPanel.add(administratorbp);
logPanel.add(passworbp);
add(logPanel);
//添加下部分
bConfirm = new JButton("确定");
bConfirm.addActionListener(this);
confpanel = new JPanel();
confpanel.add(bConfirm);
bConfirm.setBounds(30,30 , 50, 50);
add("Center",confpanel);
setBounds(100,100,600,400);
setVisible(true);
}
public static void menuSetEnable(Operatepage a,boolean flag){
a.menu1.setEnabled(flag);
a.menu2.setEnabled(flag);
a.menu3.setEnabled(flag);
a.menu4.setEnabled(flag);
a.me
展开阅读全文