From 394405e167140dc3805e76713dea79e16a4dd357 Mon Sep 17 00:00:00 2001 From: cruldra Date: Thu, 3 Apr 2025 23:06:24 +0000 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20Python/SqlModel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Python/SqlModel/模型定义.txt | 571 +++++++++++++++++++++++++++++++++++ 1 file changed, 571 insertions(+) create mode 100644 Python/SqlModel/模型定义.txt diff --git a/Python/SqlModel/模型定义.txt b/Python/SqlModel/模型定义.txt new file mode 100644 index 0000000..78171f2 --- /dev/null +++ b/Python/SqlModel/模型定义.txt @@ -0,0 +1,571 @@ +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 +================================================================