B/S架构实现员工工资管理系统(含源码)

时间:2023-01-27 23:06:56

好久都没有这么累过了持续了大半个月的学期末阶段就这样结束了,期间经历了一个礼拜左右的时间去完成数据库课设,说是说数据库课设,但给人的感觉其实就是一个完整的网站开发项目,开始理一理

题目:员工工资管理系统

软件架构:B/S

开发环境:Win10+Eclipse J2EE+JSP+JavaBean+ apache-tomcat-8.0.48 +MySQL5.7.20

辅助工具:mysql-connector-java-5.1.45 +Navicat

源码包已上传至http://download.csdn.net/download/mikeoperfect/10214875

记录一下那周的情况:

2018年1月6日数据库项目正式开始,初步确定技术路线:J2EE+MySQL ,秉承简单优先的原则,采用:Jsp+tomcat+mysql

1月7日,星期天,又是一个下雨的天气,没有任何进展,一直都在IDEA社区版maven这边折腾,除了熟悉了jsp外,只剩下无比的焦虑

1月8日,星期一,正式改变开发环境,从IDEA转换为eclipse,进展不错,但止步于MySQL的JDBC,晚上问题依旧存在,逐项排查发现MySQL登陆账号和密码不相符,更改之后,成功连接MySQL,成功运行,测试通过。

1月9日,星期二,构思网站结构,通过 www.processon.com 制作了网站的结构地图,,晚上学完JSP基本的语法

1月10日,星期三,数据库设计基本完成,上午制定完前端任务,想法:前端和后台,数据库设计项目的配合十分的重要,到底哪个先完成,哪个指导哪个是关键问题,首先数据库这边先完成触发器的设计,当进行增删改测试成功之后,前端就简单了。19:30许,将源代码编写完毕,已保存至桌面new文件夹下,下一步开始测试,分步测试,首先测试员工账号,首战告捷,加油!

2018年1月11日星期四 08点45分,员工账号这边已经完全解决了,09点40分,完成www.processon.com 员工登陆思维导图

开始root账号登陆设计。 已设置两个管理员账号

2018年1月12日星期五,08点46分,下周一有个信号与系统考试,有点烦,现在还有debittable和allowancetable两块有待设计。

2018年1月12日星期五,下午16点00分,基本完成了数据库的开发工作,当然啦,小问题依旧存在,急需要改善,17点00分:开始网站优化和项目总结

2018年1月13日星期六,正在复习信号与系统,项目搁置2天,星期一晚9点重新开始,需要做的内容有加急内容、数据库数据的生成、BUG的修复等等

2018年1月15日,20点26分,项目重新开始,项目BUG修复

首先介绍一下数据库的设计

  • ER图
    B/S架构实现员工工资管理系统(含源码)

  • 表结构设计

B/S架构实现员工工资管理系统(含源码)
B/S架构实现员工工资管理系统(含源码)

———————————————-
B/S架构实现员工工资管理系统(含源码)
B/S架构实现员工工资管理系统(含源码)

———————————————
B/S架构实现员工工资管理系统(含源码)
B/S架构实现员工工资管理系统(含源码)

———————————————–
B/S架构实现员工工资管理系统(含源码)
B/S架构实现员工工资管理系统(含源码)

————————————–

B/S架构实现员工工资管理系统(含源码)

B/S架构实现员工工资管理系统(含源码)

—————————————–

B/S架构实现员工工资管理系统(含源码)

B/S架构实现员工工资管理系统(含源码)

数据库设计问题

数据库的设计是关键问题,这直接影响到了后续的发展情况,一开始我们因为没有这方面的设计经验,所以不太清楚应该如何进行,到底该如何配合是我们最为头疼的地方,但随着项目的不断深入,,慢慢的发现原来是这么做 的,数据库的设计是很重要的,因为考虑到效率问题,最好的办法就是先将数据库的基本表确定下来,本来我们有10个表,后来发现有些多余,然后删减到6个表,但是后来又发现不太行,其中一些字段是无关字段,于是继续删减,最终形成了如上数据字典。

stafftable中的staffCode是主键,wagetable中的staffCode是外键,如果添加员工基本信息之后又添加了员工工资信息,则无法直接删除员工基本信息,因为有外键约束,因此只能先删除员工的工资信息然后再删除员工的基本信息。 若只删除员工工资信息则部门人数还是不变,只有再删除员工基本信息,部门人数才会减一。

stafftable中的staffDepartment是外键,dptable中的dpCode是主键,因此添加员工基本信息时必须参考dptable中的dpCode,且dptable只能通过直接操作数据库添加无法通过网站界面添加,保证了数据库的安全性。

再来介绍下前后端设计

B/S架构实现员工工资管理系统(含源码)

B/S架构实现员工工资管理系统(含源码)

B/S架构实现员工工资管理系统(含源码)

前后端实现问题

采用的是原始的不能再简单的JSP+JavaBean,6个表源码完全是手动薅的,所以给人的感觉是十分的简陋,但在设计的过程中也是存在着很多的问题,因为我是负责这一块的,所以比较的清晰,以下是我的项目问题记录及后来的解决办法。

员工登陆逻辑: index.html中输入UserName,UserPassword,login_check.jsp获取UserName和UserPassword且将值设置为stafftable.java中的对应初值,进入到stafftable.java中判断是否与数据库中Name和Password一致,如果一致则将数据库(关键值)赋值给stafftable.java中的相应初值以便用session记录初值传给其他网页:比如传给usre_list_basic.jsp页面中,利用session记录的初值
(比如staffCode)将数据库字段统统赋值给stafftable.java中,方便后续的操作,比如增删查改(员工登陆只有查的作用)

  • 字符乱码编码问题(约定的是GBK编码)

数据库:不仅仅MySQL中的编码要为GBK,导出的sql文档编码方式也要是gbk才行,如果为utf8,则因为其他地方都是GBK故而会出现问题

界面输入框: String输入需要转换字符编码,而数字则不需要进行转换编码,但要记住一开始的对象都是Object类。

<a href="delete_attendance_save.jsp?staffCode=<%=attendance_rs.getString("staffCode")%>"> 
String staffCode=request.getParameter("staffCode");
支持URL传参 多个参数可以用&隔开
  • 登陆时如果没有选择管理员或者用户,则会报错,这个需要解决(已解决,办法如下,user就是选择的name属性)
    解决办法:(添加如下JavaScript脚本)
 <% if(user==null)
%>
<script type="text/javascript" language="javascript">
alert("请选择登陆类型!");
document.location.href="index.html";
</script>
  • 加急:排查各个表的删除功能,现在删除的依据是staffCode,但是没有考虑到date,如果还仅依据staffCode,则将所有不同date但相同staffCode信息删除,故需要改变!!

解决办法:

在Java源码删除方法中,删除MySQL语句后面添加时间限制

  • 如果退出之后点击返回按钮可以直接使用以前的cookies,非常不安全,找到解决办法了:

解决办法:拦截器,因为时间关系还没有实现,以后有时间再说了。

  • 假设界面更新中,信息输入不全的情况下还没有解决,

    思路是:①每个request.getParameter(String name) 都写一个判空条件,②使用request.getParametervalues(String name)一次性解决

这一次学到的东西也是超级的多,比如:

java中sql语句能不能加分号的问题?

一、原因

  在程序运行中,当执行sql后总是报无效字符错误;但是把程序放在pl/sql中执行又没有错误。让我很纳闷!于是我开始查找资料,然后我终于发现了问题。

二、问题剖析

  原来在程序中;如果你在程序里面写sql,就不要加分号,在程序里面编译器会把分号当做sql本身的一部分,所以会报错。

 如果是在查询工具里面(比如plsql),这个时候可以加上分号,在工具里面已经做过预处理,分号是个分隔符,看到分号就标志着本条sql语句结束了;

因此java中sql语句不能加分号。

  • 源码中的易错点: ” and date= ” 和 “and date= ” 值得注意

在写对应数据库的decimal时,发现了Java中有Bigdecimal对应的参数,
BigDecimal decimal = new BigDecimal(Math.PI);
decimal = decimal.setScale(10, BigDecimal.ROUND_HALF_EVEN); 10 是10个小数,其中ROUND_HALF_EVEN是 银行家舍入法
向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;

如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。

此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
如果前一位为奇数,则入位,否则舍去。

以下例子为保留小数点1位,那么这种舍入方式下的结果。

1.15>1.2 1.25>1.2

前端HTML中的input标签限制输入属性

<input   onkeyup="value=value.replace(/[^\d]/g,'')"   > 
//可以解决输入只限于整数。
<input onkeyup="if(isNaN(value))execCommand('undo')" onafterpaste="if(isNaN(value))execCommand('undo')" > 
//能输入数字和小数点
<input   onkeyup="this.value=this.value.replace(/[^\u4E00-\u9FA5]/g,'')"  >
//只能输入中文

readonly表示此域的值不可修改,仅可与 type=”text” 配合使用,可复制,可选择,可以接收焦点,后台会接收到传值.
  代码如下
 

 <input type="text" name="IP" readonly="readonly"  />

disabled表示禁用input元素,不可编辑,不可复制,不可选择,不能接收焦点,后台也不会接收到传值
  代码如下
 

 <input type="text"  name="IP" disabled="disabled" />

 或者 

<input type="text" value="" maxlength="0" />

或者

<input type="text" onfocus="this.blur();">  

小结
整个过程真的很累,尤其是加班加点后依然无法避免BUG的情况,不过这次学到的东西真的实在是太丰富了,满载而归一点都不过分,团队配合也是相当的重要,最重要的是理清楚了这种网站开发的全过程,这种感觉真的还是挺不错的!