将文件夹命名从拼音改为英文,整理了一些代码,将导入语句迁移到了头部

This commit is contained in:
2026-06-14 16:39:09 +08:00
parent 1fd0301e0e
commit 21bb129c5d
178 changed files with 29249 additions and 35862 deletions

0
products/__init__.py Normal file
View File

3
products/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
products/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class ShangpinConfig(AppConfig):
name = "shangpin"

View File

@@ -0,0 +1,149 @@
# Generated by Django 5.2.10 on 2026-01-14 19:59
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Huiyuan',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('huiyuan_id', models.CharField(max_length=6, unique=True, verbose_name='会员ID')),
('jieshao', models.CharField(max_length=30, verbose_name='会员介绍')),
('jtjieshao', models.TextField(blank=True, null=True, verbose_name='会员规则介绍')),
('jiage', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='会员价格')),
('guanshifc', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='管事分成')),
('goumai_cishu', models.PositiveIntegerField(default=0, verbose_name='购买次数')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '会员',
'verbose_name_plural': '会员',
'db_table': 'huiyuan',
},
),
migrations.CreateModel(
name='Huiyuangoumai',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='购买记录ID')),
('huiyuan_id', models.CharField(db_index=True, max_length=6, verbose_name='会员ID')),
('yonghu_id', models.CharField(db_index=True, max_length=32, verbose_name='用户ID')),
('huiyuan_zhuangtai', models.PositiveIntegerField(default=1, verbose_name='会员状态')),
('jieshao', models.CharField(max_length=30, null=True, verbose_name='会员介绍')),
('daoqi_time', models.DateTimeField(verbose_name='会员到期时间')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '用户购买会员',
'verbose_name_plural': '用户购买会员',
'db_table': 'huiyuangoumai',
},
),
migrations.CreateModel(
name='Shangpin',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='商品ID')),
('biaoqian', models.CharField(blank=True, max_length=45, null=True, verbose_name='商品标题')),
('jiage', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='商品价格')),
('kucun', models.PositiveIntegerField(default=0, verbose_name='商品库存')),
('leixing_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='商品类型ID')),
('zhuanqu_id', models.PositiveIntegerField(blank=True, null=True, verbose_name='商品专区ID')),
('zhenshi_xiaoliang', models.PositiveIntegerField(default=0, verbose_name='商品真实销量')),
('duiwai_xiaoliang', models.PositiveIntegerField(default=0, verbose_name='商品对外销量')),
('jieshao', models.TextField(blank=True, null=True, verbose_name='商品介绍')),
('xiadan_xuzhi', models.TextField(blank=True, null=True, verbose_name='下单须知')),
('guize_tupian', models.CharField(blank=True, max_length=500, null=True, verbose_name='规则图片URL')),
('yaoqiuleixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='抢单要求类型')),
('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')),
('yongjin', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')),
('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='商品图片URL')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更改时间')),
],
options={
'verbose_name': '商品',
'verbose_name_plural': '商品',
'db_table': 'shangpin',
},
),
migrations.CreateModel(
name='ShangpinLeixing',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='类型ID')),
('yaoqiuleixing', models.PositiveIntegerField(blank=True, null=True, verbose_name='抢单要求类型')),
('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')),
('yongjin', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='佣金要求')),
('jieshao', models.CharField(blank=True, max_length=45, null=True, verbose_name='类型介绍')),
('tupian_url', models.CharField(blank=True, max_length=500, null=True, verbose_name='类型图片URL')),
],
options={
'verbose_name': '商品类型',
'verbose_name_plural': '商品类型',
'db_table': 'shangpin_leixing',
},
),
migrations.CreateModel(
name='ShangpinZhuanqu',
fields=[
('id', models.AutoField(primary_key=True, serialize=False, verbose_name='专区ID')),
('mingzi', models.CharField(blank=True, max_length=45, null=True, verbose_name='专区名称')),
('leixing_id', models.PositiveIntegerField(verbose_name='类型ID')),
],
options={
'verbose_name': '商品专区',
'verbose_name_plural': '商品专区',
'db_table': 'shangpin_zhuanqu',
},
),
migrations.CreateModel(
name='Czjilu',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('dingdan_id', models.CharField(db_index=True, max_length=32, unique=True, verbose_name='订单ID')),
('huiyuan_id', models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID')),
('zhuangtai', models.IntegerField(blank=True, null=True, verbose_name='订单状态')),
('yonghuid', models.CharField(db_index=True, max_length=7, verbose_name='用户ID')),
('jine', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='订单金额')),
('leixing', models.IntegerField(blank=True, null=True, verbose_name='充值类型1:会员2:押金,3:积分,4:商家')),
('shuoming', models.CharField(blank=True, max_length=100, null=True, verbose_name='订单说明')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '充值记录订单',
'verbose_name_plural': '充值记录订单',
'db_table': 'czjilu',
'indexes': [models.Index(fields=['dingdan_id'], name='czjilu_dingdan_39bbd0_idx'), models.Index(fields=['yonghuid'], name='czjilu_yonghui_a0555f_idx')],
},
),
migrations.CreateModel(
name='Gsfenhong',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('dingdan_id', models.CharField(max_length=32, unique=True, verbose_name='订单ID')),
('guanshi', models.CharField(db_index=True, max_length=7, verbose_name='管事ID')),
('dashouid', models.CharField(db_index=True, max_length=7, unique=True, verbose_name='打手ID')),
('shuoming', models.CharField(blank=True, max_length=100, null=True, verbose_name='订单说明')),
('fenhong', models.DecimalField(decimal_places=2, max_digits=10, verbose_name='订单分红金额')),
('avatar', models.CharField(blank=True, max_length=500, null=True, verbose_name='打手头像')),
('nicheng', models.CharField(max_length=50, null=True, verbose_name='打手昵称')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
],
options={
'verbose_name': '管事分红记录',
'verbose_name_plural': '管事分红记录',
'db_table': 'gsfenhong',
'indexes': [models.Index(fields=['guanshi'], name='gsfenhong_guanshi_dc440f_idx'), models.Index(fields=['dashouid'], name='gsfenhong_dashoui_5473ca_idx')],
},
),
]

View File

@@ -0,0 +1,29 @@
# Generated by Django 4.2.27 on 2026-01-18 14:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0001_initial'),
]
operations = [
migrations.AlterUniqueTogether(
name='huiyuangoumai',
unique_together={('yonghu_id', 'huiyuan_id')},
),
migrations.AddIndex(
model_name='huiyuangoumai',
index=models.Index(fields=['yonghu_id'], name='huiyuangoum_yonghu__ba2138_idx'),
),
migrations.AddIndex(
model_name='huiyuangoumai',
index=models.Index(fields=['huiyuan_id'], name='huiyuangoum_huiyuan_35fe1d_idx'),
),
migrations.AddIndex(
model_name='huiyuangoumai',
index=models.Index(fields=['yonghu_id', 'huiyuan_id'], name='huiyuangoum_yonghu__21e6e1_idx'),
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 4.2.27 on 2026-02-07 19:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0002_alter_huiyuangoumai_unique_together_and_more'),
]
operations = [
migrations.AddField(
model_name='shangpin',
name='paixu',
field=models.IntegerField(default=0, verbose_name='排序权重'),
),
migrations.AddField(
model_name='shangpinleixing',
name='paixu',
field=models.IntegerField(default=0, verbose_name='排序权重'),
),
migrations.AddField(
model_name='shangpinleixing',
name='shenhezhuangtai',
field=models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态'),
),
migrations.AddField(
model_name='shangpinzhuanqu',
name='paixu',
field=models.IntegerField(default=0, verbose_name='排序权重'),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.27 on 2026-02-09 15:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0003_shangpin_paixu_shangpinleixing_paixu_and_more'),
]
operations = [
migrations.AddField(
model_name='shangpin',
name='shenhezhuangtai',
field=models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态'),
),
migrations.AddField(
model_name='shangpinzhuanqu',
name='shenhezhuangtai',
field=models.IntegerField(default=1, help_text='1=正常, 2=审核专用', verbose_name='审核状态'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.27 on 2026-02-27 15:22
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0004_shangpin_shenhezhuangtai_and_more'),
]
operations = [
migrations.AlterField(
model_name='gsfenhong',
name='dashouid',
field=models.CharField(db_index=True, max_length=7, verbose_name='打手ID'),
),
]

View File

@@ -0,0 +1,45 @@
# Generated by Django 4.2.27 on 2026-03-18 12:09
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0005_alter_gsfenhong_dashouid'),
]
operations = [
migrations.AddField(
model_name='gsfenhong',
name='huiyuan_id',
field=models.CharField(blank=True, max_length=6, null=True, verbose_name='会员ID'),
),
migrations.AddField(
model_name='huiyuan',
name='zuzhangfc',
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='组长分成'),
),
migrations.CreateModel(
name='DuociFenhong',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('guanshi', models.CharField(db_index=True, max_length=7, verbose_name='管事ID')),
('zuzhang', models.CharField(blank=True, db_index=True, max_length=7, null=True, verbose_name='组长ID')),
('cishu', models.PositiveIntegerField(verbose_name='分红次数')),
('guanshi_fenhong', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='管事分红金额')),
('zuzhang_fenhong', models.DecimalField(decimal_places=2, default=0.0, max_digits=10, verbose_name='组长分红金额')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('huiyuan', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shangpin.huiyuan', verbose_name='会员')),
],
options={
'verbose_name': '多次分红配置',
'verbose_name_plural': '多次分红配置',
'db_table': 'duoci_fenhong',
'indexes': [models.Index(fields=['guanshi'], name='duoci_fenho_guanshi_b3de53_idx'), models.Index(fields=['zuzhang'], name='duoci_fenho_zuzhang_69997d_idx')],
'unique_together': {('huiyuan', 'guanshi', 'cishu')},
},
),
]

View File

@@ -0,0 +1,47 @@
# Generated by Django 4.2.27 on 2026-03-19 13:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0006_gsfenhong_huiyuan_id_huiyuan_zuzhangfc_duocifenhong'),
]
operations = [
migrations.RemoveIndex(
model_name='duocifenhong',
name='duoci_fenho_guanshi_b3de53_idx',
),
migrations.RemoveIndex(
model_name='duocifenhong',
name='duoci_fenho_zuzhang_69997d_idx',
),
migrations.RenameField(
model_name='duocifenhong',
old_name='guanshi',
new_name='yonghuid',
),
migrations.AlterUniqueTogether(
name='duocifenhong',
unique_together=set(),
),
migrations.AlterField(
model_name='duocifenhong',
name='huiyuan',
field=models.CharField(max_length=10, verbose_name='会员ID'),
),
migrations.AlterUniqueTogether(
name='duocifenhong',
unique_together={('huiyuan', 'yonghuid', 'cishu')},
),
migrations.AddIndex(
model_name='duocifenhong',
index=models.Index(fields=['yonghuid'], name='duoci_fenho_yonghui_db6a2f_idx'),
),
migrations.RemoveField(
model_name='duocifenhong',
name='zuzhang',
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.27 on 2026-03-19 13:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0007_remove_duocifenhong_duoci_fenho_guanshi_b3de53_idx_and_more'),
]
operations = [
migrations.AddField(
model_name='gsfenhong',
name='zuzhang_fenhong',
field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='组长分红金额'),
),
migrations.AddField(
model_name='gsfenhong',
name='zuzhang_id',
field=models.CharField(blank=True, db_index=True, max_length=7, null=True, verbose_name='组长ID'),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.27 on 2026-03-22 15:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0008_gsfenhong_zuzhang_fenhong_gsfenhong_zuzhang_id'),
]
operations = [
migrations.AddField(
model_name='shangpin',
name='ewai_dashou_fencheng',
field=models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='打手额外分成金额'),
),
migrations.AddField(
model_name='shangpin',
name='kaioi_ewai_dashou_fencheng',
field=models.BooleanField(default=False, verbose_name='是否开启打手额外分成'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.27 on 2026-03-24 17:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0009_shangpin_ewai_dashou_fencheng_and_more'),
]
operations = [
migrations.AddField(
model_name='shangpinleixing',
name='is_cross_enabled',
field=models.BooleanField(default=False, verbose_name='是否开启平台互通'),
),
]

View File

@@ -0,0 +1,60 @@
# Generated by Django 4.2.27 on 2026-04-21 12:36
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('shangdian', '0001_initial'),
('shangpin', '0010_shangpinleixing_is_cross_enabled'),
]
operations = [
migrations.AddField(
model_name='shangpin',
name='dianpu',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='shangdian.dianpu', verbose_name='所属店铺'),
),
migrations.AddField(
model_name='shangpin',
name='dianpu_leixing',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='shangdian.shangpinleixingdianpu', verbose_name='店铺商品类型'),
),
migrations.AddField(
model_name='shangpin',
name='fengjin_zhuangtai',
field=models.BooleanField(default=True, verbose_name='是否封禁'),
),
migrations.AddField(
model_name='shangpin',
name='shangjia_zhuangtai',
field=models.BooleanField(default=True, verbose_name='是否上架'),
),
migrations.AddField(
model_name='shangpin',
name='shenhe_zhuangtai',
field=models.BooleanField(default=False, help_text='True=审核通过False=未审核', verbose_name='平台审核状态'),
),
migrations.AddField(
model_name='shangpinzhuanqu',
name='dianpu',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='shangdian.dianpu', verbose_name='所属店铺'),
),
migrations.AddField(
model_name='shangpinzhuanqu',
name='dianpu_leixing',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='shangdian.shangpinleixingdianpu', verbose_name='店铺商品类型'),
),
migrations.AddField(
model_name='shangpinzhuanqu',
name='fengjin_zhuangtai',
field=models.BooleanField(default=True, verbose_name='是否封禁'),
),
migrations.AddField(
model_name='shangpinzhuanqu',
name='shangjia_zhuangtai',
field=models.BooleanField(default=True, verbose_name='是否上架'),
),
]

View File

@@ -0,0 +1,42 @@
# Generated by Django 4.2.27 on 2026-04-23 14:56
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0011_shangpin_dianpu_shangpin_dianpu_leixing_and_more'),
]
operations = [
migrations.CreateModel(
name='ShangpinMeiriTongji',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('riqi', models.DateField(db_index=True, verbose_name='统计日期')),
('nian', models.PositiveSmallIntegerField(verbose_name='年份')),
('yue', models.PositiveSmallIntegerField(verbose_name='月份')),
('ri', models.PositiveSmallIntegerField(verbose_name='')),
('diandan_zongliang', models.PositiveIntegerField(default=0, verbose_name='点单总量')),
('diandan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='点单总额')),
('chengjiao_zongliang', models.PositiveIntegerField(default=0, verbose_name='成交总量')),
('chengjiao_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='成交总额')),
('tuikuan_zongliang', models.PositiveIntegerField(default=0, verbose_name='退款总量')),
('tuikuan_zonge', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='退款总额')),
('pingtai_shouyi', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='平台收益')),
('dianpu_zongshouyi', models.DecimalField(decimal_places=2, default=0.0, max_digits=12, verbose_name='店铺总收益')),
('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('shangpin', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='shangpin.shangpin', verbose_name='商品ID')),
],
options={
'verbose_name': '商品每日统计',
'verbose_name_plural': '商品每日统计',
'db_table': 'shangpin_meiri_tongji',
'indexes': [models.Index(fields=['shangpin', 'riqi'], name='shangpin_me_shangpi_d27e5c_idx'), models.Index(fields=['nian', 'yue', 'ri'], name='shangpin_me_nian_e3b409_idx')],
'unique_together': {('shangpin', 'riqi')},
},
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 4.2.27 on 2026-05-14 04:25
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('dengji', '0003_alter_dashoubiaoxian_bankuai'),
('shangpin', '0012_shangpinmeiritongji'),
]
operations = [
migrations.AddField(
model_name='shangpinleixing',
name='bankuai',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dengji.bankuai', verbose_name='所属板块'),
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 4.2.27 on 2026-05-16 16:51
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('dengji', '0010_kaohejilufeiyong'),
('shangpin', '0013_shangpinleixing_bankuai'),
]
operations = [
migrations.AddField(
model_name='huiyuan',
name='bankuai',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dengji.bankuai', verbose_name='所属板块'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.27 on 2026-06-12 01:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('shangpin', '0014_huiyuan_bankuai'),
]
operations = [
migrations.AddField(
model_name='gsfenhong',
name='fenhong_leixing',
field=models.PositiveSmallIntegerField(choices=[(1, '会员分红'), (2, '押金分红'), (3, '商家订单分红')], default=1, verbose_name='分红类型'),
),
]

View File

364
products/models.py Normal file
View File

@@ -0,0 +1,364 @@
from django.db import models
from django.utils import timezone
class Shangpin(models.Model):
"""商品表 - 100-1000条数据"""
id = models.AutoField(primary_key=True, verbose_name='商品ID')
biaoqian = models.CharField(max_length=45,null=True, blank=True, verbose_name='商品标题') # 15汉字
jiage = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='商品价格')
kucun = models.PositiveIntegerField(default=0, verbose_name='商品库存')
leixing_id = models.PositiveIntegerField(null=True, blank=True,verbose_name='商品类型ID') # 直接存数字
zhuanqu_id = models.PositiveIntegerField(null=True, blank=True,verbose_name='商品专区ID') # 直接存数字
zhenshi_xiaoliang = models.PositiveIntegerField(default=0, verbose_name='商品真实销量')
duiwai_xiaoliang = models.PositiveIntegerField(default=0, verbose_name='商品对外销量')
jieshao = models.TextField(null=True, blank=True, verbose_name='商品介绍')
# 新增字段
xiadan_xuzhi = models.TextField(null=True, blank=True, verbose_name='下单须知') # 支持500字可换行
guize_tupian = models.CharField(max_length=500, null=True, blank=True, verbose_name='规则图片URL')
yaoqiuleixing = models.PositiveIntegerField(null=True, blank=True, verbose_name='抢单要求类型')
huiyuan_id = models.CharField(max_length=6, null=True, blank=True, verbose_name='会员ID')
yongjin = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True,verbose_name='佣金要求')
# 🔥 新增:是否开启打手额外分成
kaioi_ewai_dashou_fencheng = models.BooleanField(default=False, verbose_name='是否开启打手额外分成')
# 🔥 新增:打手额外分成金额(开启时使用此值,否则按利率计算)
ewai_dashou_fencheng = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True,verbose_name='打手额外分成金额')
# 原有图片URL
tupian_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='商品图片URL')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更改时间')
paixu = models.IntegerField(default=0, verbose_name='排序权重')
shenhezhuangtai = models.IntegerField(default=1, verbose_name='审核状态', help_text='1=正常, 2=审核专用')
dianpu = models.ForeignKey(
'shangdian.Dianpu', # 🔥 跨应用完整路径
on_delete=models.CASCADE,
null=True,
blank=True,
db_index=True,
verbose_name='所属店铺'
)
dianpu_leixing = models.ForeignKey(
'shangdian.ShangpinLeixingDianpu',
on_delete=models.SET_NULL,
null=True,
blank=True,
db_index=True,
verbose_name='店铺商品类型'
)
shangjia_zhuangtai = models.BooleanField(default=True, verbose_name='是否上架')
fengjin_zhuangtai = models.BooleanField(default=True, verbose_name='是否封禁')
shenhe_zhuangtai = models.BooleanField(default=False, verbose_name='平台审核状态',help_text='True=审核通过False=未审核')
class Meta:
db_table = 'shangpin'
verbose_name = '商品'
verbose_name_plural = '商品'
# 不要索引!数据量太小
def __str__(self):
return f"商品{self.id}:{self.biaoqian}"
class ShangpinLeixing(models.Model):
"""商品类型表 - <10条数据"""
id = models.AutoField(primary_key=True, verbose_name='类型ID')
yaoqiuleixing = models.PositiveIntegerField(null=True, blank=True, verbose_name='抢单要求类型')
huiyuan_id = models.CharField(max_length=6, null=True, blank=True, verbose_name='会员ID')
yongjin = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name='佣金要求')
jieshao = models.CharField(max_length=45, null=True, blank=True, verbose_name='类型介绍') # 15汉字
tupian_url = models.CharField(max_length=500, null=True, blank=True, verbose_name='类型图片URL') # 用CharField
is_cross_enabled = models.BooleanField(default=False, verbose_name='是否开启平台互通')
paixu = models.IntegerField(default=0, verbose_name='排序权重')
shenhezhuangtai = models.IntegerField(default=1, verbose_name='审核状态', help_text='1=正常, 2=审核专用')
bankuai = models.ForeignKey(
'dengji.Bankuai',
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name='所属板块'
)
class Meta:
db_table = 'shangpin_leixing'
verbose_name = '商品类型'
verbose_name_plural = '商品类型'
def __str__(self):
return f"{self.jieshao}"
class ShangpinZhuanqu(models.Model):
"""商品专区表 - <50条数据"""
id = models.AutoField(primary_key=True, verbose_name='专区ID')
mingzi = models.CharField(max_length=45, null=True, blank=True, verbose_name='专区名称') # 15汉字
leixing_id = models.PositiveIntegerField(verbose_name='类型ID') # 直接存数字,不关联
paixu = models.IntegerField(default=0, verbose_name='排序权重')
shenhezhuangtai = models.IntegerField(default=1, verbose_name='审核状态', help_text='1=正常, 2=审核专用')
dianpu = models.ForeignKey(
'shangdian.Dianpu', # 🔥 跨应用完整路径
on_delete=models.CASCADE,
null=True,
blank=True,
db_index=True,
verbose_name='所属店铺'
)
dianpu_leixing = models.ForeignKey(
'shangdian.ShangpinLeixingDianpu',
on_delete=models.SET_NULL,
null=True,
blank=True,
db_index=True,
verbose_name='店铺商品类型'
)
shangjia_zhuangtai = models.BooleanField(default=True, verbose_name='是否上架')
fengjin_zhuangtai = models.BooleanField(default=True, verbose_name='是否封禁')
class Meta:
db_table = 'shangpin_zhuanqu'
verbose_name = '商品专区'
verbose_name_plural = '商品专区'
def __str__(self):
return f"{self.mingzi}"
class Huiyuan(models.Model):
huiyuan_id = models.CharField(max_length=6, unique=True, verbose_name='会员ID')
jieshao = models.CharField(max_length=30, verbose_name='会员介绍')
jtjieshao = models.TextField(null=True, blank=True, verbose_name='会员规则介绍')
jiage = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='会员价格')
guanshifc = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='管事分成')
zuzhangfc = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='组长分成')
goumai_cishu = models.PositiveIntegerField(default=0, verbose_name='购买次数')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
bankuai = models.ForeignKey(
'dengji.Bankuai',
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name='所属板块'
)
class Meta:
db_table = 'huiyuan'
verbose_name = '会员'
verbose_name_plural = '会员'
def __str__(self):
return f"会员{self.huiyuan_id}:{self.jieshao}"
class Huiyuangoumai(models.Model):
id = models.AutoField(primary_key=True, verbose_name='购买记录ID')
huiyuan_id = models.CharField(max_length=6, db_index=True, verbose_name='会员ID')
yonghu_id = models.CharField(max_length=32, db_index=True, verbose_name='用户ID')
huiyuan_zhuangtai = models.PositiveIntegerField(default=1, verbose_name='会员状态')
jieshao = models.CharField(max_length=30,null=True,verbose_name='会员介绍')
daoqi_time = models.DateTimeField(verbose_name='会员到期时间')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'huiyuangoumai'
verbose_name = '用户购买会员'
verbose_name_plural = '用户购买会员'
# 添加这个联合唯一约束
unique_together = [['yonghu_id', 'huiyuan_id']]
# 顺便优化索引(可选的,建议加)
indexes = [
models.Index(fields=['yonghu_id']),
models.Index(fields=['huiyuan_id']),
models.Index(fields=['yonghu_id', 'huiyuan_id']), # 复合索引加速查询
]
def __str__(self):
return f"用户{self.yonghu_id}-会员{self.huiyuan_id}"
def jiance_shifou_daoqi(self):
# 使用Django的timezone它会自动处理时区
now = timezone.now()
if now > self.daoqi_time:
# 过期了
if self.huiyuan_zhuangtai != 0:
self.huiyuan_zhuangtai = 0
self.save()
return True
else:
# 没过期
if self.huiyuan_zhuangtai != 1:
self.huiyuan_zhuangtai = 1
self.save()
return False
class Czjilu(models.Model):
dingdan_id = models.CharField(max_length=32, unique=True, db_index=True, verbose_name='订单ID')
huiyuan_id = models.CharField(max_length=6, null=True, blank=True, verbose_name='会员ID')
zhuangtai = models.IntegerField(null=True, blank=True, verbose_name='订单状态')
yonghuid = models.CharField(max_length=7, db_index=True, verbose_name='用户ID')
jine = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='订单金额')
leixing = models.IntegerField(null=True, blank=True, verbose_name='充值类型1:会员2:押金,3:积分,4:商家')
shuoming = models.CharField(max_length=100, null=True, blank=True, verbose_name='订单说明')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'czjilu'
verbose_name = '充值记录订单'
verbose_name_plural = '充值记录订单'
# 为高频查询字段添加索引
indexes = [
models.Index(fields=['dingdan_id']),
models.Index(fields=['yonghuid']),
]
class Gsfenhong(models.Model):
dingdan_id = models.CharField(max_length=32, unique=True, verbose_name='订单ID')
guanshi = models.CharField(max_length=7, db_index=True, verbose_name='管事ID')
dashouid = models.CharField(max_length=7, db_index=True,verbose_name='打手ID')
shuoming = models.CharField(max_length=100, null=True, blank=True, verbose_name='订单说明')
fenhong = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='订单分红金额')
avatar = models.CharField(max_length=500, null=True, blank=True, verbose_name='打手头像')
nicheng = models.CharField(max_length=50, null=True, verbose_name='打手昵称')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
zuzhang_id = models.CharField(max_length=7, null=True, blank=True, db_index=True, verbose_name='组长ID')
zuzhang_fenhong = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True,verbose_name='组长分红金额')
fenhong_leixing = models.PositiveSmallIntegerField(
default=1,
choices=[(1, '会员分红'), (2, '押金分红'), (3, '商家订单分红')],
verbose_name='分红类型'
)
huiyuan_id = models.CharField(max_length=6, null=True, blank=True, verbose_name='会员ID')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'gsfenhong'
verbose_name = '管事分红记录'
verbose_name_plural = '管事分红记录'
# 为高频查询字段添加索引
indexes = [
models.Index(fields=['guanshi']),
models.Index(fields=['dashouid']),
]
class DuociFenhong(models.Model):
"""
多次分红配置表
用于配置不同次数下管事和组长的分红金额
"""
huiyuan = models.CharField(max_length=10, verbose_name='会员ID')
yonghuid = models.CharField(max_length=7, db_index=True, verbose_name='管事ID')
cishu = models.PositiveIntegerField(verbose_name='分红次数')
guanshi_fenhong = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='管事分红金额')
zuzhang_fenhong = models.DecimalField(max_digits=10, decimal_places=2, default=0.00, verbose_name='组长分红金额')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'duoci_fenhong'
verbose_name = '多次分红配置'
verbose_name_plural = '多次分红配置'
unique_together = ('huiyuan', 'yonghuid', 'cishu') # 同一管事、同一会员、同一次数唯一
indexes = [
models.Index(fields=['yonghuid']),
]
def __str__(self):
return f"会员{self.huiyuan_id} 用户{self.yonghuid} 次数{self.cishu}"
class ShangpinMeiriTongji(models.Model):
"""
商品每日统计表
按商品 + 日期维度记录点单、成交、退款及收益数据
日期精确到天,冗余年月日字段便于分组查询
"""
shangpin = models.ForeignKey(
'shangpin.Shangpin',
on_delete=models.CASCADE,
db_index=True,
verbose_name='商品ID'
)
riqi = models.DateField(db_index=True, verbose_name='统计日期')
nian = models.PositiveSmallIntegerField(verbose_name='年份')
yue = models.PositiveSmallIntegerField(verbose_name='月份')
ri = models.PositiveSmallIntegerField(verbose_name='')
# 点单统计(下单即累加)
diandan_zongliang = models.PositiveIntegerField(default=0, verbose_name='点单总量')
diandan_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='点单总额')
# 成交统计(订单完成时累加)
chengjiao_zongliang = models.PositiveIntegerField(default=0, verbose_name='成交总量')
chengjiao_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='成交总额')
# 退款统计
tuikuan_zongliang = models.PositiveIntegerField(default=0, verbose_name='退款总量')
tuikuan_zonge = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='退款总额')
# 收益统计(新增)
pingtai_shouyi = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='平台收益')
dianpu_zongshouyi = models.DecimalField(max_digits=12, decimal_places=2, default=0.00, verbose_name='店铺总收益')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
class Meta:
db_table = 'shangpin_meiri_tongji'
verbose_name = '商品每日统计'
verbose_name_plural = verbose_name
# 每天每个商品唯一记录
unique_together = [['shangpin', 'riqi']]
indexes = [
models.Index(fields=['shangpin', 'riqi']),
models.Index(fields=['nian', 'yue', 'ri']),
]
def __str__(self):
return f"{self.shangpin.biaoqian} - {self.riqi}"
def clean(self):
"""保存前自动填充年月日冗余字段"""
if self.riqi:
self.nian = self.riqi.year
self.yue = self.riqi.month
self.ri = self.riqi.day
super().clean()
def save(self, *args, **kwargs):
self.clean()
super().save(*args, **kwargs)

3
products/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

73
products/urls.py Normal file
View File

@@ -0,0 +1,73 @@
# shangpin/urls.py
from django.urls import path
from django.views.decorators.csrf import csrf_exempt
from .views import ShangpinHuoquView, ShangpinXiangqingHuoquView, DashouHuiyuanList, \
YajinGoumai, YajinHuitiao, YajinShibai, YajinLunxun, JifenBuchong, JifenHuitiao, JifenShibai, \
JifenLunxun, HuiyuanGoumai, HuiyuanHuitiao, HuiyuanShibai, HuiyuanLunxun, ShangjiaChenggong, \
ShangjiaChongzhi, ShangjiaHuitiao, ShangjiaShibai, GuanshiFenhongListAPI, AdGetAllDataView, ShangpinLeixingFabuView, \
ShangpinZhuanquFabuView, ShangpinFabuView, GuizeTupianShangchuanView, AdHuiyuanHqView, HuiyuanXiugaiView, \
AdHuiyuanFbView, AdShangpinHuQu, AdLeixingXiuGai, AdLunboXiuGai, AdZhuanquXiuGai, AdGonggaoXiuGai, \
AdShangpinGuizeXiuGai, AdShangpinXiuGai, AdShangpinNeiRongHuoQu,\
HuiyuanTypeListView, HuiyuanRecordListView, ZuzhangFenhongView, CzhqdyView, DsqrgmdhView
urlpatterns = [
#path('shangpinhuoqu/', ShangpinHuoquView.as_view(), name='获取商品数据商品类型和专区'),
path('xiangqinghuoqu/', ShangpinXiangqingHuoquView.as_view(), name='获取商品详情数据'),
path('dshyhq', DashouHuiyuanList.as_view(), name='打手充值获取会员信息'),
path('yajingoumai', YajinGoumai.as_view(), name='打手购买押金'),
#path('yajinhuitiao', YajinHuitiao.as_view(), name='押金支付回调'),
path('yajinhuitiao', csrf_exempt(YajinHuitiao.as_view()), name='押金支付回调'),
path('yajinshibai', YajinShibai.as_view(), name='押金支付失败'),
path('yajinlunxun', YajinLunxun.as_view(), name='押金支付轮询'),
# 积分相关接口
path('jifenbc', JifenBuchong.as_view(), name='积分补充参数生成'),
#path('jifenhuitiao', JifenHuitiao.as_view(), name='积分充值回调'),
path('jifenhuitiao', csrf_exempt(JifenHuitiao.as_view()), name='积分充值回调'),
path('jifenshibai', JifenShibai.as_view(), name='积分支付失败'),
path('jifenlunxun', JifenLunxun.as_view(), name='积分支付轮询'),
# 会员相关接口
path('huiyuangm', HuiyuanGoumai.as_view(), name='会员购买参数生成'),
#path('huiyuanhuitiao', HuiyuanHuitiao.as_view(), name='会员支付回调'),
path('huiyuanhuitiao', csrf_exempt(HuiyuanHuitiao.as_view()), name='会员支付回调'),
path('huiyuanshibai', HuiyuanShibai.as_view(), name='会员支付失败'),
path('huiyuanlx', HuiyuanLunxun.as_view(), name='会员支付轮询'),
path('sjcz', ShangjiaChongzhi.as_view(), name='商家充值支付参数获取'), # 商家充值支付参数
path('sjhuitiao', csrf_exempt(ShangjiaHuitiao.as_view()), name='商家支付官方回调'),
#path('sjhuitiao', ShangjiaHuitiao.as_view(), name='商家支付官方回调'), # 商家支付回调
path('sjshibai', ShangjiaShibai.as_view(), name='商家支付失败'), # 商家支付失败处理
path('sjcg', ShangjiaChenggong.as_view(), name='商家支付成功'), # 商家支付成功轮询
path('fenhonghq', GuanshiFenhongListAPI.as_view(), name='管事获取打手充值记录'),
path('adhqlx', AdGetAllDataView.as_view(), name='管理员获取商品类型会员类型专区类型'),
path('leixingfabu', ShangpinLeixingFabuView.as_view(), name='添加商品类型'),
# 商品专区相关接口
path('zhuanqufabu', ShangpinZhuanquFabuView.as_view(), name='添加商品专区'),
# 商品发布相关接口
path('shangpinsc', ShangpinFabuView.as_view(), name='商品发布'),
# 规则图片上传接口
path('guizesc', GuizeTupianShangchuanView.as_view(), name='发布商品规则'),
path('adhuiyuanhq', AdHuiyuanHqView.as_view(), name='管理员获取会员信息'),
path('huiyuanxiugai', HuiyuanXiugaiView.as_view(), name='修改会员信息'), # 修改会员
path('adhuiyuanfb', AdHuiyuanFbView.as_view(), name='发布会员'), # 发布会员
path('adsphq', AdShangpinHuQu.as_view(), name='管理员商品管理页面数据获取'),
path('adggxg', AdGonggaoXiuGai.as_view(), name='管理员公告修改'),
path('adzqxg', AdZhuanquXiuGai.as_view(), name='管理员专区修改'),
path('adlunboxg', AdLunboXiuGai.as_view(), name='管理员轮播图修改'),
path('adleixingxg', AdLeixingXiuGai.as_view(), name='管理员商品类型修改'),
path('adspnrhq', AdShangpinNeiRongHuoQu.as_view(), name='管理员商品详情获取'),
# 2. 更改商品数据接口(修改/删除)
path('adspxqxg',AdShangpinXiuGai.as_view(), name='管理员商品详情修改'),
# 3. 规则图片更换接口
path('adspgzxg',AdShangpinGuizeXiuGai.as_view(), name='管理员商品规则修改'),
path('adhyjllxcx',HuiyuanTypeListView.as_view(), name='管理员查询会员记录获取会员类型'),
path('adhyjlcxhq',HuiyuanRecordListView.as_view(), name='管理员查询会员记录'),
path('zuzhangfenhong', ZuzhangFenhongView.as_view(), name='组长分红记录获取'),
path('czhqdy', CzhqdyView.as_view(), name='充值打手抵押查询'),
path('dsqrgmdh', DsqrgmdhView.as_view(), name='充值抵扣'),
]

113
products/utils.py Normal file
View File

@@ -0,0 +1,113 @@
# tongji/utils.py 或 shangpin/utils.py
import logging
from datetime import date
from decimal import Decimal
from django.db import transaction
from django.db.models import F
from .models import ShangpinMeiriTongji
from products.models import Shangpin
logger = logging.getLogger(__name__)
def update_shangpin_daily_stat(
shangpin_id,
caozuo_leixing,
dingdan_jiage=Decimal('0.00'),
pingtai_shouyi=Decimal('0.00'),
dianpu_zongshouyi=Decimal('0.00')
):
"""
原子更新商品每日统计数据(高并发安全,无店铺关联)
参数:
shangpin_id: 商品ID (int)
caozuo_leixing: 操作类型
1 = 下单(点单)
2 = 结算(成交)
3 = 退款
dingdan_jiage: 订单金额商品价格默认0.00
pingtai_shouyi: 平台收益金额默认0.00
dianpu_zongshouyi: 店铺总收益金额默认0.00
注意:
- 金额若小于0则自动设为0
- 日期自动取当天
- 使用 select_for_update 配合事务,保证并发时数据绝对准确
- 若商品不存在,仅记录日志不中断主流程
"""
# 参数归一化与合法性处理
dingdan_jiage = Decimal(str(dingdan_jiage)) if dingdan_jiage else Decimal('0.00')
pingtai_shouyi = Decimal(str(pingtai_shouyi)) if pingtai_shouyi else Decimal('0.00')
dianpu_zongshouyi = Decimal(str(dianpu_zongshouyi)) if dianpu_zongshouyi else Decimal('0.00')
if dingdan_jiage < 0:
dingdan_jiage = Decimal('0.00')
if pingtai_shouyi < 0:
pingtai_shouyi = Decimal('0.00')
if dianpu_zongshouyi < 0:
dianpu_zongshouyi = Decimal('0.00')
today = date.today()
# 校验商品是否存在(不加锁,仅校验)
if not Shangpin.objects.filter(id=shangpin_id).exists():
logger.error(f"商品ID {shangpin_id} 不存在,统计更新失败")
return
# 开启事务,使用行锁确保并发安全
with transaction.atomic():
# 获取或创建统计记录,并锁定该行
tongji, created = ShangpinMeiriTongji.objects.select_for_update().get_or_create(
shangpin_id=shangpin_id,
riqi=today,
defaults={
'nian': today.year,
'yue': today.month,
'ri': today.day,
'diandan_zongliang': 0,
'diandan_zonge': Decimal('0.00'),
'chengjiao_zongliang': 0,
'chengjiao_zonge': Decimal('0.00'),
'tuikuan_zongliang': 0,
'tuikuan_zonge': Decimal('0.00'),
'pingtai_shouyi': Decimal('0.00'),
'dianpu_zongshouyi': Decimal('0.00'),
}
)
# 根据操作类型构建更新字段(使用 F 表达式累加)
update_fields = {}
if caozuo_leixing == 1: # 下单
update_fields['diandan_zongliang'] = F('diandan_zongliang') + 1
update_fields['diandan_zonge'] = F('diandan_zonge') + dingdan_jiage
elif caozuo_leixing == 2: # 结算(成交)
update_fields['chengjiao_zongliang'] = F('chengjiao_zongliang') + 1
update_fields['chengjiao_zonge'] = F('chengjiao_zonge') + dingdan_jiage
# 收益直接累加传入值
update_fields['pingtai_shouyi'] = F('pingtai_shouyi') + pingtai_shouyi
update_fields['dianpu_zongshouyi'] = F('dianpu_zongshouyi') + dianpu_zongshouyi
elif caozuo_leixing == 3: # 退款
update_fields['tuikuan_zongliang'] = F('tuikuan_zongliang') + 1
update_fields['tuikuan_zonge'] = F('tuikuan_zonge') + dingdan_jiage
# 退款是否应扣减收益?根据业务需求决定,此处暂不处理收益字段
else:
logger.warning(f"未知的操作类型: {caozuo_leixing}")
return
# 原子更新字段
if update_fields:
for field, value in update_fields.items():
setattr(tongji, field, value)
tongji.save(update_fields=list(update_fields.keys()))
logger.info(
f"商品统计更新: 商品ID={shangpin_id}, 操作类型={caozuo_leixing}, "
f"订单金额={dingdan_jiage}, 平台收益={pingtai_shouyi}, "
f"店铺收益={dianpu_zongshouyi}, 日期={today}"
)

6403
products/views.py Normal file

File diff suppressed because it is too large Load Diff