本篇内容包含员工管理和分类管理,但因为两管理模块大体相同,都属于对单表的增删改查,所以我们只对员工管理模块进行详细介绍。
员工模块
新增员工
传入参数包括账号、姓名、手机号、性别、身份证号。要求账号必须唯一,手机号为11位数字,身份证号为18位数字。密码默认位123456,支持后续修改,但不支持新增员工时指定,因此传参中无需密码。
本项目中管理端发出的请求统一使用/admin作为前缀,用户端发出的请求统一使用/user作为前缀。因此该请求的路径为/admin/employee,请求方式为post,后端操作employee表。
数据以json格式提交,也以json格式返回,返回的数据封装进Result对象中。
因为前端提交的数据与实体类有一定区别,所以我们使用DTO类来接收前端传入的参数。
在server模块-controller.admin包-中的Controller、Service、Mapper层中编写代码:
在ServiceImpl中需要将EmployeeDTO实例中的参数传给Employee实例,因为两者属性不同,因此无法直接赋值,一个一个属性赋值又过于繁琐,我们可以使用工具类BeanUtils中的方法copyProperties来赋值(前提是需要赋值的各属性名称相同),将两实体类放入方法内,系统会将第一个实例的各属性赋给第二个实例。
设置账号状态、密码时不采用硬编码的方式,而是调用事先定义的常量来赋值。
密码需要进行md5加密处理,调用DigestUtils类的md5DigestAsHex()方法,将PasswordConstant类中的常量DEFAULT_PASSWORD,并执行getBytes()方法作为参数传入。
.getBytes()是Java String类的一个方法,它将字符串转换成字节数组。这是因为在计算散列值之前,需要将字符串转换成字节。
//Controller———————————————————
@PostMapping
@ApiOperation("新增员工")
public Result save(@RequestBody EmployeeDTO employeeDTO) {
log.info("新增员工:{}", employeeDTO);
employeeService.save(employeeDTO);
return Result.success();
}
//Service———————————————————————
/**
* 新增员工
* @param employeeDTO
*/
void save(EmployeeDTO employeeDTO);
}
//ServiceImpl———————————————————
@Override
public void save(EmployeeDTO employeeDTO) {
Employee employee = new Employee();
//对象属性拷贝
BeanUtils.copyProperties(employeeDTO, employee);
//设置账号的状态,默认为1,锁定为0
employee.setStatus(StatusConstant.DISABLE);
//设置默认密码123456
employee.setPassword(DigestUtils.md5DigestAsHex(PasswordConstant.DEFAULT_PASSWORD.getBytes()));
//设置当前记录的创建时间和修改时间
employee.setCreateTime(LocalDateTime.now());
employee.setUpdateTime(LocalDateTime.now());
//设置当前记录的创建人id和修改人id
//TODO 后期需要改为操作用户的id
employee.setCreateUser(10L);
employee.setUpdateUser(10L);
employeeMapper.insert(employee);
}
//Mapper———————————————————————
@Insert("insert into employee (name, username, password, phone, sex, id_number, create_time, update_time, create_user, update_user) " +
"values " +
"(#{name},#{username}, #{password},#{phone},#{sex}, #{idNumber}, #{createTime}, #{updateTime}, #{createUser}, #{updateUser})")
void insert(Employee employee);
然后在Swagger接口文档页面进行测试。但此时因为还有拦截器在校验jwt令牌,我们正常传参无法成功响应,我们可以先测试员工登录功能,其返回的json数据有token,这就是jwt令牌。
然后点击文档管理,全局参数设置,添加参数,参数名称填token,值填刚刚得到的jwt令牌,类型选择header,确定。
关闭原先的新增员工标签页新开一个,此时请求头部会显示红色的1,代表其附带了jwt令牌,此时再测试,后端返回json数据,状态码为200即代表成功。
此时仍存在一些问题:
- 录入的用户名已存在,抛出异常后没有处理
- 新增员工时,创建人id和修改人id设置为固定值
先来解决第一个问题,在server层-handler包-GlobalExceptionHandler类中编辑方法exceptionHandler捕获SQL查重异常:
@ExceptionHandler
public Result exceptionHandler(SQLIntegrityConstraintViolationException ex) {
// 获取异常信息
String message = ex.getMessage();
// 判断异常信息是否包含"Duplicate entry",即是否为重复条目错误
if (message.contains("Duplicate entry")) {
// 将异常信息按空格分割,获取重复的条目值
String[] split = message.split(" ");
String userName = split[2]; // 假设重复的条目值是用户名
// 构建错误信息,指出用户名已存在
String errMassage = userName + MessageConstant.ALREADY_EXISTS;
// 返回错误结果
return Result.error(errMassage);
} else {
// 如果不是重复条目错误,则返回未知错误信息
return Result.error(MessageConstant.UNKNOWN_ERROR);
}
}
再来看第二个问题&#x