fix: 3D Show

This commit is contained in:
xiaoma
2026-02-02 19:10:34 +08:00
commit b8024da3dc
61 changed files with 4123 additions and 0 deletions

View File

@@ -0,0 +1,50 @@
# Generated by Django 6.0.1 on 2026-02-02 04:06
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='ESP32Config',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100, verbose_name='配置名称')),
('chip_type', models.CharField(help_text='例如: ESP32-S3, ESP32-C3', max_length=50, verbose_name='芯片型号')),
('flash_size', models.IntegerField(default=4, verbose_name='Flash大小(MB)')),
('ram_size', models.IntegerField(default=2, verbose_name='PSRAM大小(MB)')),
('has_camera', models.BooleanField(default=False, verbose_name='是否包含摄像头')),
('has_microphone', models.BooleanField(default=False, verbose_name='是否包含麦克风')),
('price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='价格')),
('description', models.TextField(blank=True, verbose_name='描述')),
],
options={
'verbose_name': '硬件配置',
'verbose_name_plural': '硬件配置列表',
},
),
migrations.CreateModel(
name='Order',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('quantity', models.IntegerField(default=1, verbose_name='数量')),
('total_price', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='总价')),
('status', models.CharField(choices=[('pending', '待支付'), ('paid', '已支付'), ('shipped', '已发货'), ('cancelled', '已取消')], default='pending', max_length=20, verbose_name='订单状态')),
('wechat_trade_no', models.CharField(blank=True, max_length=100, null=True, verbose_name='微信支付单号')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('config', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.esp32config', verbose_name='所选配置')),
],
options={
'verbose_name': '订单',
'verbose_name_plural': '订单列表',
},
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 6.0.1 on 2026-02-02 04:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shop', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='order',
name='customer_name',
field=models.CharField(default='', max_length=100, verbose_name='收货人姓名'),
),
migrations.AddField(
model_name='order',
name='phone_number',
field=models.CharField(default='', max_length=20, verbose_name='联系电话'),
),
migrations.AddField(
model_name='order',
name='shipping_address',
field=models.TextField(default='', verbose_name='发货地址'),
),
]

View File

@@ -0,0 +1,36 @@
# Generated by Django 6.0.1 on 2026-02-02 04:14
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shop', '0002_order_customer_name_order_phone_number_and_more'),
]
operations = [
migrations.CreateModel(
name='Salesperson',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=50, verbose_name='销售员姓名')),
('code', models.CharField(help_text='唯一的推广标识码,如: zhangsan01', max_length=20, unique=True, verbose_name='推广码')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
],
options={
'verbose_name': '销售员',
'verbose_name_plural': '销售员管理',
},
),
migrations.AlterModelOptions(
name='esp32config',
options={'verbose_name': '硬件配置 (小智参数)', 'verbose_name_plural': '硬件配置 (小智参数)'},
),
migrations.AddField(
model_name='order',
name='salesperson',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='orders', to='shop.salesperson', verbose_name='所属销售员'),
),
]

View File

@@ -0,0 +1,44 @@
# Generated by Django 5.2.10 on 2026-02-02 04:56
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shop', '0003_salesperson_alter_esp32config_options_and_more'),
]
operations = [
migrations.CreateModel(
name='WeChatPayConfig',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('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(blank=True, max_length=100, null=True, verbose_name='AppSecret')),
('notify_url', models.URLField(verbose_name='回调通知地址')),
('is_active', models.BooleanField(default=True, verbose_name='是否启用')),
],
options={
'verbose_name': '微信支付配置',
'verbose_name_plural': '微信支付配置',
},
),
migrations.AlterField(
model_name='esp32config',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='order',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='salesperson',
name='id',
field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]

View File

@@ -0,0 +1,50 @@
# Generated by Django 6.0.1 on 2026-02-02 05:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shop', '0004_wechatpayconfig_alter_esp32config_id_alter_order_id_and_more'),
]
operations = [
migrations.CreateModel(
name='Service',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100, verbose_name='服务名称')),
('icon', models.ImageField(upload_to='services/icons/', verbose_name='图标')),
('description', models.TextField(verbose_name='简介')),
('features', models.TextField(help_text='每行一个特性', verbose_name='特性列表')),
('color', models.CharField(default='#00f0ff', max_length=20, verbose_name='主题色')),
('detail_image', models.ImageField(blank=True, null=True, upload_to='services/details/', verbose_name='详情页长图')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
],
options={
'verbose_name': 'AI服务',
'verbose_name_plural': 'AI服务管理',
},
),
migrations.AlterField(
model_name='esp32config',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='order',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='salesperson',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
migrations.AlterField(
model_name='wechatpayconfig',
name='id',
field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'),
),
]

View File

@@ -0,0 +1,58 @@
# Generated by Django 6.0.1 on 2026-02-02 05:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shop', '0005_service_alter_esp32config_id_alter_order_id_and_more'),
]
operations = [
migrations.CreateModel(
name='ARService',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=100, verbose_name='体验名称')),
('description', models.TextField(verbose_name='简介')),
('cover_image', models.ImageField(blank=True, null=True, upload_to='ar/covers/', verbose_name='封面/长图 (上传)')),
('cover_image_url', models.URLField(blank=True, null=True, verbose_name='封面/长图 (URL)')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
],
options={
'verbose_name': 'AR体验',
'verbose_name_plural': 'AR体验管理',
},
),
migrations.AddField(
model_name='esp32config',
name='detail_image',
field=models.ImageField(blank=True, null=True, upload_to='products/details/', verbose_name='详情页长图 (上传)'),
),
migrations.AddField(
model_name='esp32config',
name='detail_image_url',
field=models.URLField(blank=True, help_text='如果填写了URL将优先使用URL', null=True, verbose_name='详情页长图 (URL)'),
),
migrations.AddField(
model_name='service',
name='detail_image_url',
field=models.URLField(blank=True, null=True, verbose_name='详情页长图 (URL)'),
),
migrations.AddField(
model_name='service',
name='icon_url',
field=models.URLField(blank=True, null=True, verbose_name='图标 (URL)'),
),
migrations.AlterField(
model_name='service',
name='detail_image',
field=models.ImageField(blank=True, null=True, upload_to='services/details/', verbose_name='详情页长图 (上传)'),
),
migrations.AlterField(
model_name='service',
name='icon',
field=models.ImageField(blank=True, null=True, upload_to='services/icons/', verbose_name='图标 (上传)'),
),
]

View File

@@ -0,0 +1,32 @@
# Generated by Django 6.0.1 on 2026-02-02 06:04
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shop', '0006_arservice_esp32config_detail_image_and_more'),
]
operations = [
migrations.CreateModel(
name='ProductFeature',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=50, verbose_name='特性标题')),
('description', models.TextField(verbose_name='特性描述')),
('icon_name', models.CharField(blank=True, help_text='例如: SafetyCertificate, Eye, Thunderbolt', max_length=50, null=True, verbose_name='Antd图标名称')),
('icon_image', models.ImageField(blank=True, null=True, upload_to='products/features/', verbose_name='特性图标 (上传)')),
('icon_url', models.URLField(blank=True, null=True, verbose_name='特性图标 (URL)')),
('order', models.IntegerField(default=0, help_text='数字越小越靠前', verbose_name='排序权重')),
('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='features', to='shop.esp32config', verbose_name='所属产品')),
],
options={
'verbose_name': '产品特性',
'verbose_name_plural': '产品特性',
'ordering': ['order'],
},
),
]

View File

@@ -0,0 +1,55 @@
# Generated by Django 6.0.1 on 2026-02-02 06:16
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shop', '0007_productfeature'),
]
operations = [
migrations.AddField(
model_name='service',
name='delivery_content',
field=models.TextField(blank=True, help_text='描述将交付给客户的具体成果', verbose_name='交付内容'),
),
migrations.AddField(
model_name='service',
name='delivery_time',
field=models.CharField(blank=True, help_text='例如3-5个工作日', max_length=50, verbose_name='预计交付周期'),
),
migrations.AddField(
model_name='service',
name='price',
field=models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='起步价格'),
),
migrations.AddField(
model_name='service',
name='unit',
field=models.CharField(default='', help_text='例如:次、小时、月、个', max_length=20, verbose_name='计费单位'),
),
migrations.CreateModel(
name='ServiceOrder',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('customer_name', models.CharField(max_length=100, verbose_name='客户姓名')),
('company_name', models.CharField(blank=True, max_length=100, verbose_name='公司名称')),
('phone_number', models.CharField(max_length=20, verbose_name='联系电话')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='电子邮箱')),
('requirements', models.TextField(blank=True, verbose_name='具体需求描述')),
('total_price', models.DecimalField(decimal_places=2, default=0, max_digits=10, verbose_name='预估总价')),
('status', models.CharField(choices=[('pending', '待沟通/待支付'), ('processing', '服务进行中'), ('completed', '已完成'), ('cancelled', '已取消')], default='pending', max_length=20, verbose_name='订单状态')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('salesperson', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='shop.salesperson', verbose_name='所属销售员')),
('service', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shop.service', verbose_name='所选服务')),
],
options={
'verbose_name': '服务订单',
'verbose_name_plural': '服务订单列表',
},
),
]

View File