黑马程序员最新Java项目实战《苍穹外卖》,最适合新手的SpringBoot+SSM的企业级Java项目实战。
新增员工
设计 DTO 类
-
我们需要根据新增员工接口设计对应的 DTO 类去接收前端传递的参数,前端传递参数列表如下:
注意: 当前端提交的数据和实体类中对应的属性差别比较大时,建议使用 DTO 来封装数据。
-
进入 sky-pojo 模块,在 com.sky.dto 包下,定义 EmployeeDTO:
public class EmployeeDTO implements Serializable { private Long id; private String username; private String name; private String phone; private String sex; private String idNumber; }
编写接口
sky-server下EmployeeController.java 中添加新增员工接口:
/**
* 新增员工
*
* @param employeeDTO
* @return
*/
@PostMapping
@ApiOperation(value = "新增员工")
public Result add(EmployeeDTO employeeDTO) {
log.info("新增员工:{}", employeeDTO);
employeeService.save(employeeDTO);
return Result.success();
}
设置 Header
-
项目中使用了 Token 作为身份验证和授权的凭证,用于验证用户的身份和授权用户访问系统中的受保护资源。
-
我们点击【员工登录】接口,在请求体中设置用户登录的账号密码,点击发送,获取后端生成的 Token。
{ "password": "123456", "username": "admin" }
-
所有后续的请求都需要在请求头中携带我们生成的 Token,以确保后端进行用户验证。我们在设置中,设置环境,在 Header 中添加我们上一步获取的 Token。
捕获 SQL 异常
-
在员工数据表
employee
中,对username
字段设置了唯一约束: -
当我们插入已存在员工姓名时,会出现 SQL 异常:
java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '11111' for key 'employee.idx_username'
-
我们需要在全局异常 GlobalExceptionHandler 类中捕获这个异常,处理异常并返回前端结果:
/** * 处理SQL异常 * @param ex * @return */ @ExceptionHandler public Result exceptionHandler(SQLIntegrityConstraintViolationException ex){ //Duplicate entry 'zhangsan' for key 'employee.idx_username' String message = ex.getMessage(); if(message.contains("Duplicate entry")){ String[] split = message.split(" "); String username = split[2]; String msg = username + MessageConstant.ALREADY_EXISTS; return Result.error(msg); }else{ return Result.error(MessageConstant.UNKNOWN_ERROR); } }
-
再次运行【新增员工】接口,后端返回结果如下:
{ "code":0, "msg":"'xiaozhi'已存在", "data":null }
ThreadLocal 优化
ThreadLocal 为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不
能访问。
-
我们需要在
JwtTokenAdminInterceptor
拦截器中当前登录用户 ID 保存到 ThreadLocal 中,方便后续处理:// 在线程变量中保存登录用户id BaseContext.setCurrentId(empId);
-
修改
EmployeeServiceImpl
实现类中的save()
方法,增加员工时添加创建人的 ID://设置当前记录创建人id和修改人id Long createUserId = BaseContext.getCurrentId(); employee.setCreateUser(createUserId); employee.setUpdateUser(createUserId);
-
当我们在线程池下使用 ThreadLocal 时,需要手动调用
remove()
方法,防止内存泄漏。
员工分页查询
设计 DTO 类
-
我们需要根据新增员工接口设计对应的 DTO 类去接收前端传递的参数,前端传递参数列表如下:
-
进入 sky-pojo 模块,在 com.sky.dto 包下,定义 EmployeePageQueryDTO:
public class EmployeePageQueryDTO implements Serializable { //员工姓名 private String name; //页码 private int page; //每页显示记录数 private int pageSize; }
编写接口
-
在 sky-server 下 EmployeeController.java 中添加新增员工分页查询接口:
/** * 员工分页查询 * @param employeePageQueryDTO * @return */ @GetMapping("/page") @ApiOperation(value = "员工分页查询") public Result<PageResult> page(EmployeePageQueryDTO employeePageQueryDTO){ log.info("员工分页查询:{}",employeePageQueryDTO); PageResult pageResult = employeeService.pageQuery(employeePageQueryDTO); return Result.success(pageResult); }
-
在 EmployeeServiceImpl 中实现分页查询逻辑:
@Override public PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO) { PageHelper.startPage(employeePageQueryDTO.getPage(),employeePageQueryDTO.getPageSize()); Page<Employee> page = employeeMapper.pageQuery(employeePageQueryDTO); return new PageResult(page.getTotal(),page.getResult()); }
-
在 EmployeeMapper.xml 中编写 SQL 语句:
<select id="pageQuery" resultType="com.sky.entity.Employee"> select * from employee <where> <if test="name != null and name !=''"> name like concat('%',#{name},'%') </if> </where> order by create_time desc </select>
-
在
Employee
类中使用@JsonFormat
注解修改时间格式:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime;
-
启动项目,页面测试功能:
启动禁用员工账号
-
在 EmployeeController 员工控制类中编写接口:
/** * 启用、禁用员工账号 * @param status * @param id * @return */ @PostMapping("/status/{status}") @ApiOperation(value = "启用、禁用员工账号") public Result startOrStop(@PathVariable Integer status, Long id){ log.info("启用禁用员工账号:{},{}",status,id); employeeService.startOrStop(status,id); return Result.success(); }
-
在 EmployeeServiceImpl 实现类中实现功能:
@Override public void startOrStop(Integer status, Long id) { Employee employee = Employee.builder().id(id).status(status).build(); employeeMapper.update(employee); }
-
补充 EmployeeMapper 中的 update SQL语句:
<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>
根据id查询员工信息
-
在 EmployeeController 员工控制类中编写接口:
/** * 根据id查询员工 * @param id * @return */ @GetMapping("/{id}") @ApiOperation(value = "根据id查询员工") public Result<Employee> getById(@PathVariable Long id){ log.info("根据id查询员工:{},",id); Employee employee = employeeService.getById(id); return Result.success(employee); }
-
在 EmployeeServiceImpl 实现类中实现功能:
@Override public Employee getById(Long id) { Employee employee = employeeMapper.getById(id); employee.setPassword("****"); return employee; }
-
补充 EmployeeMapper 中的 SQL 语句:
/** * 根据id查询员工 * @param id * @return */ @Select("select * from employee where id = #{id}") Employee getById(Long id);
编辑员工信息
-
在 EmployeeController 中创建 update 方法:文章来源:https://www.toymoban.com/news/detail-615798.html
/** * 编辑员工信息 * @param employeeDTO * @return */ @PutMapping @ApiOperation("编辑员工信息") public Result update(@RequestBody EmployeeDTO employeeDTO){ log.info("编辑员工信息:{}", employeeDTO); employeeService.update(employeeDTO); return Result.success(); }
-
在 EmployeeServiceImpl 中实现 update 方法:文章来源地址https://www.toymoban.com/news/detail-615798.html
/**
* 编辑员工信息
*
* @param employeeDTO
*/
public void update(EmployeeDTO employeeDTO) {
Employee employee = new Employee();
BeanUtils.copyProperties(employeeDTO, employee);
employee.setUpdateTime(LocalDateTime.now());
employee.setUpdateUser(BaseContext.getCurrentId());
employeeMapper.update(employee);
}
到了这里,关于最适合新手的SpringBoot+SSM项目《苍穹外卖》实战—(五)员工管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!