fix(cms): 修复联系表单手机号长度及格式问题

- 为 CmsContactLead 实体的 name 和 phone 加入 @NotBlank、@Size 及 @Pattern 校验
- 规范 company、delivery、need、source、ip 字段长度限制,防止数据异常
- 在提交服务中新增 sanitizePhone 方法,清除手机号中的空格、横线及括号等分隔符
- 扩展数据库中 phone 字段长度到 VARCHAR(32),支持国际及带分机号格式
- 更新数据库中 name、company、need 字段长度,避免未来数据截断风险
- 补充项目长期记忆文件,记录技术栈及该修复详情
This commit is contained in:
2026-07-19 19:36:38 +08:00
parent 8256817ef7
commit b79cc1003c
5 changed files with 103 additions and 2 deletions

View File

@@ -8,6 +8,9 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.time.LocalDateTime;
@@ -28,25 +31,35 @@ public class CmsContactLead implements Serializable {
@TableId(value = "lead_id", type = IdType.AUTO)
private Integer leadId;
@Schema(description = "联系人姓名")
@Schema(description = "联系人姓名", required = true)
@NotBlank(message = "姓名不能为空")
@Size(max = 50, message = "姓名长度不能超过50个字符")
private String name;
@Schema(description = "手机号")
@Schema(description = "手机号", required = true)
@NotBlank(message = "手机号不能为空")
@Size(max = 25, message = "手机号长度不能超过25个字符")
@Pattern(regexp = "^[+]?[0-9\\-\\s()]{6,25}$", message = "手机号格式不正确")
private String phone;
@Schema(description = "单位/公司名称")
@Size(max = 100, message = "公司名称长度不能超过100个字符")
private String company;
@Schema(description = "交付方式: saas/private/hybrid")
@Size(max = 20, message = "交付方式长度不能超过20个字符")
private String delivery;
@Schema(description = "需求描述")
@Size(max = 1000, message = "需求描述长度不能超过1000个字符")
private String need;
@Schema(description = "来源渠道: web/miniapp/app")
@Size(max = 20, message = "来源渠道长度不能超过20个字符")
private String source;
@Schema(description = "提交IP")
@Size(max = 50, message = "IP长度不能超过50个字符")
private String ip;
@Schema(description = "跟进状态: 0待跟进 1跟进中 2已成交 3无效")

View File

@@ -70,6 +70,10 @@ public class CmsContactLeadServiceImpl extends ServiceImpl<CmsContactLeadMapper,
lead.setIp(ip);
lead.setStatus(0); // 默认待跟进
// 清洗手机号:去除空格、横线、括号等分隔符,仅保留 + 和数字
// 防止 "Data too long for column 'phone'" 异常
lead.setPhone(sanitizePhone(lead.getPhone()));
boolean result = save(lead);
if (result) {
log.info("[联系表单] 新线索提交成功name={}, phone={}", lead.getName(), lead.getPhone());
@@ -79,6 +83,17 @@ public class CmsContactLeadServiceImpl extends ServiceImpl<CmsContactLeadMapper,
return result;
}
/**
* 清洗手机号:去除空格、横线、括号等分隔符,仅保留 + 和数字
* 例如:"+86 (138) 1234-5678" -> "+8613812345678"
*/
private String sanitizePhone(String phone) {
if (StrUtil.isBlank(phone)) {
return phone;
}
return phone.replaceAll("[^+0-9]", "");
}
// --------------------------------------------------------
// 异步通知(企业微信 + 飞书)
// --------------------------------------------------------