Appearance
08:CRUD:新增、编辑、删除与参数校验
1. 本章要完成的接口
| 能力 | URL | 方法 | 请求体 |
|---|---|---|---|
| 新增 | /customerInfo/save | POST | CustomerSaveForm |
| 编辑 | /customerInfo/edit | POST | CustomerEditForm |
| 详情 | /customerInfo/findById | POST | id |
| 删除一条 | /customerInfo/del | POST | id |
| 批量删除 | /customerInfo/del/batch | POST | id 数组 |
| 分页 | /customerInfo/query/page | POST | QueryModel |
为了兼容当前前端,请保留 /crm/web/client 前缀版本。
2. 新增:先校验,再查重,再保存
Service 伪代码:
java
public boolean save(CustomerSaveForm form) {
Long count = demoCustomerMapper.selectCount(
new LambdaQueryWrapper<DemoCustomer>()
.eq(DemoCustomer::getCustomerName, form.getCustomerName())
);
if (count > 0) {
throw new IllegalArgumentException("客户名称已存在");
}
DemoCustomer entity = CustomerConverter.toEntity(form);
entity.setCreatedAt(LocalDateTime.now());
return demoCustomerMapper.insert(entity) == 1;
}请求示例:
json
{
"customerName": "Demo 新客户",
"contactPerson": "张三",
"contactPhone": "13800000100",
"brandName": "Demo 品牌",
"flowPhaseName": "E.初接触",
"customerLevel": "C"
}新增成功后,立刻验证:
sql
SELECT * FROM demo_customer WHERE customer_name = 'Demo 新客户';3. 编辑:必须确认存在且排除自己
编辑前的名称查重不能直接复用新增逻辑:
text
新增:同名记录数量 > 0 即重复
编辑:同名且 id != 当前 id 的记录数量 > 0 才重复编辑流程:
text
1. selectById(form.id),确认客户存在
2. 检查是否有“其他 id”的同名客户
3. Form -> Entity,必须带上 id
4. updateById(entity)
5. 返回是否更新成功不要用前端传来的每一个字段覆盖数据库。若以后支持“部分编辑”,应区分空值是“不修改”还是“清空字段”。
4. 删除:先定业务规则
Demo 第一版可以物理删除:
java
return demoCustomerMapper.deleteById(id) == 1;但正式 CRM 大多使用逻辑删除:数据不真正移除,只标记 deleted=1,以保留审计和关联关系。
在 Demo 做联系人表后,删除客户前必须先决定:
- 禁止删除有联系人的客户;或
- 事务中先删联系人,再删客户;或
- 主表与子表都做逻辑删除。
不要悄悄留下孤儿联系人数据。
5. 批量删除为什么要事务
错误情况:删除 [1, 2, 3] 时,1 和 2 成功、3 失败,结果数据只删了一半。
正确做法:
java
@Transactional(rollbackFor = Exception.class)
public boolean deleteByIds(List<Long> ids) {
for (Long id : ids) {
deleteById(id);
}
return true;
}如果任意一次 deleteById 抛异常,事务会回滚。第九章会详细说明事务。
6. 参数校验分两层
6.1 格式校验:Form 注解
java
@NotBlank(message = "客户名称不能为空")
private String customerName;适合校验:不能为空、长度、邮箱、数字范围等与单个字段有关的规则。
6.2 业务校验:Service
适合校验:名称重复、客户是否存在、是否有权限、状态是否允许变化、是否有关联数据等。
正式 CustomerInfoAddForm 中的海外客户统一社会信用代码校验属于跨字段规则;正式 CustomerInfoServiceImpl 中的名称去重、客户存在校验属于业务校验。
7. CRUD 测试清单
| 用例 | 预期 |
|---|---|
| 客户名称为空新增 | 失败,提示不能为空 |
| 新增一个新名称 | 成功,数据库多一行 |
| 再新增同名客户 | 失败,提示名称已存在 |
| 编辑不存在 id | 失败,提示客户不存在 |
| 编辑为其他客户的名称 | 失败,提示名称重复 |
| 删除存在 id | 成功,详情查不到 |
| 批量删除中混入不存在 id | 按你定义的规则失败并回滚,或明确忽略不存在 id |
| 新增/删除后分页 | total 正确增加/减少 |
8. 推荐提交节奏
即使只是本地练习,也请按小步骤保存:
text
feat: add customer save form and validation
feat: add customer detail endpoint
feat: add customer create and duplicate check
feat: add customer edit and delete endpoints
test: cover customer CRUD rules小提交便于定位错误,也符合正式团队协作习惯。
