572 lines
18 KiB
Plaintext
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
|
|
================================================================
|