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

@@ -4,7 +4,7 @@ from django.db.models import Sum
from django import forms
from unfold.admin import ModelAdmin, TabularInline
from unfold.decorators import display
from .models import ESP32Config, Order, Salesperson, WeChatPayConfig, Service, VBCourse, ProductFeature, CommissionLog, WeChatUser, Distributor, Withdrawal, ServiceOrder
from .models import ESP32Config, Order, Salesperson, WeChatPayConfig, Service, VCCourse, ProductFeature, CommissionLog, WeChatUser, Distributor, Withdrawal, ServiceOrder, CourseEnrollment
import qrcode
from io import BytesIO
import base64
@@ -83,7 +83,7 @@ class ESP32ConfigAdmin(ModelAdmin):
inlines = [ProductFeatureInline]
fieldsets = (
('基本信息', {
'fields': ('name', 'price', 'stock', 'description')
'fields': ('name', 'price', 'stock', 'commission_rate', 'description')
}),
('硬件参数', {
'fields': ('chip_type', 'flash_size', 'ram_size', 'has_camera', 'has_microphone')
@@ -141,17 +141,21 @@ class ServiceOrderAdmin(ModelAdmin):
}),
)
@admin.register(VBCourse)
class VBCourseAdmin(ModelAdmin):
list_display = ('title', 'course_type', 'tag', 'instructor', 'lesson_count', 'duration', 'created_at')
@admin.register(VCCourse)
class VCCourseAdmin(ModelAdmin):
list_display = ('title', 'course_type', 'price', 'tag', 'instructor', 'lesson_count', 'duration', 'created_at')
search_fields = ('title', 'description', 'instructor', 'tag')
list_filter = ('course_type', 'instructor', 'tag')
fieldsets = (
('基本信息', {
'fields': ('title', 'description', 'course_type', 'tag')
'fields': ('title', 'description', 'course_type', 'tag', 'price')
}),
('讲师信息', {
'fields': ('instructor', 'instructor_title', 'instructor_desc', 'instructor_avatar', 'instructor_avatar_url'),
'description': '讲师头像上传和URL二选一优先使用URL'
}),
('课程详情', {
'fields': ('instructor', 'duration', 'lesson_count')
'fields': ('duration', 'lesson_count', 'content')
}),
('封面', {
'fields': ('cover_image', 'cover_image_url'),
@@ -163,6 +167,24 @@ class VBCourseAdmin(ModelAdmin):
}),
)
@admin.register(CourseEnrollment)
class CourseEnrollmentAdmin(ModelAdmin):
list_display = ('customer_name', 'course', 'phone_number', 'status', 'created_at')
list_filter = ('status', 'course', 'created_at')
search_fields = ('customer_name', 'phone_number', 'wechat_id')
fieldsets = (
('报名信息', {
'fields': ('course', 'status', 'created_at')
}),
('客户资料', {
'fields': ('customer_name', 'phone_number', 'wechat_id', 'email', 'message')
}),
('销售归属', {
'fields': ('salesperson', 'distributor')
}),
)
@admin.register(Salesperson)
class SalespersonAdmin(ModelAdmin):
list_display = ('name', 'code', 'total_sales', 'view_promotion_url')
@@ -240,14 +262,14 @@ class SalespersonAdmin(ModelAdmin):
@admin.register(CommissionLog)
class CommissionLogAdmin(ModelAdmin):
list_display = ('id', 'salesperson', 'amount', 'level', 'status', 'created_at')
list_filter = ('status', 'level', 'salesperson', 'created_at')
search_fields = ('salesperson__name', 'order__id')
list_display = ('id', 'salesperson', 'distributor', 'amount', 'level', 'status', 'created_at')
list_filter = ('status', 'level', 'salesperson', 'distributor', 'created_at')
search_fields = ('salesperson__name', 'distributor__user__nickname', 'order__id')
readonly_fields = ('amount', 'level', 'created_at')
fieldsets = (
('基本信息', {
'fields': ('salesperson', 'order', 'amount', 'level')
'fields': ('salesperson', 'distributor', 'order', 'amount', 'level')
}),
('状态管理', {
'fields': ('status', 'created_at')
@@ -256,23 +278,31 @@ class CommissionLogAdmin(ModelAdmin):
@admin.register(Order)
class OrderAdmin(ModelAdmin):
list_display = ('id', 'customer_name', 'config', 'total_price', 'status', 'courier_name', 'tracking_number', 'salesperson', 'created_at')
list_filter = ('status', 'salesperson', 'created_at')
list_display = ('id', 'customer_name', 'get_item_name', 'total_price', 'status', 'salesperson', 'distributor', 'created_at')
list_filter = ('status', 'salesperson', 'distributor', 'created_at')
search_fields = ('id', 'customer_name', 'phone_number', 'wechat_trade_no')
readonly_fields = ('total_price', 'created_at', 'wechat_trade_no')
def get_item_name(self, obj):
if obj.config:
return f"[硬件] {obj.config.name}"
if obj.course:
return f"[课程] {obj.course.title}"
return "未知商品"
get_item_name.short_description = "购买商品"
fieldsets = (
('订单信息', {
'fields': ('config', 'quantity', 'total_price', 'status', 'created_at')
'fields': ('config', 'course', 'quantity', 'total_price', 'status', 'created_at')
}),
('客户信息', {
'fields': ('customer_name', 'phone_number', 'shipping_address')
'fields': ('customer_name', 'phone_number', 'shipping_address', 'wechat_user')
}),
('物流信息', {
'fields': ('courier_name', 'tracking_number')
}),
('销售归属', {
'fields': ('salesperson',)
'fields': ('salesperson', 'distributor')
}),
('支付信息', {
'fields': ('wechat_trade_no',)