按接口文档把班级/学员/统计/约束删除这 15 个接口做完
下面是开发顺序 + 每个接口怎么写(Controller/Service/Mapper/SQL要点)+ 易错点清单
一、15个接口总览(建议开发顺序)
A. 班级管理(6个)
- 班级条件分页查询
- 查询所有员工(班主任下拉) (其实是员工模块已有:查询全部员工)
- 新增班级
- 根据ID查询班级
- 修改班级
- 删除班级(重点:班级下有学生不允许删)
B. 学员管理(7个)
- 查询所有班级(下拉)
- 学员条件分页查询
- 新增学员
- 根据ID查询学员
- 修改学员
- 删除学员
- 违纪处理(次数+1,扣分累加)
C. 学员信息统计(2个)
- 班级人数统计
- 学员学历统计
D. 功能完善(额外约束)
- 删除部门:部门下有员工不允许删(同“删除班级”套路)
二、写代码的通用套路(每个接口都按这个走)
- Controller:路径/方法/参数格式严格对齐接口文档
- Service:写业务流程(多表操作/约束校验放这里)
- Mapper:SQL(分页、关联查询、统计、批量、更新累加)
- 统一返回 Result
- 需要一致性的:加 @Transactional
- 需要阻止删除:先 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 逻辑:
countStudentByClazzId(clazzId)- 若 >0:抛异常
BusinessException("对不起, 该班级下有学生, 不能直接删除") - 否则执行 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)