"""统一工具函数""" import uuid import random import string from datetime import date, datetime from typing import Optional, Union def generate_uuid() -> str: """生成UUID""" return str(uuid.uuid4()).replace("-", "").upper() def generate_id(prefix: str = "") -> str: """生成带前缀的ID""" uid = str(uuid.uuid4()).replace("-", "").upper() return f"{prefix}{uid}" if prefix else uid def generate_random_password(length: int = 8) -> str: """生成随机密码""" chars = string.ascii_letters + string.digits return ''.join(random.choice(chars) for _ in range(length)) def get_current_time() -> datetime: """获取当前时间""" return datetime.now() def format_datetime(dt: Optional[datetime]) -> Optional[str]: """格式化时间为ISO 8601格式""" if dt is None: return None return dt.strftime("%Y-%m-%d %H:%M:%S") def parse_datetime(dt_str: str) -> Optional[datetime]: """解析ISO 8601格式时间""" if not dt_str: return None try: return datetime.fromisoformat(dt_str.replace("Z", "+00:00")) except (ValueError, AttributeError): return None def format_date(d: Optional[Union[date, datetime]]) -> str: """格式化日期为 YYYY-MM-DD""" if d is None: return "" if isinstance(d, datetime): d = d.date() return d.strftime("%Y-%m-%d") def parse_date(date_str: str) -> Optional[date]: """解析 YYYY-MM-DD 日期""" if not date_str: return None try: s = str(date_str).strip() if not s: return None return datetime.fromisoformat(s[:10]).date() except (ValueError, AttributeError): return None def optional_date(v: object) -> Optional[date]: """将字符串 / date / datetime 转为 date 或 None""" if v is None or v == "": return None if isinstance(v, datetime): return v.date() if isinstance(v, date): return v return parse_date(str(v)) def get_file_size_display(size_bytes: int) -> str: """将字节数转换为可读的文件大小""" if size_bytes is None: return "0 B" for unit in ['B', 'KB', 'MB', 'GB', 'TB']: if size_bytes < 1024.0: return f"{size_bytes:.2f} {unit}" size_bytes /= 1024.0 return f"{size_bytes:.2f} PB"