Files
file-templates/Python/SqlModel/模型定义.txt

572 lines
18 KiB
Plaintext

This file is a merged representation of a subset of the codebase, containing specifically included files, combined into a single document by Repomix.
================================================================
File Summary
================================================================
Purpose:
--------
This file contains a packed representation of the entire repository's contents.
It is designed to be easily consumable by AI systems for analysis, code review,
or other automated processes.
File Format:
------------
The content is organized as follows:
1. This summary section
2. Repository information
3. Directory structure
4. Multiple file entries, each consisting of:
a. A separator line (================)
b. The file path (File: path/to/file)
c. Another separator line
d. The full contents of the file
e. A blank line
Usage Guidelines:
-----------------
- This file should be treated as read-only. Any changes should be made to the
original repository files, not this packed version.
- When processing this file, use the file path to distinguish
between different files in the repository.
- Be aware that this file may contain sensitive information. Handle it with
the same level of security as you would the original repository.
Notes:
------
- Some files may have been excluded based on .gitignore rules and Repomix's configuration
- Binary files are not included in this packed representation. Please refer to the Repository Structure section for a complete list of file paths, including binary files
- Only files matching these patterns are included: models.py
- Files matching patterns in .gitignore are excluded
- Files matching default ignore patterns are excluded
Additional Info:
----------------
================================================================
Directory Structure
================================================================
models.py
================================================================
Files
================================================================
================
File: models.py
================
from datetime import datetime
from enum import Enum
from typing import List, Optional
from pydantic import BaseModel
from sqlalchemy import (
Boolean,
Column,
Float,
ForeignKey,
String,
Integer,
DateTime,
Enum as SQLAlchemyEnum,
Text,
UniqueConstraint,
)
from sqlalchemy.dialects.postgresql import JSONB
from sqlmodel import Field, Relationship, SQLModel
class User(SQLModel, table=True):
"""用户信息表"""
id: Optional[int] = Field(
default=None,
sa_column=Column(Integer, primary_key=True, autoincrement=True),
description="用户ID",
)
username: str = Field(
sa_column=Column(String(50), comment="用户名"), description="用户名"
)
nickname: str = Field(
default="",
sa_column=Column(String(50), comment="昵称"), description="昵称"
)
comment: str = Field(
default="",
sa_column=Column(String(255), comment="备注"), description="备注"
)
phone: str = Field(
sa_column=Column(String(11), comment="手机号"), description="手机号"
)
password: str = Field(
sa_column=Column(String(100), comment="密码(加密存储)"), description="密码"
)
created_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="创建时间"),
description="创建时间",
)
updated_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="更新时间", onupdate=datetime.now()),
description="更新时间",
)
tags: List[str] = Field(
default=[], sa_column=Column(JSONB, comment="标签列表"), description="标签列表"
)
orders: List["Order"] = Relationship(
back_populates="user", sa_relationship_kwargs={"cascade": "all, delete-orphan"}
)
assets: List["UserAsset"] = Relationship(
back_populates="user", sa_relationship_kwargs={"cascade": "all, delete-orphan"}
)
agents: List["Agent"] = Relationship(
back_populates="owner", sa_relationship_kwargs={"cascade": "all, delete-orphan"}
)
privileges: List["UserPrivilege"] = Relationship(
back_populates="user", sa_relationship_kwargs={"cascade": "all, delete-orphan"}
)
__table_args__ = (
UniqueConstraint("phone", name="uq_user_phone"),
{"comment": "用户表"},
)
__tablename__ = "qu_users"
class Agent(SQLModel, table=True):
"""智能体"""
class Type(str, Enum):
CHAT = "chat"
AGENT_CHAT = "agent-chat"
WORKFLOW = "workflow"
COMPLETION = "completion"
id: str = Field(
default=None,
sa_column=Column(String, primary_key=True, comment="应用ID"),
description="应用ID",
)
name: str = Field(
sa_column=Column(String, index=True, comment="名称"), description="名称"
)
monthly_price: float = Field(
default=0.0,
sa_column=Column(Float, comment="月付价格"),
description="月付价格",
)
original_monthly_price: float = Field(
default=0.0,
sa_column=Column(Float, comment="月付原价"),
description="月付原价",
)
yearly_price: float = Field(
default=0.0,
sa_column=Column(Float, comment="年付价格"),
description="年付价格",
)
original_yearly_price: float = Field(
default=0.0,
sa_column=Column(Float, comment="年付原价"),
description="年付原价",
)
icon_url: Optional[str] = Field(
default=None, sa_column=Column(String, comment="图标URL"), description="图标URL"
)
description: str = Field(
sa_column=Column(String, comment="功能描述"), description="功能描述"
)
type: Type = Field(
sa_column=Column(
SQLAlchemyEnum(Type, name="agent_type_enum"),
comment="应用模式",
),
description="应用模式",
)
api_key: Optional[str] = Field(
default=None,
sa_column=Column(String, index=True, comment="API密钥"),
description="最后同步的可用API密钥",
)
owner_id: Optional[int] = Field(
default=None,
sa_column=Column(Integer, ForeignKey("qu_users.id"), comment="创建者ID"),
description="创建者ID",
)
tags: List[str] = Field(
default=[], sa_column=Column(JSONB, comment="标签列表"), description="标签列表"
)
created_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="创建时间"),
description="创建时间",
)
updated_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="更新时间", onupdate=datetime.now()),
description="更新时间",
)
owner: Optional["User"] = Relationship(back_populates="agents")
__table_args__ = {"comment": "Dify应用表"}
__tablename__ = "qu_agents"
class Course(SQLModel, table=True):
"""
课程表
"""
id: Optional[int] = Field(
default=None,
sa_column=Column(Integer, primary_key=True, comment="课程ID"),
description="ID",
)
title: str = Field(
sa_column=Column(String, index=True, comment="课程标题"), description="课程标题"
)
description: str = Field(
sa_column=Column(String, comment="课程描述"), description="课程描述"
)
price: float = Field(sa_column=Column(Float, comment="价格"), description="价格")
tags: List[str] = Field(
default=[], sa_column=Column(JSONB, comment="标签列表"), description="标签列表"
)
cover_image: Optional[str] = Field(
default=None,
sa_column=Column(String, comment="课程封面图片URL"),
description="课程封面",
)
poster_url: Optional[str] = Field(
default=None,
sa_column=Column(String, comment="海报图片URL"),
description="海报图片",
)
created_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="创建时间"),
description="创建时间",
)
updated_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="更新时间", onupdate=datetime.now()),
description="更新时间",
)
instructor: Optional[str] = Field(
default=None, sa_column=Column(String, comment="导师"), description="导师"
)
# 添加这一行,建立与章节的关系
sections: List["CourseSection"] = Relationship(back_populates="course")
__table_args__ = {"comment": "课程信息表"}
__tablename__ = "qu_courses"
class CourseSection(SQLModel, table=True):
"""
课程章节表
"""
id: Optional[int] = Field(
default=None,
sa_column=Column(Integer, primary_key=True, comment="章节ID"),
description="ID",
)
title: str = Field(
sa_column=Column(String, index=True, comment="章节标题"), description="章节标题"
)
duration: int = Field(
default=0, sa_column=Column(Integer, comment="时长(秒)"), description="时长"
)
sort_order: int = Field(
default=0, sa_column=Column(Integer, comment="排序"), description="排序"
)
is_free: bool = Field(
default=False,
sa_column=Column(Boolean, comment="是否免费"),
description="是否免费",
)
video_url: Optional[str] = Field(
default=None, sa_column=Column(String, comment="视频URL"), description="视频URL"
)
created_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="创建时间"),
description="创建时间",
)
updated_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="更新时间", onupdate=datetime.now()),
description="更新时间",
)
is_published: bool = Field(
default=False,
sa_column=Column(Boolean, comment="是否发布"),
description="是否发布",
)
course_id: int = Field(
sa_column=Column(Integer, ForeignKey("qu_courses.id"), comment="关联课程ID"),
description="课程ID",
)
course: "Course" = Relationship(back_populates="sections")
__table_args__ = {"comment": "课程章节表"}
__tablename__ = "qu_course_sections"
class UserAsset(SQLModel, table=True):
"""用户资产表"""
class Type(str, Enum):
APP = "app"
COURSE = "course"
id: Optional[int] = Field(
default=None,
sa_column=Column(Integer, primary_key=True, autoincrement=True),
description="资产ID",
)
user_id: int = Field(
sa_column=Column(Integer, ForeignKey("qu_users.id"), comment="用户ID"),
description="用户ID",
)
asset_type: Type = Field(
default=Type.APP,
sa_column=Column(
SQLAlchemyEnum(Type, name="asset_type_enum"),
comment="资产类型",
),
description="资产类型",
)
app_mode: Optional[Agent.Type] = Field(
default=None,
sa_column=Column(
SQLAlchemyEnum(Agent.Type, name="app_mode_enum"),
comment="应用模式,当资产类型为APP时有效",
),
description="应用模式",
)
asset_id: str = Field(
sa_column=Column(String, comment="资产ID"), description="资产ID"
)
asset_name: str = Field(
sa_column=Column(String, comment="资产名称"), description="资产名称"
)
quantity: int = Field(
default=1,
sa_column=Column(Integer, comment="数量"),
description="数量",
)
expire_at: Optional[datetime] = Field(
default=None,
sa_column=Column(DateTime(), comment="有效期至"),
description="有效期至",
)
created_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="创建时间"),
description="创建时间",
)
updated_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="更新时间", onupdate=datetime.now()),
description="更新时间",
)
user: "User" = Relationship(back_populates="assets")
__table_args__ = {"comment": "用户资产表"}
__tablename__ = "qu_user_assets"
class Order(SQLModel, table=True):
"""订单表"""
class PaymentMethod(str, Enum):
"""支付方式枚举"""
ALIPAY = "alipay" # 支付宝
WECHATPAY = "wechatpay" # 微信支付
class Item(BaseModel):
"""订单项目"""
asset_type: Agent.Type
asset_id: str
quantity: int
unit_price: str
class Status(str, Enum):
"""订单状态枚举"""
PENDING = "PENDING" # 待支付
PAID = "PAID" # 已支付
CANCELLED = "CANCELLED" # 已取消
REFUNDED = "REFUNDED" # 已退款
id: Optional[str] = Field(
default=None,
sa_column=Column(String, primary_key=True, comment="订单ID"),
description="ID",
)
user_id: int = Field(
sa_column=Column(Integer, ForeignKey("qu_users.id"), comment="用户ID"),
description="用户ID",
)
amount: float = Field(
sa_column=Column(Float, comment="订单金额"), description="订单金额"
)
status: str = Field(
default=Status.PENDING,
sa_column=Column(
SQLAlchemyEnum(Status, name="order_status_enum" ),
comment="订单状态",
),
description="订单状态",
)
payment_method: PaymentMethod = Field(
default=PaymentMethod.ALIPAY,
sa_column=Column(
SQLAlchemyEnum(PaymentMethod, name="payment_method_enum"),
comment="支付方式",
),
description="支付方式",
)
pay_time: Optional[datetime] = Field(
default=None,
sa_column=Column(DateTime(), comment="支付时间"),
description="支付时间",
)
items: List[Item] = Field(
default=[], sa_column=Column(JSONB, comment="订单项"), description="订单项"
)
created_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="创建时间"),
description="创建时间",
)
updated_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="更新时间", onupdate=datetime.now()),
description="更新时间",
)
user: "User" = Relationship(back_populates="orders")
__table_args__ = {"comment": "订单信息表"}
__tablename__ = "qu_orders"
class Admin(SQLModel, table=True):
"""管理员表"""
id: Optional[int] = Field(
default=None,
sa_column=Column(
Integer, primary_key=True, autoincrement=True, comment="管理员ID"
),
description="管理员ID",
)
username: str = Field(
sa_column=Column(String(50), unique=True, comment="用户名"),
description="用户名",
)
password: str = Field(
sa_column=Column(String(100), comment="密码"),
description="密码",
)
avatar_url: Optional[str] = Field(
default=None,
sa_column=Column(Text, comment="头像URL"),
description="头像URL",
)
created_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="创建时间"),
description="创建时间",
)
updated_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="更新时间", onupdate=datetime.now()),
description="更新时间",
)
__table_args__ = {"comment": "管理员表"}
__tablename__ = "qu_admins"
class UserPrivilege(SQLModel, table=True):
"""用户权益表"""
class PrivilegeType(str, Enum):
"""用户权益类型枚举"""
CREATE_AGENT = "create_agent" # 创建智能体
SINGLE_CHAT = "single_chat" # 单次对话聊天
id: Optional[int] = Field(
default=None,
sa_column=Column(Integer, primary_key=True, autoincrement=True),
description="权益ID",
)
user_id: int = Field(
sa_column=Column(Integer, ForeignKey("qu_users.id"), index=True),
description="用户ID",
)
privilege_type: PrivilegeType = Field(
sa_column=Column(
SQLAlchemyEnum(PrivilegeType, name="privilege_type_enum"),
comment="权益类型",
),
description="权益类型",
)
value: int = Field(
sa_column=Column(Integer, comment="权益值"), description="权益值"
)
expires_at: Optional[datetime] = Field(
default=None,
sa_column=Column(DateTime(), comment="过期时间"),
description="过期时间",
)
created_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="创建时间"),
description="创建时间",
)
updated_at: datetime = Field(
default_factory=lambda: datetime.now(),
sa_column=Column(DateTime(), comment="更新时间", onupdate=datetime.now()),
description="更新时间",
)
user: "User" = Relationship(back_populates="privileges")
__table_args__ = (
UniqueConstraint("user_id", "privilege_type", name="uix_user_privilege_type"),
{"comment": "用户权益表"},
)
__tablename__ = "qu_user_privileges"
================================================================
End of Codebase
================================================================