Add admin-frontend and user-frontend standalone projects, certification/invoice/discovery features, fix auth header and theme consistency

This commit is contained in:
TradeMate Dev
2026-05-22 18:35:30 +08:00
parent 18c6cf5406
commit 52dba37f22
79 changed files with 10333 additions and 248 deletions
+4
View File
@@ -12,6 +12,8 @@ from .device import Device
from .followup import FollowupStrategy, FollowupLog
from .system_config import SystemConfig
from .translation_quota import TranslationQuota
from .certification import Certification, CertType, CertStatus
from .invoice import Invoice, InvoiceType, InvoiceStatus
__all__ = [
"User", "Product",
@@ -28,4 +30,6 @@ __all__ = [
"FollowupStrategy", "FollowupLog",
"SystemConfig",
"TranslationQuota",
"Certification", "CertType", "CertStatus",
"Invoice", "InvoiceType", "InvoiceStatus",
]
+41
View File
@@ -0,0 +1,41 @@
from sqlalchemy import Column, String, Boolean, Integer, DateTime, Text, ForeignKey, Enum as SAEnum
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
from datetime import datetime
from app.database import Base
import uuid
import enum
class CertType(str, enum.Enum):
individual = "individual"
enterprise = "enterprise"
class CertStatus(str, enum.Enum):
pending = "pending"
approved = "approved"
rejected = "rejected"
class Certification(Base):
__tablename__ = "certifications"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True)
cert_type = Column(SAEnum(CertType), nullable=False)
personal_name = Column(String(100))
personal_id = Column(String(30))
company_name = Column(String(255))
tax_id = Column(String(30))
business_license_url = Column(String(500))
status = Column(SAEnum(CertStatus), default=CertStatus.pending)
reject_reason = Column(Text)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User")
+41
View File
@@ -0,0 +1,41 @@
from sqlalchemy import Column, String, Boolean, Integer, DateTime, Text, Float, ForeignKey, Enum as SAEnum
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import relationship
from datetime import datetime
from app.database import Base
import uuid
import enum
class InvoiceType(str, enum.Enum):
individual = "individual"
enterprise = "enterprise"
class InvoiceStatus(str, enum.Enum):
pending = "pending"
issued = "issued"
rejected = "rejected"
class Invoice(Base):
__tablename__ = "invoices"
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True)
certification_id = Column(UUID(as_uuid=True), ForeignKey("certifications.id"), nullable=True)
invoice_type = Column(SAEnum(InvoiceType), nullable=False)
title = Column(String(255), nullable=False)
tax_id = Column(String(30))
amount = Column(Float, nullable=False)
status = Column(SAEnum(InvoiceStatus), default=InvoiceStatus.pending)
reject_reason = Column(Text)
issued_at = Column(DateTime)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
user = relationship("User")
certification = relationship("Certification")