ForcePilot/backend/package/yuxi/services/user_identity_service.py
2026-05-29 22:19:58 +08:00

60 lines
1.6 KiB
Python

import re
import time
from pypinyin import Style, lazy_pinyin
def to_pinyin(text: str) -> str:
return "".join(lazy_pinyin(text, style=Style.NORMAL))
def validate_username(username: str) -> tuple[bool, str]:
if not username:
return False, "用户名不能为空"
if len(username) < 2:
return False, "用户名长度不能少于2个字符"
if len(username) > 20:
return False, "用户名长度不能超过20个字符"
if not re.match(r"^[一-龥a-zA-Z0-9_]+$", username):
return False, "用户名只能包含中文、英文、数字和下划线"
return True, ""
def generate_uid(username: str) -> str:
uid = re.sub(r"[^a-zA-Z0-9_]", "", to_pinyin(username.strip()))
if uid and uid[0].isdigit():
uid = f"u{uid}"
if len(uid) < 2:
uid = f"user{hash(username) % 10000:04d}"
return uid[:20].lower()
def generate_unique_uid(username: str, existing_uids: list[str]) -> str:
base_uid = generate_uid(username)
if base_uid not in existing_uids:
return base_uid
counter = 1
while counter <= 9999:
candidate = f"{base_uid}{counter}"
if candidate not in existing_uids:
return candidate
counter += 1
return f"{base_uid}{int(time.time()) % 10000}"
def is_valid_phone_number(phone: str) -> bool:
if not phone:
return False
return bool(re.match(r"^1[3-9]\d{9}$", re.sub(r"[\s\-\(\)]", "", phone)))
def normalize_phone_number(phone: str) -> str:
if not phone:
return ""
phone = re.sub(r"\D", "", phone)
if len(phone) == 11 and phone.startswith("1"):
return phone
return phone