员工管理系统源码及一些问题及解决方案

一:员工管理系统源码

员工管理系统Gitee地址:https://gitee.com/deng-jianglong/hnluchuan_2021-07-21

二:问题合集

1.导入数据库到SQLyog时执行sql脚本出现错误:无法使用use语句;Unknown database ‘staff’

解决方案:
1.百度几种解决方案都不适用,打开sql脚本发现开头是以下语句:
drop database if exists staff ;
CREATE DATABASE IF NOT EXISTS salary /*!40100 DEFAULT CHARACTER SET utf8 */;
USE salary;
2.再回到SQLyog一看,发现果然是创建了名为salary的数据库
3.将sql文件中的salary修改为staff,即可导入成功。

2.Mysql替换版本后连接失败

解决方案:
1.在我的电脑–>管理–>服务中启动mysql,无法启动
2.以管理员身份使用win10自带的powerShell终端输入如下命令:net start mysql,启动成功
3.sqlyog仍无法连接
4.打开cmd,在mysql目录下输入命令mysqld --initialize --user=mysql --console获取临时密码
5.输入命令mysql -uroot -p,回车,接着输入刚刚获取的临时密码,登录成功
6.修改密码:ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘123456’;
7.sqlyog连接成功
8.mysql 5.7.34版本安装,配置,连接完成

3.启动项目出现问题ERROR Could not parse url

解决方案:
1.经查询可能是由于路径中包含中文导致的错误,将项目转移到纯英文路径中,问题解决。

4.日期数据显示不出来

解决方案:添加对日期格式的控制pattern=“yyyy-MM-dd”。

5.弹出的页面是杂乱的后台代码

解决方案:
1.控制台报错Caused by:javax.el.PropertyNotFoundException: Property 'iDCard' not found on type  com.hnluchuan.staff.dto.EmployeeDTO
                  2.通过报错发现问题出在属性"iDCard"上,根据提示路径发现是在employee_detail中引用了该属性,无法转到实体类中的IDCard
                  3.把employee_detail中的iDCard改成IDCard。再次运行,查看员工信息详情成功。

6.新增或查询时选择员工id和用户id有问题

解决方案:
1.当选择id后,输入框内没有显示选择的id,导致无法判断是未选取成功还是选取了但后续功能无法实现
2.查看代码发现有一输入框的type=“hidden”,将其去掉后在界面中若选取id成功即可在该框内显示
3.发现大部分是未选取到id,将可以选取到id的界面的代码与之对照,发现是由于选择框内的id名和bring代码块中的idInput不一致导致的。
4.将其名称改为一致,再次查询成功。

7.对字段进行验证(电话号码,身份证号码)

解决方案:
1.在编辑信息弹出的jsp界面对应代码中需要验证的字段加入id属性,并加入验证是否为空的代码,运行后发现无法触发功能。
2.在显示信息的界面新增按钮对应的代码,发现是k.layer.add控制弹出的界面,进入代码,在表示提交的代码块上方加入验证代码,运行触发验证功能,信息填写不能为空。
3.继续通过正则表达式添加信息的格式控制代码,验证成功。

8.无法根据下拉选择框中选中的内容进行查询

解决方案:
1.在页面中添加下拉选择框。设置好相应属性值
2.点击查询,功能没有触发
3.通过查阅资料尝试了各种方法都无法获取到选中的值并查询出结果。(onchange,onclick,input与select结合)
4.对比为何input能查询到,select就查不到,发现原来标签属性中name的值不能自定义,要与数据库中的字段名相同才能获取到值进行查询。
5.将select标签中属性改为name=“status”,运行,选择下拉框查询成功。

9.使用代码托管平台对代码版本进行控制

解决方案:
1.想到了之前了解的gitee代码托管平台好像可以记录版本更新情况
2.将项目上传到gitee仓库
3.在IDEA中打开上传到gitee的本地文件夹中的项目
4.此时对项目中的代码进行更改就会被Git记录
5.每次完成一些修改后可以更新项目并提交到gitee中去,以便出现问题可以回滚到较近的版本
6.提交操作:点击上方的√–>Commit and push 或者右键点击项目–>Git–>Commit Directory–>Commit and push

10.持久层注解@OneToMany报错

解决方案
1.业务要满足一个员工可能对应其他某表的多条信息,可是加上注解@OneToMany就报错:Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements
2.因为是一对多,有一方是多,所以不能用一个单独的变量来定义,要用到集合。
3.将原来的:private Education education;改为:private Set educations=new HashSet();
4.再次运行不报错了

11.在有其他关联的数据时直接删除员工信息失败

解决方案
1.删除员工信息时后台报错:Cannot delete or update a parent row: a foreign key constraint fails,因为其他的表中有与这个员工关联的数据没删除,不能直接删员工信息
2.添加级联,在employee实体类的一对多注释中加入:cascade = CascadeType.ALL,这样他们的各项操作都会关联起来同步进行。
3.修改后再删除员工信息,关联的其他信息也会一并删除。

12.发现新增员工时员工工号可以为重复值,这是不合常理的

解决方案
1.记得数据库中有个约束是唯一性,查资料如何设置某属性为唯一性
2.在改变表中对需要的字段新增索引,索引类型设置为UNIQUE
3.保存后再新增员工,员工工号不能为重复值。
4.身份证,联系电话也加上唯一性

13.无法在弹窗嵌套中实现功能

解决方案:
1.点击按钮正常弹出新增或修改信息的窗口,填入信息后点击确定信息无法保存,但也没报错。
2.仔细观察后发现是在详情页中打开的弹窗大小与父窗口一样大,并且被父窗口覆盖,所以点击的确定实际是对员工详情页确定,而不是详情页中新弹窗的确定。
3.调整弹窗大小,使两窗口界面分明,再次尝试修改信息,成功。

14.多个表的增删改按钮功能混乱

	已解决
	1.员工学历表信息在员工详情中完成增删改功能后给其他表也加上按钮尝试,明明选择了某行,点击详情后弹出“请选择一条记录”。说明并没有选取到。
	2.观察代码,是根据 var selections = $('#table').bootstrapTable('getAllSelections');来判断选中的记录的,但是其他按钮也是通过$('#table')来选中,所以造成选择混乱。
	3.将每个表的table的id区分开来,如id=“edu_table”表示员工学历的信息表,依次改动。
	4.再次尝试对不同表增删改,成功。

15.实现逻辑删除

解决方案:
1.给需要实现逻辑删除的表在数据库中增加一个字段“deleted”来表示删除状态
2.在实体类中加入字段的定义和方法
3.在service层中把原来的物理删除修改为逻辑删除,获取到选中的id,将这些记录的deleted字段的值改为true,表示deleted生效
4.在显示表中数据的find方法中用hql语句加入一个判断语句,(hql.append(" and n.deleted != true ");)只有当deleted字段的值不为true时才显示改行数据。
5.运行系统测试,点击删除后,界面中改行数据消失,数据库中数据仍然存在,deleted的值由0变为1。

16.逻辑删除没有将各表同步

解决方案:
1.按理来说如果删除一个员工的信息,那么与其有关的其他信息也应该被删除,而不会独立存在。
2.逻辑删除不会像物理删除一样通过级联同步删除其他关联数据,那么同样考虑将那些信息同步隐藏起来。
3.在其他与员工表关联的表的显示数据的find方法再追加一个条件,要其本身的deleted和与其关联的员工表的deleted都不为true时(hql.append(" and n.employee.deleted != true ");)才显示该行数据。
4.运行系统,删除某员工基本信息后查看与其关联的其他信息,都不再显示,数据库中员工的deleted的值为1,其他表的deleted仍为0,但也不会显示。成功。

17.身份证号与性别的一致性

解决方案:
1.要获取身份证倒数第二位的位数的值和填写的性别,然后做判断
2.定义一个变量储存身份证倒数第二位,用parseInt转为int类型,然后对2取余,就可以判断是奇数还是偶数了
3.性别的填写时是枚举类型,不知道怎么获取值并且进行判断
4.尝试跟获取身份证号一样,将它打印在页面中显示的是NaN,查询是Not a Number(不是一个数值)的缩写。
5.用js获取不到枚举类型的值,就在Controller层中用java尝试获取
6.在sava方法中分别获取性别的value值和身份证倒数第二位的数,然后进行对比验证。

18.身份证号与出生日期的一致性

解决方案:
1.用substring方法分别获取到身份证号中代表年月日的字段。
2.按照日期的格式将年月日拼接起来
3.将从身份证号中拼接的日期与填写的出生日期进行对比判断。

19.在Controller层中的验证问题

解决方案:
1.对性别和身份证的验证实现了,但是对比之后就算不符合要求也还是会保存数据
2.自定义一个异常,如果验证没有通过就抛出异常,就不会保存错误的数据了

20.逻辑删除的功能有问题

解决方案:
1.在员工详情中的其他表数据就算在数据库中的delete是true的也会显示
2.发现在详情中的其他表数据的显示是没有经过find方法的判断的,它是直接从员工的实体类中获取来的。
3.jsp中可以用<c:if>来实现判断语句,于是在展示信息前加个条件(<c:if test="${n.deleted==false}">),当deleted为false时才显示该条信息,这样就实现了详情表中的逻辑删除。

21.某几个表新增信息又无法显示了

解决方案:
1.新增信息后发现数据库中的deleted为null,而不是设置的默认值0
2.有几个表的实体类中定义deleted属性类型的boolean错写成了Boolean,改为小写后新增功能恢复正常
3.之前认为的是在db.sql中新写的语句起到了设置默认值的作用,现在删掉那些语句后,新增功能还是正常。由此看来并不是那句语句起到了作用。

22.boolean和Boolean的问题

解决方案:
1.发现当实体类用boolean时新增功能正常,但显示数据时的<c:if>条件判断就不起作用了。用Boolean则相反。
2.查询发现: boolean 是 基础数据类型 当遇到不能解析的情况下 会默认给false然后 Boolean 是包装类,是一个对象,所以当遇到不能解析的情况下会默认给null
3.将实体类中deleted的set方法的变量的数据类型由Boolean改为boolean后尝试删除数据,报错:Caused by: java.lang.NoSuchMethodError: com.hnluchuan.staff.model.Family.setDeleted(Ljava/lang/Boolean;)V
4.查询后得知(Ljava/lang/Boolean;)V这一段叫做JNI字段描述,是对函数返回值和参数的编码,翻译过来就是Void(Boolean),这与Set方法一致,但是它却说没有找到这个方法,从而无法触发对deleted变量的赋值改变,导致删除失败。
5.而且是部分表会报这个错,部分表能正常删除,对比对deleted字段的定义和使用发现是一样的。
6.查询很多资料说是jar包依赖冲突的问题。,但尝试查找没有找到那里冲突了
7.这个方向行不通,就把实体类的boolean改成Boolean,这样出现的问题是新增的数据deleted默认为null,从而<c:if test=false>条件判断不对,无法显示新增的信息,把条件改为test=null就可以了。
8.但是如果把之前是boolean时能正常删除的几个表改为Boolean,删除时反而报错了,查询也是某些冲突,难以解决,所以就决定让几个表的deleted为boolean,几个表的为Boolean,这样删除和新增功能都能正常实现了。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值