1. 员工管理-优化
前言
上一节,我们存在2个问题:👇
- 员工分页查询没有部门显示

- 员工新增不能修改工作经历
那么本次我们来解决这个2个问题

1.1 优化分页查询
因为员工表中只有部门ID,但是我们需要显示部门名称,所以我们需要在查询员工信息的时候,通过部门ID查询部门名称,然后将部门名称显示在员工列表中。
- 在Emp实体类中增加部门名称属性

- 在EmpController中分页后,遍历已经查询到的员工列表,然后根据部门ID查询部门名称,然后将部门名称设置到员工实体类中

重启测试效果

- 之前发现修改部门的时间不对,是应为jdbc时区不对,我们需要修改jdbc的时区,这样部门列表中时间的显示就对了

1.2 优化新增员工-新增工作经历
思考:
- 一个员工可以有多个工作经历,一个工作经历可以属于1个员工,那么员工表和工作经历表属于一对多的关系
- 为了简化设计,每次修改员工信息的时候,我们可以对删除该员工的所有工作经历,然后在增加,这样先删后增,完成员工工作经历的修改。
实操:
- 导入工作经历表实体类和工作经历表mapper接口
实体类导入到pojo中
@Data
public class EmpExpr {
private Integer id; //ID
private Integer empId; //员工ID
private LocalDate begin; //开始时间
private LocalDate end; //结束时间
private String company; //公司名称
private String job; //职位
}mapper接口导入到mapper中
@Mapper
public interface EmpExprMapper extends BaseMapper<EmpExpr> {
}- 在Emp实体类中增加工作经历列表属性

- 在EmpController中,新增员工的时候,将工作经历列表设置到员工实体类中

- 测试效果 ;👇
新增员工
观察数据库中emp_expr表的数据是否增加
2. 员工管理-修改员工
修改员工
2.1 根据ID查询员工信息

- 在EmpController中,根据ID查询员工信息,然后返回给前端

- 重启测试效果

2.2 保存修改的员工信息

- 在EmpController中,保存修改的员工信息,然后返回给前端

- 重启测试效果


3. 登录模块
登陆功能

在登录界面中,我们可以输入用户的用户名以及密码,然后点击 Login 按钮就要请求服务器,服务端判断用户输入的用户名或者密码是否正确。如果正确,则返回成功结果,前端跳转至系统首页面。
登录服务端的核心逻辑:
- 接收前端请求传递的用户名和密码
(数据库中的密码是密文,还是明文), - 然后再根据用户名和密码查询用户信息,
- 如果用户信息存在,则说明用户输入的用户名和密码正确。
- 如果查询到的用户不存在,则说明用户输入的用户名和密码错误。
3.1 查看接口文档和思路


3.2 实现登录功能
- 创建LoginController,实现登录功能
@Slf4j
@RestController
public class LoginController {
@Autowired
private EmpMapper empManager;
// 请求路径:/login
// 请求方式:POST
// 接口描述:该接口用于员工登录Tlias智能学习辅助系统,登录完毕后,系统下发JWT令牌。
//参数:{"username": "jinyong", "password": "123456"}
@PostMapping("/login")
public AjaxResult login(@RequestBody Emp emp){
log.info("员工登录: {}", emp);
//1.构建查询条件
QueryWrapper<Emp> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", emp.getUsername());
queryWrapper.eq("password", emp.getPassword());
Emp loginEmp = empManager.selectOne(queryWrapper);
if (loginEmp == null) {
return AjaxResult.warn("用户名或密码错误", null);
}
//这里不定义单独的返回类,使用Map,具体字段参考登录接口描述
HashMap<Object, Object> resultMap = new HashMap<>();
resultMap.put("username", loginEmp.getUsername());
resultMap.put("name", loginEmp.getName());
resultMap.put("id", loginEmp.getId());
//这里搞个假的令牌,解决登录的问题
resultMap.put("token", "WO shi jia de token");
return AjaxResult.success(resultMap);
}
}- 重启测试效果

4. 员工信息统计
员工管理的增删改查功能我们已开发完成,接下来,我们再来完成员工信息统计的接口开发。 对于这些图形报表的开发,其实呢,都是基于现成的一些图形报表的组件开发的,比如:Echarts、HighCharts等。
而报表的制作,主要是前端人员开发,引入对应的组件(比如:ECharts)即可。 服务端开发人员仅为其提供数据即可。
官网:https://echarts.apache.org/zh/index.html

4.1 职位统计
前言

对于这类的图形报表,服务端要做的,就是为其提供数据即可。 我们可以通过官方的示例,看到提供的数据其实就是X轴展示的信息,和对应的数据。

相关信息
4.1.2 接口文档
1). 基本信息
请求路径:/report/empJobData
请求方式:GET
接口描述:统计各个职位的员工人数
详细接口请查看接口文档
为了封装上面需要给前端返回的数据,在pojo包下再创建一个实体类 JobOption,封装给前端返回的结果:
/**
* 员工职位人数统计
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class JobOption {
private List jobList; //职位列表
private List dataList; //人数列表
}代码操作
代码实现
1). 定义ReportController,并添加方法。
@Slf4j
@RequestMapping("/report")
@RestController
public class ReportController {
@Autowired
EmpMapper empMapper;
/**
* 统计各个职位的员工人数
*/
@GetMapping("/empJobData")
public AjaxResult getEmpJobData(){
log.info("统计各个职位的员工人数");
List<Map<String,Object>> list = empMapper.countEmpJobData();
List<Object> jobList = list.stream().map(dataMap -> dataMap.get("pos")).collect(Collectors.toList());
List<Object> dataList = list.stream().map(dataMap -> dataMap.get("total")).collect(Collectors.toList());
JobOption jobOption = new JobOption(jobList, dataList);
return AjaxResult.success(jobOption);
}
}2). 定义EmpMapper 接口
统计的是员工的信息,所以需要操作的是员工表。 所以代码我们就写在 EmpMapper 接口中即可。
/**
* 统计各个职位的员工人数
*/
@MapKey("pos")//指定返回的map中的唯一标识是pos字段
List<Map<String,Object>> countEmpJobData();如果查询的记录往Map中封装,可以通过@MapKey注解指定返回的map中的唯一标识是那个字段。【也可以不指定】
3). 定义EmpMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.yangeit.mapper.EmpMapper">
<!-- 统计各个职位的员工人数 -->
<select id="countEmpJobData" resultType="java.util.Map">
select
(case job when 1 then '班主任'
when 2 then '讲师'
when 3 then '学工主管'
when 4 then '教研主管'
when 5 then '咨询师'
else '其他' end) pos,
count(*) total
from emp group by job
order by total
</select>
</mapper>case流程控制函数:
语法一:case when cond1 then res1 [ when cond2 then res2 ] else res end ;
- 含义:如果 cond1 成立, 取 res1。 如果 cond2 成立,取 res2。 如果前面的条件都不成立,则取 res。
语法二(仅适用于等值匹配):case expr when val1 then res1 [ when val2 then res2 ] else res end ;
- 含义:如果 expr 的值为 val1 , 取 res1。 如果 expr 的值为 val2 ,取 res2。 如果前面的条件都不成立,则取 res。
4). 测试

4.2 性别统计
性别统计

对于这类的图形报表,服务端要做的,就是为其提供数据即可。 我们可以通过官方的示例,看到提供的数据就是一个json格式的数据。

代码操作
代码实现
1). 在ReportController,添加方法。
/**
* 统计员工性别信息
*/
@GetMapping("/empGenderData")
public AjaxResult getEmpGenderData(){
log.info("统计员工性别信息");
List<Map> genderList = empMapper.countEmpGenderData();
return AjaxResult.success(genderList);
}2). 定义EmpMapper 接口
统计的是员工的信息,所以需要操作的是员工表。 所以代码我们就写在 EmpMapper 接口中即可。
/**
* 统计员工性别信息
*/
@MapKey("name") // 指定返回的map中,唯一标识是哪个字段
List<Map> countEmpGenderData();3). 定义EmpMapper.xml
<!-- 统计员工的性别信息 -->
<select id="countEmpGenderData" resultType="java.util.Map">
select
if(gender = 1, '男', '女') as name,
count(*) as value
from emp group by gender ;
</select>if函数语法:
if(条件, 条件为true取值, 条件为false取值)
ifnull函数语法:
ifnull(expr, val1)如果expr不为null,取自身,否则取val1
4). 测试







