Files
FastapiAdmin/backend/app/api/v1/module_system/tenant/model.py
T
zhangtao 7e4eda0671 refactor(database): 重构系统表命名及数据隔离逻辑
- 将系统表前缀从'system_'统一改为'sys_',包括用户、角色、部门等核心表
- 优化数据权限检查逻辑,支持初始化场景跳过权限验证
- 更新初始化脚本和模型模板,确保与新的表结构兼容
- 修复字典服务中is_default字段类型定义问题
- 调整控制台显示的数据库类型描述
- 添加业务逻辑文档,详细说明系统架构和核心功能

docs: 添加系统业务逻辑文档和多租户设计参考
2025-11-29 14:54:40 +08:00

47 lines
1.9 KiB
Python

# -*- coding: utf-8 -*-
from datetime import datetime
from sqlalchemy import DateTime, String
from sqlalchemy.orm import Mapped, mapped_column, validates
from app.core.base_model import ModelMixin
class TenantModel(ModelMixin):
"""
租户模型
核心数据隔离模型:
- 系统租户(id=1):管理所有租户和系统配置,由平台超管管理
- 普通租户(id>1):拥有自己的用户、部门、角色、客户等数据,租户间完全隔离
- 所有业务表通过tenant_id字段关联到租户,实现租户间数据隔离
注意:
- 租户表本身不需要tenant_id字段(租户不属于租户)
- 租户表不需要customer_id字段(租户不属于客户)
- 但需要created_id/updated_id用于审计追踪
"""
__tablename__: str = 'sys_tenant'
__table_args__: dict[str, str] = {'comment': '租户表'}
name: Mapped[str] = mapped_column(String(100), nullable=False, unique=True, comment='租户名称')
code: Mapped[str] = mapped_column(String(100), nullable=False, unique=True, comment='租户编码')
start_time: Mapped[datetime | None] = mapped_column(DateTime, nullable=True, default=None, comment='开始时间')
end_time: Mapped[datetime | None] = mapped_column(DateTime, nullable=True, default=None, comment='结束时间')
@validates('name')
def validate_name(self, key: str, name: str) -> str:
"""验证名称不为空"""
if not name or not name.strip():
raise ValueError('名称不能为空')
return name
@validates('code')
def validate_code(self, key: str, code: str) -> str:
"""验证编码格式校验"""
if not code or not code.strip():
raise ValueError('编码不能为空')
if not code.isalnum():
raise ValueError('编码只能包含字母和数字')
return code