day05--实战

30 阅读4分钟

按接口文档把班级/学员/统计/约束删除这 15 个接口做完

下面是开发顺序 + 每个接口怎么写(Controller/Service/Mapper/SQL要点)+ 易错点清单


一、15个接口总览(建议开发顺序)

A. 班级管理(6个)

  1. 班级条件分页查询
  2. 查询所有员工(班主任下拉) (其实是员工模块已有:查询全部员工)
  3. 新增班级
  4. 根据ID查询班级
  5. 修改班级
  6. 删除班级(重点:班级下有学生不允许删)

B. 学员管理(7个)

  1. 查询所有班级(下拉)
  2. 学员条件分页查询
  3. 新增学员
  4. 根据ID查询学员
  5. 修改学员
  6. 删除学员
  7. 违纪处理(次数+1,扣分累加)

C. 学员信息统计(2个)

  1. 班级人数统计
  2. 学员学历统计

D. 功能完善(额外约束)

  • 删除部门:部门下有员工不允许删(同“删除班级”套路)

二、写代码的通用套路(每个接口都按这个走)

  1. Controller:路径/方法/参数格式严格对齐接口文档
  2. Service:写业务流程(多表操作/约束校验放这里)
  3. Mapper:SQL(分页、关联查询、统计、批量、更新累加)
  4. 统一返回 Result
  5. 需要一致性的:加 @Transactional
  6. 需要阻止删除:先 count 校验,不通过就抛自定义异常

三、班级管理关键实现点

1)班级分页查询(带状态 status、班主任姓名 masterName)

状态规则:

  • now > endDate => 已结课
  • now < beginDate => 未开班
  • else => 在读中

实现方式二选一:

  • 推荐SQL直接算 status(前端直接用)
  • 或 Java 层算(查出来后遍历补 status)

SQL建议(JOIN emp 拿 masterName + CASE 算 status):

select c.*, e.name as masterName,
       case
         when now() > c.end_date then '已结课'
         when now() < c.begin_date then '未开班'
         else '在读中'
       end as status
from clazz c
left join emp e on c.master_id = e.id
where 1=1
  -- 按文档加条件(name/room/subject等)
order by c.update_time desc
limit ?, ?

如果项目用 PageHelper,就用 PageHelper.startPage(page,pageSize) + 普通select。


2)新增/修改班级

  • 新增:补 createTime/updateTime
  • 修改:补 updateTime
  • Mapper:insert / update(动态 SQL更稳)

3)删除班级(重点:班级下有学生不允许删)

Service 逻辑:

  1. countStudentByClazzId(clazzId)
  2. 若 >0:抛异常 BusinessException("对不起, 该班级下有学生, 不能直接删除")
  3. 否则执行 delete

SQL:

select count(*) from student where clazz_id = #{clazzId}
delete from clazz where id = #{id}

全局异常处理器捕获 BusinessException,返回 Result.error(消息)。


四、学员管理关键实现点

1)学员分页查询(通常要带 clazzName)

一般需要 join clazz 取班级名:

select s.*, c.name as clazzName
from student s
left join clazz c on s.clazz_id = c.id
where 1=1
  -- 条件:name/no/phone/gender/clazzId 等按文档拼
order by s.update_time desc
limit ?, ?

返回字段名和实体属性对不上时,用 resultMap


2)新增/修改学员

  • 新增补 createTime/updateTime
  • 修改补 updateTime
  • 唯一约束(no/phone/id_card)冲突会报错:你已有全局异常处理器兜底即可(也可以精细化捕获 DuplicateKeyException 给更友好提示)

3)删除学员

  • 单表 delete 即可(一般不需要事务)

4)违纪处理(非常经典的“累加更新”)

需求:违纪次数+1,违纪扣分 + 前端输入 score

SQL一条搞定:

update student
set violation_count = violation_count + 1,
    violation_score = violation_score + #{score},
    update_time = now()
where id = #{id}

接口参数通常是:id + score(按文档来)。


五、统计接口关键实现点

1)班级人数统计

目标:每个班多少人(给图表)

select c.name as name, count(s.id) as value
from clazz c
left join student s on s.clazz_id = c.id
group by c.id, c.name
order by value desc;

返回一般是 List<Map>,字段用 name/value 最契合图表。

2)学员学历统计

degree 是 1~6,输出要是中文学历(初中/高中/大专/本科/硕士/博士)

select
  (case degree
    when 1 then '初中'
    when 2 then '高中'
    when 3 then '大专'
    when 4 then '本科'
    when 5 then '硕士'
    when 6 then '博士'
    else '其他' end) as name,
  count(*) as value
from student
group by degree;

六、功能完善:删除部门限制(同删除班级套路)

删部门前:count emp where dept_id = ?

0 则抛 BusinessException("对不起,当前部门下有员工,不能直接删除!")


七、你最容易踩的坑(做完自查)

  • 分页接口:参数名/返回结构不符合文档(联调直接崩)
  • join 字段别名没起好,导致 clazzName/masterName/status 为空
  • 一对多/字段不匹配时还用 resultType(应该 resultMap)
  • 删除班级没先校验学生数量
  • 违纪处理写成“覆盖赋值”而不是“累加”
  • update 动态 SQL 最后多一个逗号(用 <set> 可避免)
  • 没补 updateTime/createTime
  • 多步操作没加事务(比如:未来你可能扩展到多表)

八、收尾清单

  • 接口回归:Apifox 跑一遍新增/修改/删除/分页/统计/违纪,确认返回格式统一 Result

  • 异常验证

    • 手机号/学号/身份证重复 → 能被全局异常处理器兜住、前端提示正常
    • 删除班级有学生 / 删除部门有员工 → 自定义异常提示正确
  • 事务验证:涉及多表操作的方法(比如删除员工、修改员工经历)故意造个异常,看是否回滚

  • SQL检查:统计接口的 name/value 字段是否符合图表数据结构

  • 字段映射检查clazzName/masterName/status 有没有空(join + resultMap)