员工分页查询功能
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避免全字段更新。### 苍穹外卖项目员工管理核心笔记
今日所获:分层开发的标准化流程
通过员工模块的开发实践,我梳理出后端业务功能从构思到落地的四层实现范式:
- Controller层(接口定义层):基于需求设计接口的请求方式、路径与入参,通过 @GetMapping / @PostMapping 声明接口,并接收前端传递的分页、筛选参数;
- Service层(业务抽象层):在Service接口中定义业务方法的签名,例如 IPage getEmployeePage(PageParam param); ,统一对外暴露业务能力;
- ServiceImpl层(业务实现层):完成具体逻辑编码,借助MyBatis-Plus的分页构造器、条件构造器实现数据的分页查询、条件过滤与排序,同时处理字段校验、数据转换等业务细节;
- Mapper层(数据持久层):仅需定义接口继承 BaseMapper ,通过注解或XML文件补充复杂SQL逻辑,基础CRUD与分页能力由MyBatis-Plus自动生成。
这种分层模式让各模块职责清晰,后续修改员工状态、编辑员工信息时,只需聚焦ServiceImpl层的逻辑调整,无需改动上层接口与下层映射,极大提升了代码的可维护性。
后端业务功能开发的四步范式
- Controller层:接收前端参数,定义接口路径与请求方式,比如用@PostMapping("/page")接收分页查询请求;
- Service层:在接口声明业务方法,如Page pageQuery(Page page, EmployeeDTO employeeDTO);
- ServiceImpl层:实现具体业务逻辑,调用MyBatis-Plus的page方法完成分页与条件查询,同时处理数据权限、字段校验;
- Mapper层:仅需定义接口继承BaseMapper,复杂SQL再通过XML补充,无需手动编写基础CRUD方法。