# employee_management_plus **Repository Path**: desiy/employee_management_plus ## Basic Information - **Project Name**: employee_management_plus - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-03 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # employee_management_plus #### 软件架构 简单的spring boot+mybatis项目(CRDU) #### 使用说明 仅供学习 数据库:内容简单可以自创。 #### 介绍 day01:昨天已将项目的静态资源成功导入,如果按照一般的Controller映射页面,可能会出现static资源无法加载,这时使用thymeleaf整合页面,重写WebMvcConfigurer中的方法效果更佳,在实际开发中也建议这样做。再者就是实现了页面的国际化。重写LocaleResolver中的两个方法,主要写Locale方法,LocaleResolver字面翻译局部溶解,这时候要在前端页面需要国际化的地方写入th:href="@{/index.html(l='zh_CN')}"或者th:href="@{/index.html(l='en_US')}",那么在我们自己的写的LocaleResolver继承LocaleResolver后需要在Locale方法中:1.获取请求中的语言参数。2.如果没有Locale就使用默认的。3.如果请求的连接携带了国际化参数。 员工以及管理员相关信息已经存放到数据库中... 今天的任务是将登录功能实现、登录拦截器。注意这里所有的用户名密码都是以数据库中的数据为准! day02: 昨天已将管理员登录模块完成。不同于以前,管理员的用户名和密码是伪造的而不是从数据库中提取,所以这次使用了数据库。使用数据库之前要导入相关的pom文件:mysql-connector-java以及mybatis-spring-boot-starter,需要注意的是如果你的MySQL版本是5.+的,那么相应的包也应该使用低版本的(5.+),不要使用8.+。以免报错。在成功登录后,网页会显示用户名和密码,这是我们不想要的,那么我们需要在视图控制器addViewControllers中添加registry.addViewController("/main.html").setViewName("dashboard");这样登录成功后就会进入main页面,同时也要在LoginController中把return "dashboard"改为return "redirect:/main.html";但是,又出现了一个问题,我们不需要登录直接输入网址localhost://8080/main也可以进入后台页面。所以今天解决的问题是登录拦截器以及展示员工(emp)列表。当然有登录功能就有注销功能,十分简单:session.invalidate();就能实现。 day03: 昨天已完成页面的登录拦截器和员工列表的显示。登录拦截器需要我们自己写一个继承HandlerInterceptor中的preHandle方法。原理:首先获取用户的session,可以用Object接收,如果存在则说明用户已经成功登录。与之对应的要在LoginController中,用户登录成功时setAttribute。最后在Config类中重写addInterceptors方法。registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/*").excludePathPatterns("/index.html","/","/user/login","/css/**","/js/**","/img/**");其中addPathPatterns是值拦截器什么,这里具体是拦截全部,反观excludePathPatterns就是不拦截什么,一般我们不拦截一些静态资源文件和主页。 员工列表的显示:在EmployeeController中写入显示方法,因为要用到数据,所以调用dao层中的查询。再使用Model传给前端。model.addAttribute("emp",employees);//"emp"相当于存这个employees的ID。在前端页面如何获取呢?这时我们可以使用thyme leaf中的th:each="emp:${emp}"-${emp}中的emp是EmployeeController中model中的emp:这叫取值,取完值后要给谁呢?我们这里给emp,emp可以换成其他名字!那么接下来就是th:text="${emp.getId()}"诸如此类的代码。 我们在写前端的时候会有许多重复性的代码,比如头部导航栏、侧边栏等,所以这时我们可以将这些重复性的代码放在一个commons文件,其他页面需要用的时候提取即可。这里还是使用thyme leaf;th:fragment="sidebar"提取,"sidebar"为id,使用时:th:replace="~{commons/commons::sidebar(active='main.html')}";commons文件下的commons页面。(active='main.html')时参数,我们在点击侧边栏的时候会出现高亮,如何设置的呢?thyme leaf三目表达式,例如:th:class="${active=='main.html'?'nav-link active':'nav-link'}"。 Java业务中dao层与service的区别:我们都知道,标准主流现在的编程方式都是采用MVC综合设计模式,MVC本身不属于设计模式的一种,它描述的是一种结构,最终目的达到解耦,解耦说的意思是你更改某一层代码,不会影响我其他层代码,如果你会像spring这样的框架,你会了解面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。初期也许都是new对象去调用下一层,比如你在业务层new一个DAO类的对象,调用DAO类方法访问数据库,这样写是不对的,因为在业务层中是不应该含有具体对象,最多只能有引用,如果有具体对象存在,就耦合了。当那个对象不存在,我还要修改业务的代码,这不符合逻辑。好比主板上内存坏了,我换内存,没必要连主板一起换。我不用知道内存是哪家生产,不用知道多大容量,只要是内存都可以插上这个接口使用。这就是MVC的意义。 接下来说你感觉service的意义,其实因为你现在做东西分层次不是那么严格,在一个你们做东西业务本身也少,举个最简单的例子,你做一个分页的功能,数据1000条,你20条在一个页,你可以把这个功能写成工具类封装起来,然后在业务层里调用这个封装的方法,这才是业务里真正干得事,只要没访问数据库的,都要在业务里写。 员工登录模块错误做法:在写LoginController时,调用了dao层,而在实际项目开发中我们具体的业务应该写在service层中,也就是我们需要在service层中写login方法,在Controller中调用service。 简而言之一句话,需要业务功能就调用service层,需要访问数据就调用dao层。今天完成的任务是实现员工的添加。 day04: 昨天花了很多的时间来完成员工的添加功能。首先不管是什么业务我们都要先实现页面的跳转成功,所以开始先搭建好我们的前端页面,就像这里我们做添加功能,在主页面写了个添加按钮,注意:这里按钮点击过去是GET请求,那么在对应的Controller中最好也是GetMapping(),先成功跳转到页面再去实现具体业务。表单用post提交,则在Controller中最好也是PostMapping()。 那么下面的内容就是昨天困扰我几个小时的Bug;首先看报错nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'departmentid' in 'class com.desiy.pojo.entity.Emp',大概意思就是在com.desiy.pojo.entity.Emp这个类中没有departmentid的getter属性。我的Emp类使用了lombok,绝对不是没有getter属性,网上的解决方法大多都是在xml文件中的字母打错了,于是我仔细检查了每个属性,但是并没有发现拼写错误。。。经过千辛万苦终于发现了问题,在我的Emp中,'departmentid' 中的id是大写Id,但是在EMPDao.xml配置文件中的sql语句中为departmentid传参使用的也是departmentid来接收,于是乎就与Emp中的不符合,也就是为什么报这种错误。 综上,以后要用到数据库或者实现增删改查功能,最好使用IDEA中的插件自动生成dao、service、serviceimpl、entity...这样出错率会大大降低,而且节省时间。 那么今天的任务是实现员工的修改功能。 day05: 昨天的修改功能已成功实现,首先思想是点击编辑(修改)时,前端先获取此员工的id,传给后端。后端再调用service层,获取为此id的用户所有信息,接着再通过model.addAttribute将数据传到修改页面。同样需要注意的是xml中修改方法的传参字母是否写错,以免出现添加功能时出现的错误。今天遇到的问题同样是有关xml文件中的方法,当我们将要改好的数据重新输入后,点击修改,却发现所有员工的数据都是刚刚改的,这不是程序的问题,而是我们的sql语句写错了,所以以后使用插件将是必经之路!!! 接下来两天完成删除功能、404页面以及复习项目。 day06: 昨天已成功完成员工系统的删除的功能,实现原理十分简单,没啥说的。我前端删除标签处于更改功能同理需要获取员工的参数,因为在xml中的sql语句有条件:根据id删除。再spring boot中实现404页面或者500页面只需在templates文件下创建一个error文件夹,将写好的404页面放在里面即可。 接下来的任务是将配置文件用yaml格式,业务方法再重写一下。 day07: 完成