This commit is contained in:
jeremygan2021
2026-02-11 04:06:51 +08:00
parent 96d5598fb5
commit 1100143a6e
36 changed files with 1223 additions and 401 deletions

View File

@@ -165,7 +165,8 @@ class CommissionLog(models.Model):
)
order = models.ForeignKey('Order', on_delete=models.CASCADE, verbose_name="关联订单", related_name='commissions')
salesperson = models.ForeignKey(Salesperson, on_delete=models.CASCADE, verbose_name="获佣销售员", related_name='commissions')
salesperson = models.ForeignKey(Salesperson, on_delete=models.CASCADE, verbose_name="获佣销售员", related_name='commissions', null=True, blank=True)
distributor = models.ForeignKey(Distributor, on_delete=models.CASCADE, verbose_name="获佣分销员", related_name='commissions', null=True, blank=True)
amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="佣金金额")
level = models.IntegerField(default=1, verbose_name="分销层级", help_text="1: 直接销售, 2: 二级分销")
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="状态")
@@ -219,13 +220,15 @@ class Order(models.Model):
('cancelled', '已取消'),
)
config = models.ForeignKey(ESP32Config, on_delete=models.CASCADE, verbose_name="所选配置")
config = models.ForeignKey(ESP32Config, on_delete=models.CASCADE, verbose_name="所选配置", null=True, blank=True)
course = models.ForeignKey('VCCourse', on_delete=models.SET_NULL, null=True, blank=True, verbose_name="所选课程", related_name='orders')
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')
distributor = models.ForeignKey(Distributor, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="所属分销员", related_name='orders')
# 关联微信用户
wechat_user = models.ForeignKey(WeChatUser, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="下单微信用户", related_name='orders')
@@ -312,9 +315,9 @@ class ServiceOrder(models.Model):
verbose_name_plural = "服务订单列表"
class VBCourse(models.Model):
class VCCourse(models.Model):
"""
VB Coding 课程模型
VC (VB Coding) 课程模型
"""
COURSE_TYPE_CHOICES = (
('software', '软件课程'),
@@ -327,10 +330,17 @@ class VBCourse(models.Model):
course_type = models.CharField(max_length=20, choices=COURSE_TYPE_CHOICES, default='software', verbose_name="课程类型")
duration = models.CharField(max_length=50, verbose_name="课程时长", help_text="例如: 30分钟", default="30分钟")
lesson_count = models.IntegerField(default=1, verbose_name="课时数量")
instructor = models.CharField(max_length=50, verbose_name="讲师", default="VB讲师")
instructor = models.CharField(max_length=50, verbose_name="讲师", default="VC讲师")
instructor_title = models.CharField(max_length=50, verbose_name="讲师头衔", default="资深讲师")
instructor_avatar = models.ImageField(upload_to='instructors/avatars/', blank=True, null=True, verbose_name="讲师头像 (上传)")
instructor_avatar_url = models.URLField(blank=True, null=True, verbose_name="讲师头像 (URL)")
instructor_desc = models.TextField(blank=True, verbose_name="讲师简介", default="拥有多年开发经验,擅长...")
tag = models.CharField(max_length=20, blank=True, verbose_name="标签", help_text="例如: 热门, 推荐, 进阶")
price = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name="价格", help_text="0表示免费")
content = models.TextField(blank=True, verbose_name="详细内容", help_text="支持Markdown或HTML")
cover_image = models.ImageField(upload_to='courses/covers/', blank=True, null=True, verbose_name="封面图 (上传)")
cover_image_url = models.URLField(blank=True, null=True, verbose_name="封面图 (URL)")
@@ -343,5 +353,40 @@ class VBCourse(models.Model):
return self.title
class Meta:
verbose_name = "VB课程"
verbose_name_plural = "VB课程管理"
verbose_name = "VC课程"
verbose_name_plural = "VC课程管理"
class CourseEnrollment(models.Model):
"""
课程报名/咨询记录
"""
STATUS_CHOICES = (
('pending', '待联系'),
('contacted', '已联系'),
('completed', '已完成'),
('cancelled', '已取消'),
)
course = models.ForeignKey(VCCourse, on_delete=models.CASCADE, verbose_name="咨询课程", related_name='enrollments')
customer_name = models.CharField(max_length=100, verbose_name="姓名")
phone_number = models.CharField(max_length=20, verbose_name="联系电话")
email = models.EmailField(blank=True, verbose_name="电子邮箱")
wechat_id = models.CharField(max_length=50, blank=True, verbose_name="微信号")
message = models.TextField(blank=True, 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="所属销售员")
distributor = models.ForeignKey(Distributor, on_delete=models.SET_NULL, null=True, blank=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"{self.customer_name} - {self.course.title}"
class Meta:
verbose_name = "课程报名"
verbose_name_plural = "课程报名管理"