feat(多租户): 增强多租户和客户支持功能

添加租户ID和客户ID到请求上下文中
更新操作日志记录以包含租户和客户信息
优化类型注解使用现代Python语法
重构基础模型和模式中的租户和客户关联字段
This commit is contained in:
zhangtao
2025-11-29 16:22:46 +08:00
parent 7e4eda0671
commit 959eb6f19c
6 changed files with 66 additions and 54 deletions
@@ -1,6 +1,5 @@
# -*- coding: utf-8 -*-
from typing import Optional, Union
from datetime import datetime
from pydantic import ConfigDict, Field, BaseModel, model_validator
from sqlalchemy.ext.asyncio import AsyncSession
@@ -21,8 +20,8 @@ class JWTPayloadSchema(BaseModel):
"""JWT载荷模型"""
sub: str = Field(..., description='用户登录信息')
is_refresh: bool = Field(default=False, description='是否刷新token')
exp: Union[datetime, int] = Field(..., description='过期时间')
tenant_id: Optional[int] = Field(default=None, description='租户ID')
exp: datetime | int = Field(..., description='过期时间')
tenant_id: int | None = Field(default=None, description='租户ID')
@model_validator(mode='after')
def validate_fields(self):
+24 -21
View File
@@ -11,20 +11,23 @@ from app.core.base_schema import BaseSchema, UserBySchema, TenantSchema, Custome
class OperationLogCreateSchema(BaseModel):
"""日志创建模型"""
type: Optional[int] = Field(default=None, description="日志类型(1登录日志 2操作日志)")
request_path: Optional[str] = Field(default=None, description="请求路径")
request_method: Optional[str] = Field(default=None, description="请求方法")
request_payload: Optional[str] = Field(default=None, description="请求负载")
request_ip: Optional[str] = Field(default=None, description="请求 IP 地址")
login_location: Optional[str] = Field(default=None, description="登录位置")
request_os: Optional[str] = Field(default=None, description="请求操作系统")
request_browser: Optional[str] = Field(default=None, description="请求浏览器")
response_code: Optional[int] = Field(default=None, description="响应状态码")
response_json: Optional[str] = Field(default=None, description="响应 JSON 数据")
process_time: Optional[str] = Field(default=None, description="处理时间")
status: Optional[str] = Field(default="0", description="是否成功")
description: Optional[str] = Field(default=None, max_length=255, description="描述")
created_id: Optional[int] = Field(default=None, description="创建人ID")
type: int | None = Field(default=None, description="日志类型(1登录日志 2操作日志)")
request_path: str | None = Field(default=None, description="请求路径")
request_method: str | None = Field(default=None, description="请求方法")
request_payload: str | None = Field(default=None, description="请求负载")
request_ip: str | None = Field(default=None, description="请求 IP 地址")
login_location: str | None = Field(default=None, description="登录位置")
request_os: str | None = Field(default=None, description="请求操作系统")
request_browser: str | None = Field(default=None, description="请求浏览器")
response_code: int | None = Field(default=None, description="响应状态码")
response_json: str | None = Field(default=None, description="响应 JSON 数据")
process_time: str | None = Field(default=None, description="处理时间")
status: str | None = Field(default="0", description="是否成功")
description: str | None = Field(default=None, max_length=255, description="描述")
created_id: int | None = Field(default=None, description="创建人ID")
updated_id: int | None = Field(default=None, description="更新人ID")
tenant_id: int | None = Field(default=None, description="租户ID")
customer_id: int | None = Field(default=None, description="客户ID")
@field_validator("type")
@classmethod
@@ -67,13 +70,13 @@ class OperationLogQueryParam:
def __init__(
self,
type: Optional[int] = Query(None, description="日志类型(1:登录日志, 2:操作日志)"),
request_path: Optional[str] = Query(None, description="请求路径"),
request_method: Optional[str] = Query(None, description="请求方法"),
request_ip: Optional[str] = Query(None, description="请求IP"),
response_code: Optional[int] = Query(None, description="响应状态码"),
created_id: Optional[int] = Query(None, description="创建人"),
created_time: Optional[list[DateTimeStr]] = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
type: int | None = Query(None, description="日志类型(1:登录日志, 2:操作日志)"),
request_path: str | None = Query(None, description="请求路径"),
request_method: str | None = Query(None, description="请求方法"),
request_ip: str | None = Query(None, description="请求IP"),
response_code: int | None = Query(None, description="响应状态码"),
created_id: int | None = Query(None, description="创建人"),
created_time: list[DateTimeStr] | None = Query(None, description="创建时间范围", example=["2025-01-01 00:00:00", "2025-12-31 23:59:59"]),
) -> None:
# 模糊查询字段