from django.db import models from django.utils.html import format_html import qrcode from io import BytesIO import base64 class ESP32Config(models.Model): """ ESP32 硬件配置选项模型 用于定义可售卖的硬件参数 """ name = models.CharField(max_length=100, verbose_name="配置名称") chip_type = models.CharField(max_length=50, verbose_name="芯片型号", help_text="例如: ESP32-S3, ESP32-C3") flash_size = models.IntegerField(verbose_name="Flash大小(MB)", default=4) ram_size = models.IntegerField(verbose_name="PSRAM大小(MB)", default=2) has_camera = models.BooleanField(default=False, verbose_name="是否包含摄像头") has_microphone = models.BooleanField(default=False, verbose_name="是否包含麦克风") price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="价格") description = models.TextField(verbose_name="描述", blank=True) detail_image = models.ImageField(upload_to='products/details/', blank=True, null=True, verbose_name="详情页长图 (上传)") detail_image_url = models.URLField(blank=True, null=True, verbose_name="详情页长图 (URL)", help_text="如果填写了URL,将优先使用URL") def __str__(self): return f"{self.name} - ¥{self.price}" class Meta: verbose_name = "硬件配置 (小智参数)" verbose_name_plural = "硬件配置 (小智参数)" class Salesperson(models.Model): """ 销售人员模型 """ name = models.CharField(max_length=50, verbose_name="销售员姓名") code = models.CharField(max_length=20, unique=True, verbose_name="推广码", help_text="唯一的推广标识码,如: zhangsan01") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") def __str__(self): return f"{self.name} ({self.code})" class Meta: verbose_name = "销售员" verbose_name_plural = "销售员管理" class WeChatPayConfig(models.Model): """ 微信支付配置模型 """ app_id = models.CharField(max_length=50, verbose_name="AppID") mch_id = models.CharField(max_length=50, verbose_name="商户号(MchID)") api_key = models.CharField(max_length=100, verbose_name="API密钥(Key)") app_secret = models.CharField(max_length=100, verbose_name="AppSecret", blank=True, null=True) notify_url = models.URLField(verbose_name="回调通知地址") is_active = models.BooleanField(default=True, verbose_name="是否启用") class Meta: verbose_name = "微信支付配置" verbose_name_plural = "微信支付配置" def __str__(self): return f"微信支付配置 ({'启用' if self.is_active else '禁用'})" def save(self, *args, **kwargs): # 确保只有一个启用的配置 if self.is_active: WeChatPayConfig.objects.filter(is_active=True).exclude(id=self.id).update(is_active=False) super().save(*args, **kwargs) class Order(models.Model): """ 订单模型 记录用户的购买请求和支付状态 """ STATUS_CHOICES = ( ('pending', '待支付'), ('paid', '已支付'), ('shipped', '已发货'), ('cancelled', '已取消'), ) config = models.ForeignKey(ESP32Config, on_delete=models.CASCADE, verbose_name="所选配置") quantity = models.IntegerField(default=1, verbose_name="数量") total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="总价") status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="订单状态") # 销售归属 salesperson = models.ForeignKey(Salesperson, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="所属销售员", related_name='orders') # 用户信息 customer_name = models.CharField(max_length=100, verbose_name="收货人姓名", default="") phone_number = models.CharField(max_length=20, verbose_name="联系电话", default="") shipping_address = models.TextField(verbose_name="发货地址", default="") # 微信支付相关字段 wechat_trade_no = models.CharField(max_length=100, blank=True, null=True, verbose_name="微信支付单号") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间") def __str__(self): return f"Order #{self.id} - {self.customer_name} - {self.status}" class Meta: verbose_name = "订单" verbose_name_plural = "订单列表" class Service(models.Model): """ AI服务项目模型 """ title = models.CharField(max_length=100, verbose_name="服务名称") icon = models.ImageField(upload_to='services/icons/', blank=True, null=True, verbose_name="图标 (上传)") icon_url = models.URLField(blank=True, null=True, verbose_name="图标 (URL)") description = models.TextField(verbose_name="简介") features = models.TextField(verbose_name="特性列表", help_text="每行一个特性") color = models.CharField(max_length=20, default="#00f0ff", verbose_name="主题色") detail_image = models.ImageField(upload_to='services/details/', blank=True, null=True, verbose_name="详情页长图 (上传)") detail_image_url = models.URLField(blank=True, null=True, verbose_name="详情页长图 (URL)") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") def __str__(self): return self.title class Meta: verbose_name = "AI服务" verbose_name_plural = "AI服务管理" class ARService(models.Model): """ AR体验服务模型 """ title = models.CharField(max_length=100, verbose_name="体验名称") description = models.TextField(verbose_name="简介") cover_image = models.ImageField(upload_to='ar/covers/', blank=True, null=True, verbose_name="封面/长图 (上传)") cover_image_url = models.URLField(blank=True, null=True, verbose_name="封面/长图 (URL)") created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") def __str__(self): return self.title class Meta: verbose_name = "AR体验" verbose_name_plural = "AR体验管理"