feat: 用户名验证支持点号,统一错误消息,完善前端验证

- 后端正则改为 ^[a-zA-Z0-9_.\-]+$ 支持点号
- 统一错误消息使用"连字符"
- 前端 UserFormDialog 和 RegisterDialog 添加实时验证
- 输入框显示格式提示和错误信息
This commit is contained in:
LewisPen
2026-01-27 12:17:19 +08:00
parent e24534668a
commit 9fefa94134
5 changed files with 58 additions and 9 deletions

View File

@@ -136,7 +136,7 @@ class UsernameValidator:
MIN_LENGTH = 3
MAX_LENGTH = 30
USERNAME_REGEX = re.compile(r"^[a-zA-Z0-9_-]+$")
USERNAME_REGEX = re.compile(r"^[a-zA-Z0-9_.\-]+$")
@classmethod
def validate(cls, username: str) -> tuple[bool, Optional[str]]:
@@ -159,7 +159,7 @@ class UsernameValidator:
return False, f"用户名长度不能超过{cls.MAX_LENGTH}个字符"
if not cls.USERNAME_REGEX.match(username):
return False, "用户名只能包含字母、数字、下划线连字符"
return False, "用户名只能包含字母、数字、下划线连字符和点号"
# 检查保留用户名
reserved_names = [

View File

@@ -314,8 +314,8 @@ class UpdateUserRequest(BaseModel):
if v is None:
return v
if not re.match(r"^[a-zA-Z0-9_-]+$", v):
raise ValueError("用户名只能包含字母、数字、下划线连字符")
if not re.match(r"^[a-zA-Z0-9_.\-]+$", v):
raise ValueError("用户名只能包含字母、数字、下划线连字符和点号")
return v

View File

@@ -103,8 +103,8 @@ class RegisterRequest(BaseModel):
v = v.strip()
if not v:
raise ValueError("用户名不能为空")
if not re.match(r"^[a-zA-Z0-9_-]+$", v):
raise ValueError("用户名只能包含字母、数字、下划线和短横线")
if not re.match(r"^[a-zA-Z0-9_.\-]+$", v):
raise ValueError("用户名只能包含字母、数字、下划线、连字符和点号")
return v
@classmethod
@@ -279,8 +279,8 @@ class CreateUserRequest(BaseModel):
v = v.strip()
if not v:
raise ValueError("用户名不能为空")
if not re.match(r"^[a-zA-Z0-9_-]+$", v):
raise ValueError("用户名只能包含字母、数字、下划线和短横线")
if not re.match(r"^[a-zA-Z0-9_.\-]+$", v):
raise ValueError("用户名只能包含字母、数字、下划线、连字符和点号")
return v
@classmethod