Skip to content

08:CRUD:新增、编辑、删除与参数校验

1. 本章要完成的接口

能力URL方法请求体
新增/customerInfo/savePOSTCustomerSaveForm
编辑/customerInfo/editPOSTCustomerEditForm
详情/customerInfo/findByIdPOSTid
删除一条/customerInfo/delPOSTid
批量删除/customerInfo/del/batchPOSTid 数组
分页/customerInfo/query/pagePOSTQueryModel

为了兼容当前前端,请保留 /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

小提交便于定位错误,也符合正式团队协作习惯。

Lucking