新增、员工列表、编辑员工整体代码流程与登录基本一致。
1、新增员工
@RestController
@RequestMapping("/admin/employee")
EmployeeController 类中使用了注解 @RestController
用于构建 RESTful 风格的 API,其中每个方法的返回值会直接序列化为 JSON 或 XML 数据并发送给客户端。它负责处理对应的请求并返回相应的视图数据。
使用 @RequestMapping("/admin/employee")
注解来指定该控制器处理的 URL 路径的前缀
EmployeeServiceImpl 类中处理前端传参,设置默认值等,组装数据结构
@Mapper
注解通常用于标识一个 Java 接口或类是 MyBatis 的映射器(Mapper)。MyBatis 是一个持久层框架,用于将数据库操作与 Java 代码进行映射,简化了数据库访问的过程。
@Mapper
注解被应用于EmployeeMapper
接口,表明该接口是一个 MyBatis 的映射器。通过在接口中的方法上使用@Select
注解,可以定义与数据库操作相关的 SQL 语句。
这样,MyBatis 框架可以自动扫描并创建实现映射器接口的代理对象,实现数据库操作与 Java 代码的映射。
全局异常处理
定义了一个全局异常处理器exceptionHandler
,用于处理SQLIntegrityConstraintViolationException
类型的异常。在方法中,首先获取异常信息message
,然后检查message
中是否包含Duplicate entry
字符串。
如果包含,则将message
按照空格分割,获取第三个元素作为用户名username
,并拼接MessageConstant.ALREADY_EXISTS
作为错误信息msg
,最后返回Result.error(msg)
。如果message
中不包含Duplicate entry
,则返回Result.error(MessageConstant.UNKNOWN_ERROR)
。
当用户名重复时触发 sql错误,被全局异常处理器拦截并处理返回处理结果。
使用 swagger 调试
http://localhost:8080/doc.html#/home
2、员工列表分页查询
@Data
public class EmployeePageQueryDTO implements Serializable {
//员工姓名
private String name;
//页码
private int page;
//每页显示记录数
private int pageSize;
}
/**
* 封装分页查询结果
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageResult implements Serializable {
private long total; //总记录数
private List records; //当前页数据集合
}
PageHelper.startPage
是一个用于分页查询的方法,通常在 MyBatis 框架中与 PageHelper 插件一起使用。
该方法用于设置分页查询的参数,包括当前页码和每页显示的记录数。需要在执行数据库查询之前调用该方法,将分页参数传递进去。
正确引入了PageHelper分页插件的依赖
mybatis: mapper-locations用于将配置路径下的 XML 文件加载到 MyBatis 中。
这是一个 MyBatis 的 Mapper 映射文件的一部分,用于定义数据库操作的 SQL 语句。
<where>
:表示查询条件的开始。
<if test="name!= null and name!= ''">
:
一个条件判断,用于检查参数 name 是否不为空且不为空字符串。如果满足条件,则执行以下的 SQL 片段。
and name like concat('%',#{name},'%')
:
一个模糊查询条件,用于在 name 列中查找包含指定参数 name 的记录。concat('%',#{name},'%')
会将 % 符号与参数 name 拼接起来,形成一个模糊匹配的模式。
3、编辑员工与修改账号状态
EmployeeController.java
/**
* 启用禁用员工账号
* @param status
* @param id
* @return
*/
@PostMapping("/status/{status}")
@ApiOperation("启用禁用员工账号")
public Result startOrStop(@PathVariable Integer status,Long id){
log.info("启用禁用员工账号:{},{}",status,id);
employeeService.startOrStop(status,id);
return Result.success();
}
/**
* 编辑员工信息
* @param employeeDTO
* @return
*/
@PutMapping
@ApiOperation("编辑员工信息")
public Result update(@RequestBody EmployeeDTO employeeDTO){
log.info("编辑员工信息:{}", employeeDTO);
employeeService.update(employeeDTO);
return Result.success();
}
EmployeeServiceImpl.java
/**
* 启用禁用员工账号
*
* @param status
* @param id
*/
public void startOrStop(Integer status, Long id) {
// update employee set status = ? where id = ?
Employee employee = Employee.builder()
.status(status)
.id(id)
.build();
employeeMapper.update(employee);
}
/**
* 编辑员工信息
*
* @param employeeDTO
*/
public void update(EmployeeDTO employeeDTO) {
Employee employee = new Employee();
//employee.setUpdateTime(LocalDateTime.now());
//employee.setUpdateUser(BaseContext.getCurrentId());
// 使用属性拷贝简化赋值操作
BeanUtils.copyProperties(employeeDTO, employee);
employeeMapper.update(employee);
}
EmployeeMapper.java
/**
* 根据主键动态修改属性
* @param employee
*/
@AutoFill(value = OperationType.UPDATE)
void update(Employee employee);
EmployeeMapper.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="com.sky.mapper.EmployeeMapper">
<update id="update" parameterType="Employee">
update employee
<set>
<if test="name != null">name = #{name},</if>
<if test="username != null">username = #{username},</if>
<if test="password != null">password = #{password},</if>
<if test="phone != null">phone = #{phone},</if>
<if test="sex != null">sex = #{sex},</if>
<if test="idNumber != null">id_Number = #{idNumber},</if>
<if test="updateTime != null">update_Time = #{updateTime},</if>
<if test="updateUser != null">update_User = #{updateUser},</if>
<if test="status != null">status = #{status},</if>
</set>
where id = #{id}
</update>
</mapper>
4、实现效果
5、项目源码
前后端源码及数据库 SQL 文件
https://download.csdn.net/download/qq_44721831/89463416