mirror of
https://github.com/fastapiadmin/FastapiAdmin.git
synced 2026-10-04 09:10:59 +00:00
refactor: 整合仪表盘功能到监控模块,清理冗余代码
- 移除原监控仪表盘独立模块,将相关功能合并到在线监控模块 - 重构租户配置字段名,统一使用logo_url和name替代tenant_logo/tenant_name - 优化搜索工具函数,移除重复导入 - 调整参数配置模型字段长度限制,移除config_value的max_length约束 - 清理冗余的常量定义和导入语句 - 修复批量状态设置接口的redis依赖注入 - 增强OAuth登录安全性,添加租户默认归属和state一次性消费 - 优化资源目录缓存逻辑,减少重复计算 - 新增API Token模块基础框架 - 完善用户token版本管理,支持主动失效JWT - 调整AI模型配置缓存过期时间 - 修复菜单类型字段索引,提升查询性能 - 简化前端刷新token调用逻辑 - 新增滑块验证完成接口和忘记密码验证码校验 - 调整系统配置默认值,添加操作日志保留天数和接口白名单配置 - 限制Mock支付回调仅在开发环境可用 - 重构websocket认证方式,支持更安全的subprotocol传参
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
"""API Token 数据模型
|
||||
|
||||
设计要点:
|
||||
- token 全名:``fastpat_<tenant_code>_<tenant_id_hex>_<48-random>``,明文存 ``token_plain`` 字段
|
||||
(按业务需求选择明文存储,便于长期使用的 webhook / 集成 token)
|
||||
- ``token_prefix`` 字段存前 12 字符用于列表展示,剩余部分用 ``fp_xxxx****yz`` 形式脱敏
|
||||
- 支持 ``scopes``、``expires_at``、``rate_limit``、``status`` 等运营字段
|
||||
- ``last_used_at`` 与 ``used_count`` 提供审计
|
||||
"""
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import ForeignKey, Index, Integer, String, Text
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
|
||||
from app.core.base_model import ModelMixin, TenantMixin, UserMixin
|
||||
|
||||
|
||||
class ApiTokenModel(ModelMixin, TenantMixin, UserMixin):
|
||||
"""租户 API 访问令牌(用于外部系统/集成调用)
|
||||
|
||||
token 全名格式:
|
||||
fastpat_<tenant_code>_<tenant_id_hex>_<48-char-base64url-secret>
|
||||
|
||||
字段:
|
||||
- ``token_plain``:明文令牌(创建时一次性返回,后续可读但不推荐直接读)
|
||||
- ``token_prefix``:用于列表展示的前 12 字符
|
||||
- ``scopes``:JSON 数组(``["order:read", "user:write"]``),控制 API 可访问范围
|
||||
- ``expires_at``:过期时间(空=永久)
|
||||
- ``rate_limit``:每小时请求配额(默认 1000)
|
||||
- ``status``:0=启用 1=禁用 2=吊销
|
||||
- ``last_used_at/used_count/last_used_ip``:调用审计
|
||||
"""
|
||||
|
||||
__tablename__: str = "sys_api_token"
|
||||
__table_args__ = (
|
||||
Index("idx_tenant_token_prefix", "tenant_id", "token_prefix"),
|
||||
{"comment": "租户 API 访问令牌"},
|
||||
)
|
||||
__loader_options__: list[str] = ["tenant_by", "created_by", "updated_by"]
|
||||
|
||||
name: Mapped[str] = mapped_column(String(64), nullable=False, comment="令牌名称(业务语义,如:CRM-对账集成)")
|
||||
token_prefix: Mapped[str] = mapped_column(String(32), nullable=False, index=True, comment="明文 token 前 12 字符(用于展示)")
|
||||
token_plain: Mapped[str] = mapped_column(Text, nullable=False, comment="明文 token(自管理,按需用于外部集成)")
|
||||
owner_user_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("sys_user.id", ondelete="SET NULL", onupdate="CASCADE"), nullable=True, index=True, comment="所属用户ID(创建者/操作者)")
|
||||
scopes: Mapped[str] = mapped_column(String(255), nullable=False, default="*", comment="可用 scope(逗号或 JSON 数组字符串)")
|
||||
expires_at: Mapped[datetime | None] = mapped_column(nullable=True, comment="过期时间(NULL=永不过期)")
|
||||
status: Mapped[int] = mapped_column(Integer, default=0, nullable=False, comment="状态(0:启用 1:禁用 2:吊销)", index=True)
|
||||
rate_limit: Mapped[int] = mapped_column(Integer, default=1000, nullable=False, comment="每小时请求上限")
|
||||
used_count: Mapped[int] = mapped_column(Integer, default=0, nullable=False, comment="累计调用次数")
|
||||
last_used_at: Mapped[datetime | None] = mapped_column(nullable=True, comment="最近一次调用时间")
|
||||
last_used_ip: Mapped[str | None] = mapped_column(String(64), nullable=True, comment="最近一次调用 IP")
|
||||
description: Mapped[str | None] = mapped_column(Text, nullable=True, comment="备注")
|
||||
Reference in New Issue
Block a user