苍穹外卖-day02-员工管理进阶模块笔记

0 阅读5分钟

员工分页查询功能

1.分页查询实现 使用MyBatis-Plus的分页插件,通过Page对象设置当前页码page和每页记录数records,结合条件构造器QueryWrapper动态拼接查询条件(如员工姓名模糊查询like)。返回分页结果Page,包含数据列表和分页信息(总记录数、总页数)。

2.SQL优化 确保查询字段覆盖索引,避免全表扫描。例如,为name和phone字段添加复合索引,提升模糊查询效率。

3.代码示例

Page page = new Page<>(currentPage, pageSize); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.like(StringUtils.isNotBlank(name), "name", name); employeeMapper.selectPage(page, wrapper);

启动/禁用员工账号功能

1.状态更新逻辑 通过UPDATE语句修改员工表的status字段(0禁用,1启用),通常基于员工ID作为条件。前端传递操作类型(启用/禁用)和员工ID,后端校验权限后执行更新。

2.权限控制 使用拦截器或注解(如@PreAuthorize)确保仅管理员角色可操作。例如:

@PreAuthorize("hasAuthority('admin')") public void updateStatus(Long id, Integer status) { employeeMapper.updateStatusById(id, status); }

3.事务管理 确保状态更新的原子性,避免并发问题。可通过@Transactional注解实现。

编辑员工信息功能

1.数据回显 根据员工ID查询完整信息,返回给前端填充表单。需包含基础字段(姓名、手机号、角色等)。

2.数据校验 后端验证手机号格式、姓名非空等规则。使用@Valid注解配合校验注解(如@NotBlank):

public Result updateEmployee(@Valid @RequestBody EmployeeDTO employeeDTO) { // 业务逻辑 }

3.更新策略 采用动态SQL(如MyBatis-Plus的UpdateWrapper)选择性更新字段,避免覆盖未修改数据:

UpdateWrapper wrapper = new UpdateWrapper<>(); wrapper.eq("id", employeeDTO.getId()) .set(StringUtils.isNotBlank(employeeDTO.getName()), "name", employeeDTO.getName()); employeeMapper.update(null, wrapper);

导入分类管理功能

1.Excel解析 使用Apache POI或EasyExcel解析上传文件,获取分类数据列表。例如:

List categories = EasyExcel.read(inputStream) .head(Category.class) .sheet() .doReadSync();

2.批量插入 通过MyBatis-Plus的saveBatch方法批量插入数据,提升性能。建议每批次处理500条左右,避免内存溢出。

3.异常处理 捕获文件格式错误或数据重复等异常,返回友好提示。例如:

try { importService.importCategories(file); } catch (DuplicateKeyException e) { return Result.error("分类名称重复"); }

4.事务回滚 标注@Transactional确保批量插入失败时全部回滚,保持数据一致性。

通用注意事项

1.接口安全

文件上传接口限制文件类型(如仅允许.xlsx)。 敏感操作(如禁用账号)记录日志备查。 性能优化

分页查询使用count(1)替代count(*)。 导入数据时关闭MyBatis日志,减少I/O开销。 前后端协作

分页接口返回标准结构:{ "records": [], "total": 100 }。 文件导入提供模板下载功能,规范数据格式。


员工分页查询

分页查询通常结合MyBatis-Plus的分页插件实现,需定义DTO接收前端分页参数(当前页、每页条数),并封装查询条件(如姓名模糊查询)。
示例代码片段:

// 分页构造器  
Page<Employee> page = new Page<>(pageNum, pageSize);  
// 条件构造器  
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper<>();  
queryWrapper.like(StringUtils.isNotEmpty(name), Employee::getName, name);  
// 执行查询  
employeeMapper.selectPage(page, queryWrapper);  

返回结果需包含总记录数和当前页数据列表,前端通过表格组件渲染数据,并配合分页控件实现交互。

启动/禁用员工账号

该功能通常通过修改员工状态字段(如status,0禁用1启用)实现,需注意权限控制(仅管理员可操作)。
关键逻辑:

Employee employee = employeeMapper.selectById(id);  
employee.setStatus(status);  
employeeMapper.updateById(employee);  

操作需记录日志,并考虑并发修改问题。前端通过状态切换按钮触发AJAX请求,后端返回操作结果后动态更新界面状态。

编辑员工信息

编辑功能需实现数据回显和提交更新,通常分为两步:通过ID查询员工信息返回给前端,接收修改后的DTO执行更新。
注意事项:

  • 敏感字段(如密码)需单独处理
  • 避免越权修改(如普通员工修改管理员权限)

示例更新逻辑:

Employee employee = new Employee();  
BeanUtils.copyProperties(employeeDTO, employee);  
employeeMapper.updateById(employee);  

前端表单需做非空校验,提交后显示操作结果提示。批量编辑时可考虑使用动态SQL避免全字段更新。### 苍穹外卖项目员工管理核心笔记


今日所获:分层开发的标准化流程

通过员工模块的开发实践,我梳理出后端业务功能从构思到落地的四层实现范式:

  1. Controller层(接口定义层):基于需求设计接口的请求方式、路径与入参,通过 @GetMapping / @PostMapping 声明接口,并接收前端传递的分页、筛选参数; ​
  2. Service层(业务抽象层):在Service接口中定义业务方法的签名,例如 IPage getEmployeePage(PageParam param); ,统一对外暴露业务能力; ​
  3. ServiceImpl层(业务实现层):完成具体逻辑编码,借助MyBatis-Plus的分页构造器、条件构造器实现数据的分页查询、条件过滤与排序,同时处理字段校验、数据转换等业务细节; ​
  4. Mapper层(数据持久层):仅需定义接口继承 BaseMapper ,通过注解或XML文件补充复杂SQL逻辑,基础CRUD与分页能力由MyBatis-Plus自动生成。

这种分层模式让各模块职责清晰,后续修改员工状态、编辑员工信息时,只需聚焦ServiceImpl层的逻辑调整,无需改动上层接口与下层映射,极大提升了代码的可维护性。

后端业务功能开发的四步范式

  1. Controller层:接收前端参数,定义接口路径与请求方式,比如用@PostMapping("/page")接收分页查询请求;
  2. Service层:在接口声明业务方法,如Page pageQuery(Page page, EmployeeDTO employeeDTO);
  3. ServiceImpl层:实现具体业务逻辑,调用MyBatis-Plus的page方法完成分页与条件查询,同时处理数据权限、字段校验;
  4. Mapper层:仅需定义接口继承BaseMapper,复杂SQL再通过XML补充,无需手动编写基础CRUD方法。