Initial commit: 000-platform project skeleton
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
13
backend/app/models/__init__.py
Normal file
13
backend/app/models/__init__.py
Normal file
@@ -0,0 +1,13 @@
|
||||
"""数据模型"""
|
||||
from .tenant import Tenant, Subscription, Config
|
||||
from .stats import AICallEvent, TenantUsageDaily
|
||||
from .logs import PlatformLog
|
||||
|
||||
__all__ = [
|
||||
"Tenant",
|
||||
"Subscription",
|
||||
"Config",
|
||||
"AICallEvent",
|
||||
"TenantUsageDaily",
|
||||
"PlatformLog"
|
||||
]
|
||||
31
backend/app/models/logs.py
Normal file
31
backend/app/models/logs.py
Normal file
@@ -0,0 +1,31 @@
|
||||
"""日志相关模型"""
|
||||
from datetime import datetime
|
||||
from sqlalchemy import Column, BigInteger, String, Integer, Text, JSON, Enum, TIMESTAMP
|
||||
from ..database import Base
|
||||
|
||||
|
||||
class PlatformLog(Base):
|
||||
"""统一日志表"""
|
||||
__tablename__ = "platform_logs"
|
||||
|
||||
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
||||
trace_id = Column(String(36))
|
||||
tenant_id = Column(BigInteger)
|
||||
user_id = Column(BigInteger)
|
||||
app_code = Column(String(50), nullable=False)
|
||||
log_type = Column(Enum('request', 'error', 'app', 'biz', 'audit'), nullable=False)
|
||||
level = Column(Enum('debug', 'info', 'warn', 'error', 'fatal'), default='info')
|
||||
category = Column(String(100))
|
||||
message = Column(Text, nullable=False)
|
||||
context = Column(JSON)
|
||||
method = Column(String(10))
|
||||
path = Column(String(500))
|
||||
status_code = Column(Integer)
|
||||
duration_ms = Column(Integer)
|
||||
error_type = Column(String(100))
|
||||
stack_trace = Column(Text)
|
||||
action = Column(String(100))
|
||||
target_type = Column(String(50))
|
||||
target_id = Column(String(100))
|
||||
log_time = Column(TIMESTAMP, nullable=False)
|
||||
created_at = Column(TIMESTAMP, default=datetime.now)
|
||||
41
backend/app/models/stats.py
Normal file
41
backend/app/models/stats.py
Normal file
@@ -0,0 +1,41 @@
|
||||
"""统计相关模型"""
|
||||
from datetime import datetime, date
|
||||
from decimal import Decimal
|
||||
from sqlalchemy import Column, BigInteger, String, Integer, Date, DECIMAL, TIMESTAMP
|
||||
from ..database import Base
|
||||
|
||||
|
||||
class AICallEvent(Base):
|
||||
"""AI调用明细"""
|
||||
__tablename__ = "platform_ai_call_events"
|
||||
|
||||
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
||||
tenant_id = Column(BigInteger, nullable=False)
|
||||
user_id = Column(BigInteger)
|
||||
app_code = Column(String(50), nullable=False)
|
||||
module_code = Column(String(50), nullable=False)
|
||||
trace_id = Column(String(36))
|
||||
prompt_name = Column(String(100), nullable=False)
|
||||
model = Column(String(100), nullable=False)
|
||||
input_tokens = Column(Integer, default=0)
|
||||
output_tokens = Column(Integer, default=0)
|
||||
cost = Column(DECIMAL(10, 6), default=0)
|
||||
latency_ms = Column(Integer, default=0)
|
||||
status = Column(String(20), default='success')
|
||||
event_time = Column(TIMESTAMP, nullable=False)
|
||||
created_at = Column(TIMESTAMP, default=datetime.now)
|
||||
|
||||
|
||||
class TenantUsageDaily(Base):
|
||||
"""租户日用量汇总"""
|
||||
__tablename__ = "platform_tenant_usage_daily"
|
||||
|
||||
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
||||
tenant_id = Column(BigInteger, nullable=False)
|
||||
app_code = Column(String(50), nullable=False)
|
||||
stat_date = Column(Date, nullable=False)
|
||||
ai_calls = Column(Integer, default=0)
|
||||
ai_tokens = Column(BigInteger, default=0)
|
||||
ai_cost = Column(DECIMAL(10, 4), default=0)
|
||||
created_at = Column(TIMESTAMP, default=datetime.now)
|
||||
updated_at = Column(TIMESTAMP, default=datetime.now, onupdate=datetime.now)
|
||||
47
backend/app/models/tenant.py
Normal file
47
backend/app/models/tenant.py
Normal file
@@ -0,0 +1,47 @@
|
||||
"""租户相关模型"""
|
||||
from datetime import datetime, date
|
||||
from sqlalchemy import Column, BigInteger, String, Enum, Date, Text, Boolean, JSON, TIMESTAMP
|
||||
from ..database import Base
|
||||
|
||||
|
||||
class Tenant(Base):
|
||||
"""租户表"""
|
||||
__tablename__ = "platform_tenants"
|
||||
|
||||
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
||||
code = Column(String(50), unique=True, nullable=False)
|
||||
name = Column(String(100), nullable=False)
|
||||
contact_info = Column(JSON)
|
||||
status = Column(Enum('active', 'expired', 'trial'), default='active')
|
||||
expired_at = Column(Date)
|
||||
created_at = Column(TIMESTAMP, default=datetime.now)
|
||||
updated_at = Column(TIMESTAMP, default=datetime.now, onupdate=datetime.now)
|
||||
|
||||
|
||||
class Subscription(Base):
|
||||
"""订阅表"""
|
||||
__tablename__ = "platform_subscriptions"
|
||||
|
||||
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
||||
tenant_id = Column(BigInteger, nullable=False)
|
||||
app_code = Column(String(50), nullable=False)
|
||||
start_date = Column(Date)
|
||||
end_date = Column(Date)
|
||||
quota = Column(JSON)
|
||||
status = Column(Enum('active', 'expired'), default='active')
|
||||
created_at = Column(TIMESTAMP, default=datetime.now)
|
||||
updated_at = Column(TIMESTAMP, default=datetime.now, onupdate=datetime.now)
|
||||
|
||||
|
||||
class Config(Base):
|
||||
"""配置表"""
|
||||
__tablename__ = "platform_configs"
|
||||
|
||||
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
||||
tenant_id = Column(BigInteger, nullable=False)
|
||||
config_type = Column(String(50), nullable=False)
|
||||
config_key = Column(String(100), nullable=False)
|
||||
config_value = Column(Text)
|
||||
is_encrypted = Column(Boolean, default=False)
|
||||
created_at = Column(TIMESTAMP, default=datetime.now)
|
||||
updated_at = Column(TIMESTAMP, default=datetime.now, onupdate=datetime.now)
|
||||
Reference in New Issue
Block a user