2026-06-01 09:25:26 +08:00
|
|
|
from datetime import datetime
|
|
|
|
|
|
2026-06-03 15:51:46 +08:00
|
|
|
from sqlalchemy import BigInteger, Boolean, DateTime, Integer, JSON, SmallInteger, String
|
2026-06-01 09:25:26 +08:00
|
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
|
|
|
|
|
|
from app.db.base import Base
|
|
|
|
|
from app.models.mixins import TimestampMixin
|
|
|
|
|
|
2026-06-03 15:51:46 +08:00
|
|
|
BIGINT_PK = BigInteger().with_variant(Integer, "sqlite")
|
2026-06-01 09:25:26 +08:00
|
|
|
|
|
|
|
|
|
2026-06-03 15:51:46 +08:00
|
|
|
class User(TimestampMixin, Base):
|
|
|
|
|
"""用户端用户表:按 Django 用户中心确定字段建模,只读取不承担登录注册职责。"""
|
|
|
|
|
|
|
|
|
|
__tablename__ = "user"
|
|
|
|
|
|
|
|
|
|
id: Mapped[int] = mapped_column(BIGINT_PK, primary_key=True, autoincrement=True, comment="用户ID")
|
|
|
|
|
username: Mapped[str] = mapped_column(String(50), nullable=False, unique=True, index=True, comment="用户名")
|
|
|
|
|
password: Mapped[str] = mapped_column(String(255), nullable=False, comment="密码哈希")
|
|
|
|
|
real_name: Mapped[str] = mapped_column(String(50), nullable=False, comment="真实姓名")
|
|
|
|
|
phone: Mapped[str] = mapped_column(String(20), nullable=False, unique=True, index=True, comment="手机号")
|
|
|
|
|
avatar: Mapped[str] = mapped_column(String(255), nullable=False, default="", comment="头像")
|
|
|
|
|
gender: Mapped[int] = mapped_column(SmallInteger, nullable=False, default=0, comment="性别")
|
|
|
|
|
role_type: Mapped[str] = mapped_column(String(30), nullable=False, comment="角色类型")
|
|
|
|
|
title_name: Mapped[str] = mapped_column(String(50), nullable=False, default="", comment="职称")
|
|
|
|
|
major: Mapped[str] = mapped_column(String(100), nullable=False, default="", comment="专业")
|
|
|
|
|
training_stage: Mapped[str] = mapped_column(String(50), nullable=False, default="", comment="培训阶段")
|
|
|
|
|
learning_target: Mapped[str] = mapped_column(String(255), nullable=False, default="", comment="学习目标")
|
|
|
|
|
competency_profile: Mapped[dict] = mapped_column(JSON, nullable=False, default=dict, comment="能力画像")
|
|
|
|
|
weak_dimensions: Mapped[list] = mapped_column(JSON, nullable=False, default=list, comment="薄弱维度")
|
|
|
|
|
strong_dimensions: Mapped[list] = mapped_column(JSON, nullable=False, default=list, comment="优势维度")
|
|
|
|
|
ai_preference: Mapped[dict] = mapped_column(JSON, nullable=False, default=dict, comment="AI偏好")
|
|
|
|
|
total_training_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0, comment="训练次数")
|
|
|
|
|
total_case_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0, comment="病例数")
|
|
|
|
|
current_level: Mapped[str] = mapped_column(String(30), nullable=False, default="", comment="当前等级")
|
|
|
|
|
status: Mapped[int] = mapped_column(SmallInteger, nullable=False, default=1, comment="状态")
|
|
|
|
|
last_login: Mapped[datetime | None] = mapped_column(DateTime, nullable=True, comment="最后登录")
|
|
|
|
|
last_login_time: Mapped[datetime | None] = mapped_column(DateTime, nullable=True, comment="最后登录时间")
|
|
|
|
|
is_superuser: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, comment="是否超级用户")
|
|
|
|
|
is_staff: Mapped[bool] = mapped_column(Boolean, nullable=False, default=False, comment="是否员工")
|
|
|
|
|
is_active: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True, comment="是否激活")
|
|
|
|
|
date_joined: Mapped[datetime | None] = mapped_column(DateTime, nullable=True, comment="加入时间")
|
|
|
|
|
department_id: Mapped[int | None] = mapped_column(BigInteger, nullable=True, index=True, comment="科室ID")
|
|
|
|
|
institution_id: Mapped[int | None] = mapped_column(BigInteger, nullable=True, index=True, comment="机构ID")
|
|
|
|
|
|
|
|
|
|
__table_args__ = {"comment": "用户表"}
|